Package org.deepsymmetry.beatlink.data
Class WaveformPreviewComponent
- java.lang.Object
-
- java.awt.Component
-
- java.awt.Container
-
- javax.swing.JComponent
-
- org.deepsymmetry.beatlink.data.WaveformPreviewComponent
-
- All Implemented Interfaces:
ImageObserver
,MenuContainer
,Serializable
public class WaveformPreviewComponent extends JComponent
Provides a convenient way to draw a waveform preview in a user interface, including annotations like the current time and minute markers (if you supplyTrackMetadata
so the total length can be determined), and cue markers (if you also supply aCueList
). Can also be configured to automatically update itself to reflect the state of a specified player, showing the current track, playback state, and position, as long as it is able to load appropriate metadata, which includes beat grids for translating beat numbers into track time.- See Also:
- Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponent
-
Nested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainer
-
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
-
-
Field Summary
Fields Modifier and Type Field Description static Color
BRIGHT_PLAYED
The color for brighter sections of the already-played section of the playback progress bar.static Color
DIM_PLAYED
The color for darker sections of the already-played section of the playback progress bar.static Color
DIM_UNPLAYED
The color for the darker sections of the not-yet-played sections of the playback progress bar.static int
MIN_WAVEFORM_WIDTH
The minimum acceptable width for the waveform.-
Fields inherited from class javax.swing.JComponent
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
-
Fields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
-
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
-
-
Constructor Summary
Constructors Constructor Description WaveformPreviewComponent(int player)
Create a view which updates itself to reflect the track loaded on a particular player, and that player's playback progress.WaveformPreviewComponent(WaveformPreview preview, int duration, CueList cueList)
Create a view which draws a specific waveform, even if it is not currently loaded in a player.WaveformPreviewComponent(WaveformPreview preview, TrackMetadata metadata)
Create a view which draws a specific waveform, even if it is not currently loaded in a player.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
clearPlaybackState()
Removes all stored playback state.void
clearPlaybackState(int player)
Clear the playback state stored for a player, such as when it has unloaded the track.Color
getBackgroundColor()
Examine the color to which the background is cleared before drawing the waveform.CueList
getCueList()
Get the cue list associated with this track.Color
getEmphasisColor()
Examine the color with which the playback position is drawn when playback is active.boolean
getFetchSongStructures()
Check whether we are supposed to obtain the song structure for tracks we are displaying when we are monitoring a player.PlaybackState
getFurthestPlaybackState()
Look up the playback state that has reached furthest in the track.Color
getIndicatorColor()
Examine the color with which the playback position and tick markers are drawn.Dimension
getMinimumSize()
int
getMonitoredPlayer()
See which player is having its state tracked automatically by the component, if any.Set<PlaybackState>
getPlaybackState()
Look up all recorded playback state information.PlaybackState
getPlaybackState(int player)
Look up the playback state recorded for a particular player.Dimension
getPreferredSize()
long
getTimeForX(int x)
Determine the playback time that corresponds to a particular X coordinate in the component given the current scale.int
getXForBeat(int beat)
Determine the X coordinate within the component at which the specified beat begins.int
millisecondsToX(long milliseconds)
Converts a time in milliseconds to the appropriate x coordinate for drawing something at that time.protected void
paintComponent(Graphics g)
void
setBackgroundColor(Color color)
Change the color to which the background is cleared before drawing the waveform.void
setBeatGrid(BeatGrid beatGrid)
Establish a beat grid to use when translating between times and beat numbers, for example to paint the phrase bars.void
setEmphasisColor(Color color)
Change the color with which the playback position is drawn when playback is active.void
setFetchSongStructures(boolean fetchSongStructures)
Determine whether we should try to obtain the song structure for tracks that we are displaying, and paint the phrase information at the bottom of the waveform.void
setIndicatorColor(Color color)
Change the color with which the playback position and tick markers are drawn.void
setMonitoredPlayer(int player)
Configures the player whose current track waveforms and status will automatically be reflected.void
setOverlayPainter(OverlayPainter painter)
Arrange for an overlay to be painted on top of the component.void
setPlaybackState(int player, long position, boolean playing)
Set the current playback state for a player.void
setRepaintDelegate(RepaintDelegate delegate)
Establish a host component to which allComponent.repaint(int, int, int, int)
calls should be delegated, presumably because we are being soft-loaded in a large user interface to save on memory.void
setSongStructure(org.deepsymmetry.cratedigger.pdb.RekordboxAnlz.SongStructureTag songStructure)
Establish a song structure (phrase analysis) to be displayed on the waveform.void
setWaveformPreview(WaveformPreview preview, int duration, CueList cueList)
Change the waveform preview being drawn.void
setWaveformPreview(WaveformPreview preview, TrackMetadata metadata)
Change the waveform preview being drawn.String
toolTipText(Point point)
Checks whether we have anything that could reasonably be displayed as a tool tip when the mouse is hovering over the specified point, for programs that want to offer such a feature in their user interface.String
toString()
-
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getNextFocusableComponent, getPopupLocation, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, paramString, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update, updateUI
-
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
-
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, transferFocus, transferFocusBackward, transferFocusUpCycle
-
-
-
-
Field Detail
-
MIN_WAVEFORM_WIDTH
public static final int MIN_WAVEFORM_WIDTH
The minimum acceptable width for the waveform.- See Also:
- Constant Field Values
-
BRIGHT_PLAYED
public static final Color BRIGHT_PLAYED
The color for brighter sections of the already-played section of the playback progress bar. Note that if the indicator color has been changed, only the transparency (alpha) channel of this is used.
-
DIM_PLAYED
public static final Color DIM_PLAYED
The color for darker sections of the already-played section of the playback progress bar. Note that if the indicator color has been changed, only the transparency (alpha) channel of this is used.
-
DIM_UNPLAYED
public static final Color DIM_UNPLAYED
The color for the darker sections of the not-yet-played sections of the playback progress bar. Note that if the indicator color has been changed, only the transparency (alpha) channel of this is used.
-
-
Constructor Detail
-
WaveformPreviewComponent
public WaveformPreviewComponent(int player)
Create a view which updates itself to reflect the track loaded on a particular player, and that player's playback progress.- Parameters:
player
- the player number to monitor, or zero if it should start out monitoring no player
-
WaveformPreviewComponent
public WaveformPreviewComponent(WaveformPreview preview, TrackMetadata metadata)
Create a view which draws a specific waveform, even if it is not currently loaded in a player.- Parameters:
preview
- the waveform preview to displaymetadata
- information about the track whose waveform we are drawing, so we can translate times into positions
-
WaveformPreviewComponent
public WaveformPreviewComponent(WaveformPreview preview, int duration, CueList cueList)
Create a view which draws a specific waveform, even if it is not currently loaded in a player.- Parameters:
preview
- the waveform preview to displayduration
- the playback duration, in seconds, of the track whose waveform we are drawing, so we can translate times into positionscueList
- the hot cues and memory points stored for the track, if any, so we can draw them
-
-
Method Detail
-
setBeatGrid
public void setBeatGrid(BeatGrid beatGrid)
Establish a beat grid to use when translating between times and beat numbers, for example to paint the phrase bars. If we are configured to monitor a player, then this will be overwritten the next time a track loads.- Parameters:
beatGrid
- the beat grid information for the displayed waveform, ornull
if none is available
-
getCueList
public CueList getCueList()
Get the cue list associated with this track.- Returns:
- the cues defined for the track.
-
setSongStructure
public void setSongStructure(org.deepsymmetry.cratedigger.pdb.RekordboxAnlz.SongStructureTag songStructure)
Establish a song structure (phrase analysis) to be displayed on the waveform. If we are configured to monitor a player, then this will be overwritten the next time a track loads.- Parameters:
songStructure
- the phrase information to be painted at the bottom of the waveform, ornull
to display none
-
setFetchSongStructures
public void setFetchSongStructures(boolean fetchSongStructures)
Determine whether we should try to obtain the song structure for tracks that we are displaying, and paint the phrase information at the bottom of the waveform. Only has effect if we are monitoring a player.- Parameters:
fetchSongStructures
-true
if we should try to obtain and display phrase analysis information
-
getFetchSongStructures
public boolean getFetchSongStructures()
Check whether we are supposed to obtain the song structure for tracks we are displaying when we are monitoring a player.- Returns:
true
if we should try to obtain and display phrase analysis information
-
setOverlayPainter
public void setOverlayPainter(OverlayPainter painter)
Arrange for an overlay to be painted on top of the component.- Parameters:
painter
- if notnull
, itsOverlayPainter.paintOverlay(Component, Graphics)
method will be called once this component has done its own painting
-
getBackgroundColor
public Color getBackgroundColor()
Examine the color to which the background is cleared before drawing the waveform. The default is black, but can be changed (including to a transparent color) for use in other contexts, like the OBS overlay.- Returns:
- the color used to draw the component background
-
setBackgroundColor
public void setBackgroundColor(Color color)
Change the color to which the background is cleared before drawing the waveform. The default is black, but can be changed (including to a transparent color) for use in other contexts, like the OBS overlay.- Parameters:
color
- the color used to draw the component background
-
getIndicatorColor
public Color getIndicatorColor()
Examine the color with which the playback position and tick markers are drawn. The default is white, but can be changed (including to a transparent color) for use in other contexts, like the OBS overlay.- Returns:
- the color used to draw the playback and tick markers
-
setIndicatorColor
public void setIndicatorColor(Color color)
Change the color with which the playback position and tick markers are drawn. The default is white, but can be changed (including to a transparent color) for use in other contexts, like the OBS overlay.- Parameters:
color
- the color used to draw the playback marker when actively playing
-
getEmphasisColor
public Color getEmphasisColor()
Examine the color with which the playback position is drawn when playback is active. The default is red, but can be changed (including to a transparent color) for use in other contexts, like the OBS overlay.- Returns:
- the color used to draw the active playback marker
-
setEmphasisColor
public void setEmphasisColor(Color color)
Change the color with which the playback position is drawn when playback is active. The default is red, but can be changed (including to a transparent color) for use in other contexts, like the OBS overlay.- Parameters:
color
- the color used to draw the playback marker when actively playing
-
getFurthestPlaybackState
public PlaybackState getFurthestPlaybackState()
Look up the playback state that has reached furthest in the track. This is used to render the “played until” graphic below the preview.- Returns:
- the playback state, if any, with the highest
PlaybackState.position
value
-
setRepaintDelegate
public void setRepaintDelegate(RepaintDelegate delegate)
Establish a host component to which allComponent.repaint(int, int, int, int)
calls should be delegated, presumably because we are being soft-loaded in a large user interface to save on memory.- Parameters:
delegate
- the permanent component that can actually accumulate repaint regions, ornull
if we are being hosted normally in a container, so we should use the normal repaint process.
-
setPlaybackState
public void setPlaybackState(int player, long position, boolean playing)
Set the current playback state for a player. Will cause part of the component to be redrawn if the player state has changed (and we have theTrackMetadata
we need to translate the time into a position in the component). This will be quickly overruled if a player is being monitored, but can be used in other contexts.- Parameters:
player
- the player number whose playback state is being recordedposition
- the current playback position of that player in millisecondsplaying
- whether the player is actively playing the track- Throws:
IllegalStateException
- if the component is configured to monitor a player, and this is called with state for a different playerIllegalArgumentException
- if player is less than one- Since:
- 0.5.0
-
clearPlaybackState
public void clearPlaybackState(int player)
Clear the playback state stored for a player, such as when it has unloaded the track.- Parameters:
player
- the player number whose playback state is no longer valid- Since:
- 0.5.0
-
clearPlaybackState
public void clearPlaybackState()
Removes all stored playback state.- Since:
- 0.5.0
-
getPlaybackState
public PlaybackState getPlaybackState(int player)
Look up the playback state recorded for a particular player.- Parameters:
player
- the player number whose playback state information is desired- Returns:
- the corresponding playback state, if any has been stored
- Since:
- 0.5.0
-
getPlaybackState
public Set<PlaybackState> getPlaybackState()
Look up all recorded playback state information.- Returns:
- the playback state recorded for any player
- Since:
- 0.5.0
-
setWaveformPreview
public void setWaveformPreview(WaveformPreview preview, TrackMetadata metadata)
Change the waveform preview being drawn. This will be quickly overruled if a player is being monitored, but can be used in other contexts.- Parameters:
preview
- the waveform preview to displaymetadata
- information about the track whose waveform we are drawing, so we can translate times into positions and display hot cues and memory points
-
setWaveformPreview
public void setWaveformPreview(WaveformPreview preview, int duration, CueList cueList)
Change the waveform preview being drawn. This will be quickly overruled if a player is being monitored, but can be used in other contexts.- Parameters:
preview
- the waveform preview to displayduration
- the playback duration, in seconds, of the track whose waveform we are drawing, so we can translate times into positionscueList
- the hot cues and memory points stored for the track, if any, so we can draw them
-
setMonitoredPlayer
public void setMonitoredPlayer(int player)
Configures the player whose current track waveforms and status will automatically be reflected. Whenever a new track is loaded on that player, the waveform and metadata will be updated, and the current playback position and state of the player will be reflected by the component.- Parameters:
player
- the player number to monitor, or zero if monitoring should stop
-
getMonitoredPlayer
public int getMonitoredPlayer()
See which player is having its state tracked automatically by the component, if any.- Returns:
- the player number being monitored, or zero if none
-
getPreferredSize
public Dimension getPreferredSize()
- Overrides:
getPreferredSize
in classJComponent
-
getMinimumSize
public Dimension getMinimumSize()
- Overrides:
getMinimumSize
in classJComponent
-
getXForBeat
public int getXForBeat(int beat)
Determine the X coordinate within the component at which the specified beat begins.- Parameters:
beat
- the beat number whose position is desired- Returns:
- the horizontal position within the component coordinate space where that beat begins
- Throws:
IllegalArgumentException
- if the beat number exceeds the number of beats in the track.
-
millisecondsToX
public int millisecondsToX(long milliseconds)
Converts a time in milliseconds to the appropriate x coordinate for drawing something at that time. Can only be called when we haveTrackMetadata
.- Parameters:
milliseconds
- the time at which something should be drawn- Returns:
- the component x coordinate at which it should be drawn
-
getTimeForX
public long getTimeForX(int x)
Determine the playback time that corresponds to a particular X coordinate in the component given the current scale.- Parameters:
x
- the horizontal position within the component coordinate space- Returns:
- the number of milliseconds into the track this would correspond to (may fall outside the actual track)
-
paintComponent
protected void paintComponent(Graphics g)
- Overrides:
paintComponent
in classJComponent
-
toolTipText
public String toolTipText(Point point)
Checks whether we have anything that could reasonably be displayed as a tool tip when the mouse is hovering over the specified point, for programs that want to offer such a feature in their user interface.- Parameters:
point
- the point where the mouse has been detected- Returns:
- the text of a tool tip to describe that area of this component, or
null
if there's nothing to say about that point
-
-