00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #include <typeinfo>
00060
00061 #include "guichan/basiccontainer.h"
00062 #include "guichan/widgets/listbox.h"
00063 #include "guichan/widgets/scrollarea.h"
00064
00065 namespace gcn
00066 {
00067 ListBox::ListBox()
00068 {
00069 mSelected = -1;
00070 mListModel = NULL;
00071 setWidth(100);
00072 setFocusable(true);
00073
00074 addMouseListener(this);
00075 addKeyListener(this);
00076 }
00077
00078 ListBox::ListBox(ListModel *listModel)
00079 {
00080 mSelected = -1;
00081 setWidth(100);
00082 setListModel(listModel);
00083 setFocusable(true);
00084
00085 addMouseListener(this);
00086 addKeyListener(this);
00087 }
00088
00089 void ListBox::draw(Graphics* graphics)
00090 {
00091 if (mListModel == NULL)
00092 {
00093 return;
00094 }
00095
00096 graphics->setColor(getForegroundColor());
00097 graphics->setFont(getFont());
00098
00099 int i, fontHeight;
00100 int y = 0;
00101
00102 fontHeight = getFont()->getHeight();
00103
00107 for (i = 0; i < mListModel->getNumberOfElements(); ++i)
00108 {
00109 if (i == mSelected)
00110 {
00111 graphics->drawRectangle(Rectangle(0, y, getWidth(), fontHeight));
00112 graphics->setColor(Color(40, 60, 120));
00113 graphics->fillRectangle(Rectangle(1, y + 1, getWidth() - 2, fontHeight - 2));
00114 }
00115
00116 graphics->drawText(mListModel->getElementAt(i), 1, y);
00117
00118 y += fontHeight;
00119 }
00120 }
00121
00122 void ListBox::drawBorder(Graphics* graphics)
00123 {
00124 Color faceColor = getBaseColor();
00125 Color highlightColor, shadowColor;
00126 int alpha = getBaseColor().a;
00127 int width = getWidth() + getBorderSize() * 2 - 1;
00128 int height = getHeight() + getBorderSize() * 2 - 1;
00129 highlightColor = faceColor + 0x303030;
00130 highlightColor.a = alpha;
00131 shadowColor = faceColor - 0x303030;
00132 shadowColor.a = alpha;
00133
00134 unsigned int i;
00135 for (i = 0; i < getBorderSize(); ++i)
00136 {
00137 graphics->setColor(shadowColor);
00138 graphics->drawLine(i,i, width - i, i);
00139 graphics->drawLine(i,i + 1, i, height - i - 1);
00140 graphics->setColor(highlightColor);
00141 graphics->drawLine(width - i,i + 1, width - i, height - i);
00142 graphics->drawLine(i,height - i, width - i - 1, height - i);
00143 }
00144 }
00145
00146 void ListBox::logic()
00147 {
00148 adjustSize();
00149 }
00150
00151 int ListBox::getSelected()
00152 {
00153 return mSelected;
00154 }
00155
00156 void ListBox::setSelected(int selected)
00157 {
00158 if (mListModel == NULL)
00159 {
00160 mSelected = -1;
00161 }
00162 else
00163 {
00164 if (selected < 0)
00165 {
00166 mSelected = -1;
00167 }
00168 else if (selected >= mListModel->getNumberOfElements())
00169 {
00170 mSelected = mListModel->getNumberOfElements() - 1;
00171 }
00172 else
00173 {
00174 mSelected = selected;
00175 }
00176
00177 Widget *par = getParent();
00178 if (par == NULL)
00179 {
00180 return;
00181 }
00182
00183 ScrollArea* scrollArea = dynamic_cast<ScrollArea *>(par);
00184 if (scrollArea != NULL)
00185 {
00186 Rectangle scroll;
00187 scroll.y = getFont()->getHeight() * mSelected;
00188 scroll.height = getFont()->getHeight();
00189 scrollArea->scrollToRectangle(scroll);
00190 }
00191 }
00192 }
00193
00194 bool ListBox::keyPress(const Key& key)
00195 {
00196 bool ret = false;
00197
00198 if (key.getValue() == Key::ENTER || key.getValue() == Key::SPACE)
00199 {
00200 generateAction();
00201 ret = true;
00202 }
00203 else if (key.getValue() == Key::UP)
00204 {
00205 setSelected(mSelected - 1);
00206
00207 if (mSelected == -1)
00208 {
00209 setSelected(0);
00210 }
00211 ret = true;
00212 }
00213 else if (key.getValue() == Key::DOWN)
00214 {
00215 setSelected(mSelected + 1);
00216 ret = true;
00217 }
00218
00219 return ret;
00220 }
00221
00222 void ListBox::mousePress(int x, int y, int button)
00223 {
00224 if (button == MouseInput::LEFT && hasMouse())
00225 {
00226 setSelected(y / getFont()->getHeight());
00227 generateAction();
00228 }
00229 }
00230
00231 void ListBox::setListModel(ListModel *listModel)
00232 {
00233 mSelected = -1;
00234 mListModel = listModel;
00235 adjustSize();
00236 }
00237
00238 ListModel* ListBox::getListModel()
00239 {
00240 return mListModel;
00241 }
00242
00243 void ListBox::adjustSize()
00244 {
00245 if (mListModel != NULL)
00246 {
00247 setHeight(getFont()->getHeight() * mListModel->getNumberOfElements());
00248 }
00249 }
00250 }