/******************************************************************************* * Copyright (c) 2003, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.wst.server.ui.internal.audio; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import org.eclipse.core.runtime.*; import org.eclipse.swt.events.*; import org.eclipse.jface.viewers.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.help.IWorkbenchHelpSystem; import org.eclipse.wst.server.ui.internal.ContextIds; import org.eclipse.wst.server.ui.internal.Messages; import org.eclipse.wst.server.ui.internal.SWTUtil; import org.eclipse.wst.server.ui.internal.Trace; /** * Audio preference page. */ public class AudioPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { protected Button enableButton; protected Spinner volume; protected Map<String, IPath> userSoundMap; protected CategoryTableViewer viewer; boolean soundAvailable = true; /** * AudioPreferencePage constructor comment. */ public AudioPreferencePage() { super(); loadUserMapInfo(); } protected IPath chooseAudioFile() { FileDialog dialog = new FileDialog(getShell(), SWT.SINGLE); dialog.setText(Messages.audioPrefSelectFile); dialog.setFilterExtensions(new String[] {"*.au;*.wav"}); dialog.setFilterPath(null); dialog.open(); String[] filenames = dialog.getFileNames(); if (filenames != null && filenames.length > 0) { String filterPath = dialog.getFilterPath(); return new Path(filterPath + java.io.File.separator + filenames[0]); } return null; } /** * Creates and returns the SWT control for the customized body * of this preference page under the given parent composite. * <p> * This framework method must be implemented by concrete * subclasses. * </p> * * @param parent the parent composite * @return the new control */ protected Control createContents(Composite parent) { initializeDialogUnits(parent); IWorkbenchHelpSystem whs = PlatformUI.getWorkbench().getHelpSystem(); whs.setHelp(parent, ContextIds.AUDIO_PREFERENCES); final AudioCore core = AudioCore.getInstance(); Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.horizontalSpacing = convertHorizontalDLUsToPixels(4); layout.verticalSpacing = convertVerticalDLUsToPixels(3); layout.marginWidth = 0; layout.marginHeight = 0; composite.setLayout(layout); GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL); composite.setLayoutData(data); enableButton = new Button(composite, SWT.CHECK); enableButton.setText(Messages.audioPrefEnable); enableButton.setSelection(AudioCore.getInstance().isSoundEnabled()); data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); data.horizontalSpan = 3; enableButton.setLayoutData(data); whs.setHelp(enableButton, ContextIds.AUDIO_PREFERENCES_ENABLE); final Label volumeLabel = new Label(composite, SWT.NONE); volumeLabel.setText(Messages.audioPrefVolume); data = new GridData(); data.horizontalIndent = 20; volumeLabel.setLayoutData(data); volumeLabel.setEnabled(enableButton.getSelection()); volume = new Spinner(composite, SWT.BORDER); volume.setMinimum(0); volume.setMaximum(20); volume.setSelection(AudioCore.getInstance().getVolume()); data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); data.horizontalSpan = 2; data.widthHint = 60; volume.setLayoutData(data); volume.setEnabled(enableButton.getSelection()); whs.setHelp(volume, ContextIds.AUDIO_PREFERENCES_VOLUME); enableButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { volumeLabel.setEnabled(enableButton.getSelection()); volume.setEnabled(enableButton.getSelection()); } }); Label label = new Label(composite, SWT.NONE); data = new GridData(); data.horizontalSpan = 3; label.setLayoutData(data); label = new Label(composite, SWT.NONE); label.setText(Messages.audioPrefSounds); data = new GridData(); data.horizontalSpan = 3; label.setLayoutData(data); final Table table = new Table(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION | SWT.CHECK); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 2; table.setLayoutData(data); whs.setHelp(table, ContextIds.AUDIO_PREFERENCES_SOUNDS_TABLE); viewer = new CategoryTableViewer(table); TableLayout tableLayout = new TableLayout(); table.setLayout(tableLayout); table.setHeaderVisible(true); tableLayout.addColumnData(new ColumnPixelData(23, false)); TableColumn col = new TableColumn(table, SWT.CENTER, 0); col.setResizable(false); tableLayout.addColumnData(new ColumnWeightData(11, 110, true)); col = new TableColumn(table, SWT.NONE, 1); col.setText(Messages.audioPrefSound); col.setResizable(true); tableLayout.addColumnData(new ColumnWeightData(15, 150, true)); col = new TableColumn(table, SWT.NONE, 2); col.setText(Messages.audioPrefFile); col.setResizable(true); viewer.setContentProvider(new AudioTableContentProvider()); viewer.setLabelProvider(new AudioTableLabelProvider(this)); viewer.setInput("root"); setCheckState(viewer); viewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { boolean checked = event.getChecked(); Object obj = event.getElement(); if (obj instanceof String) { String id = (String) obj; core.setCategoryEnabled(id, checked); //viewer.refresh(); Iterator iterator = AudioTableContentProvider.getSoundsByCategory(id).iterator(); while (iterator.hasNext()) { Sound s = (Sound) iterator.next(); viewer.setChecked(s, checked); core.setSoundEnabled(s.getId(), checked); } } else { Sound sound = (Sound) obj; core.setSoundEnabled(sound.getId(), checked); } } }); Composite right = new Composite(composite, SWT.NONE); layout = new GridLayout(); layout.numColumns = 1; layout.horizontalSpacing = convertHorizontalDLUsToPixels(4); layout.verticalSpacing = convertVerticalDLUsToPixels(4); layout.marginWidth = 0; layout.marginHeight = 0; right.setLayout(layout); data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_FILL); right.setLayoutData(data); // play button and table selection listener final Button playButton = SWTUtil.createButton(right, Messages.audioPrefPlay); playButton.setEnabled(false); whs.setHelp(playButton, ContextIds.AUDIO_PREFERENCES_PLAY); final Button browseButton = SWTUtil.createButton(right, Messages.audioPrefBrowse); browseButton.setEnabled(false); whs.setHelp(browseButton, ContextIds.AUDIO_PREFERENCES_BROWSE); final Button resetButton = SWTUtil.createButton(right, Messages.audioPrefReset); resetButton.setEnabled(false); whs.setHelp(resetButton, ContextIds.AUDIO_PREFERENCES_RESET); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { try { IStructuredSelection sel = (IStructuredSelection) event.getSelection(); Object obj = sel.getFirstElement(); if (obj instanceof Sound) { Sound sound = (Sound) obj; URL url = getSoundURL(sound.getId()); if (url != null && soundAvailable) playButton.setEnabled(true); else playButton.setEnabled(false); browseButton.setEnabled(true); if (getUserSoundPath(sound.getId()) != null) resetButton.setEnabled(true); else resetButton.setEnabled(false); } else { playButton.setEnabled(false); browseButton.setEnabled(false); resetButton.setEnabled(false); } } catch (Exception ex) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, "Error in table selection", ex); } } } }); soundAvailable = AudioCore.isAudioSupported(); if (soundAvailable) { playButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { int sel = table.getSelectionIndex(); Sound sound = (Sound) table.getItem(sel).getData(); AudioCore.playSound(getSoundURL(sound.getId()), volume.getSelection()); } catch (Exception ex) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, "Error in table selection", ex); } } } }); } else playButton.setEnabled(false); browseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { IPath path = chooseAudioFile(); if (path != null) { int sel = table.getSelectionIndex(); Sound sound = (Sound) table.getItem(sel).getData(); setUserSoundPath(sound.getId(), path); viewer.refresh(sound); playButton.setEnabled(true); } } catch (Exception ex) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, "Error browsing", ex); } } } }); resetButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { int sel = table.getSelectionIndex(); Sound sound = (Sound) table.getItem(sel).getData(); removeUserSoundPath(sound.getId()); viewer.refresh(sound); //playButton.setEnabled(true); } catch (Exception ex) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, "Error reseting sound", ex); } } } }); Dialog.applyDialogFont(composite); return composite; } protected void setCheckState(CheckboxTableViewer viewer) { AudioCore core = AudioCore.getInstance(); Map<String, String> categories = core.getCategories(); // first, find all the categories and sort List<String> cats = new ArrayList<String>(); Iterator iterator = categories.keySet().iterator(); while (iterator.hasNext()) cats.add((String)iterator.next()); // list them, ignoring empty ones iterator = categories.keySet().iterator(); while (iterator.hasNext()) { String id = (String) iterator.next(); List l = AudioTableContentProvider.getSoundsByCategory(id); if (!l.isEmpty()) { if (core.isCategoryEnabled(id)) viewer.setChecked(id, true); int size = l.size(); for (int i = 0; i < size; i++) { Sound s = (Sound) l.get(i); if (core.isSoundEnabled(s.getId())) viewer.setChecked(s, true); } } } // finally, list the "misc" sounds List l = AudioTableContentProvider.getSoundsByCategory(null); if (!l.isEmpty()) { int size = l.size(); for (int i = 0; i < size; i++) { Sound s = (Sound) l.get(i); if (core.isSoundEnabled(s.getId())) viewer.setChecked(s, true); } } } /** * * @return org.eclipse.core.runtime.IPath * @param id java.lang.String */ protected URL getSoundURL(String id) { try { IPath path = userSoundMap.get(id); if (path != null) return path.toFile().toURL(); } catch (Exception e) { // ignore } return AudioCore.getInstance().getSound(id).getLocation(); } /** * * @return org.eclipse.core.runtime.IPath * @param id java.lang.String */ protected IPath getUserSoundPath(String id) { try { IPath path = userSoundMap.get(id); if (path != null) return path; } catch (Exception e) { // ignore } return null; } /** * Initializes this preference page for the given workbench. * <p> * This method is called automatically as the preference page is being created * and initialized. Clients must not call this method. * </p> * * @param workbench the workbench */ public void init(IWorkbench workbench) { // do nothing } /** * */ protected void loadUserMapInfo() { // create a copy of the user sound map Map<String, IPath> map = AudioCore.getInstance().getUserSoundMap(); userSoundMap = new HashMap<String, IPath>(map.size()); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String id = (String) iterator.next(); IPath path = map.get(id); userSoundMap.put(id, path); } } /** * @see PreferencePage#performDefaults() */ protected void performDefaults() { AudioCore core = AudioCore.getInstance(); enableButton.setSelection(core.getDefaultSoundsEnabled()); volume.setSelection(core.getDefaultVolume()); userSoundMap = new HashMap<String, IPath>(); viewer.refresh(); super.performDefaults(); } /** * @see PreferencePage#performOk() */ public boolean performOk() { AudioCore core = AudioCore.getInstance(); core.setSoundsEnabled(enableButton.getSelection()); core.setVolume(volume.getSelection()); core.setUserSoundMap(userSoundMap); viewer.refresh(); return super.performOk(); } /** * */ protected void removeUserSoundPath(String id) { if (userSoundMap.containsKey(id)) userSoundMap.remove(id); } /** * */ protected void saveUserMapInfo() { // create a copy of the user sound map Map map = AudioCore.getInstance().getUserSoundMap(); userSoundMap = new HashMap<String, IPath>(map.size()); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String id = (String) iterator.next(); IPath path = (IPath) map.get(id); userSoundMap.put(id, path); } } /** * * @param path org.eclipse.core.runtime.IPath */ protected void setUserSoundPath(String id, IPath path) { userSoundMap.put(id, path); } }