2 Copyright 2004-2005 Chris Tallon
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
30 buttonBarActive = true;
32 setBackgroundColour(DrawStyle::TABVIEWBACKGROUND);
34 symbolLeft.setPosition(0, 4);
35 symbolLeft.nextColour = DrawStyle::BUTTONBACKGROUND;
36 symbolLeft.nextSymbol = WSymbol::LEFTARROW;
39 symbolRight.setPosition(0, 4); // will be reset in addtab
40 symbolRight.nextColour = DrawStyle::BUTTONBACKGROUND;
41 symbolRight.nextSymbol = WSymbol::RIGHTARROW;
47 for (UINT i = 0; i < tabs.size(); i++)
49 delete tabs[i].button;
50 delete tabs[i].pane; //moved from vopts MR
54 void WTabBar::addTab(const char* name, Boxx* boxx)
60 for(UINT i = 0; i < strlen(name); i++)
62 td.nameWidth += static_cast<UINT>(charWidth(name[i]));
66 for(UINT i = 0; i < tabs.size(); i++) newButtonX += tabs[i].button->getWidth() + 10;
68 WButton* newButton = new WButton();
69 newButton->setText(name);
70 newButton->setPosition(newButtonX, 2);
71 newButton->setSize(td.nameWidth + 6, getFontHeight());
72 if ((newButtonX + newButton->getWidth()) > (getWidth() - 22)) newButton->setVisible(false);
75 boxx->setPosition(0, 34);
76 boxx->setSize(getWidth(), getHeight()-34);
79 td.button = newButton;
85 newButton->setActive(true);
86 boxx->setVisible(true);
90 newButton->setActive(false);
91 boxx->setVisible(false);
92 symbolRight.nextColour = DrawStyle::SELECTHIGHLIGHT; // if this is the 2nd+ tab, ensure right arrow goes active
95 // WTabbar doesn't know its width during the constructor
96 // So this is moved to here for now
97 symbolRight.setPosition(getWidth() - 28, 4);
100 int WTabBar::handleCommand(int command)
102 // This returns 0 for not handled, and 1 for handled and please-update-me, 2 for handled-no-update
104 // if the focus is in a pane, send the command there
105 if (!buttonBarActive)
107 // Send the command to the pane
108 // Return code should be:
110 // 1 - handled - stop command here
111 // 4 - handled - pane is returning control to here
112 // 5 - activate button bar and let button process the call, this for simple up and down scroll views
113 // FIXME standardise these
115 int paneRetCode = tabs[visiblePane].pane->handleCommand(command);
116 if (paneRetCode == 0)
120 else if (paneRetCode == 1)
125 else if (paneRetCode == 4)
127 buttonBarActive = true;
128 tabs[visiblePane].button->setActive(true);
129 if (visiblePane != 0) symbolLeft.nextColour = DrawStyle::SELECTHIGHLIGHT;
130 if (visiblePane != tabs.size() - 1) symbolRight.nextColour = DrawStyle::SELECTHIGHLIGHT;
133 } else if (paneRetCode == 5)
135 buttonBarActive = true;
136 tabs[visiblePane].button->setActive(true);
137 if (visiblePane != 0) symbolLeft.nextColour = DrawStyle::SELECTHIGHLIGHT;
138 if (visiblePane != tabs.size() - 1) symbolRight.nextColour = DrawStyle::SELECTHIGHLIGHT;
150 if (!left()) return 2;
156 if (!right()) return 2;
163 int handleResult = tabs[visiblePane].pane->handleCommand(command);
164 // A WOptionPane will accept control being passed into it from inactive, up or down (== 1).
165 // A WTextBox will only accept control if it will scroll (== 1). It will refuse if not (== 4).
167 if (handleResult == 1)
169 buttonBarActive = false;
170 tabs[visiblePane].button->dim();
171 symbolLeft.nextColour = DrawStyle::BUTTONBACKGROUND;
172 symbolRight.nextColour = DrawStyle::BUTTONBACKGROUND;
176 else if (handleResult == 4)
183 LogNT::getInstance()->error("WTabBar", "Up/Down client returned not 1 or 4");
191 // When there are too many tabs to display simultaneously, extend this to shift the tabs left and right
195 if (visiblePane == 0) return false;
196 tabs[visiblePane].button->setActive(false);
197 tabs[visiblePane].pane->setVisible(false);
199 tabs[visiblePane].button->setActive(true);
200 tabs[visiblePane].pane->setVisible(true);
202 if (visiblePane == 0) symbolLeft.nextColour = DrawStyle::BUTTONBACKGROUND;
203 symbolRight.nextColour = DrawStyle::SELECTHIGHLIGHT;
205 // Move the buttons..
206 if (tabs[visiblePane].button->getVisible() == false)
208 tabs[visiblePane].button->setVisible(true);
209 // We have gone << past the last visible button
210 UINT newButtonX = 22;
212 for(j = visiblePane; j < tabs.size(); j++) // start with the button just uncovered
214 if ((newButtonX + tabs[j].button->getWidth()) > (getWidth() - 22)) break; // this one too big.
215 tabs[j].button->setPosition(newButtonX, 2);
216 newButtonX += tabs[j].button->getWidth() + 10;
218 for(; j < tabs.size(); j++) // hide the rest
220 tabs[j].button->setVisible(false);
227 bool WTabBar::right()
229 if (visiblePane == tabs.size() - 1) return false;
230 tabs[visiblePane].button->setActive(false);
231 tabs[visiblePane].pane->setVisible(false);
233 tabs[visiblePane].button->setActive(true);
234 tabs[visiblePane].pane->setVisible(true);
236 if (visiblePane == tabs.size() - 1) symbolRight.nextColour = DrawStyle::BUTTONBACKGROUND;
237 symbolLeft.nextColour = DrawStyle::SELECTHIGHLIGHT;
239 // Move the buttons..
240 if (tabs[visiblePane].button->getVisible() == false)
242 tabs[visiblePane].button->setVisible(true);
243 // We have gone >> past the last visible button
244 // Move all buttons left, but need to work out which one to finally display as first on the left
245 UINT displayWidth = getWidth() - 44;
246 UINT widthSum = tabs[visiblePane].button->getWidth(); // start with width of newly shown button (on the right)
249 for(i = visiblePane - 1; i >= 0; i--)
251 widthSum += tabs[i].button->getWidth() + 10; // add on width needed to display also the previous button
252 if (widthSum > displayWidth) // then it's too much
259 for(i = 0; i < startWith; i++) // For each button to the left of startWith...
261 tabs[i].button->setVisible(false);
264 UINT newButtonX = 22;
265 for(UINT j = startWith; j <= visiblePane; j++) // startWith -> the one we just uncovered
267 tabs[j].button->setPosition(newButtonX, 2);
268 newButtonX += tabs[j].button->getWidth() + 10;
275 bool WTabBar::mouseMove(int x, int y) {
276 if (tabs[visiblePane].pane->mouseMove(x,y)) {
277 if (buttonBarActive){
278 buttonBarActive = false;
279 tabs[visiblePane].button->dim();
280 symbolLeft.nextColour = DrawStyle::BUTTONBACKGROUND;
281 symbolRight.nextColour = DrawStyle::BUTTONBACKGROUND;
290 bool WTabBar::mouseAndroidScroll(int x, int y, int sx, int sy) {
291 if (tabs[visiblePane].pane->mouseAndroidScroll(x, y,sx,sy)) {
298 bool WTabBar::mouseLBDOWN(int x, int y) {
300 for (i=0;i<tabs.size();i++) {
301 if (tabs[i].button->getVisible()) {
302 if (tabs[i].button->mouseMove(x,y)) {
303 tabs[visiblePane].button->setActive(false);
304 tabs[visiblePane].pane->setVisible(false);
305 tabs[visiblePane].pane->deactivateAllControls();
307 tabs[visiblePane].button->setActive(true);
308 tabs[visiblePane].pane->setVisible(true);
309 tabs[visiblePane].pane->deactivateAllControls();
310 buttonBarActive = true;
316 if (tabs[visiblePane].pane->mouseLBDOWN(x,y)) {
317 buttonBarActive = false;
318 tabs[visiblePane].button->dim();
319 symbolLeft.nextColour = DrawStyle::BUTTONBACKGROUND;
320 symbolRight.nextColour = DrawStyle::BUTTONBACKGROUND;
324 if (symbolLeft.mouseLBDOWN(x,y)) {
329 if (symbolRight.mouseLBDOWN(x,y)) {
337 void WTabBar::activateFocus(bool active)
341 tabs[visiblePane].button->setActive(true);
342 buttonBarActive = true;
345 tabs[visiblePane].button->setActive(false);
346 buttonBarActive = false;