/* * @(#)DefaultControlPanel.java 1.55 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.ui; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.media.*; import com.sun.media.controls.*; import com.sun.media.util.*; import javax.media.format.*; import javax.media.format.*; import javax.media.format.*; import javax.media.control.*; public class DefaultControlPanel extends BufferedPanelLight implements ActionListener, ItemListener, ControllerListener, GainChangeListener, ComponentListener { /************************************************************************* * Variables *************************************************************************/ static final Color colorBackground = new Color(192, 192, 192); private static final String MENU_PROPERTIES = JMFI18N.getResource("mediaplayer.properties"); private static final String MENU_RATE_1_4 = JMFI18N.getResource("mediaplayer.rate.1:4"); private static final String MENU_RATE_1_2 = JMFI18N.getResource("mediaplayer.rate.1:2"); private static final String MENU_RATE_1_1 = JMFI18N.getResource("mediaplayer.rate.1:1"); private static final String MENU_RATE_2_1 = JMFI18N.getResource("mediaplayer.rate.2:1"); private static final String MENU_RATE_4_1 = JMFI18N.getResource("mediaplayer.rate.4:1"); private static final String MENU_RATE_8_1 = JMFI18N.getResource("mediaplayer.rate.8:1"); private static final String MENU_MEDIA = JMFI18N.getResource("mediaplayer.menu.media"); private static final String MENU_AUDIO = JMFI18N.getResource("mediaplayer.menu.audio"); private static final String MENU_VIDEO = JMFI18N.getResource("mediaplayer.menu.video"); Player player; Frame parentFrame = null; Container container = null; TransparentPanel panelLeft; TransparentPanel panelRight; TransparentPanel panelProgress; boolean boolAdded = false; ButtonComp buttonPlay = null; ButtonComp buttonStepBack = null; ButtonComp buttonStepFwd = null; AudioButton buttonAudio = null; ButtonComp buttonMedia = null; ProgressSlider progressSlider = null; CheckboxMenuItem menuItemCheck = null; PopupMenu menuPopup = null; WindowListener wl = null; private boolean firstTime = true; private boolean started = false; private Integer localLock = new Integer(0); GainControlComponent audioControls = null; PropertySheet propsSheet = null; // PopupMenu rateMenu = null; // Controls javax.media.control.FramePositioningControl controlFrame = null; ProgressControl progressControl = null; GainControl gainControl = null; SliderRegionControl regionControl = null; String urlName = null; long lFrameStep = 0; private CheckboxMenuItem menuRate_1_4 = null; private CheckboxMenuItem menuRate_1_2 = null; private CheckboxMenuItem menuRate_1_1 = null; private CheckboxMenuItem menuRate_2_1 = null; private CheckboxMenuItem menuRate_4_1 = null; private CheckboxMenuItem menuRate_8_1 = null; private Vector vectorTracksAudio = new Vector (); private Vector vectorTracksVideo = new Vector (); private int pausecnt = -1; private boolean resetMediaTimeinPause = false; /************************************************************************* * Methods *************************************************************************/ public DefaultControlPanel(Player player) { this.player = player; try { init (); } catch ( Exception exception ) { exception.printStackTrace (); } } public void addNotify () { boolean boolLightweight = true; Container containerParent; java.awt.peer.ComponentPeer compPeer; if ( boolAdded == false ) { containerParent = this.getParent (); while ( containerParent != null && boolLightweight == true ) { compPeer = containerParent.getPeer (); containerParent = containerParent.getParent (); if ( containerParent == null ) break; if ( compPeer != null && !(compPeer instanceof java.awt.peer.LightweightPeer) ) boolLightweight = false; } if ( container != null ) { container.remove ( panelLeft ); container.remove ( panelRight ); container.remove ( panelProgress ); if ( container != this ) this.remove ( container ); } if ( boolLightweight == true ) { container = this; } else { container = new BufferedPanel ( new BorderLayout() ); container.setBackground(colorBackground); ((BufferedPanel)container).setBackgroundTile ( BasicComp.fetchImage("texture3.gif") ); this.add ( container, BorderLayout.CENTER ); } container.add ( panelLeft, BorderLayout.WEST ); container.add ( panelRight, BorderLayout.EAST ); container.add ( panelProgress, BorderLayout.CENTER ); boolAdded = true; } setVisible ( true ); super.addNotify (); this.validate (); } public void removeNotify () { // cleanUp(); super.removeNotify (); if ( boolAdded == true ) { // container.remove ( panelLeft ); // container.remove ( panelRight ); // container.remove ( panelProgress ); // if ( container != this ) // this.remove ( container ); boolAdded = false; } } // added by hsy for FlashDefaultControlPanel protected void removePlayButton() { panelLeft.remove(buttonPlay); } private void init () throws Exception { Time duration; Dimension dim; int i; int nCount; Control arrControls []; TrackControl trackControl; Format format; VideoFormat formatVideo; float frameRate; MenuItem menuItem; boolean boolEnable; getPlayerControls(); if (gainControl != null) gainControl.addGainChangeListener ( this ); setBackground(colorBackground); setLayout ( new BorderLayout() ); this.addComponentListener ( this ); container = this; panelLeft = new TransparentPanel ( new GridLayout(1,0) ); container.add ( panelLeft, BorderLayout.WEST ); panelRight = new TransparentPanel ( new GridLayout(1,0) ); container.add ( panelRight, BorderLayout.EAST ); panelProgress = new TransparentPanel ( new BorderLayout() ); container.add ( panelProgress, BorderLayout.CENTER ); buttonPlay = new ButtonComp ( "Play", "play.gif", "play-active.gif", "play-pressed.gif", "play-disabled.gif", "pause.gif", "pause-active.gif", "pause-pressed.gif", "pause-disabled.gif" ); buttonPlay.setActionListener ( this ); panelLeft.add ( buttonPlay ); // if ( player instanceof com.sun.media.BasicPlayer // && ((com.sun.media.BasicPlayer)player).isFramePositionable() ) { if ( controlFrame != null ) { buttonStepBack = new ButtonComp ( "StepBack", "step-back.gif", "step-back-active.gif", "step-back-pressed.gif", "step-back-disabled.gif", "step-back.gif", "step-back-active.gif", "step-back-pressed.gif", "step-back-disabled.gif" ); buttonStepBack.setActionListener ( this ); buttonStepBack.setContMousePress ( true ); panelLeft.add ( buttonStepBack ); buttonStepFwd = new ButtonComp ( "StepForward", "step-fwd.gif", "step-fwd-active.gif", "step-fwd-pressed.gif", "step-fwd-disabled.gif", "step-fwd.gif", "step-fwd-active.gif", "step-fwd-pressed.gif", "step-fwd-disabled.gif" ); buttonStepFwd.setActionListener ( this ); buttonStepFwd.setContMousePress ( true ); panelLeft.add ( buttonStepFwd ); } if (gainControl != null) { buttonAudio = new AudioButton ( gainControl ); buttonAudio.setActionListener ( this ); panelRight.add ( buttonAudio ); } buttonMedia = new ButtonComp ( "Media", "media.gif", "media-active.gif", "media-pressed.gif", "media-disabled.gif", "media.gif", "media-active.gif", "media-pressed.gif", "media-disabled.gif" ); buttonMedia.setActionListener ( this ); panelRight.add ( buttonMedia ); progressSlider = new ProgressSlider( "mediatime", this, player ); progressSlider.setActionListener ( this ); panelProgress.add ( progressSlider, BorderLayout.CENTER ); duration = player.getDuration (); if (duration == Duration.DURATION_UNBOUNDED || duration == Duration.DURATION_UNKNOWN ) progressSlider.setEnabled(false); updateButtonState (); // Add GUI controls for audio /* if (gainControl != null) { audioControls = new GainControlComponent(gainControl); add(audioControls); minimumWidth += audioControls.getPreferredSize().width; } */ validate(); dim = this.getPreferredSize (); this.setSize ( dim ); setVisible ( true ); setBackgroundTile ( BasicComp.fetchImage("texture3.gif") ); player.addControllerListener ( this ); arrControls = player.getControls (); nCount = arrControls.length; for ( i = 0; i < nCount; i++ ) { if ( !(arrControls[i] instanceof TrackControl) ) continue; trackControl = (TrackControl) arrControls[i]; format = trackControl.getFormat (); if ( format instanceof AudioFormat ) { vectorTracksAudio.addElement ( trackControl ); } else if ( format instanceof VideoFormat ) { vectorTracksVideo.addElement ( trackControl ); formatVideo = (VideoFormat) format; frameRate = formatVideo.getFrameRate (); lFrameStep = (long)(Time.ONE_SECOND / frameRate); } } menuPopup = new PopupMenu ( MENU_MEDIA ); buttonMedia.setPopupMenu ( menuPopup ); nCount = vectorTracksAudio.size (); // The audio icon for the first enabled track is // enabled. For all the remaining tracks, the // audio icon is set to muted state. boolean aTrackAudioIconEnabled = false; if ( nCount > 1 ) { for ( i = 0; i < nCount; i++ ) { trackControl = (TrackControl)vectorTracksAudio.elementAt ( i ); boolEnable = false; if (!aTrackAudioIconEnabled && trackControl.isEnabled()) { aTrackAudioIconEnabled = true; boolEnable = true; } menuItemCheck = new CheckboxMenuItem ( MENU_AUDIO + " " + i, boolEnable ); muteAudioTrack ( trackControl, !boolEnable ); menuItemCheck.addItemListener ( this ); menuPopup.add ( menuItemCheck ); } menuPopup.addSeparator (); } /* nCount = vectorTracksVideo.size (); if ( nCount > 1 ) { for ( i = 0; i < nCount; i++ ) { menuItemCheck = new CheckboxMenuItem ( "Video " + i, true ); menuItemCheck.addItemListener ( this ); menuPopup.add ( menuItemCheck ); } menuPopup.addSeparator (); } */ menuRate_1_4 = new CheckboxMenuItem ( MENU_RATE_1_4, false ); menuRate_1_4.addItemListener ( this ); menuPopup.add ( menuRate_1_4 ); menuRate_1_2 = new CheckboxMenuItem ( MENU_RATE_1_2, false ); menuRate_1_2.addItemListener ( this ); menuPopup.add ( menuRate_1_2 ); menuRate_1_1 = new CheckboxMenuItem ( MENU_RATE_1_1, true ); menuRate_1_1.addItemListener ( this ); menuPopup.add ( menuRate_1_1 ); menuRate_2_1 = new CheckboxMenuItem ( MENU_RATE_2_1, false ); menuRate_2_1.addItemListener ( this ); menuPopup.add ( menuRate_2_1 ); menuRate_4_1 = new CheckboxMenuItem ( MENU_RATE_4_1, false ); menuRate_4_1.addItemListener ( this ); menuPopup.add ( menuRate_4_1 ); menuRate_8_1 = new CheckboxMenuItem ( MENU_RATE_8_1, false ); menuRate_8_1.addItemListener ( this ); menuPopup.add ( menuRate_8_1 ); // menuPopup.addSeparator (); // menuItem = new MenuItem ( MENU_PROPERTIES ); // menuItem.addActionListener ( this ); // menuPopup.add ( menuItem ); } private void updateButtonState () { if ( player == null ) { buttonPlay.setEnabled ( false ); } else { buttonPlay.setEnabled ( true ); if ( player.getState() == Controller.Started ) buttonPlay.setValue ( true ); else buttonPlay.setValue ( false ); } } public void minicleanUp() { synchronized (localLock) { firstTime = true; } } public void dispose() { synchronized (localLock) { if (player == null) return; if (propsSheet != null) { propsSheet.dispose(); propsSheet = null; } if (progressSlider != null) { progressSlider.dispose(); progressSlider = null; } if (audioControls != null) { remove(audioControls); audioControls = null; } if (buttonAudio != null) { buttonAudio.dispose(); buttonAudio = null; } player = null; gainControl = null; controlFrame = null; if (parentFrame != null && wl != null) { parentFrame.removeWindowListener(wl); parentFrame = null; wl = null; } vectorTracksAudio.removeAllElements(); vectorTracksVideo.removeAllElements(); /** * Don't ask why, the following few lines of code * will allow the Solaris production VM to garbage-collect * the DefaultControlPanel. */ if (menuItemCheck != null) menuItemCheck.removeItemListener(this); menuRate_1_4.removeItemListener(this); menuRate_1_2.removeItemListener(this); menuRate_8_1.removeItemListener(this); menuRate_4_1.removeItemListener(this); menuRate_2_1.removeItemListener(this); menuRate_1_1.removeItemListener(this); buttonMedia.setPopupMenu(null); } } private void getPlayerControls() { Control control; if (player == null) return; gainControl = player.getGainControl(); control = player.getControl ( "javax.media.control.FramePositioningControl" ); if ( control != null && control instanceof javax.media.control.FramePositioningControl ) controlFrame = (javax.media.control.FramePositioningControl) control; /* Control [] controls = player.getControls(); for (int i = 0; i < controls.length; i++) { Control ctl = controls[i]; if (ctl instanceof GainControl) { gainControl = (GainControl)ctl; } } */ } public void actionPerformed(ActionEvent ae) { String command; command = ae.getActionCommand(); if ( command.equalsIgnoreCase(buttonPlay.getLabel()) ) { playStop(); } if ( buttonAudio != null && command.equalsIgnoreCase(buttonAudio.getLabel()) ) { audioMute (); } else if ( command.equalsIgnoreCase(buttonMedia.getLabel()) || command.equalsIgnoreCase(MENU_PROPERTIES) ) { showPropsSheet(); } else if ( buttonStepBack != null && command.equalsIgnoreCase(buttonStepBack.getLabel()) ) { playStep ( false ); } else if ( buttonStepFwd != null && command.equalsIgnoreCase(buttonStepFwd.getLabel()) ) { playStep ( true ); } } public void itemStateChanged ( ItemEvent event ) { ItemSelectable item; Object objectItem; String strItem; int nIndex; TrackControl trackControl; boolean boolEnabled; int nState; item = event.getItemSelectable (); nState = event.getStateChange (); objectItem = event.getItem (); if ( item == menuRate_1_4 && nState == ItemEvent.SELECTED ) { menuRate_1_4.setState ( false ); // will be set only if successfull, i.e. on RateChangeEvent player.setRate ( (float)0.25 ); } else if ( item == menuRate_1_2 && nState == ItemEvent.SELECTED ) { menuRate_1_2.setState ( false ); player.setRate ( (float)0.5 ); } else if ( item == menuRate_1_1 && nState == ItemEvent.SELECTED ) { menuRate_1_1.setState ( false ); player.setRate ( (float)1.0 ); } else if ( item == menuRate_2_1 && nState == ItemEvent.SELECTED ) { menuRate_2_1.setState ( false ); player.setRate ( (float)2.0 ); } else if ( item == menuRate_4_1 && nState == ItemEvent.SELECTED ) { menuRate_4_1.setState ( false ); player.setRate ( (float)4.0 ); } else if ( item == menuRate_8_1 && nState == ItemEvent.SELECTED ) { menuRate_8_1.setState ( false ); player.setRate ( (float)8.0 ); } else if ( objectItem instanceof String ) { strItem = (String) objectItem; if ( strItem.substring(0,5).equalsIgnoreCase(MENU_AUDIO) ) { nIndex = Integer.valueOf(strItem.substring(6)).intValue(); trackControl = (TrackControl)vectorTracksAudio.elementAt ( nIndex ); boolEnabled = event.getStateChange() == ItemEvent.SELECTED; muteAudioTrack ( trackControl, !boolEnabled ); } else if ( strItem.substring(0,5).equalsIgnoreCase(MENU_VIDEO) ) { } } } void update() { if ( propsSheet == null || player == null ) return; if ( player.getState() == Controller.Started ) { pausecnt = -1; propsSheet.update(); } else { if (pausecnt < 5 ) { pausecnt ++; propsSheet.update(); } else if ( pausecnt == 5 ) { pausecnt++; propsSheet.clearBRFR(); } else if ( resetMediaTimeinPause ) { resetMediaTimeinPause = false; propsSheet.updateMediaTime(); } } } void resetPauseCount() { pausecnt = -1; } private void playStop() { long lDuration; long lMedia; boolean state = buttonPlay.getValue(); synchronized (localLock) { if (player == null || buttonPlay == null) return; if (state) { if (player.getTargetState() == Controller.Started) { // Ignore } else { buttonPlay.setEnabled(false); lDuration = player.getDuration().getNanoseconds(); lMedia = player.getMediaNanoseconds(); if ( lMedia >= lDuration ) player.setMediaTime ( new Time(0) ); player.start(); } } else { if (player.getTargetState() == Controller.Started) { buttonPlay.setEnabled(false); player.stop(); } else { // Ignore } } } } private void audioMute() { boolean boolState; if ( gainControl == null ) return; boolState = buttonAudio.getValue(); gainControl.setMute ( boolState ); } private void playStep ( boolean boolFwd ) { long lValue; if ( controlFrame == null ) return; if (player.getTargetState() == Controller.Started) { buttonPlay.setEnabled(false); player.stop(); } controlFrame.skip ( (boolFwd?1:(-1)) ); } public void controllerUpdate(ControllerEvent ce) { long lDuration; long lMedia; synchronized (localLock) { if (player == null) return; if (ce instanceof StartEvent) { buttonPlay.setValue(true); buttonPlay.setEnabled(true); if ( buttonStepFwd != null ) buttonStepFwd.setEnabled ( true ); if ( buttonStepBack != null ) buttonStepBack.setEnabled ( true ); } else if (ce instanceof StopEvent || ce instanceof ResourceUnavailableEvent) { buttonPlay.setValue(false); buttonPlay.setEnabled(true); Thread.yield (); lDuration = player.getDuration().getNanoseconds(); lMedia = player.getMediaNanoseconds(); if ( buttonStepFwd != null ) { if ( lMedia < lDuration - 1 ) buttonStepFwd.setEnabled ( true ); else buttonStepFwd.setEnabled ( false ); } if ( buttonStepBack != null ) { if ( lMedia > 0 ) buttonStepBack.setEnabled ( true ); else buttonStepBack.setEnabled ( false ); } } else if (ce instanceof DurationUpdateEvent) { Time duration = player.getDuration(); if ( duration == Duration.DURATION_UNKNOWN || duration == Duration.DURATION_UNBOUNDED ) progressSlider.setEnabled(false); else progressSlider.setEnabled(true); if (propsSheet != null) propsSheet.updateDuration(); } else if (ce instanceof MediaTimeSetEvent) { Thread.yield (); lDuration = player.getDuration().getNanoseconds(); lMedia = player.getMediaNanoseconds(); if ( buttonStepFwd != null ) { if ( lMedia < lDuration - 1 ) buttonStepFwd.setEnabled ( true ); else buttonStepFwd.setEnabled ( false ); } if ( buttonStepBack != null ) { if ( lMedia > 0 ) buttonStepBack.setEnabled ( true ); else buttonStepBack.setEnabled ( false ); } resetMediaTimeinPause = true; } else if (ce instanceof RateChangeEvent) { float fRate; menuRate_1_4.setState ( false ); menuRate_1_2.setState ( false ); menuRate_1_1.setState ( false ); menuRate_2_1.setState ( false ); menuRate_4_1.setState ( false ); menuRate_8_1.setState ( false ); fRate = player.getRate (); if ( fRate < 0.5 ) { menuRate_1_4.removeItemListener ( this ); menuRate_1_4.setState ( true ); menuRate_1_4.addItemListener ( this ); } else if ( fRate < 1.0 ) { menuRate_1_2.removeItemListener ( this ); menuRate_1_2.setState ( true ); menuRate_1_2.addItemListener ( this ); } else if ( fRate > 4.0 ) { menuRate_8_1.removeItemListener ( this ); menuRate_8_1.setState ( true ); menuRate_8_1.addItemListener ( this ); } else if ( fRate > 2.0 ) { menuRate_4_1.removeItemListener ( this ); menuRate_4_1.setState ( true ); menuRate_4_1.addItemListener ( this ); } else if ( fRate > 1.0 ) { menuRate_2_1.removeItemListener ( this ); menuRate_2_1.setState ( true ); menuRate_2_1.addItemListener ( this ); } else { menuRate_1_1.removeItemListener ( this ); menuRate_1_1.setState ( true ); menuRate_1_1.addItemListener ( this ); } } } } public void gainChange ( GainChangeEvent event ) { boolean boolMute; boolMute = gainControl.getMute (); buttonAudio.setValue ( boolMute ); } public void componentResized(ComponentEvent e) { this.validate (); } public void componentMoved(ComponentEvent e) { } public void componentShown(ComponentEvent e) { } public void componentHidden(ComponentEvent e) { } /************************************************************************* * Overridden Component methods *************************************************************************/ public void paint(Graphics g) { if (firstTime) { findFrame(); } super.paint(g); } protected void findFrame() { synchronized (localLock) { if (firstTime) { firstTime = false; Component c = getParent(); while (!(c instanceof Frame) && c != null) { c = c.getParent(); } if (c instanceof Frame) { parentFrame = (Frame)c; ((Frame)c).addWindowListener(wl = new WindowAdapter() { public void windowClosing(WindowEvent we) { minicleanUp(); } } ); } } } } public Insets getInsets () { Insets insets; insets = new Insets (1,0,0,0); return ( insets ); } private void showPropsSheet() { Point point; Dimension dim; if (propsSheet == null) { try { propsSheet = new PropertySheet ( parentFrame, player ); if ( this.isShowing() ) { point = this.getLocationOnScreen (); dim = this.getSize (); point.y += dim.height; propsSheet.setLocation ( point ); } } catch (Exception e) { propsSheet = null; } } if (propsSheet != null) { propsSheet.setVisible(true); } } private void muteAudioTrack ( TrackControl trackControl, boolean boolMute ) { int i; int nCount; Object arrControls []; arrControls = trackControl.getControls (); nCount = arrControls.length; for ( i = 0; i < nCount; i++ ) { if ( arrControls[i] instanceof GainControl ) ((GainControl)arrControls[i]).setMute ( boolMute ); } } } class TransparentPanel extends Container implements ComponentListener { public TransparentPanel () { super (); this.addComponentListener ( this ); } public TransparentPanel ( LayoutManager mgrLayout ) { super (); this.setLayout ( mgrLayout ); this.addComponentListener ( this ); } public void componentResized(ComponentEvent e) { this.doLayout (); this.repaint (); } public void componentMoved(ComponentEvent e) { } public void componentShown(ComponentEvent e) { } public void componentHidden(ComponentEvent e) { } } class AudioButton extends ButtonComp { private GainControl gainControl; private GainSlider sliderGain = null; public AudioButton ( GainControl gainControl ) { super ( "Audio", "audio.gif", "audio-active.gif", "audio-pressed.gif", "audio-disabled.gif", "mute.gif", "mute-active.gif", "mute-pressed.gif", "mute-disabled.gif" ); this.gainControl = gainControl; this.setMousePopup ( true ); } protected void processMousePopup () { Dimension dim; Point point; if ( this.isShowing() && gainControl.getLevel() >= 0 ) { if ( sliderGain == null ) sliderGain = new GainSlider ( gainControl, getFrame() ); dim = this.getSize (); point = this.getLocationOnScreen (); point.y += dim.height; sliderGain.setLocation ( point ); sliderGain.setVisible ( !sliderGain.isVisible() ); } } private Frame getFrame () { Component parent; Frame frame = null; parent = this; while ( parent != null && !(parent instanceof Frame ) ) { parent = parent.getParent (); } if ( parent != null && parent instanceof Frame ) frame = (Frame) parent; return ( frame ); } public void dispose() { gainControl = null; if (sliderGain != null) { sliderGain.dispose(); sliderGain = null; } } } class GainSlider extends Window implements GainChangeListener, MouseListener, MouseMotionListener, FocusListener { private GainControl gainControl; private Image imageGrabber = null; private Dimension dimGrabber = new Dimension (); private Button buttonFocus; private boolean boolFocus = false; private boolean pressed = false; private PopupThread threadPopup = null; private Image imageBackground = null; private static final int WIDTH = 80; private static final int HEIGHT = 20; public GainSlider ( GainControl gainControl ) { this ( gainControl, new Frame() ); } public GainSlider ( GainControl gainControl, Frame frame ) { super ( frame ); this.gainControl = gainControl; try { init (); } catch ( Exception exception ) { } } public void dispose() { gainControl = null; } public void addNotify () { Insets insets; super.addNotify (); insets = this.getInsets (); this.setSize ( WIDTH + insets.left + insets.right, HEIGHT + insets.top + insets.bottom ); } private void init () throws Exception { gainControl.addGainChangeListener ( this ); this.addMouseListener ( this ); this.addMouseMotionListener ( this ); this.setLayout ( null ); imageBackground = BasicComp.fetchImage ( "texture3.gif" ); buttonFocus = new Button ( "Focus" ); buttonFocus.setBounds ( -100, -100, 80, 24 ); this.add ( buttonFocus ); buttonFocus.addFocusListener ( this ); imageGrabber = BasicComp.fetchImage ( "grabber.gif" ); this.setBackground ( Color.lightGray ); this.setSize ( WIDTH, HEIGHT ); } public void setVisible ( boolean boolVisible ) { super.setVisible ( boolVisible ); if ( boolVisible == true ) { buttonFocus.requestFocus (); if ( threadPopup != null ) threadPopup.stopNormaly (); threadPopup = new PopupThread ( this ); threadPopup.resetCounter ( 3 ); threadPopup.start (); } else if ( threadPopup != null ) { threadPopup.stopNormaly (); } } public void update ( Graphics g ) { Rectangle rectClient; Image image; Graphics graphics; rectClient = this.getBounds (); image = createImage ( rectClient.width, rectClient.height ); if ( image != null ) graphics = image.getGraphics (); else graphics = g; paint ( graphics ); if ( image != null ) g.drawImage ( image, 0, 0, this ); } public void paint ( Graphics graphics ) { int x, y; Dimension dimSize; int widthGrabber; float levelGain; Insets insets; Rectangle rect; paintBackground ( graphics ); dimSize = this.getSize (); insets = this.getInsets (); rect = new Rectangle ( insets.left, insets.top, dimSize.width - insets.left - insets.right, dimSize.height - insets.top - insets.bottom ); graphics.setColor ( this.getBackground() ); graphics.draw3DRect ( rect.x, rect.y, rect.width - 1, rect.height - 1, true ); graphics.draw3DRect ( rect.x + 4, rect.y + (rect.height / 2) - 2, rect.width - 9, 3, false ); if ( dimGrabber.width < 1 ) dimGrabber.width = imageGrabber.getWidth ( this ); if ( dimGrabber.height < 1 ) dimGrabber.height = imageGrabber.getHeight ( this ); levelGain = gainControl.getLevel (); x = rect.x + (int)(2 + levelGain * (rect.width - 5 - dimGrabber.width)); y = rect.y + (rect.height - dimGrabber.height) / 2; graphics.drawImage ( imageGrabber, x, y, this ); } private void paintBackground ( Graphics graphics ) { Dimension dimSize; Rectangle rectTile; Rectangle rectClip; dimSize = getSize (); if ( imageBackground == null ) { graphics.setColor ( getBackground() ); graphics.fillRect ( 0, 0, dimSize.width, dimSize.height ); } else { rectTile = new Rectangle ( 0, 0, imageBackground.getWidth(this), imageBackground.getHeight(this) ); rectClip = graphics.getClipBounds (); while ( rectTile.y < dimSize.height ) { while ( rectTile.x < dimSize.width ) { if ( rectClip == null || rectClip.intersects(rectTile) ) { graphics.drawImage ( imageBackground, rectTile.x, rectTile.y, this ); } rectTile.x += rectTile.width; } rectTile.x = 0; rectTile.y += rectTile.height; } } } public void gainChange ( GainChangeEvent event ) { repaint (); } public void mouseClicked ( MouseEvent event ) { } public void mousePressed ( MouseEvent event ) { Point pointMouse; if ( threadPopup != null ) threadPopup.resetCounter ( 3 ); pointMouse = event.getPoint (); setLevelToMouse ( pointMouse ); pressed = true; } public void mouseReleased ( MouseEvent event ) { pressed = false; if (boolFocus == false) this.setVisible(false); } public void mouseEntered ( MouseEvent event ) { boolFocus = true; if ( threadPopup != null ) threadPopup.stopNormaly (); } public void mouseExited ( MouseEvent event ) { if ( boolFocus == true && !pressed) this.setVisible ( false ); boolFocus = false; } public void mouseDragged ( MouseEvent event ) { Point pointMouse; if ( threadPopup != null ) threadPopup.resetCounter ( 3 ); pointMouse = event.getPoint (); setLevelToMouse ( pointMouse ); } public void mouseMoved ( MouseEvent event ) { } public void focusLost ( FocusEvent event ) { } public void focusGained ( FocusEvent event ) { } private void setLevelToMouse ( Point pointMouse ) { int nPos; int nWidth; Dimension dimSize; Insets insets; float levelGain; if (gainControl == null) return; dimSize = this.getSize (); insets = this.getInsets (); nPos = pointMouse.x - 2 - insets.left; nWidth = dimSize.width - insets.left - insets.right - 5; if ( nPos > nWidth ) nPos = nWidth; if ( nPos < 0 ) nPos = 0; levelGain = (float)nPos / nWidth; gainControl.setMute ( false ); gainControl.setLevel ( levelGain ); } } class PopupThread extends Thread { private Window window; private int nTimeCounter = 3; private boolean boolRun = true; public PopupThread ( Window window ) { this.window = window; } public void resetCounter ( int nTimeCounter ) { this.nTimeCounter = nTimeCounter; } public void stopNormaly () { boolRun = false; } /** * */ public void run () { while ( boolRun ) { if ( nTimeCounter < 1 ) window.setVisible ( false ); try { sleep ( 1000 ); } catch ( Exception exception ) { } nTimeCounter--; } } }