#include <unordered_map>
#include <unordered_set>
+#include <functional>
namespace Msg
{
* @brief Sets thread id
* @param[in] thread id
*/
- void setThreadId(ThreadId id,const std::string &searchWord = std::string());
+ void setThreadId(ThreadId id, const char *searchWord = nullptr);
/**
* @brief Gets thread id
*/
std::vector<ConvListItem*> getConvItems() const;
+ void setBodyFocusCb(std::function<bool()> bodyFocusFunc);
+
private:
typedef std::unordered_map<MsgId::Type, ConvListItem*> ConvListItemMap;
typedef std::unordered_set<std::string> DateLineItemSet;
std::string m_SearchWord;
BubbleEntityFactory m_BubbleEntityFactory;
ComposeListItem *m_pComposeItem;
+ std::function<bool()> m_BodyFocusFunc;
};
class IConvListListener
, m_SearchWord()
, m_BubbleEntityFactory(app, workingDir)
, m_pComposeItem(nullptr)
+ , m_BodyFocusFunc()
{
create(parent);
}
}
}
-void ConvList::setThreadId(ThreadId id, const std::string &searchWord)
+void ConvList::setThreadId(ThreadId id, const char *searchWord)
{
bool fillList = false;
updateRecipThumbId();
}
- if(searchWord != m_SearchWord)
+ if(searchWord && strcmp(searchWord, m_SearchWord.c_str()))
{
fillList = true;
m_SearchWord = searchWord;
{
ListItem *item = m_pList->getLastItem();
if(item)
- m_pList->showItem(*item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ {
+ ComposeListViewItem *composeItem = dynamic_cast<ComposeListViewItem *>(item);
+ if(composeItem && composeItem->isVisible())
+ {
+ m_pList->showItem(*item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ }
+ else
+ {
+ item = m_pList->getPrevItem(*item);
+ if(item)
+ m_pList->showItem(*item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+ }
+ }
}
ConvListItem *ConvList::getItem(MsgId msgId) const
return m_pList->getItems<ConvListItem>();
}
+void ConvList::setBodyFocusCb(std::function<bool()> bodyFocusFunc)
+{
+ m_BodyFocusFunc = std::move(bodyFocusFunc);
+}
+
void ConvList::onListItemLongPressed(ListItem &listItem)
{
ConvListItem *item = dynamic_cast<ConvListItem*>(&listItem);
void ConvList::onListResized(Evas_Object *obj, void *eventInfo)
{
- navigateToBottom();
+ MSG_LOG("");
+ if(m_BodyFocusFunc && m_BodyFocusFunc())
+ navigateToBottom();
}
+
void show(bool show);
void navigate();
+ bool isVisible() const;
protected:
virtual Evas_Object *getBubbleContent() = 0;
getOwner()->showItem(*this, ELM_GENLIST_ITEM_SCROLLTO_BOTTOM);
}
+bool ComposeListViewItem::isVisible() const
+{
+ return m_Visibility;
+}
+
void ComposeListViewItem::show(bool show)
{
m_Visibility = show;
void navigateToBottom();
void execCmd(const AppControlComposeRef &cmd);
void execCmd(const AppControlDefaultRef &cmd);
- void setThreadId(ThreadId id, const std::string &searchWord = std::string(), bool updateConvList = true, bool updateRecipPanel = true);
+ void setThreadId(ThreadId id, const char *searchWord = nullptr, bool updateConvList = true, bool updateRecipPanel = true);
void setListener(IConversationListener *listener);
void forwardMsg(MsgId id);
void checkAndSetMsgType(bool force = false);
void navigateToSlideShow(MsgId id);
void setBodyFocus();
+ bool getBodyFocus() const;
void setRecipEntryFocus();
void resetMsgThread(bool updateConvList = true, bool updateRecipPanel = true);
void updateActiveNotifPolicy();
if(m_pContactsList)
m_pContactsList->setListener(nullptr);
if(m_pConvList)
+ {
m_pConvList->setListener(nullptr);
+ m_pConvList->setBodyFocusCb(nullptr);
+ }
m_AttachPanel.setListener(nullptr);
if(m_NnotifyConvertMsgTypeIdler)
{
getMsgEngine().getSettings().setActiveNotifPolicy(threadId);
}
-void Conversation::setThreadId(ThreadId id, const std::string &searchWord, bool updateConvList, bool updateRecipPanel)
+void Conversation::setThreadId(ThreadId id, const char *searchWord, bool updateConvList, bool updateRecipPanel)
{
MSG_LOG("Thread id = ", id);
m_ThreadId = id;
if(!m_pConvList)
{
m_pConvList = new ConvList(*m_pLayout, getApp(), m_WorkingDir);
+ m_pConvList->setBodyFocusCb(std::bind(&Conversation::getBodyFocus, this));
m_pConvList->setListener(this);
m_pConvList->show();
m_pLayout->setConvList(*m_pConvList);
}
}
+bool Conversation::getBodyFocus() const
+{
+ return m_pBody ? m_pBody->getFocus() : false;
+}
+
void Conversation::setRecipEntryFocus()
{
if(getOwner().getTransitionStatus())
void MsgThread::navigateToConversation(ThreadId threadId, MsgId msgId, const std::string &searchWord)
{
Conversation *frame = new Conversation(getParent());
- frame->setThreadId(threadId, searchWord);
+ frame->setThreadId(threadId, searchWord.c_str());
if(msgId.isValid())
frame->navigateTo(msgId);
else