2013-08-09 00:01:20 +00:00
|
|
|
// Aseprite UI Library
|
2013-01-27 15:13:13 +00:00
|
|
|
// Copyright (C) 2001-2013 David Capello
|
2010-09-27 22:18:17 +00:00
|
|
|
//
|
2013-08-09 00:01:20 +00:00
|
|
|
// This source file is distributed under MIT license,
|
|
|
|
// please read LICENSE.txt for more information.
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-08-06 00:20:19 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
2009-07-12 20:29:16 +00:00
|
|
|
#include "config.h"
|
2013-08-06 00:20:19 +00:00
|
|
|
#endif
|
2009-07-12 20:29:16 +00:00
|
|
|
|
2011-03-27 23:42:16 +00:00
|
|
|
#include "base/compiler_specific.h"
|
2010-09-25 19:22:32 +00:00
|
|
|
#include "gfx/size.h"
|
2013-08-06 00:20:19 +00:00
|
|
|
#include "ui/ui.h"
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2011-03-27 23:42:16 +00:00
|
|
|
#include <allegro.h>
|
|
|
|
|
2012-06-18 01:02:54 +00:00
|
|
|
namespace ui {
|
|
|
|
|
2013-08-06 00:20:19 +00:00
|
|
|
using namespace gfx;
|
|
|
|
|
|
|
|
class ComboBoxButton : public Button {
|
2011-03-06 19:15:05 +00:00
|
|
|
public:
|
2012-06-16 03:06:54 +00:00
|
|
|
ComboBoxButton() : Button("") {
|
|
|
|
setFocusStop(false);
|
|
|
|
}
|
2011-03-06 19:15:05 +00:00
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
void onPaint(PaintEvent& ev) OVERRIDE {
|
2011-03-06 19:15:05 +00:00
|
|
|
getTheme()->paintComboBoxButton(ev);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
class ComboBoxEntry : public Entry
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ComboBoxEntry(ComboBox* comboBox)
|
|
|
|
: Entry(256, ""),
|
|
|
|
m_comboBox(comboBox) {
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
bool onProcessMessage(Message* msg) OVERRIDE;
|
2013-05-20 23:40:18 +00:00
|
|
|
void onPaint(PaintEvent& ev) OVERRIDE;
|
2012-06-16 02:37:59 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
ComboBox* m_comboBox;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ComboBoxListBox : public ListBox
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ComboBoxListBox(ComboBox* comboBox)
|
2013-04-03 23:31:02 +00:00
|
|
|
: m_comboBox(comboBox)
|
|
|
|
{
|
|
|
|
for (ComboBox::ListItems::iterator
|
|
|
|
it = comboBox->begin(), end = comboBox->end(); it != end; ++it)
|
|
|
|
addChild(*it);
|
|
|
|
}
|
|
|
|
|
|
|
|
void clean()
|
|
|
|
{
|
|
|
|
// Remove all added items so ~Widget() don't delete them.
|
|
|
|
while (getLastChild())
|
|
|
|
removeChild(getLastChild());
|
|
|
|
|
|
|
|
ASSERT(getChildren().empty());
|
|
|
|
|
|
|
|
selectChild(NULL);
|
2012-06-16 02:37:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
bool onProcessMessage(Message* msg) OVERRIDE;
|
|
|
|
void onChangeSelectedItem() OVERRIDE;
|
|
|
|
|
|
|
|
private:
|
|
|
|
bool isValidItem(int index) const {
|
|
|
|
return (index >= 0 && index < m_comboBox->getItemCount());
|
|
|
|
}
|
|
|
|
|
|
|
|
ComboBox* m_comboBox;
|
|
|
|
};
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
ComboBox::ComboBox()
|
2013-04-04 01:07:24 +00:00
|
|
|
: Widget(kComboBoxWidget)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2012-06-16 02:37:59 +00:00
|
|
|
m_entry = new ComboBoxEntry(this);
|
2011-03-06 19:15:05 +00:00
|
|
|
m_button = new ComboBoxButton();
|
2010-06-25 02:44:59 +00:00
|
|
|
m_window = NULL;
|
|
|
|
m_selected = 0;
|
|
|
|
m_editable = false;
|
|
|
|
m_clickopen = true;
|
|
|
|
m_casesensitive = true;
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2011-01-21 20:50:04 +00:00
|
|
|
// TODO this separation should be from the Theme*
|
2010-06-25 02:44:59 +00:00
|
|
|
this->child_spacing = 0;
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2012-04-05 22:00:19 +00:00
|
|
|
m_entry->setExpansive(true);
|
2010-08-23 20:41:19 +00:00
|
|
|
|
|
|
|
// When the "m_button" is clicked ("Click" signal) call onButtonClick() method
|
|
|
|
m_button->Click.connect(&ComboBox::onButtonClick, this);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2011-03-30 00:35:17 +00:00
|
|
|
addChild(m_entry);
|
|
|
|
addChild(m_button);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
setFocusStop(true);
|
2010-06-25 02:44:59 +00:00
|
|
|
setEditable(m_editable);
|
2008-02-04 02:37:26 +00:00
|
|
|
|
2011-02-15 12:00:29 +00:00
|
|
|
initTheme();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
ComboBox::~ComboBox()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
removeAllItems();
|
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::setEditable(bool state)
|
|
|
|
{
|
|
|
|
m_editable = state;
|
2007-09-18 23:57:02 +00:00
|
|
|
|
|
|
|
if (state) {
|
2010-12-08 17:28:13 +00:00
|
|
|
m_entry->setReadOnly(false);
|
|
|
|
m_entry->showCaret();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
else {
|
2010-12-08 17:28:13 +00:00
|
|
|
m_entry->setReadOnly(true);
|
|
|
|
m_entry->hideCaret();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::setClickOpen(bool state)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
m_clickopen = state;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::setCaseSensitive(bool state)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
m_casesensitive = state;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
bool ComboBox::isEditable()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
return m_editable;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
bool ComboBox::isClickOpen()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
return m_clickopen;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
bool ComboBox::isCaseSensitive()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
return m_casesensitive;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
int ComboBox::addItem(ListItem* item)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
bool sel_first = m_items.empty();
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
m_items.push_back(item);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
|
|
|
if (sel_first)
|
2013-04-03 23:31:02 +00:00
|
|
|
setSelectedItemIndex(0);
|
2010-06-25 02:44:59 +00:00
|
|
|
|
|
|
|
return m_items.size()-1;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-10-14 22:58:11 +00:00
|
|
|
int ComboBox::addItem(const base::string& text)
|
2013-04-03 23:31:02 +00:00
|
|
|
{
|
|
|
|
return addItem(new ListItem(text));
|
|
|
|
}
|
|
|
|
|
|
|
|
void ComboBox::insertItem(int itemIndex, ListItem* item)
|
2010-03-08 01:48:01 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
bool sel_first = m_items.empty();
|
2010-03-08 01:48:01 +00:00
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
m_items.insert(m_items.begin() + itemIndex, item);
|
2010-03-08 01:48:01 +00:00
|
|
|
|
|
|
|
if (sel_first)
|
2013-04-03 23:31:02 +00:00
|
|
|
setSelectedItemIndex(0);
|
|
|
|
}
|
|
|
|
|
2013-10-14 22:58:11 +00:00
|
|
|
void ComboBox::insertItem(int itemIndex, const base::string& text)
|
2013-04-03 23:31:02 +00:00
|
|
|
{
|
|
|
|
insertItem(itemIndex, new ListItem(text));
|
|
|
|
}
|
|
|
|
|
|
|
|
void ComboBox::removeItem(ListItem* item)
|
|
|
|
{
|
|
|
|
ListItems::iterator it = std::find(m_items.begin(), m_items.end(), item);
|
|
|
|
|
|
|
|
ASSERT(it != m_items.end());
|
|
|
|
|
|
|
|
if (it != m_items.end())
|
|
|
|
m_items.erase(it);
|
|
|
|
|
|
|
|
// Do not delete the given "item"
|
2010-03-08 01:48:01 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::removeItem(int itemIndex)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-08-04 02:33:44 +00:00
|
|
|
ASSERT(itemIndex >= 0 && (size_t)itemIndex < m_items.size());
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItem* item = m_items[itemIndex];
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
m_items.erase(m_items.begin() + itemIndex);
|
|
|
|
delete item;
|
2008-02-04 02:37:26 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::removeAllItems()
|
2008-02-04 02:37:26 +00:00
|
|
|
{
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItems::iterator it, end = m_items.end();
|
2010-06-25 02:44:59 +00:00
|
|
|
for (it = m_items.begin(); it != end; ++it)
|
|
|
|
delete *it;
|
2008-02-04 02:37:26 +00:00
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
m_items.clear();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
int ComboBox::getItemCount() const
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
return m_items.size();
|
|
|
|
}
|
2008-02-04 02:37:26 +00:00
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItem* ComboBox::getItem(int itemIndex)
|
2010-06-25 02:44:59 +00:00
|
|
|
{
|
|
|
|
if (itemIndex >= 0 && (size_t)itemIndex < m_items.size()) {
|
2013-04-03 23:31:02 +00:00
|
|
|
return m_items[itemIndex];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-10-14 22:58:11 +00:00
|
|
|
const base::string& ComboBox::getItemText(int itemIndex) const
|
2013-04-03 23:31:02 +00:00
|
|
|
{
|
|
|
|
if (itemIndex >= 0 && (size_t)itemIndex < m_items.size()) {
|
|
|
|
ListItem* item = m_items[itemIndex];
|
|
|
|
return item->getText();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
2013-10-14 22:58:11 +00:00
|
|
|
else {
|
|
|
|
// Returns the text of the combo-box (it should be empty).
|
|
|
|
ASSERT(getText().empty());
|
|
|
|
return getText();
|
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-10-14 22:58:11 +00:00
|
|
|
void ComboBox::setItemText(int itemIndex, const base::string& text)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-08-04 02:33:44 +00:00
|
|
|
ASSERT(itemIndex >= 0 && (size_t)itemIndex < m_items.size());
|
2010-06-25 02:44:59 +00:00
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItem* item = m_items[itemIndex];
|
|
|
|
item->setText(text);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-10-14 22:58:11 +00:00
|
|
|
int ComboBox::findItemIndex(const base::string& text)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
int itemIndex = 0;
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItems::iterator it, end = m_items.end();
|
2010-06-25 02:44:59 +00:00
|
|
|
for (it = m_items.begin(); it != end; ++it) {
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItem* item = *it;
|
2010-06-25 02:44:59 +00:00
|
|
|
|
2013-10-14 22:58:11 +00:00
|
|
|
if ((m_casesensitive && item->getText() == text) ||
|
|
|
|
(!m_casesensitive && item->getText() == text)) {
|
2010-06-25 02:44:59 +00:00
|
|
|
return itemIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
itemIndex++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItem* ComboBox::getSelectedItem() const
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2013-04-03 23:31:02 +00:00
|
|
|
return (!m_items.empty() ? m_items[m_selected]: NULL);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
void ComboBox::setSelectedItem(ListItem* item)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItems::iterator it = std::find(m_items.begin(), m_items.end(), item);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ASSERT(it != m_items.end());
|
|
|
|
|
|
|
|
if (it != m_items.end())
|
|
|
|
setSelectedItemIndex(std::distance(m_items.begin(), it));
|
2008-02-04 02:37:26 +00:00
|
|
|
}
|
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
int ComboBox::getSelectedItemIndex() const
|
2008-02-04 02:37:26 +00:00
|
|
|
{
|
2013-04-03 23:31:02 +00:00
|
|
|
return (!m_items.empty() ? m_selected: -1);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
void ComboBox::setSelectedItemIndex(int itemIndex)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2013-04-03 23:31:02 +00:00
|
|
|
if (itemIndex >= 0 && (size_t)itemIndex < m_items.size()) {
|
|
|
|
m_selected = itemIndex;
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItems::iterator it = m_items.begin() + itemIndex;
|
|
|
|
ListItem* item = *it;
|
|
|
|
m_entry->setText(item->getText());
|
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-12-08 17:28:13 +00:00
|
|
|
Entry* ComboBox::getEntryWidget()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
return m_entry;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-08-23 20:41:19 +00:00
|
|
|
Button* ComboBox::getButtonWidget()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
return m_button;
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2011-04-02 16:14:07 +00:00
|
|
|
bool ComboBox::onProcessMessage(Message* msg)
|
2008-02-04 02:37:26 +00:00
|
|
|
{
|
2013-07-29 00:17:07 +00:00
|
|
|
switch (msg->type()) {
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
case kCloseMessage:
|
2010-06-25 02:44:59 +00:00
|
|
|
closeListBox();
|
2008-02-04 02:37:26 +00:00
|
|
|
break;
|
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
case kWinMoveMessage:
|
2013-05-11 20:56:27 +00:00
|
|
|
if (m_window)
|
|
|
|
m_window->moveWindow(getListBoxPos());
|
2007-09-18 23:57:02 +00:00
|
|
|
break;
|
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
case kMouseDownMessage:
|
2010-06-25 02:44:59 +00:00
|
|
|
if (m_window != NULL) {
|
2012-01-05 22:45:03 +00:00
|
|
|
if (!View::getView(m_listbox)->hasMouse()) {
|
|
|
|
closeListBox();
|
|
|
|
return true;
|
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
break;
|
2008-02-04 02:37:26 +00:00
|
|
|
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-08-03 00:29:56 +00:00
|
|
|
return Widget::onProcessMessage(msg);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-05-11 20:56:27 +00:00
|
|
|
void ComboBox::onResize(ResizeEvent& ev)
|
|
|
|
{
|
|
|
|
gfx::Rect bounds = ev.getBounds();
|
|
|
|
setBoundsQuietly(bounds);
|
|
|
|
|
|
|
|
// Button
|
|
|
|
Size buttonSize = m_button->getPreferredSize();
|
|
|
|
m_button->setBounds(Rect(bounds.x2() - buttonSize.w, bounds.y,
|
|
|
|
buttonSize.w, bounds.h));
|
|
|
|
|
|
|
|
// Entry
|
|
|
|
m_entry->setBounds(Rect(bounds.x, bounds.y,
|
|
|
|
bounds.w - buttonSize.w, bounds.h));
|
|
|
|
}
|
|
|
|
|
2010-08-03 01:57:41 +00:00
|
|
|
void ComboBox::onPreferredSize(PreferredSizeEvent& ev)
|
|
|
|
{
|
|
|
|
Size reqSize(0, 0);
|
|
|
|
Size entrySize = m_entry->getPreferredSize();
|
|
|
|
|
|
|
|
// Get the text-length of every item and put in 'w' the maximum value
|
2013-04-03 23:31:02 +00:00
|
|
|
ListItems::iterator it, end = m_items.end();
|
2010-08-03 01:57:41 +00:00
|
|
|
for (it = m_items.begin(); it != end; ++it) {
|
|
|
|
int item_w =
|
|
|
|
2*jguiscale()+
|
2013-10-14 22:58:11 +00:00
|
|
|
text_length(getFont(), (*it)->getText().c_str())+
|
2010-08-03 01:57:41 +00:00
|
|
|
10*jguiscale();
|
|
|
|
|
|
|
|
reqSize.w = MAX(reqSize.w, item_w);
|
|
|
|
}
|
|
|
|
|
|
|
|
reqSize.w += entrySize.w;
|
|
|
|
reqSize.h += entrySize.h;
|
|
|
|
|
|
|
|
Size buttonSize = m_button->getPreferredSize();
|
|
|
|
reqSize.w += buttonSize.w;
|
|
|
|
reqSize.h = MAX(reqSize.h, buttonSize.h);
|
|
|
|
ev.setPreferredSize(reqSize);
|
|
|
|
}
|
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
bool ComboBoxEntry::onProcessMessage(Message* msg)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2013-07-29 00:17:07 +00:00
|
|
|
switch (msg->type()) {
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
case kKeyDownMessage:
|
2012-06-16 02:37:59 +00:00
|
|
|
if (hasFocus()) {
|
2013-07-29 00:17:07 +00:00
|
|
|
KeyMessage* keymsg = static_cast<KeyMessage*>(msg);
|
|
|
|
KeyScancode scancode = keymsg->scancode();
|
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
if (!m_comboBox->isEditable()) {
|
2013-07-29 00:17:07 +00:00
|
|
|
if (scancode == kKeySpace ||
|
|
|
|
scancode == kKeyEnter ||
|
|
|
|
scancode == kKeyEnterPad) {
|
2012-06-16 02:37:59 +00:00
|
|
|
m_comboBox->switchListBox();
|
2012-01-05 22:45:03 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2013-07-29 00:17:07 +00:00
|
|
|
if (scancode == kKeyEnter ||
|
|
|
|
scancode == kKeyEnterPad) {
|
2012-06-16 02:37:59 +00:00
|
|
|
m_comboBox->switchListBox();
|
2012-01-05 22:45:03 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
case kMouseDownMessage:
|
2012-06-16 02:37:59 +00:00
|
|
|
if (m_comboBox->isClickOpen()) {
|
|
|
|
m_comboBox->switchListBox();
|
2007-12-04 21:50:31 +00:00
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
if (m_comboBox->isEditable()) {
|
|
|
|
getManager()->setFocus(this);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
else
|
2012-01-05 22:45:03 +00:00
|
|
|
return true;
|
2007-09-18 23:57:02 +00:00
|
|
|
break;
|
2009-11-22 00:26:58 +00:00
|
|
|
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
return Entry::onProcessMessage(msg);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-05-20 23:40:18 +00:00
|
|
|
void ComboBoxEntry::onPaint(PaintEvent& ev)
|
|
|
|
{
|
|
|
|
getTheme()->paintComboBoxEntry(ev);
|
|
|
|
}
|
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
bool ComboBoxListBox::onProcessMessage(Message* msg)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2013-07-29 00:17:07 +00:00
|
|
|
switch (msg->type()) {
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-07-29 00:17:07 +00:00
|
|
|
case kMouseUpMessage: {
|
|
|
|
int index = m_comboBox->getSelectedItemIndex();
|
|
|
|
if (isValidItem(index))
|
|
|
|
m_comboBox->onChange();
|
2008-02-10 18:52:42 +00:00
|
|
|
|
2013-07-29 00:17:07 +00:00
|
|
|
m_comboBox->closeListBox();
|
2009-08-17 18:00:38 +00:00
|
|
|
return true;
|
2013-07-29 00:17:07 +00:00
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
case kKeyDownMessage:
|
2012-06-16 02:37:59 +00:00
|
|
|
if (hasFocus()) {
|
2013-07-29 00:17:07 +00:00
|
|
|
KeyMessage* keymsg = static_cast<KeyMessage*>(msg);
|
|
|
|
KeyScancode scancode = keymsg->scancode();
|
|
|
|
|
|
|
|
if (scancode == kKeySpace ||
|
|
|
|
scancode == kKeyEnter ||
|
|
|
|
scancode == kKeyEnterPad) {
|
2012-06-16 02:37:59 +00:00
|
|
|
m_comboBox->closeListBox();
|
2012-01-05 22:45:03 +00:00
|
|
|
return true;
|
|
|
|
}
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2012-06-16 02:37:59 +00:00
|
|
|
return ListBox::onProcessMessage(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ComboBoxListBox::onChangeSelectedItem()
|
|
|
|
{
|
|
|
|
ListBox::onChangeSelectedItem();
|
|
|
|
|
|
|
|
int index = getSelectedIndex();
|
|
|
|
if (isValidItem(index))
|
2013-04-03 23:31:02 +00:00
|
|
|
m_comboBox->setSelectedItemIndex(index);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-08-23 20:41:19 +00:00
|
|
|
// When the mouse is clicked we switch the visibility-status of the list-box
|
|
|
|
void ComboBox::onButtonClick(Event& ev)
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-08-23 20:41:19 +00:00
|
|
|
switchListBox();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::openListBox()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
if (!m_window) {
|
2013-10-14 22:58:11 +00:00
|
|
|
m_window = new Window(false, "");
|
2011-02-20 21:35:21 +00:00
|
|
|
View* view = new View();
|
2012-06-16 02:37:59 +00:00
|
|
|
m_listbox = new ComboBoxListBox(this);
|
2013-01-11 15:43:25 +00:00
|
|
|
m_window->setOnTop(true);
|
2010-06-25 02:44:59 +00:00
|
|
|
jwidget_noborders(m_window);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2011-02-20 21:35:21 +00:00
|
|
|
Widget* viewport = view->getViewport();
|
2010-06-25 02:44:59 +00:00
|
|
|
int size = getItemCount();
|
2007-12-06 20:05:32 +00:00
|
|
|
jwidget_set_min_size
|
2010-03-22 01:35:55 +00:00
|
|
|
(viewport,
|
2013-10-26 15:50:55 +00:00
|
|
|
m_button->getBounds().x2() - m_entry->getBounds().x - view->border_width.l - view->border_width.r,
|
2010-03-22 01:35:55 +00:00
|
|
|
+viewport->border_width.t
|
2010-06-25 02:44:59 +00:00
|
|
|
+(2*jguiscale()+jwidget_get_text_height(m_listbox))*MID(1, size, 16)+
|
2010-03-22 01:35:55 +00:00
|
|
|
+viewport->border_width.b);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2011-03-30 00:35:17 +00:00
|
|
|
m_window->addChild(view);
|
2011-02-20 21:35:21 +00:00
|
|
|
view->attachToView(m_listbox);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2012-04-06 02:19:32 +00:00
|
|
|
m_listbox->selectIndex(m_selected);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-01-11 15:43:25 +00:00
|
|
|
m_window->remapWindow();
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-05-11 20:56:27 +00:00
|
|
|
gfx::Rect rc = getListBoxPos();
|
|
|
|
m_window->positionWindow(rc.x, rc.y);
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
getManager()->addMessageFilter(kMouseDownMessage, this);
|
2008-02-04 02:37:26 +00:00
|
|
|
|
2012-07-09 02:24:42 +00:00
|
|
|
m_window->openWindow();
|
2012-04-15 18:21:24 +00:00
|
|
|
getManager()->setFocus(m_listbox);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::closeListBox()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
if (m_window) {
|
2013-04-03 23:31:02 +00:00
|
|
|
m_listbox->clean();
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
m_window->closeWindow(this);
|
2012-01-05 22:45:03 +00:00
|
|
|
delete m_window; // window, frame
|
2010-06-25 02:44:59 +00:00
|
|
|
m_window = NULL;
|
2007-09-18 23:57:02 +00:00
|
|
|
|
2013-04-05 00:53:29 +00:00
|
|
|
getManager()->removeMessageFilter(kMouseDownMessage, this);
|
2012-04-15 18:21:24 +00:00
|
|
|
getManager()->setFocus(m_entry);
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-25 02:44:59 +00:00
|
|
|
void ComboBox::switchListBox()
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2010-06-25 02:44:59 +00:00
|
|
|
if (!m_window)
|
|
|
|
openListBox();
|
2007-09-18 23:57:02 +00:00
|
|
|
else
|
2010-06-25 02:44:59 +00:00
|
|
|
closeListBox();
|
2007-09-18 23:57:02 +00:00
|
|
|
}
|
|
|
|
|
2013-05-11 20:56:27 +00:00
|
|
|
gfx::Rect ComboBox::getListBoxPos() const
|
2007-09-18 23:57:02 +00:00
|
|
|
{
|
2013-10-26 15:50:55 +00:00
|
|
|
gfx::Rect rc(gfx::Point(m_entry->getBounds().x,
|
|
|
|
m_entry->getBounds().y2()),
|
|
|
|
gfx::Point(m_button->getBounds().x2(),
|
|
|
|
m_entry->getBounds().y2()+m_window->getBounds().h));
|
2013-05-11 20:56:27 +00:00
|
|
|
|
|
|
|
if (rc.y2() > JI_SCREEN_H)
|
2013-10-26 15:50:55 +00:00
|
|
|
rc.offset(0, -(rc.h + m_entry->getBounds().h));
|
2013-05-11 20:56:27 +00:00
|
|
|
|
2007-09-18 23:57:02 +00:00
|
|
|
return rc;
|
|
|
|
}
|
2012-06-18 01:02:54 +00:00
|
|
|
|
2013-03-29 19:16:24 +00:00
|
|
|
void ComboBox::onChange()
|
|
|
|
{
|
|
|
|
Change();
|
|
|
|
}
|
|
|
|
|
2012-06-18 01:02:54 +00:00
|
|
|
} // namespace ui
|