| /******************************************************************************* |
| * 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); |
| } |
| } |