+s32 CGUITabControl::calculateScrollIndexFromActive()\r
+{\r
+ if (!ScrollControl || Tabs.empty())\r
+ return 0;\r
+\r
+ IGUISkin *skin = Environment->getSkin();\r
+ if (!skin)\r
+ return false;\r
+\r
+ IGUIFont *font = skin->getFont();\r
+ if (!font)\r
+ return false;\r
+\r
+ const s32 pos_left = AbsoluteRect.UpperLeftCorner.X + 2;\r
+ const s32 pos_right = UpButton->getAbsolutePosition().UpperLeftCorner.X - 2;\r
+\r
+ // Move from center to the left border left until it is reached\r
+ s32 pos_cl = (pos_left + pos_right) / 2;\r
+ s32 i = ActiveTabIndex;\r
+ for (; i > 0; --i) {\r
+ if (!Tabs[i])\r
+ continue;\r
+\r
+ s32 len = calcTabWidth(font, Tabs[i]->getText());\r
+ if (i == ActiveTabIndex)\r
+ len /= 2;\r
+ if (pos_cl - len < pos_left)\r
+ break;\r
+\r
+ pos_cl -= len;\r
+ }\r
+ if (i == 0)\r
+ return i;\r
+\r
+ // Is scrolling to right still possible?\r
+ s32 pos_rr = 0;\r
+ if (needScrollControl(i, true, &pos_rr))\r
+ return i; // Yes? -> OK\r
+\r
+ // No? -> Decrease "i" more. Append tabs until scrolling becomes necessary\r
+ for (--i; i > 0; --i) {\r
+ if (!Tabs[i])\r
+ continue;\r
+\r
+ pos_rr += calcTabWidth(font, Tabs[i]->getText());\r
+ if (pos_rr > pos_right)\r
+ break;\r
+ }\r
+ return i + 1;\r
+}\r
+\r