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
00060
00061 #include "guichan/widgets/listbox.hpp"
00062
00063 #include "guichan/basiccontainer.hpp"
00064 #include "guichan/font.hpp"
00065 #include "guichan/graphics.hpp"
00066 #include "guichan/key.hpp"
00067 #include "guichan/listmodel.hpp"
00068 #include "guichan/mouseinput.hpp"
00069
00070 namespace gcn
00071 {
00072 ListBox::ListBox()
00073 {
00074 mSelected = -1;
00075 mListModel = NULL;
00076 mWrappingKeyboardSelection = false;
00077 setWidth(100);
00078 setFocusable(true);
00079
00080 addMouseListener(this);
00081 addKeyListener(this);
00082 }
00083
00084 ListBox::ListBox(ListModel *listModel)
00085 {
00086 mSelected = -1;
00087 mWrappingKeyboardSelection = false;
00088 setWidth(100);
00089 setListModel(listModel);
00090 setFocusable(true);
00091
00092 addMouseListener(this);
00093 addKeyListener(this);
00094 }
00095
00096 void ListBox::draw(Graphics* graphics)
00097 {
00098 graphics->setColor(getBackgroundColor());
00099 graphics->fillRectangle(Rectangle(0, 0, getWidth(), getHeight()));
00100
00101 if (mListModel == NULL)
00102 {
00103 return;
00104 }
00105
00106 graphics->setColor(getForegroundColor());
00107 graphics->setFont(getFont());
00108
00109 int i, fontHeight;
00110 int y = 0;
00111
00112 fontHeight = getFont()->getHeight();
00113
00117 for (i = 0; i < mListModel->getNumberOfElements(); ++i)
00118 {
00119 if (i == mSelected)
00120 {
00121 graphics->drawRectangle(Rectangle(0, y, getWidth(), fontHeight));
00122 }
00123
00124 graphics->drawText(mListModel->getElementAt(i), 1, y);
00125
00126 y += fontHeight;
00127 }
00128 }
00129
00130 void ListBox::drawBorder(Graphics* graphics)
00131 {
00132 Color faceColor = getBaseColor();
00133 Color highlightColor, shadowColor;
00134 int alpha = getBaseColor().a;
00135 int width = getWidth() + getBorderSize() * 2 - 1;
00136 int height = getHeight() + getBorderSize() * 2 - 1;
00137 highlightColor = faceColor + 0x303030;
00138 highlightColor.a = alpha;
00139 shadowColor = faceColor - 0x303030;
00140 shadowColor.a = alpha;
00141
00142 unsigned int i;
00143 for (i = 0; i < getBorderSize(); ++i)
00144 {
00145 graphics->setColor(shadowColor);
00146 graphics->drawLine(i,i, width - i, i);
00147 graphics->drawLine(i,i + 1, i, height - i - 1);
00148 graphics->setColor(highlightColor);
00149 graphics->drawLine(width - i,i + 1, width - i, height - i);
00150 graphics->drawLine(i,height - i, width - i - 1, height - i);
00151 }
00152 }
00153
00154 void ListBox::logic()
00155 {
00156 adjustSize();
00157 }
00158
00159 int ListBox::getSelected()
00160 {
00161 return mSelected;
00162 }
00163
00164 void ListBox::setSelected(int selected)
00165 {
00166 if (mListModel == NULL)
00167 {
00168 mSelected = -1;
00169 }
00170 else
00171 {
00172 if (selected < 0)
00173 {
00174 mSelected = -1;
00175 }
00176 else if (selected >= mListModel->getNumberOfElements())
00177 {
00178 mSelected = mListModel->getNumberOfElements() - 1;
00179 }
00180 else
00181 {
00182 mSelected = selected;
00183 }
00184
00185 BasicContainer *par = getParent();
00186 if (par == NULL)
00187 {
00188 return;
00189 }
00190
00191 Rectangle scroll;
00192
00193 if (mSelected < 0)
00194 {
00195 scroll.y = 0;
00196 }
00197 else
00198 {
00199 scroll.y = getFont()->getHeight() * mSelected;
00200 }
00201
00202 scroll.height = getFont()->getHeight();
00203 par->showWidgetPart(this, scroll);
00204 }
00205 }
00206
00207 void ListBox::keyPress(const Key& key)
00208 {
00209 if (key.getValue() == Key::ENTER || key.getValue() == Key::SPACE)
00210 {
00211 generateAction();
00212 }
00213 else if (key.getValue() == Key::UP)
00214 {
00215 setSelected(mSelected - 1);
00216
00217 if (mSelected == -1)
00218 {
00219 if (isWrappingKeyboardSelection())
00220 {
00221 setSelected(getListModel()->getNumberOfElements() - 1);
00222 }
00223 else
00224 {
00225 setSelected(0);
00226 }
00227 }
00228 }
00229 else if (key.getValue() == Key::DOWN)
00230 {
00231 if (isWrappingKeyboardSelection()
00232 && getSelected() == getListModel()->getNumberOfElements() - 1)
00233 {
00234 setSelected(0);
00235 }
00236 else
00237 {
00238 setSelected(getSelected() + 1);
00239 }
00240 }
00241 }
00242
00243 void ListBox::mousePress(int x, int y, int button)
00244 {
00245 if (button == MouseInput::LEFT && hasMouse())
00246 {
00247 setSelected(y / getFont()->getHeight());
00248 generateAction();
00249 }
00250 }
00251
00252 void ListBox::setListModel(ListModel *listModel)
00253 {
00254 mSelected = -1;
00255 mListModel = listModel;
00256 adjustSize();
00257 }
00258
00259 ListModel* ListBox::getListModel()
00260 {
00261 return mListModel;
00262 }
00263
00264 void ListBox::adjustSize()
00265 {
00266 if (mListModel != NULL)
00267 {
00268 setHeight(getFont()->getHeight() * mListModel->getNumberOfElements());
00269 }
00270 }
00271
00272 bool ListBox::isWrappingKeyboardSelection()
00273 {
00274 return mWrappingKeyboardSelection;
00275 }
00276
00277 void ListBox::setWrappingKeyboardSelection(bool wrapping)
00278 {
00279 mWrappingKeyboardSelection = wrapping;
00280 }
00281 }