CHUI-855 FIXED Text entry bar auto expand does not resize

master
maksymsproductengine 2013-03-28 04:52:24 +02:00
parent 3a31b47028
commit da8f2ffb16
11 changed files with 282 additions and 302 deletions

View File

@ -25,6 +25,7 @@
*/
#include "linden_common.h"
#include "llscrollcontainer.h"
#include "llchatentry.h"
@ -42,7 +43,9 @@ LLChatEntry::LLChatEntry(const Params& p)
mHasHistory(p.has_history),
mIsExpandable(p.is_expandable),
mExpandLinesCount(p.expand_lines_count),
mPrevLinesCount(0)
mPrevLinesCount(0),
mSingleLineMode(false),
mPrevExpandedLineCount(S32_MAX)
{
// Initialize current history line iterator
mCurrentHistoryLine = mLineHistory.begin();
@ -82,20 +85,23 @@ boost::signals2::connection LLChatEntry::setTextExpandedCallback(const commit_si
void LLChatEntry::expandText()
{
S32 line_count = mSingleLineMode ? 1 : mExpandLinesCount;
int visible_lines_count = llabs(getVisibleLines(true).first - getVisibleLines(true).second);
bool can_expand = getLineCount() <= mExpandLinesCount;
bool can_changed = getLineCount() <= line_count || line_count < mPrevExpandedLineCount ;
mPrevExpandedLineCount = line_count;
// true if pasted text has more lines than expand height limit and expand limit is not reached yet
bool text_pasted = (getLineCount() > mExpandLinesCount) && (visible_lines_count < mExpandLinesCount);
bool text_pasted = (getLineCount() > line_count) && (visible_lines_count < line_count);
if (mIsExpandable && (can_expand || text_pasted) && getLineCount() != mPrevLinesCount)
if (mIsExpandable && (can_changed || text_pasted || mSingleLineMode) && getLineCount() != mPrevLinesCount)
{
int lines_height = 0;
if (text_pasted)
{
// text is pasted and now mLineInfoList.size() > mExpandLineCounts and mLineInfoList is not empty,
// so lines_height is the sum of the last 'mExpandLinesCount' lines height
lines_height = (mLineInfoList.end() - mExpandLinesCount)->mRect.mTop - mLineInfoList.back().mRect.mBottom;
// so lines_height is the sum of the last 'expanded_line_count' lines height
lines_height = (mLineInfoList.end() - line_count)->mRect.mTop - mLineInfoList.back().mRect.mBottom;
}
else
{
@ -114,6 +120,8 @@ void LLChatEntry::expandText()
{
(*mTextExpandedSignal)(this, LLSD() );
}
needsReflow();
}
}
@ -235,3 +243,15 @@ BOOL LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
return handled;
}
void LLChatEntry::enableSingleLineMode(bool single_line_mode)
{
if (mScroller)
{
mScroller->setSize(single_line_mode ? 0 : -1);
}
mSingleLineMode = single_line_mode;
mPrevLinesCount = -1;
setWordWrap(!single_line_mode);
}

View File

@ -65,6 +65,7 @@ public:
/*virtual*/ void onFocusReceived();
/*virtual*/ void onFocusLost();
void enableSingleLineMode(bool single_line_mode);
boost::signals2::connection setTextExpandedCallback(const commit_signal_t::slot_type& cb);
private:
@ -95,9 +96,11 @@ private:
line_history_t mLineHistory; // line history storage
bool mHasHistory; // flag for enabled/disabled line history
bool mIsExpandable;
bool mSingleLineMode;
int mExpandLinesCount;
int mPrevLinesCount;
S32 mExpandLinesCount;
S32 mPrevLinesCount;
S32 mPrevExpandedLineCount;
};
#endif /* LLCHATENTRY_H_ */

View File

@ -642,3 +642,8 @@ void LLScrollbar::onLineDownBtnPressed( const LLSD& data )
{
changeLine( mStepSize, TRUE );
}
void LLScrollbar::setThickness(S32 thickness)
{
mThickness = thickness < 0 ? LLUI::sSettingGroups["config"]->getS32("UIScrollbarSize") : thickness;
}

View File

@ -124,6 +124,9 @@ public:
void onLineUpBtnPressed(const LLSD& data);
void onLineDownBtnPressed(const LLSD& data);
S32 getThickness() const { return mThickness; }
void setThickness(S32 thickness);
private:
void updateThumbRect();

View File

@ -73,7 +73,8 @@ LLScrollContainer::Params::Params()
hide_scrollbar("hide_scrollbar"),
min_auto_scroll_rate("min_auto_scroll_rate", 100),
max_auto_scroll_rate("max_auto_scroll_rate", 1000),
reserve_scroll_corner("reserve_scroll_corner", false)
reserve_scroll_corner("reserve_scroll_corner", false),
size("size", -1)
{}
@ -88,9 +89,12 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
mReserveScrollCorner(p.reserve_scroll_corner),
mMinAutoScrollRate(p.min_auto_scroll_rate),
mMaxAutoScrollRate(p.max_auto_scroll_rate),
mScrolledView(NULL)
mScrolledView(NULL),
mSize(p.size)
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
LLRect border_rect( 0, getRect().getHeight(), getRect().getWidth(), 0 );
LLViewBorder::Params params;
params.name("scroll border");
@ -276,7 +280,6 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
// Scroll folder view if needed. Never accepts a drag or drop.
*accept = ACCEPT_NO;
BOOL handled = autoScroll(x, y);
@ -292,7 +295,8 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,
bool LLScrollContainer::autoScroll(S32 x, S32 y)
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
bool scrolling = false;
if( mScrollbar[HORIZONTAL]->getVisible() || mScrollbar[VERTICAL]->getVisible() )
@ -365,7 +369,9 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const
{
const LLRect& doc_rect = getScrolledViewRect();
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
S32 doc_width = doc_rect.getWidth();
S32 doc_height = doc_rect.getHeight();
@ -406,7 +412,9 @@ void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height
void LLScrollContainer::draw()
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
if (mAutoScrolling)
{
// add acceleration to autoscroll
@ -515,7 +523,9 @@ void LLScrollContainer::updateScroll()
{
return;
}
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
LLRect doc_rect = mScrolledView->getRect();
S32 doc_width = doc_rect.getWidth();
S32 doc_height = doc_rect.getHeight();
@ -716,3 +726,9 @@ S32 LLScrollContainer::getBorderWidth() const
return 0;
}
void LLScrollContainer::setSize(S32 size)
{
mSize = size;
mScrollbar[VERTICAL]->setThickness(size);
mScrollbar[HORIZONTAL]->setThickness(size);
}

View File

@ -68,6 +68,7 @@ public:
max_auto_scroll_rate;
Optional<LLUIColor> bg_color;
Optional<LLScrollbar::callback_t> scroll_callback;
Optional<S32> size;
Params();
};
@ -116,6 +117,9 @@ public:
bool autoScroll(S32 x, S32 y);
S32 getSize() const { return mSize; }
void setSize(S32 thickness);
protected:
LLView* mScrolledView;

View File

@ -3490,3 +3490,7 @@ F32 LLImageTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 select
return 0.0;
}
void LLTextBase::setWordWrap(bool wrap)
{
mWordWrap = wrap;
}

View File

@ -41,6 +41,7 @@
#include <boost/signals2.hpp>
class LLScrollContainer;
class LLContextMenu;
class LLUrlMatch;
@ -434,6 +435,9 @@ public:
virtual void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);
void setWordWrap(bool wrap);
LLScrollContainer* getScrollContainer() const { return mScroller; }
protected:
// helper structs
struct compare_bottom;
@ -634,7 +638,7 @@ protected:
// support widgets
LLContextMenu* mPopupMenu;
LLView* mDocumentView;
class LLScrollContainer* mScroller;
LLScrollContainer* mScroller;
// transient state
S32 mReflowIndex; // index at which to start reflow. S32_MAX indicates no reflow needed.

View File

@ -64,6 +64,8 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
, mHasVisibleBeenInitialized(false)
, mIsParticipantListExpanded(true)
, mChatLayoutPanel(NULL)
, mInputPanels(NULL)
, mChatLayoutPanelHeight(0)
{
setAutoFocus(FALSE);
mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
@ -265,13 +267,15 @@ BOOL LLFloaterIMSessionTab::postBuild()
mInputEditor = getChild<LLChatEntry>("chat_editor");
mChatLayoutPanel = getChild<LLLayoutPanel>("chat_layout_panel");
mInputPanels = getChild<LLLayoutStack>("input_panels");
mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatLayoutPanel, this));
mInputEditor->setCommitOnFocusLost( FALSE );
mInputEditor->setPassDelete(TRUE);
mInputEditor->setFont(LLViewerChat::getChatFont());
mInputEditorPad = mChatLayoutPanel->getRect().getHeight() - mInputEditor->getRect().getHeight();
mChatLayoutPanelHeight = mChatLayoutPanel->getRect().getHeight();
mInputEditorPad = mChatLayoutPanelHeight - mInputEditor->getRect().getHeight();
setOpenPositioning(LLFloaterEnums::POSITIONING_RELATIVE);
@ -749,9 +753,7 @@ void LLFloaterIMSessionTab::forceReshape()
void LLFloaterIMSessionTab::reshapeChatLayoutPanel()
{
LLRect chat_layout_panel_rect = mChatLayoutPanel->getRect();
LLRect input_rect = mInputEditor->getRect();
mChatLayoutPanel->reshape(chat_layout_panel_rect.getWidth(), input_rect.getHeight() + mInputEditorPad, FALSE);
mChatLayoutPanel->reshape(mChatLayoutPanel->getRect().getWidth(), mInputEditor->getRect().getHeight() + mInputEditorPad, FALSE);
}
void LLFloaterIMSessionTab::showTranslationCheckbox(BOOL show)
@ -850,6 +852,7 @@ void LLFloaterIMSessionTab::onCollapseToLine(LLFloaterIMSessionTab* self)
self->mExpandCollapseLineBtn->setImageOverlay(self->getString(expand ? "collapseline_icon" : "expandline_icon"));
self->mContentPanel->setVisible(!expand);
self->mToolbarPanel->setVisible(!expand);
self->mInputEditor->enableSingleLineMode(expand);
self->reshapeFloater(expand);
self->setMessagePaneExpanded(!expand);
}
@ -862,20 +865,20 @@ void LLFloaterIMSessionTab::reshapeFloater(bool collapse)
if(collapse)
{
mFloaterHeight = floater_rect.getHeight();
S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight();
S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight()
+ mChatLayoutPanel->getRect().getHeight() - mChatLayoutPanelHeight + 2;
floater_rect.mTop -= height;
enableResizeCtrls(true, true, false);
}
else
{
floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
enableResizeCtrls(true, true, true);
}
enableResizeCtrls(true, true, !collapse);
saveCollapsedState();
setShape(floater_rect, true);
mBodyStack->updateLayout();
}
void LLFloaterIMSessionTab::restoreFloater()

View File

@ -175,17 +175,14 @@ protected:
LLChatHistory* mChatHistory;
LLChatEntry* mInputEditor;
LLLayoutPanel * mChatLayoutPanel;
int mInputEditorPad; // padding between input field and chat history
LLLayoutStack * mInputPanels;
LLButton* mExpandCollapseLineBtn;
LLButton* mExpandCollapseBtn;
LLButton* mTearOffBtn;
LLButton* mCloseBtn;
LLButton* mGearBtn;
S32 mFloaterHeight;
private:
// Handling selection and contextual menu
void doToSelected(const LLSD& userdata);
@ -209,6 +206,10 @@ private:
bool mHasVisibleBeenInitialized;
LLTimer* mRefreshTimer; ///< Defines the rate at which refresh() is called.
S32 mInputEditorPad;
S32 mChatLayoutPanelHeight;
S32 mFloaterHeight;
};

View File

@ -42,58 +42,52 @@
<floater.string
name="multiple_participants_added"
value="[NAME] were invited to the conversation."/>
<floater.string
<floater.string
name="tooltip_to_separate_window"
value="Move this conversation to a separate window"/>
<floater.string
<floater.string
name="tooltip_to_main_window"
value="Move this conversation back to main window"/>
<floater.string
<floater.string
name="start_call_button_tooltip"
value="Open voice connection"/>
<floater.string
<floater.string
name="end_call_button_tooltip"
value="Close voice connection"/>
<floater.string
<floater.string
name="expcol_button_not_tearoff_tooltip"
value="Collapse this pane"/>
<floater.string
<floater.string
name="expcol_button_tearoff_and_expanded_tooltip"
value="Collapse participant list"/>
<floater.string
<floater.string
name="expcol_button_tearoff_and_collapsed_tooltip"
value="Expand participant list"/>
<view
follows="all"
layout="topleft"
name="contents_view"
top="0"
left="0"
height="355"
width="394">
<layout_stack
animate="false"
default_tab_group="2"
follows="all"
height="355"
width="394"
layout="topleft"
orientation="vertical"
name="main_stack"
tab_group="1"
top="0"
left="0">
<layout_panel
follows="left|top|right"
follows="all"
layout="topleft"
name="contents_view"
top="0"
left="0"
right="-1"
bottom="-1">
<layout_stack
animate="false"
default_tab_group="2"
follows="all"
right="-5"
bottom="-1"
layout="topleft"
name="toolbar_panel"
orientation="vertical"
name="main_stack"
tab_group="1"
top="0"
left="0"
height="35"
min_height="35"
width="394">
<menu_button
left="5">
<layout_panel
auto_resize="false"
name="toolbar_panel"
height="35">
<menu_button
menu_filename="menu_im_session_showmodes.xml"
follows="top|left"
height="25"
@ -107,22 +101,22 @@
tool_tip="View/sort options"
top="5"
width="31" />
<menu_button
menu_filename="menu_im_conversation.xml"
follows="top|left"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
top="5"
left_pad="2"
name="gear_btn"
visible="false"
tool_tip="Actions on selected person"
width="31"/>
<button
<menu_button
menu_filename="menu_im_conversation.xml"
follows="top|left"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
top="5"
left_pad="2"
name="gear_btn"
visible="false"
tool_tip="Actions on selected person"
width="31"/>
<button
enabled="false"
follows="top|left"
height="25"
@ -136,7 +130,7 @@
name="add_btn"
tool_tip="Add someone to this conversation"
width="31"/>
<button
<button
follows="top|left"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
@ -149,19 +143,19 @@
name="voice_call_btn"
tool_tip="Open voice connection"
width="31"/>
<output_monitor
auto_update="true"
follows="top|left"
draw_border="false"
height="16"
layout="topleft"
top="10"
left_pad="10"
mouse_opaque="true"
name="speaking_indicator"
visible="false"
width="20" />
<button
<output_monitor
auto_update="true"
follows="top|left"
draw_border="false"
height="16"
layout="topleft"
top="10"
left_pad="10"
mouse_opaque="true"
name="speaking_indicator"
visible="false"
width="20" />
<button
follows="right|top"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
@ -170,232 +164,155 @@
image_unselected="Toolbar_Middle_Off"
layout="topleft"
top="5"
left="292"
right="-70"
name="close_btn"
tool_tip="End this conversation"
width="31" />
<button
<button
follows="right|top"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Conv_toolbar_collapse"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
top="5"
left_pad="2"
name="expand_collapse_btn"
tool_tip="Collapse/Expand this pane"
width="31" />
<button
<button
follows="right|top"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Conv_toolbar_arrow_ne"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
top="5"
left_pad="2"
name="tear_off_btn"
width="31" />
</layout_panel>
<layout_panel
name="body_panel"
follows="all"
width="394"
height="235"
user_resize="false"
auto_resize="true">
<layout_stack
animate="true"
default_tab_group="2"
follows="all"
height="275"
width="394"
layout="topleft"
orientation="horizontal"
name="im_panels"
tab_group="1"
top_pad="0"
left="0">
<layout_panel
name="speakers_list_panel"
follows="all"
expanded_min_dim="115"
min_dim="0"
width="150"
height="275"
user_resize="true"
auto_resize="false">
</layout_panel>
<layout_panel
default_tab_group="3"
left="0"
tab_group="2"
follows="all"
top="0"
height="275"
width="244"
layout="topleft"
user_resize="true"
auto_resize="true"
visible="true"
name="right_part_holder"
min_width="221">
<panel
name="trnsAndChat_panel"
follows="all"
layout="topleft"
visible="true"
height="240"
width="244">
<layout_stack
animate="true"
default_tab_group="2"
follows="all"
height="240"
width="244"
layout="topleft"
visible="true"
orientation="vertical"
name="translate_and_chat_stack"
tab_group="1"
left_pad="0"
top="0"
left="0">
<layout_panel
auto_resize="false"
user_resize="false"
height="26"
layout="topleft"
left_delta="0"
name="translate_chat_checkbox_lp"
top_delta="0"
visible="true"
width="210">
<check_box
top="10"
control_name="TranslateChat"
enabled="true"
height="16"
label="Translate chat"
layout="topleft"
left="5"
name="translate_chat_checkbox"
width="230" />
</layout_panel>
<layout_panel
width="210"
layout="topleft"
follows="all"
left_delta="0"
top_delta="0"
bottom="0"
visible="true"
user_resize="false"
auto_resize="true"
name="chat_holder">
<chat_history
font="SansSerifSmall"
follows="all"
visible="true"
name="chat_history"
parse_highlights="true"
parse_urls="true"
layout="topleft"
right="-5"
left="5"
top="0"
bottom="1">
</chat_history>
</layout_panel>
</layout_stack>
</panel>
</layout_panel>
</layout_stack>
</layout_panel>
<layout_panel
height="35"
layout="topleft"
follows="left|right|bottom"
left_delta="0"
right="0"
top_delta="0"
bottom="0"
visible="true"
user_resize="false"
auto_resize="false"
name="chat_layout_panel">
<layout_stack
animate="true"
default_tab_group="2"
follows="all"
height="35"
right="0"
layout="topleft"
orientation="horizontal"
name="input_panels"
top_pad="0"
left="0">
<layout_panel
height="35"
layout="topleft"
follows="left|right|bottom"
left_delta="0"
top_delta="0"
bottom="0"
visible="true"
user_resize="false"
auto_resize="true"
name="input_editor_layout_panel">
<chat_editor
expand_lines_count="5"
follows="left|right|bottom"
font="SansSerifSmall"
visible="true"
height="20"
is_expandable="true"
label="To"
text_tentative_color="TextFgTentativeColor"
layout="topleft"
name="chat_editor"
max_length="1023"
spellcheck="true"
tab_group="3"
width="160"
top="6"
left="5"
right="-5"
wrap="true">
</chat_editor>
</layout_panel>
<layout_panel
height="35"
layout="topleft"
follows="left|right|bottom"
left_delta="0"
top_delta="0"
bottom="0"
width="35"
visible="true"
user_resize="false"
auto_resize="false"
name="input_button_layout_panel">
<button
follows="left|right|bottom"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Conv_expand_one_line"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
name="minz_btn"
tool_tip="Shows/hides message panel"
width="28"/>
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
left_pad="2"
name="tear_off_btn"
top="5"
width="31" />
</layout_panel>
<layout_panel
name="body_panel"
height="235">
<layout_stack
default_tab_group="2"
follows="all"
orientation="horizontal"
name="im_panels"
tab_group="1"
top="0"
right="-1"
bottom="-1"
left="0">
<layout_panel
name="speakers_list_panel"
expanded_min_dim="115"
min_dim="0"
width="150"
user_resize="true"
auto_resize="false" />
<layout_panel
default_tab_group="3"
tab_group="2"
name="right_part_holder"
min_width="221">
<layout_stack
animate="true"
default_tab_group="2"
follows="all"
orientation="vertical"
name="translate_and_chat_stack"
tab_group="1"
top="0"
left="0"
right="-1"
bottom="-1">
<layout_panel
auto_resize="false"
height="26"
name="translate_chat_checkbox_lp">
<check_box
top="10"
control_name="TranslateChat"
enabled="true"
height="16"
label="Translate chat"
left="5"
name="translate_chat_checkbox"
width="230" />
</layout_panel>
<layout_panel
name="chat_holder">
<chat_history
font="SansSerifSmall"
follows="all"
name="chat_history"
parse_highlights="true"
parse_urls="true"
right="-1"
left="5"
top="0"
bottom="-1" />
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
</layout_panel>
<layout_panel
height="35"
auto_resize="false"
name="chat_layout_panel">
<layout_stack
animate="false"
default_tab_group="2"
follows="all"
right="-1"
orientation="horizontal"
name="input_panels"
top="0"
bottom="-1"
left="0">
<layout_panel
name="input_editor_layout_panel">
<chat_editor
layout="topleft"
expand_lines_count="5"
follows="left|right|bottom"
font="SansSerifSmall"
height="20"
is_expandable="true"
text_tentative_color="TextFgTentativeColor"
name="chat_editor"
max_length="1023"
spellcheck="true"
tab_group="3"
bottom="-8"
left="5"
right="-5"
wrap="true" />
</layout_panel>
<layout_panel
auto_resize="false"
name="input_button_layout_panel"
width="32">
<button
left="1"
top="4"
follows="left|right|top"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Conv_expand_one_line"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
name="minz_btn"
tool_tip="Shows/hides message panel"
width="28" />
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
</view>
</floater>