handled ajaxevents

This commit is contained in:
Peter Schojer
2008-09-10 14:13:31 +00:00
parent 2febc946df
commit b9fa3377a0
10 changed files with 348 additions and 7 deletions

View File

@@ -209,6 +209,10 @@
<Filter
Name="Header Files"
>
<File
RelativePath=".\include\Poco\WebWidgets\AjaxDelegate.h"
>
</File>
<File
RelativePath=".\include\Poco\WebWidgets\Alignment.h"
>
@@ -293,6 +297,10 @@
<Filter
Name="Source Files"
>
<File
RelativePath=".\src\AjaxDelegate.cpp"
>
</File>
<File
RelativePath=".\src\Cell.cpp"
>

View File

@@ -208,6 +208,10 @@
<Filter
Name="Header Files"
>
<File
RelativePath=".\include\Poco\WebWidgets\AjaxDelegate.h"
>
</File>
<File
RelativePath=".\include\Poco\WebWidgets\Alignment.h"
>
@@ -292,6 +296,10 @@
<Filter
Name="Source Files"
>
<File
RelativePath=".\src\AjaxDelegate.cpp"
>
</File>
<File
RelativePath=".\src\Cell.cpp"
>

View File

@@ -0,0 +1,158 @@
//
// AjaxDelegate.h
//
// $Id: //poco/Main/WebWidgets/include/Poco/WebWidgets/AjaxDelegate.h#2 $
//
// Library: WebWidgets
// Package: Core
// Module: AjaxDelegate
//
// Definition of the AjaxDelegate class.
//
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
//
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
#ifndef WebWidgets_AjaxDelegate_INCLUDED
#define WebWidgets_AjaxDelegate_INCLUDED
#include "Poco/WebWidgets/WebWidgets.h"
#include "Poco/RefCountedObject.h"
namespace Poco {
namespace Net {
class NameValueCollection;
class HTTPServerResponse;
}
namespace WebWidgets {
class BasicAjaxDelegateImpl;
struct AjaxParameters
{
const Poco::Net::NameValueCollection& args;
Poco::Net::HTTPServerResponse& response;
bool handled;
AjaxParameters(const Poco::Net::NameValueCollection& args, Poco::Net::HTTPServerResponse& response);
};
class WebWidgets_API AjaxDelegate
/// AjaxDelegate implements a very simple, lightweight delegate mechanism.
{
public:
AjaxDelegate();
/// Creates a AjaxDelegate for void.
AjaxDelegate(const AjaxDelegate& delegate);
/// Creates a AjaxDelegate by copying another one.
AjaxDelegate(BasicAjaxDelegateImpl* pImpl);
/// Creates a AjaxDelegate using the given BasicAjaxDelegateImpl.
~AjaxDelegate();
/// Destroys the AjaxDelegate.
void swap(AjaxDelegate& delegate);
/// Swaps the AjaxDelegate with another one.
AjaxDelegate& operator = (const AjaxDelegate& delegate);
/// Assignment operator.
void operator () (void* pSender, const Poco::Net::NameValueCollection& args, Poco::Net::HTTPServerResponse& response, bool& handled) const;
/// Invokes the delegate.
operator void* () const;
bool operator ! () const;
private:
BasicAjaxDelegateImpl* _pImpl;
};
class WebWidgets_API BasicAjaxDelegateImpl: public Poco::RefCountedObject
/// The common base class for all AjaxDelegateImpl instantiations.
{
public:
BasicAjaxDelegateImpl();
/// Creates the BasicAjaxDelegateImpl.
virtual void invoke(void* pSender, AjaxParameters& params) = 0;
/// Invokes the delegate.
protected:
~BasicAjaxDelegateImpl();
/// Destroys the AjaxDelegate.
};
template <class C>
class AjaxDelegateImpl: public BasicAjaxDelegateImpl
{
public:
typedef void (C::*Callback)(void*, AjaxParameters&);
AjaxDelegateImpl(C& object, Callback method):
/// Creates the AjaxDelegateImpl
_pObject(&object),
_method(method)
{
}
void invoke(void* pSender, AjaxParameters& params)
{
(_pObject->*_method)(pSender, params);
}
protected:
~AjaxDelegateImpl()
{
}
private:
AjaxDelegateImpl();
C* _pObject;
Callback _method;
};
template <class C>
AjaxDelegate ajaxDelegate(C& object, void (C::*method)(void*, AjaxParameters&))
/// "Constructor" function for a AjaxDelegate.
{
return AjaxDelegate(new AjaxDelegateImpl<C>(object, method));
}
} } // namespace Poco::WebWidgets
#endif // WebWidgets_AjaxDelegate_INCLUDED

View File

@@ -42,6 +42,7 @@
#include "Poco/WebWidgets/Control.h"
#include "Poco/WebWidgets/Event.h"
#include "Poco/WebWidgets/AjaxDelegate.h"
#include "Poco/WebWidgets/JavaScriptEvent.h"
@@ -59,6 +60,8 @@ public:
typedef Poco::AutoPtr<Button> Ptr;
typedef Event<Button> ButtonEvent;
JavaScriptEvent<AjaxParameters> ajaxButtonClicked;
JavaScriptEvent<ButtonEvent> buttonClicked;
Button(const std::string& name);
@@ -70,6 +73,9 @@ public:
Button();
/// Creates an anonymous Button.
void fireAjaxButtonClicked(void* pSender, AjaxParameters& params);
/// Fires the ajaxButtonClicked event.
void fireButtonClicked(void* pSender);
/// Fires the buttonClicked event.

View File

@@ -41,6 +41,7 @@
#include "Poco/WebWidgets/Cell.h"
#include "Poco/WebWidgets/AjaxDelegate.h"
#include "Poco/WebWidgets/Delegate.h"
@@ -56,6 +57,8 @@ public:
static const std::string EV_BUTTONCLICKED;
AjaxDelegate ajaxButtonClicked;
Delegate buttonClicked;
ButtonCell(View* pOwner);

View File

@@ -43,7 +43,7 @@
#include "Poco/WebWidgets/WebWidgets.h"
#include "Poco/WebWidgets/JSDelegate.h"
#include "Poco/AbstractEvent.h"
#include "Poco/DefaultStrategy.h"
#include "Poco/FIFOStrategy.h"
#include "Poco/AbstractDelegate.h"
#include "Poco/CompareFunctions.h"
#include <list>
@@ -63,11 +63,11 @@ enum ServerCallback
template <class TArgs>
class JavaScriptEvent: public Poco::AbstractEvent <
TArgs, Poco::DefaultStrategy<TArgs, Poco::AbstractDelegate<TArgs>, Poco::p_less<Poco::AbstractDelegate<TArgs> > >,
TArgs, Poco::FIFOStrategy<TArgs, Poco::AbstractDelegate<TArgs>, Poco::p_less<Poco::AbstractDelegate<TArgs> > >,
Poco::AbstractDelegate<TArgs>
>
/// Event class used to handle JavaScriptEvents. Allows to register two different types
/// of delegates. The standard delegates, as known from Poco::BasicEvent and JSDelegates
/// of delegates. The standard delegates, as known from Poco::FIFOEvent and JSDelegates
/// which will be embedded into the WebPage when the Parser generates the site.
/// Per default a server callback happens only when local listeners are registered.
{

View File

@@ -0,0 +1,139 @@
//
// AjaxDelegate.cpp
//
// $Id: //poco/Main/WebWidgets/src/AjaxDelegate.cpp#2 $
//
// Library: WebWidgets
// Package: Core
// Module: AjaxDelegate
//
// Copyright (c) 2008, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
//
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
#include "Poco/WebWidgets/AjaxDelegate.h"
#include "Poco/Net/NameValueCollection.h"
#include "Poco/Net/HTTPServerResponse.h"
#include <algorithm>
namespace Poco {
namespace WebWidgets {
AjaxParameters::AjaxParameters(const Poco::Net::NameValueCollection& a, Poco::Net::HTTPServerResponse& r):
args(a),
response(r),
handled(false)
{
}
//
// AjaxDelegate
//
AjaxDelegate::AjaxDelegate():
_pImpl(0)
{
}
AjaxDelegate::AjaxDelegate(const AjaxDelegate& delegate):
_pImpl(delegate._pImpl)
{
if (_pImpl)
_pImpl->duplicate();
}
AjaxDelegate::AjaxDelegate(BasicAjaxDelegateImpl* pImpl):
_pImpl(pImpl)
{
}
AjaxDelegate::~AjaxDelegate()
{
if (_pImpl)
_pImpl->release();
}
void AjaxDelegate::swap(AjaxDelegate& delegate)
{
std::swap(_pImpl, delegate._pImpl);
}
AjaxDelegate& AjaxDelegate::operator = (const AjaxDelegate& delegate)
{
AjaxDelegate tmp(delegate);
swap(tmp);
return *this;
}
void AjaxDelegate::operator () (void* pSender, const Poco::Net::NameValueCollection& args, Poco::Net::HTTPServerResponse& response, bool& handled) const
{
if (_pImpl)
{
AjaxParameters params(args, response);
_pImpl->invoke(pSender, params);
handled = params.handled;
}
}
AjaxDelegate::operator void* () const
{
return _pImpl;
}
bool AjaxDelegate::operator ! () const
{
return _pImpl == 0;
}
//
// BasicAjaxDelegateImpl
//
BasicAjaxDelegateImpl::BasicAjaxDelegateImpl()
{
}
BasicAjaxDelegateImpl::~BasicAjaxDelegateImpl()
{
}
} } // namespace Poco::WebWidgets

View File

@@ -102,6 +102,7 @@ void Button::init(Cell::Ptr ptrCell)
ButtonCell::Ptr pCell = ptrCell.cast<ButtonCell>();
poco_check_ptr (pCell);
pCell->buttonClicked = delegate(*this, &Button::fireButtonClicked);
pCell->ajaxButtonClicked = ajaxDelegate(*this, &Button::fireAjaxButtonClicked);
setCell(pCell);
}
@@ -113,6 +114,12 @@ void Button::init()
}
void Button::fireAjaxButtonClicked(void* pSender, AjaxParameters& params)
{
ajaxButtonClicked(pSender, params);
}
void Button::fireButtonClicked(void* pSender)
{
ButtonEvent clickedEvent(this);

View File

@@ -66,7 +66,7 @@ ButtonCell::~ButtonCell()
void ButtonCell::handleForm(const std::string& field, const std::string& value)
{
buttonClicked(this);
//buttonClicked(this);
}
@@ -75,9 +75,13 @@ void ButtonCell::handleAjaxRequest(const Poco::Net::NameValueCollection& args, P
const std::string& ev = args[RequestHandler::KEY_EVID];
if (ev == EV_BUTTONCLICKED)
{
bool handled(false);
ajaxButtonClicked(this, args, response, handled);
if (!handled)
response.send();
buttonClicked(this);
}
else
response.send();
}

View File

@@ -37,6 +37,7 @@
#include "Poco/WebWidgets/WebApplication.h"
#include "Poco/WebWidgets/RequestProcessor.h"
#include "Poco/WebWidgets/SubmitButtonCell.h"
#include "Poco/WebWidgets/SubmitButton.h"
#include "Poco/WebWidgets/WebWidgetsException.h"
#include "Poco/Net/HTMLForm.h"
#include "Poco/Net/HTTPServerRequest.h"
@@ -213,7 +214,14 @@ void WebApplication::notifySubmitButton(Renderable::ID id)
if (it == _submitButtons.end())
throw WebWidgetsException("failed to find submitButton with id " + Poco::NumberFormatter::format(id));
it->second->buttonClicked(this);
View* pOwner = it->second->getOwner();
poco_assert (pOwner);
SubmitButton* pSubmit = dynamic_cast<SubmitButton*>(pOwner);
if (pSubmit)
{
Button::ButtonEvent clickedEvent(pSubmit);
pSubmit->buttonClicked.notify(pSubmit, clickedEvent);
}
}