// // ComboBoxCellRenderer.cpp // // $Id: //poco/Main/WebWidgets/ExtJS/src/ComboBoxCellRenderer.cpp#3 $ // // Library: ExtJS // Package: Core // Module: ComboBoxCellRenderer // // Copyright (c) 2007, 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/ExtJS/ComboBoxCellRenderer.h" #include "Poco/WebWidgets/ExtJS/TextFieldCellRenderer.h" #include "Poco/WebWidgets/ExtJS/FormRenderer.h" #include "Poco/WebWidgets/ExtJS/Utility.h" #include "Poco/WebWidgets/ComboBoxCell.h" #include "Poco/WebWidgets/ComboBox.h" #include "Poco/WebWidgets/WebApplication.h" #include "Poco/WebWidgets/RequestHandler.h" #include "Poco/NumberFormatter.h" #include "Poco/Delegate.h" #include namespace Poco { namespace WebWidgets { namespace ExtJS { const std::string ComboBoxCellRenderer::EV_SELECTED("select"); ComboBoxCellRenderer::ComboBoxCellRenderer() { } ComboBoxCellRenderer::~ComboBoxCellRenderer() { } void ComboBoxCellRenderer::addSelectedServerCallback(ComboBox* pCombo, const std::string& onSuccess, const std::string& onFailure) { //select : ( Ext.form.ComboBox combo, Ext.data.Record record, Number index ) static const std::string signature("function(combo,rec,idx)"); std::map addParams; addParams.insert(std::make_pair(ComboBoxCell::FIELD_VAL, "+rec.get('d')")); addParams.insert(std::make_pair(RequestHandler::KEY_EVID, ComboBoxCell::EV_SELECTED)); Utility::addServerCallback(pCombo->selected, signature, addParams, pCombo->id(), onSuccess, onFailure); } void ComboBoxCellRenderer::renderHead(const Renderable* pRenderable, const RenderContext& context, std::ostream& ostr) { poco_assert_dbg (pRenderable != 0); poco_assert_dbg (pRenderable->type() == typeid(Poco::WebWidgets::ComboBoxCell)); ComboBoxCell* pCell = const_cast(static_cast(pRenderable)); ComboBox* pOwner = dynamic_cast(pCell->getOwner()); poco_check_ptr (pOwner); ostr << "new Ext.form.ComboBox({"; TextFieldCellRenderer::writeCellProperties(pCell, ostr, true, false); ostr << ",store:new Ext.data.SimpleStore({autoLoad:true,fields:['d'],"; ostr << "proxy:new Ext.data.HttpProxy({url:"; std::map addParams; addParams.insert(std::make_pair(RequestHandler::KEY_EVID,ComboBoxCell::EV_LOAD)); std::string url(Utility::createURI(addParams, pOwner->id())); ostr << url << "}),"; ostr << "reader:new Ext.data.ArrayReader()})"; ostr << ",displayField:'d',typeAhead:true,triggerAction:'all'"; std::string tooltip (pCell->getToolTip()); if (!pOwner->selected.jsDelegates().empty()) { ostr << ",listeners:{"; Utility::writeJSEvent(ostr, EV_SELECTED, pOwner->selected.jsDelegates()); if (!tooltip.empty()) ostr << ",render:function(c){Ext.QuickTips.register({target:c.getEl(),text:'" << Utility::safe(tooltip) << "'});}"; ostr << "}"; } else if (!tooltip.empty()) { ostr << ",listeners:{"; ostr << "render:function(c){Ext.QuickTips.register({target:c.getEl(),text:'" << Utility::safe(tooltip) << "'});}}"; } ostr << "})"; pCell->beforeLoad += Poco::delegate(&ComboBoxCellRenderer::onLoad); WebApplication::instance().registerAjaxProcessor(Poco::NumberFormatter::format(pOwner->id()), pCell); } void ComboBoxCellRenderer::onLoad(void* pSender, Poco::Net::HTTPServerResponse* &pResponse) { poco_check_ptr (pSender); poco_check_ptr (pResponse); ComboBoxCell* pCell = reinterpret_cast(pSender); poco_check_ptr (pCell); pResponse->setChunkedTransferEncoding(true); pResponse->setContentType("text/javascript"); std::ostream& out = pResponse->send(); serialize (pCell, out); } void ComboBoxCellRenderer::serialize(const ComboBoxCell* pCell, std::ostream& ostr) { //now serialize data std::vector::const_iterator it = pCell->begin(); std::vector::const_iterator itEnd = pCell->end(); Formatter::Ptr ptrFormatter = pCell->getFormatter(); ostr << "["; for (; it != itEnd; ++it) { if (it != pCell->begin()) ostr << ","; if (ptrFormatter) ostr << "['" << ptrFormatter->format(*it) << "']"; else ostr << "['" << RefAnyCast(*it) << "']"; } ostr << "]"; } void ComboBoxCellRenderer::renderBody(const Renderable* pRenderable, const RenderContext& context, std::ostream& ostr) { } } } } // namespace Poco::WebWidgets::ExtJS