<listOptionValue builtIn="false" value="Native_API"/>
</option>
<option id="gnu.cpp.compiler.option.dialect.std.1756711526" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.c++11" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1776859471" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols"/>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1776859471" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="MSG_PRIVATE_API"/>
+ </option>
<option id="gnu.cpp.compiler.option.other.other.1256197611" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" value="-c -fmessage-length=0 -Wno-extern-c-compat" valueType="string"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1529131313" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
</tool>
<listOptionValue builtIn="false" value="Native_API"/>
</option>
<option id="gnu.cpp.compiler.option.dialect.std.177145679" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.c++11" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.preprocessor.def.889877088" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols"/>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.889877088" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def"/>
<option id="gnu.cpp.compiler.option.other.other.645149247" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" value="-c -fmessage-length=0 -Wno-extern-c-compat" valueType="string"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1209285457" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
</tool>
#include "MessageMms.h"
#include "MsgUtils.h"
#include "Logger.h"
+#include "MsgTypes.h"
+
+#include <vector>
namespace Msg {
class MsgComposer {
virtual MessageSMSRef createSms() = 0;
virtual MessageMmsRef createMms() = 0;
+ virtual std::vector<MessageRef> createMultiMessage(const std::string &text) = 0;
+
+ /**
+ * @brief Calculates input text length by encode type.
+ * @param[in] text input text.
+ * @param[out] text metric.
+ **/
+ virtual void calculateTextMetric(const std::string &text, MsgTextMetric &textMetric) = 0;
MessageRef createMessage(Message::Type type);
};
*/
static std::string whatError(int error);
- /**
- * @brief Calculates input text length by encode type.
- * @param[in] text input text.
- * @param[out] text metric.
- **/
- static void calculateTextMetric(const std::string &text, MsgTextMetric &textMetric);
-
private:
std::unique_ptr<MsgStorage> m_Storage;
std::unique_ptr<MsgTransport> m_Transport;
m_Storage.reset(new MsgStoragePrivate(m_MsgHandle));
m_Transport.reset(new MsgTransportPrivate(m_MsgHandle));
- m_Composer.reset(new MsgComposerPrivate());
+ m_Composer.reset(new MsgComposerPrivate(*this));
#elif MSG_PUBLIC_API
// TODO: impl for public API
#endif
return "SOME ANOTHER ERROR";
}
-
-void MsgEngine::calculateTextMetric(const std::string &text, MsgTextMetric &textMetric)
-{
- textMetric.reset();
-
-#ifdef MSG_PRIVATE_API
- static const int maxGsm7Len = 160;
- static const int maxUnicodeLen = 70;
- static const int maxMmsLen = 180; // In bytes
- int maxSmsLen = maxGsm7Len; // In chars
-
- msg_encode_type_t encode = MSG_ENCODE_GSM7BIT;
- unsigned textLen = 0;
- unsigned segmentLen = 0;
- int bytesInChar = 1;
-
- if (!text.empty()) {
- if (msg_util_calculate_text_length(text.c_str(), MSG_ENCODE_AUTO, &textLen, &segmentLen, &encode) != 0) {
- MSG_LOG_ERROR("msg_util_calculate_text_length returns error");
- }
-
- switch (encode)
- {
- case MSG_ENCODE_UCS2:
- bytesInChar = 2;
- maxSmsLen = maxUnicodeLen;
- break;
-
- case MSG_ENCODE_GSM7BIT:
- case MSG_ENCODE_AUTO:
- bytesInChar = 1;
- maxSmsLen = maxGsm7Len;
- break;
-
- default:
- MSG_LOG_ERROR("Unknown encode type: ", encode);
- break;
- }
-
- textLen /= bytesInChar;
- }
-
- if (textLen == 0)
- textLen = text.length() / bytesInChar;
-
- textMetric.isMms = textLen > maxSmsLen;
- textMetric.bytes = textLen * bytesInChar;
- textMetric.textLen = textLen;
- textMetric.maxLen = textMetric.isMms ? maxMmsLen : maxSmsLen;
-
-
-#endif
-}
#include "MsgUtils.h"
#include "LangUtils.h"
+#include "Logger.h"
#include <string.h>
#include <ctype.h>
do {
prevIndex = index;
eina_unicode_utf8_next_get(str.c_str(), &index);
+ // FIXME: recognize graphemes
bytes += index - prevIndex;
if (bytes >= maxSize || index == size) {
int from = startIndex;
int to = 0;
- if (bytes == maxSize || index == size) {
+ if (bytes <= maxSize) {
to = index;
} else {
to = prevIndex;
}
startIndex = index;
std::string s(&str[from], &str[to]);
+
if (!s.empty() && s.size() <= maxSize)
list.push_back(std::move(s));
bytes = 0;
return mmsRef;
}
+std::vector<MessageRef> MsgComposerDummy::createMultiMessage(const std::string &text)
+{
+ return {};
+}
+
void MsgComposerDummy::setSmilHeader(bool isTextTop)
{
}
virtual MessageSMSRef createSms();
virtual MessageMmsRef createMms();
+ virtual std::vector<MessageRef> createMultiMessage(const std::string &text);
private:
void setSmilHeader(bool isTextTop);
* limitations under the License.
*/
+#include "MsgEngine.h"
#include "MsgComposerPrivate.h"
#include "MessageSMSPrivate.h"
#include "MessageMmsPrivate.h"
#include "MsgUtilsPrivate.h"
#include "MsgDefPrivate.h"
+#include "MsgUtils.h"
+#include "MsgEngine.h"
+#include "Logger.h"
#include <msg.h>
using namespace Msg;
-MsgComposerPrivate::MsgComposerPrivate()
+MsgComposerPrivate::MsgComposerPrivate(MsgEngine &msgEngine)
+ : m_Engine(msgEngine)
{
}
msg_set_int_value(imageRegion, MSG_MMS_REGION_LENGTH_HEIGHT_INT, smilRegionHeight);
msg_set_bool_value(imageRegion, MSG_MMS_REGION_LENGTH_HEIGHT_PERCENT_BOOL, true);
}
+
+std::vector<MessageRef> MsgComposerPrivate::createMultiMessage(const std::string &text)
+{
+ std::vector<MessageRef> msgList;
+ int maxMsgSize = m_Engine.getSettings().getMaxMmsSize();
+ if (maxMsgSize <= 0) {
+ MSG_LOG_ERROR("getMaxMmsSize() returns 0");
+ return {};
+ }
+
+ auto textList = MsgUtils::splitUtf8String(text, maxMsgSize);
+
+ for (auto &&text : textList) {
+ MsgTextMetric metric;
+ calculateTextMetric(text, metric);
+ Message::Type type = metric.isMms ? Message::MT_MMS : Message::MT_SMS;
+ auto msg = createMessage(type);
+ if (msg) {
+ msg->setText(std::move(text));
+ msgList.push_back(msg);
+ }
+ }
+
+ return msgList;
+}
+
+void MsgComposerPrivate::calculateTextMetric(const std::string &text, MsgTextMetric &textMetric)
+{
+ textMetric.reset();
+
+ static const int maxGsm7Len = 160;
+ static const int maxUnicodeLen = 70;
+ const int maxMmsLen = m_Engine.getSettings().getMaxMmsSize();; // In bytes
+ int maxSmsLen = maxGsm7Len; // In chars
+
+ msg_encode_type_t encode = MSG_ENCODE_GSM7BIT;
+ unsigned textLen = 0;
+ unsigned segmentLen = 0;
+ int bytesInChar = 1;
+
+ if (!text.empty()) {
+ if (msg_util_calculate_text_length(text.c_str(), MSG_ENCODE_AUTO, &textLen, &segmentLen, &encode) != 0) {
+ MSG_LOG_ERROR("msg_util_calculate_text_length returns error");
+ }
+
+ switch (encode)
+ {
+ case MSG_ENCODE_UCS2:
+ bytesInChar = 2;
+ maxSmsLen = maxUnicodeLen;
+ break;
+
+ case MSG_ENCODE_GSM7BIT:
+ case MSG_ENCODE_AUTO:
+ bytesInChar = 1;
+ maxSmsLen = maxGsm7Len;
+ break;
+
+ default:
+ MSG_LOG_ERROR("Unknown encode type: ", encode);
+ break;
+ }
+
+ textLen /= bytesInChar;
+ }
+
+ if (textLen == 0)
+ textLen = text.length() / bytesInChar;
+
+ textMetric.isMms = textLen > maxSmsLen;
+ textMetric.bytes = textLen * bytesInChar;
+ textMetric.textLen = textLen;
+ textMetric.maxLen = textMetric.isMms ? maxMmsLen : maxSmsLen;
+}
#include <msg_types.h>
namespace Msg {
+ class MsgEngine;
class MsgComposerPrivate
: public MsgComposer {
public:
- MsgComposerPrivate();
+ MsgComposerPrivate(MsgEngine &msgEngine);
MsgComposerPrivate(MsgComposerPrivate&) = delete;
MsgComposerPrivate &operator=(MsgComposerPrivate&) = delete;
virtual ~MsgComposerPrivate();
- virtual MessageSMSRef createSms();
- virtual MessageMmsRef createMms();
+ MessageSMSRef createSms() override;
+ MessageMmsRef createMms() override;
+ std::vector<MessageRef> createMultiMessage(const std::string &text) override;
+ void calculateTextMetric(const std::string &text, MsgTextMetric &textMetric) override;
private:
void setSmilHeader(msg_struct_t mms, bool isTextTop);
+
+ private:
+ MsgEngine &m_Engine;
};
}
msg_set_struct_handle(req, MSG_REQUEST_MESSAGE_HND, privMsg);
-
if (privMsg.isMms()) {
MSG_LOG("Sending MMS");
err = msg_mms_send_message(m_ServiceHandle, req);
void setDismissByOutsideTapFlag(bool value);
bool getDismissByOutsideTapFlag() const;
+
void setDismissByPauseAppFlag(bool value);
bool getDismissByPauseAppFlag() const;
+ void setDismissByBackButtonFlag(bool value);
+ bool getDismissByBackButtonFlag() const;
+
protected:
static Evas_Object *getWindow();
private:
bool m_OutsideTapDismiss;
bool m_PauseAppDismiss;
+ bool m_BackButtonDismiss;
};
}
BasePopup::BasePopup(Evas_Object *popup)
: m_OutsideTapDismiss(false)
, m_PauseAppDismiss(false)
+ , m_BackButtonDismiss(true)
{
setEo(popup);
App::getInst().getPopupManager().push(*this);
{
return m_PauseAppDismiss;
}
+
+void BasePopup::setDismissByBackButtonFlag(bool value)
+{
+ m_BackButtonDismiss = value;
+}
+
+bool BasePopup::getDismissByBackButtonFlag() const
+{
+ return m_BackButtonDismiss;
+}
void PopupManager::onHwBackButtonClicked(Evas_Object *obj, void *eventInfo)
{
- pop();
+ if (m_pPopup && m_pPopup->getDismissByBackButtonFlag())
+ pop();
}
void PopupManager::onPause()
#include "Recipient.h"
#include "MsgStorage.h"
+#include <set>
+
namespace Msg {
+ class MsgEngine;
class DefaultLayout;
class IconTextPopup;
class Popup;
void onHwBackButtonPreessed(Evas_Object *obj, void *event);
private:
+ struct SendInfo {
+ SendInfo ();
+ void reset();
+ std::vector<MessageRef> msgs;
+ std::set<RequestId> reqtIdSet;
+ Message::NetworkStatus status;
+ ThreadId threadId;
+ bool inProgress;
+ };
+
void prepareLayout();
void prepareBody();
void updateTextCounter();
- void sendMsg();
- bool checkBeforeSend(const Message &msg);
+ std::vector<MessageRef> createMessage();
+ void sendMessage();
+ void requestSendMessage();
+ void resetSendInfo();
+ MsgEngine &getMsgEngine();
+ bool checkBeforeSend(Message::Type type);
void handleSendResult(const Message &msg, MsgTransport::SendResult result);
bool read(Message &msg);
bool readBody(Message &msg);
// Popup callback:
void onSendingPopupDestroy(Evas *e, Evas_Object *obj, void *event_info);
+ void onSendingPopupBackButtonPressed(Evas_Object *obj, void *event_info);
void onTurnOffFlightModeClicked(Popup &popup);
void onAllowTransmissionTextLClicked(Popup &popup);
void onEnableDataRoamingClicked(Popup &popup);
IconTextPopup *m_pSendingPopup;
MsgTextMetric m_TextMetric;
Recipient m_Recip;
- ThreadId m_ThreadId;
- RequestId m_ReqtId;
+ SendInfo m_SendInfo;
};
}
#include "SystemSettingsManager.h"
#include "PopupManager.h"
#include "ConvFrame.h"
+#include "MsgUtils.h"
using namespace Msg;
+MsgBodyFrame::SendInfo::SendInfo()
+ : reqtIdSet()
+ , status(Message::NS_Unknown)
+ , threadId()
+ , inProgress(false)
+{
+}
+
+void MsgBodyFrame::SendInfo::reset()
+{
+ msgs.clear();
+ inProgress = false;
+ reqtIdSet.clear();
+ status = Message::NS_Unknown;
+ threadId.reset();
+}
+
MsgBodyFrame::MsgBodyFrame(NaviFrameController &parent, Recipient recip)
: FrameController(parent)
, m_pLayout(nullptr)
MSG_LOG("");
prepareLayout();
prepareBody();
- App::getInst().getMsgEngine().getTransport().addListener(*this);
+ getMsgEngine().getTransport().addListener(*this);
}
MsgBodyFrame::~MsgBodyFrame()
{
MSG_LOG("");
- App::getInst().getMsgEngine().getTransport().removeListener(*this);
+ if (m_pSendingPopup)
+ m_pSendingPopup->destroy();
+ getMsgEngine().getTransport().removeListener(*this);
}
void MsgBodyFrame::prepareLayout()
void MsgBodyFrame::updateTextCounter()
{
const std::string &text = m_pBody->getEntry().getText();
- App::getInst().getMsgEngine().calculateTextMetric(text, m_TextMetric);
+ getMsgEngine().getComposer().calculateTextMetric(text, m_TextMetric);
m_TextMetric.isMms ?
m_pBody->setCounter(msgt("WDS_MSG_SBODY_MMS_ABB")) :
// TODO: impl.
}
-bool MsgBodyFrame::checkBeforeSend(const Message &msg)
+bool MsgBodyFrame::checkBeforeSend(Message::Type type)
{
if (!App::getInst().getSysSettingsManager().isSimInserted()) {
// TODO: popup for No SIM card
return false;
}
- if (msg.isMms() && !App::getInst().getSysSettingsManager().isMobileDataEnabled()) {
+ if (MsgUtils::isMms(type) && !App::getInst().getSysSettingsManager().isMobileDataEnabled()) {
showMobileNetworkSettingsPopup();
return false;
}
return false;
}
-void MsgBodyFrame::sendMsg()
+MsgEngine &MsgBodyFrame::getMsgEngine()
{
- auto msgRef = App::getInst().getMsgEngine().getComposer().createMessage(m_TextMetric.isMms ? Message::MT_MMS : Message::MT_SMS);
- if (!msgRef)
- return;
+ return App::getInst().getMsgEngine();
+}
- Message &msg = *msgRef;
+std::vector<MessageRef> MsgBodyFrame::createMessage()
+{
+ const std::string &text = m_pBody->getEntry().getText();
+ std::vector<MessageRef> msgList = getMsgEngine().getComposer().createMultiMessage(text);
- if (!read(msg) || !checkBeforeSend(msg))
+ for (MessageRef &msg : msgList) {
+ readAddress(*msg);
+ }
+
+ return msgList;
+}
+
+void MsgBodyFrame::requestSendMessage()
+{
+ m_SendInfo.reset();
+
+ m_SendInfo.msgs = createMessage();
+ if (m_SendInfo.msgs .empty())
return;
- MsgTransport::SendResult sendRes = App::getInst().getMsgEngine().getTransport().sendMessage(msg, &m_ThreadId, &m_ReqtId);
- MSG_LOG("Send result = ", sendRes);
- MSG_LOG("Request id = ", m_ReqtId);
+ if (!checkBeforeSend(m_SendInfo.msgs [0]->getType()))
+ return;
+
+ sendMessage();
+}
+
+void MsgBodyFrame::sendMessage()
+{
+ MsgTransport::SendResult sendRes = MsgTransport::SendFail;
+ MessageRef lastSentMsg;
+
+ for (MessageRef msg : m_SendInfo.msgs) {
+ lastSentMsg = msg;
+ RequestId reqId;
+ sendRes = getMsgEngine().getTransport().sendMessage(msg, &m_SendInfo.threadId, &reqId);
+
+ MSG_LOG("Send result = ", sendRes);
+ MSG_LOG("Request id = ", reqId);
+
+ if (sendRes != MsgTransport::SendSuccess)
+ break;
- if (sendRes == MsgTransport::SendSuccess && m_ThreadId.isValid()) {
+ m_SendInfo.inProgress = true;
+ m_SendInfo.reqtIdSet.insert(reqId);
+ }
+
+ if (sendRes == MsgTransport::SendSuccess && m_SendInfo.threadId.isValid()) {
m_pBody->getEntry().clear();
showSendingProgressPopup();
} else {
- handleSendResult(msg, sendRes);
+ if (lastSentMsg)
+ handleSendResult(*lastSentMsg, sendRes);
}
}
if (!App::getInst().isTerminating()) {
// Navigate to ConvFrame
- if (m_ThreadId.isValid()) {
- ConvFrame *conv = getParent().getTopFrame<ConvFrame>();
+ if (m_SendInfo.threadId.isValid()) {
+ auto *conv = getParent().getTopFrame<ConvFrame>();
if (!conv) {
conv = new ConvFrame(getParent());
- conv->setThreadId(m_ThreadId);
+ conv->setThreadId(m_SendInfo.threadId);
getParent().push(*conv);
} else {
- conv->setThreadId(m_ThreadId);
+ conv->setThreadId(m_SendInfo.threadId);
getParent().promote(*conv);
}
}
{
if (!m_pSendingPopup) {
m_pSendingPopup = new IconTextPopup;
+ m_pSendingPopup->setDismissByBackButtonFlag(false);
m_pSendingPopup->addEventCb(EVAS_CALLBACK_DEL, makeCbFirst(&MsgBodyFrame::onSendingPopupDestroy), this);
+ m_pSendingPopup->addHwButtonEvent(EEXT_CALLBACK_BACK, makeCbFirst(&MsgBodyFrame::onSendingPopupBackButtonPressed), this);
m_pSendingPopup->setIcon(IconTextPopup::ProgressIcon);
m_pSendingPopup->setText(msgt("IDS_MSG_BODY_SENDING_ING_M_STATUS_ABB"));
m_pSendingPopup->show();
{
auto *popup = new StandardPopup(StandardPopup::buttons2Style);
// TODO: remove later
- int numberOfCharacters = 2048;
+ int numberOfCharacters = getMsgEngine().getSettings().getMaxMmsSize();
int numberOfMmsMsg = 2;
std::string popupMessage = msgArgs("WDS_MSG_BODY_MAXIMUM_NUMBER_OF_CHARACTERS_HPD_EXCEEDED", numberOfCharacters);
m_pSendingPopup = nullptr;
}
+void MsgBodyFrame::onSendingPopupBackButtonPressed(Evas_Object *obj, void *event_info)
+{
+ MSG_LOG("");
+ if (m_pSendingPopup)
+ m_pSendingPopup->destroy();
+
+ if (m_SendInfo.inProgress) {
+ m_SendInfo.reset();
+ getParent().popGroup(*this);
+ }
+}
+
void MsgBodyFrame::onTurnOffFlightModeClicked(Popup &popup)
{
MSG_LOG("");
void MsgBodyFrame::onEntryActivated(Evas_Object *obj, void *event)
{
MSG_LOG("");
- sendMsg();
+ requestSendMessage();
}
void MsgBodyFrame::onSendButtonClicked()
{
MSG_LOG("");
- sendMsg();
+ requestSendMessage();
}
void MsgBodyFrame::onEntryFilter(Evas_Object *obj, char **text)
MSG_LOG("Id = ", id);
MSG_LOG("Network status = ", networkStatus);
- if (m_pSendingPopup && m_ReqtId == id && networkStatus != Message::NS_Sending) {
- if (networkStatus == Message::NS_Send_Success) {
+ auto reqIdIt = m_SendInfo.reqtIdSet.find(id);
+ bool reqFound = reqIdIt != m_SendInfo.reqtIdSet.end();
+
+ // Skip unknown request
+ if (!reqFound)
+ return;
+
+ if (networkStatus == Message::NS_Sending)
+ return;
+
+ m_SendInfo.reqtIdSet.erase(reqIdIt);
+ bool isLast = m_SendInfo.reqtIdSet.empty();
+
+ if (networkStatus == Message::NS_Send_Fail)
+ m_SendInfo.status = Message::NS_Send_Fail;
+ else if (networkStatus == Message::NS_Send_Pending && m_SendInfo.status != Message::NS_Send_Fail)
+ m_SendInfo.status = Message::NS_Send_Pending;
+ else if (m_SendInfo.status == Message::NS_Unknown)
+ m_SendInfo.status = networkStatus;
+
+ if (isLast || m_SendInfo.status == Message::NS_Send_Fail) {
+
+ m_SendInfo.inProgress = false;
+ m_SendInfo.reqtIdSet.clear();
+
+ if (m_SendInfo.status == Message::NS_Send_Success) {
m_pSendingPopup->setIcon(IconTextPopup::CheckIcon);
m_pSendingPopup->setText(msgt("WDS_WNOTI_TPOP_SENT_ABB"));
m_pSendingPopup->setTimeOut();
- } else if (networkStatus == Message::NS_Send_Fail) {
+ } else if (m_SendInfo.status == Message::NS_Send_Fail) {
m_pSendingPopup->setIcon(IconTextPopup::FailedIcon);
m_pSendingPopup->setText(msgt("WDS_MSG_TPOP_SENDING_FAILED_ABB"));
m_pSendingPopup->setTimeOut();
- } else if (networkStatus != Message::NS_Send_Pending) {
+ } else if (m_SendInfo.status != Message::NS_Send_Pending) {
m_pSendingPopup->destroy();
showSentWhenServiceBecomesAvailablePopup();
}
+
navigateAfterSent();
+ m_SendInfo.reset();
}
}
, private IThreadComposeListViewItemListener {
public:
- ThreadList(DefaultLayout *parent);
+ ThreadList(DefaultLayout &parent);
virtual ~ThreadList();
void setListener(IThreadListListener *l);
PaddingListViewItem *m_pTopPadItem;
PaddingListViewItem *m_pBottomPadItem;
NoContentListViewItem *m_pNoContentItem;
- DefaultLayout *m_pParentLayout;
};
class IThreadListListener {
void MsgThreadFrame::prepareThreadList()
{
if (!m_pThreadList) {
- m_pThreadList = new ThreadList(m_pLayout);
+ m_pThreadList = new ThreadList(*m_pLayout);
m_pThreadList->setListener(this);
m_pLayout->setContent(*m_pThreadList);
m_pLayout->showContent(true);
}
}
-ThreadList::ThreadList(DefaultLayout *parent)
- : ListView(*parent, App::getInst().getWindow().getCircleSurface())
+ThreadList::ThreadList(DefaultLayout &parent)
+ : ListView(parent, App::getInst().getWindow().getCircleSurface())
, m_pListener(nullptr)
, m_App(App::getInst())
, m_DeleteMode(false)
, m_pTopPadItem(nullptr)
, m_pBottomPadItem(nullptr)
, m_pNoContentItem(nullptr)
- , m_pParentLayout(parent)
{
ListView::setListener(this);
ListView::setHomogeneous(false);