/******************************************************************************* * Copyright (c) 2009 Paul VanderLei, Simon Archer, Jeff McAffer and others. All * rights reserved. This program and the accompanying materials are made available * under the terms of the Eclipse Public License v1.0 and Eclipse Distribution License * v1.0 which accompanies this distribution. The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution License * is available at http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Paul VanderLei, Simon Archer, Jeff McAffer - initial API and implementation *******************************************************************************/ package org.eclipse.examples.toast.internal.swt.audio; import org.eclipse.examples.toast.core.LogUtility; import org.eclipse.examples.toast.crust.shell.DisplayBlock; import org.eclipse.examples.toast.crust.shell.ICrustScreenListener; import org.eclipse.examples.toast.crust.shell.ICrustShell; import org.eclipse.examples.toast.crust.shell.ScaledWidgetFactory; import org.eclipse.examples.toast.crust.widgets.ImageButton; import org.eclipse.examples.toast.crust.widgets.ImageProgressBar; import org.eclipse.examples.toast.crust.widgets.ImageSlider; import org.eclipse.examples.toast.dev.amplifier.IAmplifier; import org.eclipse.examples.toast.dev.amplifier.IAmplifierListener; import org.eclipse.examples.toast.dev.cdplayer.ICdPlayer; import org.eclipse.examples.toast.dev.radio.IRadio; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; public class AudioScreen implements IAmplifierListener, SelectionListener, ICrustScreenListener { private static final int SLOT = 5; private static final String TOPBAR_ICON_ON_IMAGE = "artwork/NoteOn.png"; //$NON-NLS-1$ private static final String TOPBAR_ICON_OFF_IMAGE = "artwork/NoteOff.png"; //$NON-NLS-1$ private static final int[] VOLUME_BAR_POSITIONS = {0, 17, 28, 39, 50, 61, 72, 83, 94, 105, 120}; private static final String AUDIO_PANEL_IMAGE = "artwork/AudioPanel.png"; //$NON-NLS-1$ private static final String DOWN_DOWN_IMAGE = "artwork/DownDown.png"; //$NON-NLS-1$ private static final String DOWN_UP_IMAGE = "artwork/DownUp.png"; //$NON-NLS-1$ private static final String LEFT_DOWN_IMAGE = "artwork/LeftDown.png"; //$NON-NLS-1$ private static final String LEFT_UP_IMAGE = "artwork/LeftUp.png"; //$NON-NLS-1$ private static final String MUTE_DEPRESSED_IMAGE = "artwork/MuteDownOff.png"; //$NON-NLS-1$ private static final String MUTE_ON_IMAGE = "artwork/MuteDownOn.png"; //$NON-NLS-1$ private static final String MUTE_OFF_IMAGE = "artwork/MuteUpOff.png"; //$NON-NLS-1$ private static final String RIGHT_DOWN_IMAGE = "artwork/RightDown.png"; //$NON-NLS-1$ private static final String RIGHT_UP_IMAGE = "artwork/RightUp.png"; //$NON-NLS-1$ private static final String CD_DOWN_OFF_IMAGE = "artwork/CdDownOff.png"; //$NON-NLS-1$ private static final String CD_DOWN_ON_IMAGE = "artwork/CdDownOn.png"; //$NON-NLS-1$ private static final String CD_UP_OFF_IMAGE = "artwork/CdUpOff.png"; //$NON-NLS-1$ private static final String RADIO_DOWN_OFF_IMAGE = "artwork/RadioDownOff.png"; //$NON-NLS-1$ private static final String RADIO_DOWN_ON_IMAGE = "artwork/RadioDownOn.png"; //$NON-NLS-1$ private static final String RADIO_UP_OFF_IMAGE = "artwork/RadioUpOff.png"; //$NON-NLS-1$ private static final String SLIDER_HORIZ_IMAGE = "artwork/SliderHoriz.png"; //$NON-NLS-1$ private static final String SLIDER_VERT_IMAGE = "artwork/SliderVert.png"; //$NON-NLS-1$ private static final String SLIDER_HORIZ_BAR_IMAGE = "artwork/SliderHorizBar.png"; //$NON-NLS-1$ private static final String SLIDER_VERT_BAR_IMAGE = "artwork/SliderVertBar.png"; //$NON-NLS-1$ private static final String HORIZ_SLIDER_BACKGROUND_IMAGE = "artwork/HorzSliderBackground.png"; //$NON-NLS-1$ private static final String VERT_SLIDER_BACKGROUND_IMAGE = "artwork/VertSliderBackground.png"; //$NON-NLS-1$ private static final String UP_DOWN_IMAGE = "artwork/UpDown.png"; //$NON-NLS-1$ private static final String UP_UP_IMAGE = "artwork/UpUp.png"; //$NON-NLS-1$ private static final String VOLUME_BAR_IMAGE = "artwork/VolumeBar.png"; //$NON-NLS-1$ private static final String VOLUME_DEC_DOWN_IMAGE = "artwork/VolumeDecDown.png"; //$NON-NLS-1$ private static final String VOLUME_DEC_UP_IMAGE = "artwork/VolumeDecUp.png"; //$NON-NLS-1$ private static final String VOLUME_INC_DOWN_IMAGE = "artwork/VolumeIncDown.png"; //$NON-NLS-1$ private static final String VOLUME_INC_UP_IMAGE = "artwork/VolumeIncUp.png"; //$NON-NLS-1$ private static final String BALANCE_ON_IMAGE = "artwork/BalanceOn.png"; //$NON-NLS-1$ private static final String BALANCE_OFF_IMAGE = "artwork/BalanceOff.png"; //$NON-NLS-1$ private static final String FADE_ON_IMAGE = "artwork/FadeOn.png"; //$NON-NLS-1$ private static final String FADE_OFF_IMAGE = "artwork/FadeOff.png"; //$NON-NLS-1$ private static final String TREBLE_ON_IMAGE = "artwork/TrebleOn.png"; //$NON-NLS-1$ private static final String TREBLE_OFF_IMAGE = "artwork/TrebleOff.png"; //$NON-NLS-1$ private static final String BASS_ON_IMAGE = "artwork/BassOn.png"; //$NON-NLS-1$ private static final String BASS_OFF_IMAGE = "artwork/BassOff.png"; //$NON-NLS-1$ private static final int REFERENCE_WIDTH = 640; private static final int REFERENCE_HEIGHT = 400; private ICrustShell crustShell; private IAmplifier amplifier; private ScaledWidgetFactory f; private RadioSubscreen radioSubscreen; private CdSubscreen cdSubscreen; private Composite screenComposite, controlComposite, audioComposite, cdComposite, radioComposite; private StackLayout audioStackLayout; private ImageButton cdButton; private ImageButton radioButton; private ImageProgressBar volumeBar; private ImageButton volumeUpButton, volumeDownButton; private ImageButton muteButton; private Composite adjustStackComposite; private StackLayout adjustStackLayout; private Composite trebleComposite, bassComposite, balanceComposite, fadeComposite; private ImageSlider trebleSlider; private ImageButton trebleButton, trebleUpButton, trebleDownButton; private ImageSlider bassSlider; private ImageButton bassButton, bassUpButton, bassDownButton; private ImageSlider balanceSlider; private ImageButton balanceButton, balanceLeftButton, balanceRightButton; private ImageSlider fadeSlider; private ImageButton fadeButton, fadeFrontButton, fadeBackButton; private IRadio radio; private ICdPlayer cd; public void setShell(ICrustShell value) { crustShell = value; } public void setAmp(IAmplifier value) { amplifier = value; } public void setRadio(IRadio value) { radio = value; } public void setCd(ICdPlayer value) { cd = value; } public void startup() { screenComposite = crustShell.installScreen(SLOT, this.getClass(), TOPBAR_ICON_OFF_IMAGE, TOPBAR_ICON_ON_IMAGE, null, this); new DisplayBlock() { public void run() { populateScreenComposite(); } }.sync(); amplifier.addListener(this); radioSubscreen = new RadioSubscreen(radioComposite); radioSubscreen.bind(crustShell, radio); cdSubscreen = new CdSubscreen(cdComposite); cdSubscreen.bind(crustShell, cd); updateWidgetsFromModel(); } public void shutdown() { crustShell.deactivateScreen(SLOT, this); cdSubscreen.unbind(); radioSubscreen.unbind(); amplifier.removeListener(this); new DisplayBlock() { public void run() { unpopulateScreenComposite(); } }.sync(); crustShell.uninstallScreen(SLOT, this); } // IAmplifierListener implementation public void balanceChanged(int balance) { updateBalance(); } public void bassChanged(int bass) { updateBass(); } public void fadeChanged(int fade) { updateFade(); } public void modeChanged(int mode) { updateDeviceFrame(); } public void trebleChanged(int treble) { updateTreble(); } public void volumeChanged(int volume) { updateVolume(); } public void muteChanged(boolean isMuted) { updateMute(); } // Private // screen events private void updateWidgetsFromModel() { updateVolume(); updateBass(); updateTreble(); updateBalance(); updateFade(); updateDeviceFrame(); } // update screen from model private void updateDeviceFrame() { new DisplayBlock() { public void run() { if (amplifier.getMode() == IAmplifier.MODE_CD) { radioButton.setSelection(false); cdButton.setSelection(true); audioStackLayout.topControl = cdComposite; audioComposite.layout(); } else { cdButton.setSelection(false); radioButton.setSelection(true); audioStackLayout.topControl = radioComposite; audioComposite.layout(); } } }.sync(); } private void updateAdjuster(final Composite composite) { new DisplayBlock() { public void run() { adjustStackLayout.topControl = composite; adjustStackComposite.layout(); } }.sync(); } private void updateVolume() { int length = VOLUME_BAR_POSITIONS.length - 1; final int index = (amplifier.getVolume() * length) / amplifier.getMaxVolume(); new DisplayBlock() { public void run() { volumeBar.setSelection(VOLUME_BAR_POSITIONS[index]); } }.sync(); } private void updateMute() { final boolean isMuted = amplifier.isMuted(); new DisplayBlock() { public void run() { muteButton.setSelection(isMuted); } }.sync(); } private void updateTreble() { new DisplayBlock() { public void run() { trebleSlider.setSelection((amplifier.getTreble() - amplifier.getMinTreble()) * 100 / (amplifier.getMaxTreble() - amplifier.getMinTreble())); } }.sync(); } private void updateBalance() { new DisplayBlock() { public void run() { balanceSlider.setSelection((amplifier.getBalance() - amplifier.getMinBalance()) * 100 / (amplifier.getMaxBalance() - amplifier.getMinBalance())); } }.sync(); } private void updateFade() { new DisplayBlock() { public void run() { fadeSlider.setSelection((amplifier.getFade() - amplifier.getMinFade()) * 100 / (amplifier.getMaxFade() - amplifier.getMinFade())); } }.sync(); } private void updateBass() { new DisplayBlock() { public void run() { bassSlider.setSelection((amplifier.getBass() - amplifier.getMinBass()) * 100 / (amplifier.getMaxBass() - amplifier.getMinBass())); } }.sync(); } private void populateScreenComposite() { f = new ScaledWidgetFactory(this.getClass(), screenComposite.getSize(), REFERENCE_HEIGHT, REFERENCE_WIDTH); controlComposite = f.createComposite(screenComposite, SWT.NONE, 0, 0, 215, 400, AUDIO_PANEL_IMAGE, null); muteButton = f.createImageButton(controlComposite, SWT.PUSH, 32, 19, 62, 49, MUTE_OFF_IMAGE, MUTE_ON_IMAGE, MUTE_DEPRESSED_IMAGE, true, this); volumeUpButton = f.createImageButton(controlComposite, SWT.PUSH, 14, 50, 66, 67, VOLUME_INC_UP_IMAGE, VOLUME_INC_DOWN_IMAGE, true, this); volumeDownButton = f.createImageButton(controlComposite, SWT.PUSH, 14, 117, 66, 67, VOLUME_DEC_UP_IMAGE, VOLUME_DEC_DOWN_IMAGE, true, this); volumeBar = f.createImageProgressBar(controlComposite, SWT.HORIZONTAL | SWT.LEFT_TO_RIGHT, 31, 179, 121, 37, VOLUME_BAR_IMAGE); volumeBar.setMaximum(120); audioStackLayout = new StackLayout(); audioComposite = f.createComposite(screenComposite, SWT.NONE, 215, 0, 425, 400, null, audioStackLayout); cdButton = f.createImageButton(controlComposite, SWT.PUSH, 120, 30, 72, 67, CD_UP_OFF_IMAGE, CD_DOWN_ON_IMAGE, CD_DOWN_OFF_IMAGE, false, this); cdComposite = f.createComposite(audioComposite, SWT.NONE, 0, 0, 425, 400); radioButton = f.createImageButton(controlComposite, SWT.PUSH, 120, 97, 60, 71, RADIO_UP_OFF_IMAGE, RADIO_DOWN_ON_IMAGE, RADIO_DOWN_OFF_IMAGE, false, this); radioComposite = f.createComposite(audioComposite, SWT.NONE, 0, 0, 425, 400); adjustStackLayout = new StackLayout(); adjustStackComposite = f.createComposite(controlComposite, SWT.NONE, 15, 256, 139, 106, null, adjustStackLayout); balanceButton = f.createImageButton(controlComposite, SWT.RADIO, 15, 225, 69, 31, BALANCE_OFF_IMAGE, BALANCE_ON_IMAGE, false, this); balanceComposite = createAdjustComposite(true); balanceSlider = createAdjustImageSlider(balanceComposite, SWT.HORIZONTAL | SWT.LEFT_TO_RIGHT); balanceLeftButton = f.createImageButton(balanceComposite, SWT.PUSH, 20, 49, 46, 52, LEFT_UP_IMAGE, LEFT_DOWN_IMAGE, true, this); balanceRightButton = f.createImageButton(balanceComposite, SWT.PUSH, 73, 49, 46, 52, RIGHT_UP_IMAGE, RIGHT_DOWN_IMAGE, true, this); fadeButton = f.createImageButton(controlComposite, SWT.RADIO, 84, 225, 70, 31, FADE_OFF_IMAGE, FADE_ON_IMAGE, false, this); fadeComposite = createAdjustComposite(false); fadeSlider = createAdjustImageSlider(fadeComposite, SWT.VERTICAL | SWT.UP); fadeFrontButton = f.createImageButton(fadeComposite, SWT.PUSH, 14, 5, 52, 46, UP_UP_IMAGE, UP_DOWN_IMAGE, true, this); fadeBackButton = f.createImageButton(fadeComposite, SWT.PUSH, 14, 53, 52, 46, DOWN_UP_IMAGE, DOWN_DOWN_IMAGE, true, this); trebleButton = f.createImageButton(controlComposite, SWT.RADIO, 15, 362, 69, 32, TREBLE_OFF_IMAGE, TREBLE_ON_IMAGE, false, this); trebleComposite = createAdjustComposite(false); trebleSlider = createAdjustImageSlider(trebleComposite, SWT.VERTICAL | SWT.UP); trebleUpButton = f.createImageButton(trebleComposite, SWT.PUSH, 14, 5, 52, 46, UP_UP_IMAGE, UP_DOWN_IMAGE, true, this); trebleDownButton = f.createImageButton(trebleComposite, SWT.PUSH, 14, 53, 52, 46, DOWN_UP_IMAGE, DOWN_DOWN_IMAGE, true, this); bassButton = f.createImageButton(controlComposite, SWT.RADIO, 84, 362, 70, 32, BASS_OFF_IMAGE, BASS_ON_IMAGE, false, this); bassComposite = createAdjustComposite(false); bassSlider = createAdjustImageSlider(bassComposite, SWT.VERTICAL | SWT.UP); bassUpButton = f.createImageButton(bassComposite, SWT.PUSH, 14, 5, 52, 46, UP_UP_IMAGE, UP_DOWN_IMAGE, true, this); bassDownButton = f.createImageButton(bassComposite, SWT.PUSH, 14, 53, 52, 46, DOWN_UP_IMAGE, DOWN_DOWN_IMAGE, true, this); // pick the balance as the top adjuster balanceButton.setSelection(true); updateAdjuster(balanceComposite); } private void unpopulateScreenComposite() { f.disposeImageButtonImages(bassDownButton); f.disposeImageButtonImages(bassUpButton); disposeAdjustImageSliderImages(bassSlider); disposeAdjustCompositeImage(bassComposite); f.disposeImageButtonImages(bassButton); f.disposeImageButtonImages(trebleDownButton); f.disposeImageButtonImages(trebleUpButton); disposeAdjustImageSliderImages(trebleSlider); disposeAdjustCompositeImage(trebleComposite); f.disposeImageButtonImages(trebleButton); f.disposeImageButtonImages(fadeBackButton); f.disposeImageButtonImages(fadeFrontButton); disposeAdjustImageSliderImages(fadeSlider); disposeAdjustCompositeImage(fadeComposite); f.disposeImageButtonImages(fadeButton); f.disposeImageButtonImages(balanceRightButton); f.disposeImageButtonImages(balanceLeftButton); disposeAdjustImageSliderImages(balanceSlider); disposeAdjustCompositeImage(balanceComposite); f.disposeImageButtonImages(balanceButton); f.disposeCompositeImage(adjustStackComposite); adjustStackLayout = null; f.disposeCompositeImage(radioComposite); f.disposeImageButtonImages(radioButton); f.disposeCompositeImage(cdComposite); f.disposeImageButtonImages(cdButton); f.disposeCompositeImage(audioComposite); audioStackLayout = null; f.disposeImageProgressBarImage(volumeBar); f.disposeImageButtonImages(volumeDownButton); f.disposeImageButtonImages(volumeUpButton); f.disposeImageButtonImages(muteButton); f.disposeCompositeImage(controlComposite); f = null; } private Composite createAdjustComposite(boolean isHorizontal) { Composite comp = new Composite(adjustStackComposite, SWT.NONE); comp.setBounds(f.getScaledBounds(0, 0, 139, 106)); comp.setBackgroundImage(f.getSizedImageForWidget(isHorizontal ? HORIZ_SLIDER_BACKGROUND_IMAGE : VERT_SLIDER_BACKGROUND_IMAGE, comp)); return comp; } private void disposeAdjustCompositeImage(Composite composite) { Image image = composite.getBackgroundImage(); if (image != null) image.dispose(); } private ImageSlider createAdjustImageSlider(Composite parent, int style) { boolean horizontal = ((style & SWT.HORIZONTAL) != 0); ImageSlider slider = new ImageSlider(parent, style); if (horizontal) { slider.setBounds(f.getScaledBounds(29, 12, 84, 25)); Point size = slider.getSize(); slider.setImages(f.getSizedImageForWidget(SLIDER_HORIZ_BAR_IMAGE, slider), f.getSizedImage(SLIDER_HORIZ_IMAGE, 7 * size.x / 84, 19 * size.y / 25)); } else { slider.setBounds(f.getScaledBounds(88, 11, 25, 84)); Point size = slider.getSize(); slider.setImages(f.getSizedImageForWidget(SLIDER_VERT_BAR_IMAGE, slider), f.getSizedImage(SLIDER_VERT_IMAGE, 19 * size.x / 25, 7 * size.y / 84)); } return slider; } private void disposeAdjustImageSliderImages(ImageSlider slider) { Image[] images = slider.getImages(); if (images[0] != null) images[0].dispose(); if (images[1] != null) images[1].dispose(); } public void widgetDefaultSelected(SelectionEvent arg0) { } public void widgetSelected(SelectionEvent e) { if (cdButton == e.widget) { amplifier.setMode(IAmplifier.MODE_CD); } else if (radioButton == e.widget) { amplifier.setMode(IAmplifier.MODE_FM); } else if (volumeUpButton == e.widget) { amplifier.volumeUp(); } else if (volumeDownButton == e.widget) { amplifier.volumeDown(); } else if (bassUpButton == e.widget) { amplifier.bassUp(); } else if (bassDownButton == e.widget) { amplifier.bassDown(); } else if (trebleUpButton == e.widget) { amplifier.trebleUp(); } else if (trebleDownButton == e.widget) { amplifier.trebleDown(); } else if (balanceRightButton == e.widget) { amplifier.balanceRight(); } else if (balanceLeftButton == e.widget) { amplifier.balanceLeft(); } else if (fadeFrontButton == e.widget) { amplifier.fadeFront(); } else if (fadeBackButton == e.widget) { amplifier.fadeBack(); } else if (balanceButton == e.widget & balanceButton.getSelection()) { updateAdjuster(balanceComposite); adjustStackComposite.layout(); } else if (bassButton == e.widget & bassButton.getSelection()) { updateAdjuster(bassComposite); } else if (fadeButton == e.widget & fadeButton.getSelection()) { updateAdjuster(fadeComposite); } else if (trebleButton == e.widget & trebleButton.getSelection()) { updateAdjuster(trebleComposite); } else if (muteButton == e.widget) { amplifier.toggleMute(); } } public void activate() { updateWidgetsFromModel(); LogUtility.logDebug(this, "activated"); } public void deactivate() { LogUtility.logDebug(this, "deactivated"); } }