#ifndef __MEDIA_BUTTON__
#define __MEDIA_BUTTON__
#include <Control.h>
#include <MessageRunner.h>
#include "icon_button.h"
class BMessage;
class BBitmap;
class PeriodicMessageSender;
class BitmapStash;
class TransportButton : public BControl {
public:
TransportButton(BRect frame, const char *name,
const unsigned char *normalBits,
const unsigned char *pressedBits,
const unsigned char *disabledBits,
BMessage *invokeMessage,
BMessage *startPressingMessage = 0,
BMessage *pressingMessage = 0,
BMessage *donePressing = 0,
bigtime_t period = 0,
uint32 key = 0,
uint32 modifiers = 0,
uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP);
virtual ~TransportButton();
void SetStartPressingMessage(BMessage *);
void SetPressingMessage(BMessage *);
void SetDonePressingMessage(BMessage *);
void SetPressingPeriod(bigtime_t);
virtual void SetEnabled(bool);
protected:
enum {
kDisabledMask = 0x1,
kPressedMask = 0x2
};
virtual void AttachedToWindow();
virtual void DetachedFromWindow();
virtual void Draw(BRect);
virtual void MouseDown(BPoint);
virtual void MouseMoved(BPoint, uint32 code, const BMessage *);
virtual void MouseUp(BPoint);
virtual void WindowActivated(bool);
virtual BBitmap *MakeBitmap(uint32);
virtual uint32 ModeMask() const;
virtual const unsigned char *BitsForMask(uint32) const;
virtual void StartPressing();
virtual void MouseCancelPressing();
virtual void DonePressing();
private:
void ShortcutKeyDown();
void ShortcutKeyUp();
void MouseStartPressing();
void MouseDonePressing();
BitmapStash *bitmaps;
const unsigned char *normalBits;
const unsigned char *pressedBits;
const unsigned char *disabledBits;
BMessage *startPressingMessage;
BMessage *pressingMessage;
BMessage *donePressingMessage;
bigtime_t pressingPeriod;
bool mouseDown;
bool keyDown;
PeriodicMessageSender *messageSender;
BMessageFilter *keyPressFilter;
typedef BControl _inherited;
friend class SkipButtonKeypressFilter;
friend class BitmapStash;
};
class PlayPauseButton : public TransportButton {
public:
PlayPauseButton(BRect frame, const char *name,
BMessage *invokeMessage,
BMessage *blinkMessage = 0,
uint32 key = 0,
uint32 modifiers = 0,
uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP);
void SetStopped();
void SetPlaying();
void SetPaused();
protected:
virtual uint32 ModeMask() const;
virtual const unsigned char *BitsForMask(uint32) const;
virtual void StartPressing();
virtual void MouseCancelPressing();
virtual void DonePressing();
private:
enum PlayState {
kStopped,
kAboutToPlay,
kPlayingLedOn,
kPlayingLedOff,
kAboutToPause,
kPausedLedOn,
kPausedLedOff
};
enum {
kPlayingMask = 0x4,
kPausedMask = 0x8
};
PlayState fState;
uint32 fLastModeMask;
BMessageRunner *fRunner;
BMessage *fBlinkMessage;
typedef TransportButton _inherited;
};
class RecordButton : public TransportButton {
public:
RecordButton(BRect frame, const char *name,
BMessage *invokeMessage,
BMessage *blinkMessage = 0,
uint32 key = 0,
uint32 modifiers = 0,
uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP);
void SetStopped();
void SetRecording();
protected:
virtual uint32 ModeMask() const;
virtual const unsigned char *BitsForMask(uint32) const;
virtual void StartPressing();
virtual void MouseCancelPressing();
virtual void DonePressing();
private:
enum RecordState {
kAboutToStop,
kStopped,
kAboutToRecord,
kRecordingLedOn,
kRecordingLedOff
};
enum {
kRecordingMask = 0x4
};
enum {
RECORD_PRESSING = 'crpr'
};
RecordState fState;
uint32 fLastModeMask;
BMessageRunner *fRunner;
BMessage *fBlinkMessage;
typedef TransportButton _inherited;
};
#endif