mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-17 03:03:23 +02:00
handled ajaxevents
This commit is contained in:
@@ -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"
|
||||
>
|
||||
|
@@ -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"
|
||||
>
|
||||
|
158
WebWidgets/include/Poco/WebWidgets/AjaxDelegate.h
Normal file
158
WebWidgets/include/Poco/WebWidgets/AjaxDelegate.h
Normal 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
|
@@ -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.
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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.
|
||||
{
|
||||
|
139
WebWidgets/src/AjaxDelegate.cpp
Normal file
139
WebWidgets/src/AjaxDelegate.cpp
Normal 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
|
@@ -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);
|
||||
|
@@ -66,7 +66,7 @@ ButtonCell::~ButtonCell()
|
||||
|
||||
void ButtonCell::handleForm(const std::string& field, const std::string& value)
|
||||
{
|
||||
buttonClicked(this);
|
||||
//buttonClicked(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -75,10 +75,14 @@ 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);
|
||||
}
|
||||
|
||||
response.send();
|
||||
else
|
||||
response.send();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user