1139749Simp/*
253790Sobrien * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
353790Sobrien * All rights reserved. Distributed under the terms of the MIT License.
453790Sobrien */
586266Sgroudier#ifndef WIDGET_LAYOUT_TEST_ABSTRACT_BUTTON_H
653790Sobrien#define WIDGET_LAYOUT_TEST_ABSTRACT_BUTTON_H
753790Sobrien
859743Sgroudier
959743Sgroudier#include <Invoker.h>
1053790Sobrien#include <List.h>
1153790Sobrien
1253790Sobrien#include "View.h"
1353790Sobrien
1453790Sobrien
1553790Sobrien// button behavior policy
1653790Sobrienenum button_policy {
1753790Sobrien	BUTTON_POLICY_TOGGLE_ON_RELEASE,	// check box
1853790Sobrien	BUTTON_POLICY_SELECT_ON_RELEASE,	// radio button
1953790Sobrien	BUTTON_POLICY_INVOKE_ON_RELEASE		// button
2053790Sobrien};
2153790Sobrien
2253790Sobrien
2353790Sobrien// AbstractButton
2453790Sobrienclass AbstractButton : public View, public BInvoker {
2553790Sobrienpublic:
2653790Sobrien								AbstractButton(button_policy policy,
2753790Sobrien									BMessage* message = NULL,
2853790Sobrien									BMessenger target = BMessenger());
2953790Sobrien
3053790Sobrien			void				SetPolicy(button_policy policy);
3153790Sobrien			button_policy		Policy() const;
3253790Sobrien
3353790Sobrien			void				SetSelected(bool selected);
3453790Sobrien			bool				IsSelected() const;
3553790Sobrien
3653790Sobrien	virtual	void				MouseDown(BPoint where, uint32 buttons,
3753790Sobrien									int32 modifiers);
3853790Sobrien	virtual	void				MouseUp(BPoint where, uint32 buttons,
3953790Sobrien									int32 modifiers);
4053790Sobrien	virtual	void				MouseMoved(BPoint where, uint32 buttons,
4153790Sobrien									int32 modifiers);
4253790Sobrien
4353790Sobrienpublic:
4453790Sobrien			class Listener;
4553790Sobrien
4653790Sobrien			void				AddListener(Listener* listener);
4753790Sobrien			void				RemoveListener(Listener* listener);
4853790Sobrien
4953790Sobrienprotected:
5053790Sobrien			bool				IsPressed() const;
5153790Sobrien
5253790Sobrienprivate:
5353790Sobrien			void				_PressedUpdate(BPoint where);
5453790Sobrien			void				_NotifyListeners();
5553790Sobrien
5653790Sobrienprivate:
5755258Sobrien			button_policy		fPolicy;
5855258Sobrien			bool				fSelected;
5955258Sobrien			bool				fPressed;
6053790Sobrien			bool				fPressedInBounds;
6153790Sobrien			BList				fListeners;
6253790Sobrien};
6353790Sobrien
6453790Sobrien
6553790Sobrien// synchronous listener interface
6653790Sobrienclass AbstractButton::Listener {
6753790Sobrienpublic:
6853790Sobrien	virtual						~Listener();
6959743Sgroudier
7059743Sgroudier	virtual	void				SelectionChanged(AbstractButton* button) = 0;
7159743Sgroudier};
7259743Sgroudier
7359743Sgroudier
7453790Sobrien#endif	// WIDGET_LAYOUT_TEST_ABSTRACT_BUTTON_H
7553790Sobrien