From bd4cdbf23579f6029a6c68b1c54eb364bf31d150 Mon Sep 17 00:00:00 2001 From: Lpsd <40902730+Lpsd@users.noreply.github.com> Date: Mon, 7 Oct 2024 21:14:52 +0100 Subject: [PATCH] Remove old CEGUI version (0.4.0) --- Client/core/CClientVariables.cpp | 1 - Client/core/CConsole.cpp | 14 +- Client/core/CCore.cpp | 17 +- Client/core/CCore.h | 3 - Client/core/CGUI.cpp | 6 - Client/core/CSettings.cpp | 72 +- Client/core/CSettings.h | 4 +- Client/core/ServerBrowser/CServerBrowser.cpp | 30 +- Client/gui/CGUIButton_Impl.cpp | 8 +- Client/gui/CGUICheckBox_Impl.cpp | 10 +- Client/gui/CGUIComboBox_Impl.cpp | 74 +- Client/gui/CGUIComboBox_Impl.h | 46 +- Client/gui/CGUIEdit_Impl.cpp | 27 +- Client/gui/CGUIElement_Impl.cpp | 278 +- Client/gui/CGUIElement_Impl.h | 6 + Client/gui/CGUIElement_Inc.h | 21 +- Client/gui/CGUIFont_Impl.cpp | 59 +- Client/gui/CGUIFont_Impl.h | 10 +- .../CGUIGridListItem_Impl .cpp} | 49 +- .../CGUIGridListItem_Impl.h} | 23 +- Client/gui/CGUIGridList_Impl.cpp | 164 +- Client/gui/CGUIGridList_Impl.h | 48 +- Client/gui/CGUILabel_Impl.cpp | 77 +- Client/gui/CGUILabel_Impl.h | 2 + Client/gui/CGUIListItem_Impl.cpp | 142 - Client/gui/CGUIMemo_Impl.cpp | 24 +- Client/gui/CGUIMessageBox_Impl.h | 2 +- Client/gui/CGUIProgressBar_Impl.cpp | 4 +- Client/gui/CGUIRadioButton_Impl.cpp | 8 +- Client/gui/CGUIScrollBar_Impl.cpp | 6 +- Client/gui/CGUIScrollPane_Impl.cpp | 26 +- Client/gui/CGUIStandardItem_Impl.cpp | 131 + ...istItem_Impl.h => CGUIStandardItem_Impl.h} | 40 +- Client/gui/CGUIStaticImage_Impl.cpp | 138 +- Client/gui/CGUIStaticImage_Impl.h | 10 +- Client/gui/CGUITabPanel_Impl.cpp | 9 +- Client/gui/CGUITab_Impl.cpp | 12 +- Client/gui/CGUITexture_Impl.cpp | 29 +- Client/gui/CGUITexture_Impl.h | 5 +- Client/gui/CGUIWebBrowser_Impl.cpp | 162 +- Client/gui/CGUIWebBrowser_Impl.h | 57 +- Client/gui/CGUIWindow_Impl.cpp | 23 +- Client/gui/CGUI_Impl.cpp | 652 +- Client/gui/CGUI_Impl.h | 112 +- Client/{gui_new => gui}/Main.h | 0 Client/gui/StdInc.h | 10 +- Client/gui/premake5.lua | 30 +- Client/gui_new/CGUIButton_Impl.cpp | 55 - Client/gui_new/CGUIButton_Impl.h | 30 - Client/gui_new/CGUICheckBox_Impl.cpp | 69 - Client/gui_new/CGUICheckBox_Impl.h | 33 - Client/gui_new/CGUIComboBox_Impl.cpp | 305 - Client/gui_new/CGUIComboBox_Impl.h | 62 - Client/gui_new/CGUIEdit_Impl.cpp | 217 - Client/gui_new/CGUIEdit_Impl.h | 66 - Client/gui_new/CGUIElement_Impl.cpp | 706 - Client/gui_new/CGUIElement_Impl.h | 165 - Client/gui_new/CGUIElement_Inc.h | 319 - Client/gui_new/CGUIFont_Impl.cpp | 118 - Client/gui_new/CGUIFont_Impl.h | 49 - Client/gui_new/CGUIGridList_Impl.cpp | 808 - Client/gui_new/CGUIGridList_Impl.h | 106 - Client/gui_new/CGUILabel_Impl.cpp | 215 - Client/gui_new/CGUILabel_Impl.h | 55 - Client/gui_new/CGUIMemo_Impl.cpp | 203 - Client/gui_new/CGUIMemo_Impl.h | 59 - Client/gui_new/CGUIMessageBox_Impl.cpp | 151 - Client/gui_new/CGUIMessageBox_Impl.h | 49 - Client/gui_new/CGUIProgressBar_Impl.cpp | 62 - Client/gui_new/CGUIProgressBar_Impl.h | 35 - Client/gui_new/CGUIRadioButton_Impl.cpp | 66 - Client/gui_new/CGUIRadioButton_Impl.h | 35 - Client/gui_new/CGUIScrollBar_Impl.cpp | 75 - Client/gui_new/CGUIScrollBar_Impl.h | 40 - Client/gui_new/CGUIScrollPane_Impl.cpp | 183 - Client/gui_new/CGUIScrollPane_Impl.h | 48 - Client/gui_new/CGUIStaticImage_Impl.cpp | 173 - Client/gui_new/CGUIStaticImage_Impl.h | 52 - Client/gui_new/CGUITabList.cpp | 53 - Client/gui_new/CGUITabList.h | 32 - Client/gui_new/CGUITabListItem.h | 23 - Client/gui_new/CGUITabPanel_Impl.cpp | 157 - Client/gui_new/CGUITabPanel_Impl.h | 57 - Client/gui_new/CGUITab_Impl.cpp | 91 - Client/gui_new/CGUITab_Impl.h | 41 - Client/gui_new/CGUITexture_Impl.cpp | 84 - Client/gui_new/CGUITexture_Impl.h | 46 - Client/gui_new/CGUIWebBrowser_Impl.cpp | 250 - Client/gui_new/CGUIWebBrowser_Impl.h | 91 - Client/gui_new/CGUIWindow_Impl.cpp | 144 - Client/gui_new/CGUIWindow_Impl.h | 48 - Client/gui_new/CGUI_Impl.cpp | 1739 -- Client/gui_new/CGUI_Impl.h | 359 - Client/gui_new/Main.cpp | 41 - Client/gui_new/StdInc.cpp | 2 - Client/gui_new/StdInc.h | 38 - Client/gui_new/premake5.lua | 63 - Client/mods/deathmatch/logic/CLocalServer.cpp | 4 +- .../logic/CStaticFunctionDefinitions.cpp | 2 +- .../deathmatch/logic/luadefs/CLuaGUIDefs.cpp | 2 +- Client/sdk/gui/CGUI.h | 1 + Client/sdk/gui/CGUIComboBox.h | 38 +- Client/sdk/gui/CGUIElement.h | 6 + Client/sdk/gui/CGUIGridList.h | 53 +- .../{CGUIListItem.h => CGUIGridListItem.h} | 16 +- Client/sdk/gui/CGUIStandardItem.h | 42 + .../datafiles/imagesets/GWEN.imageset | 28 +- .../datafiles/looknfeel/GWEN.looknfeel | 76 +- .../cgui-0.8.7/datafiles/schemes/GWEN.scheme | 4 +- premake5.lua | 6 - vendor/cegui-0.4.0-custom/AUTHORS | 98 - vendor/cegui-0.4.0-custom/COPYING | 504 - vendor/cegui-0.4.0-custom/ChangeLog | 272 - vendor/cegui-0.4.0-custom/FTL.TXT | 174 - .../cegui-0.4.0-custom/Freetype2 License.txt | 28 - vendor/cegui-0.4.0-custom/GLUT-README.txt | 613 - vendor/cegui-0.4.0-custom/PCRE-LICENSE | 45 - vendor/cegui-0.4.0-custom/README | 69 - vendor/cegui-0.4.0-custom/TODO | 19 - vendor/cegui-0.4.0-custom/TinyXML-License | 21 - .../WidgetSets/Falagard/include/FalButton.h | 92 - .../WidgetSets/Falagard/include/FalCheckbox.h | 96 - .../Falagard/include/FalComboDropList.h | 95 - .../WidgetSets/Falagard/include/FalCombobox.h | 92 - .../WidgetSets/Falagard/include/FalEditbox.h | 95 - .../Falagard/include/FalFrameWindow.h | 103 - .../Falagard/include/FalListHeader.h | 107 - .../include/FalListHeaderProperties.h | 64 - .../Falagard/include/FalListHeaderSegment.h | 112 - .../include/FalListHeaderSegmentProperties.h | 87 - .../WidgetSets/Falagard/include/FalListbox.h | 95 - .../WidgetSets/Falagard/include/FalMenuBar.h | 86 - .../WidgetSets/Falagard/include/FalMenuItem.h | 90 - .../WidgetSets/Falagard/include/FalModule.h | 56 - .../Falagard/include/FalMultiColumnList.h | 98 - .../Falagard/include/FalMultiLineEditbox.h | 117 - .../include/FalMultiLineEditboxProperties.h | 64 - .../Falagard/include/FalPopupMenu.h | 86 - .../Falagard/include/FalProgressBar.h | 111 - .../include/FalProgressBarProperties.h | 94 - .../Falagard/include/FalRadioButton.h | 96 - .../Falagard/include/FalScrollablePane.h | 95 - .../Falagard/include/FalScrollbar.h | 116 - .../Falagard/include/FalScrollbarProperties.h | 68 - .../WidgetSets/Falagard/include/FalSlider.h | 117 - .../Falagard/include/FalSliderProperties.h | 92 - .../WidgetSets/Falagard/include/FalSpinner.h | 91 - .../Falagard/include/FalStaticImage.h | 93 - .../Falagard/include/FalStaticText.h | 95 - .../Falagard/include/FalSystemButton.h | 82 - .../Falagard/include/FalTabButton.h | 92 - .../Falagard/include/FalTabControl.h | 112 - .../include/FalTabControlProperties.h | 62 - .../WidgetSets/Falagard/include/FalTabPane.h | 82 - .../WidgetSets/Falagard/include/FalThumb.h | 93 - .../WidgetSets/Falagard/include/FalTitlebar.h | 86 - .../WidgetSets/Falagard/include/FalTooltip.h | 88 - .../WidgetSets/Falagard/include/Makefile.am | 38 - .../WidgetSets/Falagard/include/StdInc.h | 8 - .../WidgetSets/Falagard/premake5.lua | 35 - .../WidgetSets/Falagard/src/FalButton.cpp | 171 - .../WidgetSets/Falagard/src/FalCheckbox.cpp | 132 - .../Falagard/src/FalComboDropList.cpp | 120 - .../WidgetSets/Falagard/src/FalCombobox.cpp | 92 - .../WidgetSets/Falagard/src/FalEditbox.cpp | 233 - .../Falagard/src/FalFrameWindow.cpp | 118 - .../WidgetSets/Falagard/src/FalListHeader.cpp | 104 - .../Falagard/src/FalListHeaderProperties.cpp | 45 - .../Falagard/src/FalListHeaderSegment.cpp | 162 - .../src/FalListHeaderSegmentProperties.cpp | 57 - .../WidgetSets/Falagard/src/FalListbox.cpp | 120 - .../WidgetSets/Falagard/src/FalMenuBar.cpp | 93 - .../WidgetSets/Falagard/src/FalMenuItem.cpp | 94 - .../WidgetSets/Falagard/src/FalModule.cpp | 192 - .../Falagard/src/FalMultiColumnList.cpp | 127 - .../Falagard/src/FalMultiLineEditbox.cpp | 172 - .../src/FalMultiLineEditboxProperties.cpp | 46 - .../WidgetSets/Falagard/src/FalPopupMenu.cpp | 93 - .../Falagard/src/FalProgressBar.cpp | 138 - .../Falagard/src/FalProgressBarProperties.cpp | 56 - .../Falagard/src/FalRadioButton.cpp | 132 - .../Falagard/src/FalScrollablePane.cpp | 120 - .../WidgetSets/Falagard/src/FalScrollbar.cpp | 177 - .../Falagard/src/FalScrollbarProperties.cpp | 44 - .../WidgetSets/Falagard/src/FalSlider.cpp | 203 - .../Falagard/src/FalSliderProperties.cpp | 56 - .../WidgetSets/Falagard/src/FalSpinner.cpp | 91 - .../Falagard/src/FalStaticImage.cpp | 107 - .../WidgetSets/Falagard/src/FalStaticText.cpp | 140 - .../Falagard/src/FalSystemButton.cpp | 73 - .../WidgetSets/Falagard/src/FalTabButton.cpp | 131 - .../WidgetSets/Falagard/src/FalTabControl.cpp | 115 - .../Falagard/src/FalTabControlProperties.cpp | 45 - .../WidgetSets/Falagard/src/FalTabPane.cpp | 70 - .../WidgetSets/Falagard/src/FalThumb.cpp | 137 - .../WidgetSets/Falagard/src/FalTitlebar.cpp | 99 - .../WidgetSets/Falagard/src/FalTooltip.cpp | 86 - .../WidgetSets/Falagard/src/Makefile.am | 42 - .../WidgetSets/Falagard/src/StdInc.cpp | 7 - .../cegui-0.4.0-custom/Xerces-c License.txt | 15 - .../dependencies/include/GL/glut.h | 716 - .../dependencies/include/_xercesc/Readme.txt | 1 - .../include/_xercesc/_xercesc contents.7z | Bin 370505 -> 0 bytes .../dependencies/lib/DevIL.lib | Bin 26250 -> 0 bytes .../dependencies/lib/ILU.lib | Bin 11222 -> 0 bytes .../dependencies/lib/ILUT.lib | Bin 9484 -> 0 bytes .../dependencies/lib/glut32.lib | Bin 28728 -> 0 bytes .../dependencies/lib/xerces-c_2.lib | Bin 3024874 -> 0 bytes .../dependencies/lib/xerces-c_2D.lib | Bin 3033238 -> 0 bytes vendor/cegui-0.4.0-custom/include/CEGUI.h | 102 - vendor/cegui-0.4.0-custom/include/CEGUIBase.h | 175 - .../include/CEGUIColourRect.h | 204 - .../cegui-0.4.0-custom/include/CEGUIConfig.h | 110 - .../include/CEGUIConfig_xmlHandler.h | 158 - .../include/CEGUIDataContainer.h | 154 - .../include/CEGUIDefaultResourceProvider.h | 51 - .../cegui-0.4.0-custom/include/CEGUIEvent.h | 376 - .../include/CEGUIEventArgs.h | 66 - .../include/CEGUIEventSet.h | 277 - .../include/CEGUIExceptions.h | 184 - .../include/CEGUIFactoryModule.h | 140 - vendor/cegui-0.4.0-custom/include/CEGUIFont.h | 1083 -- .../include/CEGUIFontManager.h | 285 - .../include/CEGUIFontManager_implData.h | 45 - .../include/CEGUIFont_implData.h | 49 - .../include/CEGUIFont_xmlHandler.h | 114 - .../include/CEGUIForwardRefs.h | 116 - .../include/CEGUIGUILayout_xmlHandler.h | 129 - .../include/CEGUIGlobalEventSet.h | 141 - .../cegui-0.4.0-custom/include/CEGUIImage.h | 512 - .../include/CEGUIImageset.h | 593 - .../include/CEGUIImagesetManager.h | 271 - .../include/CEGUIImageset_xmlHandler.h | 107 - .../include/CEGUIInputEvent.h | 321 - .../include/CEGUIIteratorBase.h | 276 - .../cegui-0.4.0-custom/include/CEGUILogger.h | 195 - .../include/CEGUIMouseCursor.h | 342 - .../include/CEGUIProperty.h | 190 - .../include/CEGUIPropertyHelper.h | 76 - .../include/CEGUIPropertySet.h | 222 - vendor/cegui-0.4.0-custom/include/CEGUIRect.h | 213 - .../cegui-0.4.0-custom/include/CEGUIRefPtr.h | 130 - .../include/CEGUIRenderCache.h | 208 - .../include/CEGUIRenderableElement.h | 311 - .../include/CEGUIRenderableFrame.h | 190 - .../include/CEGUIRenderableImage.h | 254 - .../include/CEGUIRenderer.h | 404 - .../include/CEGUIResourceProvider.h | 132 - .../cegui-0.4.0-custom/include/CEGUIScheme.h | 197 - .../include/CEGUISchemeManager.h | 185 - .../include/CEGUIScheme_xmlHandler.h | 105 - .../include/CEGUIScriptModule.h | 182 - .../include/CEGUISingleton.h | 75 - vendor/cegui-0.4.0-custom/include/CEGUISize.h | 54 - .../cegui-0.4.0-custom/include/CEGUIString.h | 5636 ------ .../include/CEGUIStringBidi.h | 2105 --- .../cegui-0.4.0-custom/include/CEGUISystem.h | 1047 -- .../include/CEGUITextUtils.h | 164 - .../cegui-0.4.0-custom/include/CEGUITexture.h | 139 - .../include/CEGUITinyXMLParser.h | 55 - vendor/cegui-0.4.0-custom/include/CEGUIUDim.h | 173 - .../cegui-0.4.0-custom/include/CEGUIVector.h | 132 - .../cegui-0.4.0-custom/include/CEGUIVersion.h | 40 - .../cegui-0.4.0-custom/include/CEGUIWindow.h | 4024 ---- .../include/CEGUIWindowFactory.h | 100 - .../include/CEGUIWindowFactoryManager.h | 430 - .../include/CEGUIWindowManager.h | 400 - .../include/CEGUIWindowProperties.h | 1704 -- .../include/CEGUIXMLAttributes.h | 244 - .../include/CEGUIXMLHandler.h | 79 - .../include/CEGUIXMLParser.h | 141 - .../include/CEGUIXercesParser.h | 98 - .../cegui-0.4.0-custom/include/CEGUIcolour.h | 280 - vendor/cegui-0.4.0-custom/include/StdInc.h | 12 - .../include/elements/CEGUIButtonBase.h | 341 - .../elements/CEGUIButtonBaseProperties.h | 156 - .../include/elements/CEGUICheckbox.h | 179 - .../elements/CEGUICheckboxProperties.h | 75 - .../include/elements/CEGUIComboDropList.h | 205 - .../include/elements/CEGUICombobox.h | 1084 -- .../elements/CEGUIComboboxProperties.h | 403 - .../include/elements/CEGUIDragContainer.h | 503 - .../elements/CEGUIDragContainerProperties.h | 138 - .../include/elements/CEGUIEditbox.h | 717 - .../include/elements/CEGUIEditboxProperties.h | 355 - .../include/elements/CEGUIFrameWindow.h | 799 - .../elements/CEGUIFrameWindowProperties.h | 391 - .../include/elements/CEGUIGUISheet.h | 172 - .../include/elements/CEGUIItemEntry.h | 127 - .../include/elements/CEGUIItemListBase.h | 430 - .../elements/CEGUIItemListBaseProperties.h | 63 - .../include/elements/CEGUIListHeader.h | 883 - .../elements/CEGUIListHeaderProperties.h | 177 - .../include/elements/CEGUIListHeaderSegment.h | 444 - .../CEGUIListHeaderSegmentProperties.h | 152 - .../include/elements/CEGUIListbox.h | 744 - .../include/elements/CEGUIListboxImageItem.h | 127 - .../include/elements/CEGUIListboxItem.h | 451 - .../include/elements/CEGUIListboxNumberItem.h | 202 - .../include/elements/CEGUIListboxProperties.h | 175 - .../include/elements/CEGUIListboxTextItem.h | 185 - .../include/elements/CEGUIMenuBase.h | 299 - .../elements/CEGUIMenuBaseProperties.h | 189 - .../include/elements/CEGUIMenuItem.h | 411 - .../elements/CEGUIMenuItemProperties.h | 164 - .../include/elements/CEGUIMenubar.h | 119 - .../include/elements/CEGUIMultiColumnList.h | 1643 -- .../elements/CEGUIMultiColumnListProperties.h | 362 - .../include/elements/CEGUIMultiLineEditbox.h | 795 - .../CEGUIMultiLineEditboxProperties.h | 300 - .../include/elements/CEGUIPopupMenu.h | 228 - .../elements/CEGUIPopupMenuProperties.h | 88 - .../include/elements/CEGUIProgressBar.h | 224 - .../elements/CEGUIProgressBarProperties.h | 98 - .../include/elements/CEGUIPushButton.h | 338 - .../elements/CEGUIPushButtonProperties.h | 181 - .../include/elements/CEGUIRadioButton.h | 217 - .../elements/CEGUIRadioButtonProperties.h | 99 - .../include/elements/CEGUIScrollablePane.h | 583 - .../elements/CEGUIScrollablePaneProperties.h | 293 - .../include/elements/CEGUIScrollbar.h | 515 - .../elements/CEGUIScrollbarProperties.h | 171 - .../include/elements/CEGUIScrolledContainer.h | 273 - .../CEGUIScrolledContainerProperties.h | 123 - .../include/elements/CEGUISlider.h | 333 - .../include/elements/CEGUISliderProperties.h | 122 - .../include/elements/CEGUISpinner.h | 427 - .../include/elements/CEGUISpinnerProperties.h | 165 - .../include/elements/CEGUIStatic.h | 455 - .../include/elements/CEGUIStaticImage.h | 344 - .../elements/CEGUIStaticImageProperties.h | 160 - .../include/elements/CEGUIStaticProperties.h | 391 - .../include/elements/CEGUIStaticText.h | 412 - .../elements/CEGUIStaticTextProperties.h | 186 - .../include/elements/CEGUITabButton.h | 181 - .../include/elements/CEGUITabControl.h | 485 - .../elements/CEGUITabControlProperties.h | 200 - .../include/elements/CEGUITabPane.h | 118 - .../include/elements/CEGUITextItem.h | 240 - .../elements/CEGUITextItemProperties.h | 120 - .../include/elements/CEGUIThumb.h | 322 - .../include/elements/CEGUIThumbProperties.h | 178 - .../include/elements/CEGUITitlebar.h | 195 - .../elements/CEGUITitlebarProperties.h | 98 - .../include/elements/CEGUITooltip.h | 363 - .../include/elements/CEGUITooltipProperties.h | 115 - .../include/elements/Makefile.am | 73 - .../include/falagard/CEGUIFalComponentBase.h | 252 - .../include/falagard/CEGUIFalDimensions.h | 677 - .../include/falagard/CEGUIFalEnums.h | 147 - .../include/falagard/CEGUIFalFrameComponent.h | 165 - .../falagard/CEGUIFalImageryComponent.h | 179 - .../include/falagard/CEGUIFalImagerySection.h | 275 - .../falagard/CEGUIFalLayerSpecification.h | 149 - .../include/falagard/CEGUIFalNamedArea.h | 93 - .../falagard/CEGUIFalPropertyDefinition.h | 67 - .../falagard/CEGUIFalPropertyInitialiser.h | 102 - .../falagard/CEGUIFalSectionSpecification.h | 232 - .../include/falagard/CEGUIFalStateImagery.h | 172 - .../include/falagard/CEGUIFalTextComponent.h | 161 - .../falagard/CEGUIFalWidgetComponent.h | 112 - .../include/falagard/CEGUIFalWidgetLookFeel.h | 318 - .../falagard/CEGUIFalWidgetLookManager.h | 227 - .../include/falagard/CEGUIFalXMLEnumHelper.h | 66 - .../falagard/CEGUIFalagard_xmlHandler.h | 181 - .../IrrlichtRenderer/IrrlichtRendererDef.h | 48 - .../IrrlichtResourceProvider.h | 53 - .../renderers/IrrlichtRenderer/Makefile.am | 5 - .../renderers/IrrlichtRenderer/Readme.txt | 52 - .../IrrlichtRenderer/irrlichtrenderer.h | 388 - .../IrrlichtRenderer/irrlichttexture.h | 130 - .../include/renderers/Makefile.am | 1 - .../renderers/OpenGLGUIRenderer/Makefile.am | 2 - .../OpenGLGUIRenderer/openglrenderer.h | 395 - .../OpenGLGUIRenderer/opengltexture.h | 216 - .../renderers/directx81GUIRenderer/renderer.h | 362 - .../renderers/directx81GUIRenderer/texture.h | 193 - .../directx9GUIRenderer/d3d9renderer.h | 352 - .../directx9GUIRenderer/d3d9texture.h | 197 - vendor/cegui-0.4.0-custom/premake5.lua | 56 - vendor/cegui-0.4.0-custom/src/CEGUIBase.cpp | 33 - .../src/CEGUIColourRect.cpp | 189 - .../src/CEGUIConfig_xmlHandler.cpp | 93 - .../src/CEGUIDefaultResourceProvider.cpp | 107 - vendor/cegui-0.4.0-custom/src/CEGUIEvent.cpp | 131 - .../cegui-0.4.0-custom/src/CEGUIEventArgs.cpp | 35 - .../cegui-0.4.0-custom/src/CEGUIEventSet.cpp | 265 - .../src/CEGUIExceptions.cpp | 44 - .../src/CEGUIFactoryModule.cpp | 154 - vendor/cegui-0.4.0-custom/src/CEGUIFont.cpp | 1724 -- .../src/CEGUIFontManager.cpp | 267 - .../src/CEGUIFont_xmlHandler.cpp | 277 - .../src/CEGUIGUILayout_xmlHandler.cpp | 274 - .../src/CEGUIGlobalEventSet.cpp | 127 - vendor/cegui-0.4.0-custom/src/CEGUIImage.cpp | 178 - .../cegui-0.4.0-custom/src/CEGUIImageset.cpp | 377 - .../src/CEGUIImagesetManager.cpp | 238 - .../src/CEGUIImageset_xmlHandler.cpp | 136 - vendor/cegui-0.4.0-custom/src/CEGUILogger.cpp | 204 - .../src/CEGUIMouseCursor.cpp | 292 - .../cegui-0.4.0-custom/src/CEGUIProperty.cpp | 57 - .../src/CEGUIPropertyHelper.cpp | 392 - .../src/CEGUIPropertySet.cpp | 246 - vendor/cegui-0.4.0-custom/src/CEGUIRect.cpp | 201 - vendor/cegui-0.4.0-custom/src/CEGUIRefPtr.cpp | 31 - .../src/CEGUIRenderCache.cpp | 145 - .../src/CEGUIRenderableElement.cpp | 96 - .../src/CEGUIRenderableFrame.cpp | 677 - .../src/CEGUIRenderableImage.cpp | 228 - .../cegui-0.4.0-custom/src/CEGUIRenderer.cpp | 89 - vendor/cegui-0.4.0-custom/src/CEGUIScheme.cpp | 430 - .../src/CEGUISchemeManager.cpp | 155 - .../src/CEGUIScheme_xmlHandler.cpp | 176 - .../src/CEGUIScriptModule.cpp | 61 - vendor/cegui-0.4.0-custom/src/CEGUISize.cpp | 45 - vendor/cegui-0.4.0-custom/src/CEGUIString.cpp | 536 - vendor/cegui-0.4.0-custom/src/CEGUISystem.cpp | 1529 -- .../cegui-0.4.0-custom/src/CEGUITextUtils.cpp | 191 - .../cegui-0.4.0-custom/src/CEGUITexture.cpp | 35 - .../src/CEGUITinyXMLParser.hpp | 129 - vendor/cegui-0.4.0-custom/src/CEGUIVector.cpp | 16 - .../src/CEGUIWin32XMLSelectHack.cpp | 44 - vendor/cegui-0.4.0-custom/src/CEGUIWindow.cpp | 4186 ----- .../src/CEGUIWindowFactory.cpp | 35 - .../src/CEGUIWindowFactoryManager.cpp | 331 - .../src/CEGUIWindowManager.cpp | 354 - .../src/CEGUIWindowProperties.cpp | 957 - .../src/CEGUIXMLAttributes.cpp | 175 - .../src/CEGUIXMLHandler.cpp | 45 - .../cegui-0.4.0-custom/src/CEGUIXMLParser.cpp | 64 - .../src/CEGUIXercesParser.hpp | 335 - vendor/cegui-0.4.0-custom/src/CEGUIcolour.cpp | 260 - vendor/cegui-0.4.0-custom/src/StdInc.cpp | 7 - .../src/elements/CEGUIButtonBase.cpp | 306 - .../elements/CEGUIButtonBaseProperties.cpp | 92 - .../src/elements/CEGUICheckbox.cpp | 141 - .../src/elements/CEGUICheckboxProperties.cpp | 55 - .../src/elements/CEGUIComboDropList.cpp | 239 - .../src/elements/CEGUICombobox.cpp | 1127 -- .../src/elements/CEGUIComboboxProperties.cpp | 213 - .../src/elements/CEGUIDragContainer.cpp | 454 - .../elements/CEGUIDragContainerProperties.cpp | 88 - .../src/elements/CEGUIEditbox.cpp | 1177 -- .../src/elements/CEGUIEditboxProperties.cpp | 192 - .../src/elements/CEGUIFrameWindow.cpp | 964 - .../elements/CEGUIFrameWindowProperties.cpp | 218 - .../src/elements/CEGUIGUISheet.cpp | 38 - .../src/elements/CEGUIItemEntry.cpp | 49 - .../src/elements/CEGUIItemListBase.cpp | 377 - .../elements/CEGUIItemListBaseProperties.cpp | 48 - .../src/elements/CEGUIListHeader.cpp | 1102 -- .../elements/CEGUIListHeaderProperties.cpp | 129 - .../src/elements/CEGUIListHeaderSegment.cpp | 667 - .../CEGUIListHeaderSegmentProperties.cpp | 118 - .../src/elements/CEGUIListbox.cpp | 1202 -- .../src/elements/CEGUIListboxImageItem.cpp | 126 - .../src/elements/CEGUIListboxItem.cpp | 121 - .../src/elements/CEGUIListboxNumberItem.cpp | 171 - .../src/elements/CEGUIListboxProperties.cpp | 99 - .../src/elements/CEGUIListboxTextItem.cpp | 160 - .../src/elements/CEGUIMenuBase.cpp | 158 - .../src/elements/CEGUIMenuBaseProperties.cpp | 101 - .../src/elements/CEGUIMenuItem.cpp | 519 - .../src/elements/CEGUIMenuItemProperties.cpp | 101 - .../src/elements/CEGUIMenubar.cpp | 130 - .../src/elements/CEGUIMultiColumnList.cpp | 2641 --- .../CEGUIMultiColumnListProperties.cpp | 375 - .../src/elements/CEGUIMultiLineEditbox.cpp | 1709 -- .../CEGUIMultiLineEditboxProperties.cpp | 166 - .../src/elements/CEGUIPopupMenu.cpp | 338 - .../src/elements/CEGUIPopupMenuProperties.cpp | 59 - .../src/elements/CEGUIProgressBar.cpp | 142 - .../elements/CEGUIProgressBarProperties.cpp | 64 - .../src/elements/CEGUIPushButton.cpp | 289 - .../elements/CEGUIPushButtonProperties.cpp | 123 - .../src/elements/CEGUIRadioButton.cpp | 239 - .../elements/CEGUIRadioButtonProperties.cpp | 64 - .../src/elements/CEGUIScrollablePane.cpp | 509 - .../CEGUIScrollablePaneProperties.cpp | 154 - .../src/elements/CEGUIScrollbar.cpp | 390 - .../src/elements/CEGUIScrollbarProperties.cpp | 100 - .../src/elements/CEGUIScrolledContainer.cpp | 237 - .../CEGUIScrolledContainerProperties.cpp | 71 - .../src/elements/CEGUISlider.cpp | 276 - .../src/elements/CEGUISliderProperties.cpp | 76 - .../src/elements/CEGUISpinner.cpp | 420 - .../src/elements/CEGUISpinnerProperties.cpp | 126 - .../src/elements/CEGUIStatic.cpp | 428 - .../src/elements/CEGUIStaticImage.cpp | 244 - .../elements/CEGUIStaticImageProperties.cpp | 178 - .../src/elements/CEGUIStaticProperties.cpp | 196 - .../src/elements/CEGUIStaticText.cpp | 494 - .../elements/CEGUIStaticTextProperties.cpp | 195 - .../src/elements/CEGUITabButton.cpp | 139 - .../src/elements/CEGUITabControl.cpp | 669 - .../elements/CEGUITabControlProperties.cpp | 200 - .../src/elements/CEGUITextItem.cpp | 139 - .../src/elements/CEGUITextItemProperties.cpp | 139 - .../src/elements/CEGUIThumb.cpp | 353 - .../src/elements/CEGUIThumbProperties.cpp | 123 - .../src/elements/CEGUITitlebar.cpp | 279 - .../src/elements/CEGUITitlebarProperties.cpp | 63 - .../src/elements/CEGUITooltip.cpp | 413 - .../src/elements/CEGUITooltipProperties.cpp | 70 - .../src/falagard/CEGUIFalComponentBase.cpp | 175 - .../src/falagard/CEGUIFalDimensions.cpp | 792 - .../src/falagard/CEGUIFalFrameComponent.cpp | 525 - .../src/falagard/CEGUIFalImageryComponent.cpp | 267 - .../src/falagard/CEGUIFalImagerySection.cpp | 305 - .../falagard/CEGUIFalLayerSpecification.cpp | 91 - .../src/falagard/CEGUIFalNamedArea.cpp | 58 - .../falagard/CEGUIFalPropertyDefinition.cpp | 73 - .../falagard/CEGUIFalPropertyInitialiser.cpp | 63 - .../falagard/CEGUIFalSectionSpecification.cpp | 218 - .../src/falagard/CEGUIFalStateImagery.cpp | 113 - .../src/falagard/CEGUIFalTextComponent.cpp | 165 - .../src/falagard/CEGUIFalWidgetComponent.cpp | 180 - .../src/falagard/CEGUIFalWidgetLookFeel.cpp | 255 - .../falagard/CEGUIFalWidgetLookManager.cpp | 180 - .../src/falagard/CEGUIFalXMLEnumHelper.cpp | 525 - .../src/falagard/CEGUIFalagard_xmlHandler.cpp | 690 - vendor/cegui-0.4.0-custom/src/pcre/AUTHORS | 6 - vendor/cegui-0.4.0-custom/src/pcre/COPYING | 45 - vendor/cegui-0.4.0-custom/src/pcre/ChangeLog | 1611 -- vendor/cegui-0.4.0-custom/src/pcre/NEWS | 201 - vendor/cegui-0.4.0-custom/src/pcre/README | 427 - .../cegui-0.4.0-custom/src/pcre/README-CEGUI | 10 - .../cegui-0.4.0-custom/src/pcre/chartables.c | 183 - .../src/pcre/doc/Tech.Notes | 315 - .../src/pcre/doc/html/index.html | 108 - .../src/pcre/doc/html/pcre.html | 214 - .../src/pcre/doc/html/pcre_compile.html | 75 - .../src/pcre/doc/html/pcre_config.html | 60 - .../doc/html/pcre_copy_named_substring.html | 53 - .../pcre/doc/html/pcre_copy_substring.html | 51 - .../src/pcre/doc/html/pcre_exec.html | 78 - .../pcre/doc/html/pcre_free_substring.html | 40 - .../doc/html/pcre_free_substring_list.html | 40 - .../src/pcre/doc/html/pcre_fullinfo.html | 71 - .../doc/html/pcre_get_named_substring.html | 54 - .../pcre/doc/html/pcre_get_stringnumber.html | 46 - .../src/pcre/doc/html/pcre_get_substring.html | 52 - .../doc/html/pcre_get_substring_list.html | 51 - .../src/pcre/doc/html/pcre_info.html | 39 - .../src/pcre/doc/html/pcre_maketables.html | 42 - .../src/pcre/doc/html/pcre_study.html | 56 - .../src/pcre/doc/html/pcre_version.html | 39 - .../src/pcre/doc/html/pcreapi.html | 1287 -- .../src/pcre/doc/html/pcrebuild.html | 186 - .../src/pcre/doc/html/pcrecallout.html | 180 - .../src/pcre/doc/html/pcrecompat.html | 150 - .../src/pcre/doc/html/pcregrep.html | 158 - .../src/pcre/doc/html/pcrepartial.html | 111 - .../src/pcre/doc/html/pcrepattern.html | 1470 -- .../src/pcre/doc/html/pcreperform.html | 97 - .../src/pcre/doc/html/pcreposix.html | 218 - .../src/pcre/doc/html/pcreprecompile.html | 133 - .../src/pcre/doc/html/pcresample.html | 81 - .../src/pcre/doc/html/pcretest.html | 495 - .../cegui-0.4.0-custom/src/pcre/doc/pcre.txt | 3769 ---- vendor/cegui-0.4.0-custom/src/pcre/get.c | 357 - vendor/cegui-0.4.0-custom/src/pcre/internal.h | 753 - .../cegui-0.4.0-custom/src/pcre/maketables.c | 146 - vendor/cegui-0.4.0-custom/src/pcre/pcre.c | 9195 ---------- vendor/cegui-0.4.0-custom/src/pcre/pcre.h | 204 - .../cegui-0.4.0-custom/src/pcre/pcreconfig.h | 109 - .../cegui-0.4.0-custom/src/pcre/pcreposix.c | 316 - .../cegui-0.4.0-custom/src/pcre/pcreposix.h | 117 - vendor/cegui-0.4.0-custom/src/pcre/study.c | 484 - vendor/cegui-0.4.0-custom/src/pcre/ucp.c | 151 - vendor/cegui-0.4.0-custom/src/pcre/ucp.h | 58 - .../cegui-0.4.0-custom/src/pcre/ucpinternal.h | 91 - vendor/cegui-0.4.0-custom/src/pcre/ucptable.c | 15105 ---------------- .../src/pcre/ucptypetable.c | 93 - .../directx9GUIRenderer/d3d9renderer.cpp | 727 - .../directx9GUIRenderer/d3d9texture.cpp | 277 - .../directx9GUIRenderer/premake5.lua | 31 - .../cegui-0.4.0-custom/src/tinyxml/readme.txt | 496 - .../src/tinyxml/tinystr.cpp | 307 - .../cegui-0.4.0-custom/src/tinyxml/tinystr.h | 253 - .../src/tinyxml/tinyxml.cpp | 1592 -- .../cegui-0.4.0-custom/src/tinyxml/tinyxml.h | 1424 -- .../src/tinyxml/tinyxmlerror.cpp | 51 - .../src/tinyxml/tinyxmlparser.cpp | 1516 -- 584 files changed, 1570 insertions(+), 167264 deletions(-) rename Client/{gui_new/CGUIListItem_Impl.cpp => gui/CGUIGridListItem_Impl .cpp} (66%) rename Client/{gui_new/CGUIListItem_Impl.h => gui/CGUIGridListItem_Impl.h} (77%) delete mode 100644 Client/gui/CGUIListItem_Impl.cpp create mode 100644 Client/gui/CGUIStandardItem_Impl.cpp rename Client/gui/{CGUIListItem_Impl.h => CGUIStandardItem_Impl.h} (62%) rename Client/{gui_new => gui}/Main.h (100%) delete mode 100644 Client/gui_new/CGUIButton_Impl.cpp delete mode 100644 Client/gui_new/CGUIButton_Impl.h delete mode 100644 Client/gui_new/CGUICheckBox_Impl.cpp delete mode 100644 Client/gui_new/CGUICheckBox_Impl.h delete mode 100644 Client/gui_new/CGUIComboBox_Impl.cpp delete mode 100644 Client/gui_new/CGUIComboBox_Impl.h delete mode 100644 Client/gui_new/CGUIEdit_Impl.cpp delete mode 100644 Client/gui_new/CGUIEdit_Impl.h delete mode 100644 Client/gui_new/CGUIElement_Impl.cpp delete mode 100644 Client/gui_new/CGUIElement_Impl.h delete mode 100644 Client/gui_new/CGUIElement_Inc.h delete mode 100644 Client/gui_new/CGUIFont_Impl.cpp delete mode 100644 Client/gui_new/CGUIFont_Impl.h delete mode 100644 Client/gui_new/CGUIGridList_Impl.cpp delete mode 100644 Client/gui_new/CGUIGridList_Impl.h delete mode 100644 Client/gui_new/CGUILabel_Impl.cpp delete mode 100644 Client/gui_new/CGUILabel_Impl.h delete mode 100644 Client/gui_new/CGUIMemo_Impl.cpp delete mode 100644 Client/gui_new/CGUIMemo_Impl.h delete mode 100644 Client/gui_new/CGUIMessageBox_Impl.cpp delete mode 100644 Client/gui_new/CGUIMessageBox_Impl.h delete mode 100644 Client/gui_new/CGUIProgressBar_Impl.cpp delete mode 100644 Client/gui_new/CGUIProgressBar_Impl.h delete mode 100644 Client/gui_new/CGUIRadioButton_Impl.cpp delete mode 100644 Client/gui_new/CGUIRadioButton_Impl.h delete mode 100644 Client/gui_new/CGUIScrollBar_Impl.cpp delete mode 100644 Client/gui_new/CGUIScrollBar_Impl.h delete mode 100644 Client/gui_new/CGUIScrollPane_Impl.cpp delete mode 100644 Client/gui_new/CGUIScrollPane_Impl.h delete mode 100644 Client/gui_new/CGUIStaticImage_Impl.cpp delete mode 100644 Client/gui_new/CGUIStaticImage_Impl.h delete mode 100644 Client/gui_new/CGUITabList.cpp delete mode 100644 Client/gui_new/CGUITabList.h delete mode 100644 Client/gui_new/CGUITabListItem.h delete mode 100644 Client/gui_new/CGUITabPanel_Impl.cpp delete mode 100644 Client/gui_new/CGUITabPanel_Impl.h delete mode 100644 Client/gui_new/CGUITab_Impl.cpp delete mode 100644 Client/gui_new/CGUITab_Impl.h delete mode 100644 Client/gui_new/CGUITexture_Impl.cpp delete mode 100644 Client/gui_new/CGUITexture_Impl.h delete mode 100644 Client/gui_new/CGUIWebBrowser_Impl.cpp delete mode 100644 Client/gui_new/CGUIWebBrowser_Impl.h delete mode 100644 Client/gui_new/CGUIWindow_Impl.cpp delete mode 100644 Client/gui_new/CGUIWindow_Impl.h delete mode 100644 Client/gui_new/CGUI_Impl.cpp delete mode 100644 Client/gui_new/CGUI_Impl.h delete mode 100644 Client/gui_new/Main.cpp delete mode 100644 Client/gui_new/StdInc.cpp delete mode 100644 Client/gui_new/StdInc.h delete mode 100644 Client/gui_new/premake5.lua rename Client/sdk/gui/{CGUIListItem.h => CGUIGridListItem.h} (85%) create mode 100644 Client/sdk/gui/CGUIStandardItem.h delete mode 100644 vendor/cegui-0.4.0-custom/AUTHORS delete mode 100644 vendor/cegui-0.4.0-custom/COPYING delete mode 100644 vendor/cegui-0.4.0-custom/ChangeLog delete mode 100644 vendor/cegui-0.4.0-custom/FTL.TXT delete mode 100644 vendor/cegui-0.4.0-custom/Freetype2 License.txt delete mode 100644 vendor/cegui-0.4.0-custom/GLUT-README.txt delete mode 100644 vendor/cegui-0.4.0-custom/PCRE-LICENSE delete mode 100644 vendor/cegui-0.4.0-custom/README delete mode 100644 vendor/cegui-0.4.0-custom/TODO delete mode 100644 vendor/cegui-0.4.0-custom/TinyXML-License delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalButton.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCheckbox.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalComboDropList.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCombobox.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalEditbox.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalFrameWindow.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeader.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegment.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegmentProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListbox.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuBar.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuItem.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalModule.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiColumnList.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditbox.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditboxProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalPopupMenu.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBar.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBarProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalRadioButton.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollablePane.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbar.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbarProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSlider.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSliderProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSpinner.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticImage.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticText.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSystemButton.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabButton.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControl.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControlProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabPane.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalThumb.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTitlebar.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTooltip.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/Makefile.am delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/StdInc.h delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/premake5.lua delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCheckbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalComboDropList.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCombobox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalEditbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalFrameWindow.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeader.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegment.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegmentProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuBar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalModule.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiColumnList.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditboxProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalPopupMenu.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBarProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalRadioButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollablePane.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbarProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSlider.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSliderProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSpinner.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticImage.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticText.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSystemButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControl.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControlProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabPane.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalThumb.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTitlebar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTooltip.cpp delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/Makefile.am delete mode 100644 vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/StdInc.cpp delete mode 100644 vendor/cegui-0.4.0-custom/Xerces-c License.txt delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/include/GL/glut.h delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/Readme.txt delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/_xercesc contents.7z delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/lib/DevIL.lib delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/lib/ILU.lib delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/lib/ILUT.lib delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/lib/glut32.lib delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/lib/xerces-c_2.lib delete mode 100644 vendor/cegui-0.4.0-custom/dependencies/lib/xerces-c_2D.lib delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUI.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIBase.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIColourRect.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIConfig.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIConfig_xmlHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIDataContainer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIDefaultResourceProvider.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIEvent.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIEventArgs.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIEventSet.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIExceptions.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIFactoryModule.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIFont.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIFontManager.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIFontManager_implData.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIFont_implData.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIFont_xmlHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIForwardRefs.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIGUILayout_xmlHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIGlobalEventSet.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIImage.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIImageset.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIImagesetManager.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIImageset_xmlHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIInputEvent.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIIteratorBase.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUILogger.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIMouseCursor.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIProperty.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIPropertyHelper.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIPropertySet.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRect.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRefPtr.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRenderCache.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRenderableElement.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRenderableFrame.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRenderableImage.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIRenderer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIResourceProvider.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIScheme.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUISchemeManager.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIScheme_xmlHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIScriptModule.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUISingleton.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUISize.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIString.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUISystem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUITextUtils.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUITexture.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUITinyXMLParser.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIUDim.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIVector.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIVersion.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIWindow.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIWindowFactory.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIWindowFactoryManager.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIWindowManager.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIWindowProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIXMLAttributes.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIXMLHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIXMLParser.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIXercesParser.h delete mode 100644 vendor/cegui-0.4.0-custom/include/CEGUIcolour.h delete mode 100644 vendor/cegui-0.4.0-custom/include/StdInc.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBase.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBaseProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUICheckbox.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUICheckboxProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIComboDropList.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUICombobox.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIComboboxProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainerProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIEditbox.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIEditboxProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindow.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindowProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIGUISheet.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIItemEntry.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBase.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBaseProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeader.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegment.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegmentProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListbox.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxImageItem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxItem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxNumberItem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxTextItem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBase.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBaseProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItemProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMenubar.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnList.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnListProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditbox.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditboxProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenu.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenuProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBar.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBarProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButton.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButtonProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButton.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButtonProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePane.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePaneProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbar.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbarProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainerProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUISlider.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUISliderProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUISpinner.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUISpinnerProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIStatic.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImage.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImageProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticText.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticTextProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITabButton.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITabControl.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITabControlProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITabPane.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITextItem.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITextItemProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIThumb.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUIThumbProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebar.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebarProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITooltip.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/CEGUITooltipProperties.h delete mode 100644 vendor/cegui-0.4.0-custom/include/elements/Makefile.am delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalComponentBase.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalDimensions.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalEnums.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalFrameComponent.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImageryComponent.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImagerySection.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalLayerSpecification.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalNamedArea.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyDefinition.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyInitialiser.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalSectionSpecification.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalStateImagery.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalTextComponent.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetComponent.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookFeel.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookManager.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalXMLEnumHelper.h delete mode 100644 vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalagard_xmlHandler.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtRendererDef.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtResourceProvider.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Makefile.am delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Readme.txt delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichtrenderer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichttexture.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/Makefile.am delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/Makefile.am delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/openglrenderer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/opengltexture.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/renderer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/texture.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9renderer.h delete mode 100644 vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9texture.h delete mode 100644 vendor/cegui-0.4.0-custom/premake5.lua delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIBase.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIColourRect.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIConfig_xmlHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIDefaultResourceProvider.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIEvent.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIEventArgs.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIEventSet.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIExceptions.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIFactoryModule.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIFont.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIFontManager.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIFont_xmlHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIGUILayout_xmlHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIGlobalEventSet.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIImage.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIImageset.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIImagesetManager.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIImageset_xmlHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUILogger.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIMouseCursor.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIProperty.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIPropertyHelper.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIPropertySet.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRect.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRefPtr.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRenderCache.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRenderableElement.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRenderableFrame.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRenderableImage.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIRenderer.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIScheme.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUISchemeManager.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIScheme_xmlHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIScriptModule.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUISize.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIString.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUISystem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUITextUtils.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUITexture.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUITinyXMLParser.hpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIVector.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIWin32XMLSelectHack.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIWindow.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIWindowFactory.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIWindowFactoryManager.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIWindowManager.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIWindowProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIXMLAttributes.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIXMLHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIXMLParser.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIXercesParser.hpp delete mode 100644 vendor/cegui-0.4.0-custom/src/CEGUIcolour.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/StdInc.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBase.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBaseProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUICheckbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUICheckboxProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIComboDropList.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUICombobox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIComboboxProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainer.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainerProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIEditbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIEditboxProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindow.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindowProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIGUISheet.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIItemEntry.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBase.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBaseProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeader.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegment.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegmentProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxImageItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxNumberItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxTextItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBase.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBaseProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItemProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMenubar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnList.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnListProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditbox.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditboxProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenu.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenuProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBarProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButtonProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButtonProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePane.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePaneProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbarProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainer.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainerProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUISlider.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUISliderProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUISpinner.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUISpinnerProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIStatic.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImage.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImageProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticText.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticTextProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITabButton.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITabControl.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITabControlProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITextItem.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITextItemProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIThumb.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUIThumbProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebar.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebarProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITooltip.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/elements/CEGUITooltipProperties.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalComponentBase.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalDimensions.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalFrameComponent.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImageryComponent.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImagerySection.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalLayerSpecification.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalNamedArea.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyDefinition.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyInitialiser.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalSectionSpecification.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalStateImagery.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalTextComponent.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetComponent.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookFeel.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookManager.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalXMLEnumHelper.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalagard_xmlHandler.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/AUTHORS delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/COPYING delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/ChangeLog delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/NEWS delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/README delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/README-CEGUI delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/chartables.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/Tech.Notes delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/index.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_compile.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_config.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_named_substring.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_substring.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_exec.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring_list.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_fullinfo.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_named_substring.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_stringnumber.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring_list.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_info.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_maketables.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_study.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_version.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreapi.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrebuild.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecallout.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecompat.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcregrep.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepartial.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepattern.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreperform.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreposix.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreprecompile.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcresample.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcretest.html delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/doc/pcre.txt delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/get.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/internal.h delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/maketables.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/pcre.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/pcre.h delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/pcreconfig.h delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/pcreposix.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/pcreposix.h delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/study.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/ucp.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/ucp.h delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/ucpinternal.h delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/ucptable.c delete mode 100644 vendor/cegui-0.4.0-custom/src/pcre/ucptypetable.c delete mode 100644 vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9renderer.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9texture.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/premake5.lua delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/readme.txt delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.h delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.h delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlerror.cpp delete mode 100644 vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlparser.cpp diff --git a/Client/core/CClientVariables.cpp b/Client/core/CClientVariables.cpp index 25ed032338..fb9bd3b245 100644 --- a/Client/core/CClientVariables.cpp +++ b/Client/core/CClientVariables.cpp @@ -358,7 +358,6 @@ void CClientVariables::LoadDefaults() DEFAULT("discord_rpc_share_data", false); // Consistent Rich Presence data sharing DEFAULT("discord_rpc_share_data_firsttime", false); // Display the user data sharing consent dialog box - for the first time DEFAULT("_beta_qc_rightclick_command", _S("reconnect")); // Command to run when right clicking quick connect (beta - can be removed at any time) - DEFAULT("use_new_cegui", 0); // Should we use the new CEGUI 0.8.7? (for testing / development only) if (!Exists("locale")) { diff --git a/Client/core/CConsole.cpp b/Client/core/CConsole.cpp index 31d79c6812..c1920c023b 100644 --- a/Client/core/CConsole.cpp +++ b/Client/core/CConsole.cpp @@ -408,8 +408,6 @@ void CConsole::SetNextAutoCompleteMatch() void CConsole::CreateElements(CGUIElement* pParent) { - bool bNewCEGUI = CCore::GetSingleton().IsUsingNewCEGUI(); - // Adjust window size to resolution CVector2D ScreenSize = m_pManager->GetResolution(); m_fWindowX *= ScreenSize.fX / NATIVE_RES_X; @@ -434,11 +432,7 @@ void CConsole::CreateElements(CGUIElement* pParent) */ CVector2D HistorySize = CVector2D(m_fWindowX - m_fWindowSpacer * 2.0f, m_fWindowY - m_fWindowSpacer * 1.5f - m_fWindowSpacerTop - m_fInputHeight); m_pHistory = reinterpret_cast(m_pManager->CreateMemo(m_pWindow)); - - if (!bNewCEGUI) - m_pHistory->SetPosition(CVector2D(m_fWindowSpacer, m_fWindowSpacerTop)); - else - m_pHistory->SetPosition(CVector2D(0, m_fWindowSpacer * 0.5f)); + m_pHistory->SetPosition(CVector2D(0, m_fWindowSpacer * 0.5f)); CVector2D RelHistorySize = m_pWindow->AbsoluteToRelative(HistorySize); m_pHistory->SetSize(HistorySize); @@ -449,11 +443,7 @@ void CConsole::CreateElements(CGUIElement* pParent) pos y: SPACER (TOP) + HISTORY HEIGHT + SPACER */ m_pInput = reinterpret_cast(m_pManager->CreateEdit(m_pWindow)); - - if (!bNewCEGUI) - m_pInput->SetPosition(CVector2D(m_fWindowSpacer, HistorySize.fY + m_fWindowSpacer * 0.5f + m_fWindowSpacerTop)); - else - m_pInput->SetPosition(CVector2D(0, HistorySize.fY + m_fWindowSpacer)); + m_pInput->SetPosition(CVector2D(0, HistorySize.fY + m_fWindowSpacer)); m_pInput->SetWidth(HistorySize.fX); m_pInput->SetHeight(m_fInputHeight); diff --git a/Client/core/CCore.cpp b/Client/core/CCore.cpp index e52bf43479..11fb16ce64 100644 --- a/Client/core/CCore.cpp +++ b/Client/core/CCore.cpp @@ -1019,26 +1019,15 @@ void CCore::DeinitGUI() void CCore::InitGUI(IDirect3DDevice9* pDevice) { - SString sModuleName = IsUsingNewCEGUI() ? "GUINew" : "GUI"; - SString sInitMethodName = IsUsingNewCEGUI() ? "InitNewGUIInterface" : "InitGUIInterface"; + SString sModuleName = "GUI"; + SString sInitMethodName = "InitGUIInterface"; m_pGUI = InitModule(m_GUIModule, sModuleName, sInitMethodName, pDevice); } void CCore::CreateGUI() { - CVARS_GET("use_new_cegui", m_bUsingNewCEGUI); - m_bUsingNewCEGUI = true; - - if (IsUsingNewCEGUI()) - LoadModule(m_GUIModule, "GUINew", "cgui_new"); - else - LoadModule(m_GUIModule, "GUI", "cgui"); -} - -bool CCore::IsUsingNewCEGUI() -{ - return true; + LoadModule(m_GUIModule, "GUI", "cgui"); } void CCore::DestroyGUI() diff --git a/Client/core/CCore.h b/Client/core/CCore.h index 8486d7333d..74eb95b739 100644 --- a/Client/core/CCore.h +++ b/Client/core/CCore.h @@ -183,9 +183,6 @@ class CCore : public CCoreInterface, public CSingleton void DeinitGUI(); void DestroyGUI(); - // Temporary to get if using new CEGUI - bool IsUsingNewCEGUI(); - // Web bool IsWebCoreLoaded() { return m_pWebCore != nullptr; } void DestroyWeb(); diff --git a/Client/core/CGUI.cpp b/Client/core/CGUI.cpp index 0ddd5ca9a2..890ef06944 100644 --- a/Client/core/CGUI.cpp +++ b/Client/core/CGUI.cpp @@ -184,12 +184,6 @@ void CLocalGUI::CreateObjects(IUnknown* pDevice) CVARS_SET("current_skin", currentSkinName); } - if (CCore::GetSingleton().IsUsingNewCEGUI()) - { - currentSkinName = pGUI->GetDefaultSkinName(); - CVARS_SET("current_skin", currentSkinName); - } - SetSkin(currentSkinName); CreateWindows(false); diff --git a/Client/core/CSettings.cpp b/Client/core/CSettings.cpp index 5abe53d028..9c904dec46 100644 --- a/Client/core/CSettings.cpp +++ b/Client/core/CSettings.cpp @@ -372,8 +372,8 @@ void CSettings::CreateGUI() m_pButtonGenerateNickIcon = reinterpret_cast(pManager->CreateStaticImage(m_pButtonGenerateNick)); m_pButtonGenerateNickIcon->SetSize(CVector2D(1, 1), true); m_pButtonGenerateNickIcon->LoadFromFile("cgui\\images\\serverbrowser\\refresh.png"); - m_pButtonGenerateNickIcon->SetProperty("MousePassThroughEnabled", "True"); - m_pButtonGenerateNickIcon->SetProperty("DistributeCapturedInputs", "True"); + m_pButtonGenerateNickIcon->SetCursorPassThroughEnabled(true); + m_pButtonGenerateNickIcon->SetDistributeCapturedInputs(true); m_pSavePasswords = reinterpret_cast(pManager->CreateCheckBox(pTabMultiplayer, _("Save server passwords"), true)); m_pSavePasswords->SetPosition(CVector2D(vecTemp.fX, vecTemp.fY + 50.0f)); @@ -933,8 +933,8 @@ void CSettings::CreateGUI() m_pLabelBrowserBlacklistAdd->SetTextColor(0, 0, 0); m_pLabelBrowserBlacklistAdd->SetSize(CVector2D(1, 1), true); m_pLabelBrowserBlacklistAdd->SetAlpha(0.7f); - m_pLabelBrowserBlacklistAdd->SetProperty("MousePassThroughEnabled", "True"); - m_pLabelBrowserBlacklistAdd->SetProperty("DistributeCapturedInputs", "True"); + m_pLabelBrowserBlacklistAdd->SetCursorPassThroughEnabled(true); + m_pLabelBrowserBlacklistAdd->SetDistributeCapturedInputs(true); m_pButtonBrowserBlacklistAdd = reinterpret_cast(pManager->CreateButton(m_pTabBrowser, _("Block"))); m_pButtonBrowserBlacklistAdd->SetPosition(CVector2D(vecTemp.fX + m_pEditBrowserBlacklistAdd->GetSize().fX + 2.0f, vecTemp.fY)); @@ -968,8 +968,8 @@ void CSettings::CreateGUI() m_pLabelBrowserWhitelistAdd->SetTextColor(0, 0, 0); m_pLabelBrowserWhitelistAdd->SetSize(CVector2D(1, 1), true); m_pLabelBrowserWhitelistAdd->SetAlpha(0.7f); - m_pLabelBrowserWhitelistAdd->SetProperty("MousePassThroughEnabled", "True"); - m_pLabelBrowserWhitelistAdd->SetProperty("DistributeCapturedInputs", "True"); + m_pLabelBrowserWhitelistAdd->SetCursorPassThroughEnabled(true); + m_pLabelBrowserWhitelistAdd->SetDistributeCapturedInputs(true); m_pButtonBrowserWhitelistAdd = reinterpret_cast(pManager->CreateButton(m_pTabBrowser, _("Allow"))); m_pButtonBrowserWhitelistAdd->SetPosition(CVector2D(vecTemp.fX + m_pEditBrowserWhitelistAdd->GetSize().fX + 2.0f, vecTemp.fY)); @@ -2590,10 +2590,10 @@ void CSettings::ProcessKeyBinds() bool CSettings::OnBindsListClick(CGUIElement* pElement) { - CGUIListItem* pItem = m_pBindsList->GetSelectedItem(); + CGUIGridListItem* pItem = m_pBindsList->GetSelectedItem(); if (pItem) { - CGUIListItem* pItemBind = m_pBindsList->GetItem(m_pBindsList->GetItemRowIndex(pItem), m_hBind); + CGUIGridListItem* pItemBind = m_pBindsList->GetItem(m_pBindsList->GetItemRowIndex(pItem), m_hBind); // Proceed if the user didn't select the "Bind"-column if (pItem != pItemBind) @@ -3112,7 +3112,7 @@ void CSettings::LoadData() unsigned int uiIndex = 0; while (uiIndex != m_pInterfaceLanguageSelector->GetItemCount()) { - CGUIListItem* pItem = m_pInterfaceLanguageSelector->GetItemByIndex(uiIndex); + CGUIStandardItem* pItem = m_pInterfaceLanguageSelector->GetItemByIndex(uiIndex); if (((const char*)pItem->GetData()) == strLocale) break; @@ -3373,17 +3373,17 @@ void CSettings::SaveData() // update from gui bNextWindowed = m_pCheckBoxWindowed->GetSelected(); - if (CGUIListItem* pSelected = m_pComboResolution->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pComboResolution->GetSelectedItem()) iNextVidMode = (int)pSelected->GetData(); bNextFSMinimize = m_pCheckBoxMinimize->GetSelected(); - if (CGUIListItem* pSelected = m_pFullscreenStyleCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pFullscreenStyleCombo->GetSelectedItem()) iNextFullscreenStyle = (int)pSelected->GetData(); - if (CGUIListItem* pSelected = m_pComboAntiAliasing->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pComboAntiAliasing->GetSelectedItem()) iAntiAliasing = (int)pSelected->GetData(); bool bCustomizedSAFilesEnabled = m_pCheckBoxCustomizedSAFiles->GetSelected(); bool bCustomizedSAFilesWasEnabled = GetApplicationSettingInt("customized-sa-files-request") != 0; - if (CGUIListItem* pSelected = m_pPriorityCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pPriorityCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("process_priority", iSelected); @@ -3422,13 +3422,13 @@ void CSettings::SaveData() CVARS_SET("anisotropic", iAnisotropic); // Visual FX Quality - if (CGUIListItem* pQualitySelected = m_pComboFxQuality->GetSelectedItem()) + if (CGUIStandardItem* pQualitySelected = m_pComboFxQuality->GetSelectedItem()) { gameSettings->SetFXQuality((int)pQualitySelected->GetData()); } // Aspect ratio - if (CGUIListItem* pRatioSelected = m_pComboAspectRatio->GetSelectedItem()) + if (CGUIStandardItem* pRatioSelected = m_pComboAspectRatio->GetSelectedItem()) { eAspectRatio aspectRatio = (eAspectRatio)(int)pRatioSelected->GetData(); CVARS_SET("aspect_ratio", aspectRatio); @@ -3531,7 +3531,7 @@ void CSettings::SaveData() gameSettings->SetDynamicPedShadowsEnabled(bDynamicPedShadows); // Fast clothes loading - if (CGUIListItem* pSelected = m_pFastClothesCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pFastClothesCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("fast_clothes_loading", iSelected); @@ -3543,34 +3543,34 @@ void CSettings::SaveData() gameSettings->SetRadioAutotuneEnabled(m_pCheckBoxAudioAutotune->GetSelected()); gameSettings->SetUsertrackAutoScan(m_pCheckBoxUserAutoscan->GetSelected()); - if (CGUIListItem* pSelected = m_pComboUsertrackMode->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pComboUsertrackMode->GetSelectedItem()) { gameSettings->SetUsertrackMode((int)pSelected->GetData()); } // Browser speed - if (CGUIListItem* pSelected = m_pBrowserSpeedCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pBrowserSpeedCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("browser_speed", iSelected); } // Single download - if (CGUIListItem* pSelected = m_pSingleDownloadCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pSingleDownloadCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("single_download", iSelected); } // Packet tag - if (CGUIListItem* pSelected = m_pPacketTagCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pPacketTagCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("packet_tag", iSelected); } // Progress animation - if (CGUIListItem* pSelected = m_pProgressAnimationCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pProgressAnimationCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("progress_animation", iSelected); @@ -3583,21 +3583,21 @@ void CSettings::SaveData() SetApplicationSettingInt("Win8MouseFix", m_pWin8MouseCheckBox->GetSelected()); // Debug setting - if (CGUIListItem* pSelected = m_pDebugSettingCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pDebugSettingCombo->GetSelectedItem()) { EDiagnosticDebugType iSelected = (EDiagnosticDebugType)(int)pSelected->GetData(); g_pCore->SetDiagnosticDebug(iSelected); } // Update build type - if (CGUIListItem* pSelected = m_pUpdateBuildTypeCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pUpdateBuildTypeCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("update_build_type", iSelected); } // Update auto install - if (CGUIListItem* pSelected = m_pUpdateAutoInstallCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pUpdateAutoInstallCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("update_auto_install", iSelected); @@ -3610,7 +3610,7 @@ void CSettings::SaveData() CVARS_SET("mapalpha", fMapAlpha); // Language - CGUIListItem* pItem = m_pInterfaceLanguageSelector->GetSelectedItem(); + CGUIStandardItem* pItem = m_pInterfaceLanguageSelector->GetSelectedItem(); if (pItem) { const char* szItemText = (const char*)pItem->GetData(); @@ -3645,17 +3645,17 @@ void CSettings::SaveData() CVARS_SET("chat_position_offset_x", m_pChatOffsetX->GetText()); CVARS_SET("chat_position_offset_y", m_pChatOffsetY->GetText()); - if (CGUIListItem* pSelected = m_pChatHorizontalCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pChatHorizontalCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("chat_position_horizontal", iSelected); } - if (CGUIListItem* pSelected = m_pChatVerticalCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pChatVerticalCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("chat_position_vertical", iSelected); } - if (CGUIListItem* pSelected = m_pChatTextAlignCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pChatTextAlignCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("chat_text_alignment", iSelected); @@ -3949,7 +3949,7 @@ void CSettings::LoadChatPresets() CXMLAttribute* pName = pNode->GetAttributes().Find("name"); if (pName && pName->GetValue()[1]) { - CGUIListItem* pItem = m_pChatPresets->AddItem(pName->GetValue().c_str()); + CGUIStandardItem* pItem = m_pChatPresets->AddItem(pName->GetValue().c_str()); pItem->SetData(pNode); } } @@ -3966,7 +3966,7 @@ void CSettings::LoadSkins() for (std::vector::iterator it = directories.begin(); it != directories.end(); ++it) { - CGUIListItem* item = m_pInterfaceSkinSelector->AddItem((*it)); + CGUIStandardItem* item = m_pInterfaceSkinSelector->AddItem((*it)); // TODO: add validation of the skin if (currentSkin == (*it)) @@ -4012,7 +4012,7 @@ void CSettings::SetMilliseconds(CGUIEdit* pEdit, int iValue) bool CSettings::OnChatLoadPresetClick(CGUIElement* pElement) { - CGUIListItem* pItem = m_pChatPresets->GetSelectedItem(); + CGUIStandardItem* pItem = m_pChatPresets->GetSelectedItem(); if (!pItem) return true; @@ -4147,7 +4147,7 @@ bool CSettings::OnChatLoadPresetClick(CGUIElement* pElement) bool CSettings::OnLanguageChanged(CGUIElement* pElement) { - CGUIListItem* pItem = m_pInterfaceLanguageSelector->GetSelectedItem(); + CGUIStandardItem* pItem = m_pInterfaceLanguageSelector->GetSelectedItem(); if (!pItem) return true; @@ -4159,7 +4159,7 @@ bool CSettings::OnLanguageChanged(CGUIElement* pElement) unsigned int uiIndex = 0; while (uiIndex != m_pInterfaceLanguageSelector->GetItemCount()) { - CGUIListItem* pItem = m_pInterfaceLanguageSelector->GetItemByIndex(uiIndex); + CGUIStandardItem* pItem = m_pInterfaceLanguageSelector->GetItemByIndex(uiIndex); if (((const char*)pItem->GetData()) == strLocale) break; @@ -4177,7 +4177,7 @@ bool CSettings::OnLanguageChanged(CGUIElement* pElement) bool CSettings::OnSkinChanged(CGUIElement* pElement) { - CGUIListItem* pItem = m_pInterfaceSkinSelector->GetSelectedItem(); + CGUIStandardItem* pItem = m_pInterfaceSkinSelector->GetSelectedItem(); if (!pItem) return true; @@ -4429,7 +4429,7 @@ bool CSettings::OnChatAlphaChanged(CGUIElement* pElement) bool CSettings::OnUpdateButtonClick(CGUIElement* pElement) { // Update build type - if (CGUIListItem* pSelected = m_pUpdateBuildTypeCombo->GetSelectedItem()) + if (CGUIStandardItem* pSelected = m_pUpdateBuildTypeCombo->GetSelectedItem()) { int iSelected = (int)pSelected->GetData(); CVARS_SET("update_build_type", iSelected); @@ -4449,7 +4449,7 @@ bool CSettings::OnCachePathShowButtonClick(CGUIElement* pElement) bool CSettings::OnFxQualityChanged(CGUIElement* pElement) { - CGUIListItem* pItem = m_pComboFxQuality->GetSelectedItem(); + CGUIStandardItem* pItem = m_pComboFxQuality->GetSelectedItem(); if (!pItem) return true; diff --git a/Client/core/CSettings.h b/Client/core/CSettings.h index bfeec87c44..ba199b10ad 100644 --- a/Client/core/CSettings.h +++ b/Client/core/CSettings.h @@ -60,7 +60,7 @@ struct SKeyBindSection char* szTitle; char* szOriginalTitle; int rowCount; - class CGUIListItem* headerItem; + class CGUIGridListItem* headerItem; }; class CColor; @@ -456,7 +456,7 @@ class CSettings bool m_bMuteMTA; bool m_bMuteVoice; - CGUIListItem* m_pSelectedBind; + CGUIGridListItem* m_pSelectedBind; DWORD m_dwFrameCount; bool m_bShownVolumetricShadowsWarning; diff --git a/Client/core/ServerBrowser/CServerBrowser.cpp b/Client/core/ServerBrowser/CServerBrowser.cpp index 764078e563..517d466bbe 100644 --- a/Client/core/ServerBrowser/CServerBrowser.cpp +++ b/Client/core/ServerBrowser/CServerBrowser.cpp @@ -317,8 +317,8 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pButtonRefreshIcon[type] = reinterpret_cast(pManager->CreateStaticImage(m_pButtonRefresh[type])); m_pButtonRefreshIcon[type]->SetSize(CVector2D(1, 1), true); m_pButtonRefreshIcon[type]->LoadFromFile("cgui\\images\\serverbrowser\\refresh.png"); - m_pButtonRefreshIcon[type]->SetProperty("MousePassThroughEnabled", "True"); - m_pButtonRefreshIcon[type]->SetProperty("DistributeCapturedInputs", "True"); + m_pButtonRefreshIcon[type]->SetCursorPassThroughEnabled(true); + m_pButtonRefreshIcon[type]->SetDistributeCapturedInputs(true); // Address Bar + History Combo fX = fX + SB_BUTTON_SIZE_X + SB_SMALL_SPACER; @@ -336,8 +336,8 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pLabelAddressDescription[type]->SetTextColor(0, 0, 0); m_pLabelAddressDescription[type]->AutoSize(m_pLabelAddressDescription[type]->GetText().c_str()); m_pLabelAddressDescription[type]->SetAlpha(0.6f); - m_pLabelAddressDescription[type]->SetProperty("MousePassThroughEnabled", "True"); - m_pLabelAddressDescription[type]->SetProperty("DistributeCapturedInputs", "True"); + m_pLabelAddressDescription[type]->SetCursorPassThroughEnabled(true); + m_pLabelAddressDescription[type]->SetDistributeCapturedInputs(true); // Favourite icon m_pAddressFavoriteIcon[type] = reinterpret_cast(pManager->CreateStaticImage(m_pEditAddress[type])); @@ -380,7 +380,7 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pButtonConnectIcon[type] = reinterpret_cast(pManager->CreateStaticImage(m_pButtonConnect[type])); m_pButtonConnectIcon[type]->SetSize(CVector2D(SB_BUTTON_SIZE_Y, SB_BUTTON_SIZE_Y), false); m_pButtonConnectIcon[type]->LoadFromFile("cgui\\images\\serverbrowser\\connect.png"); - m_pButtonConnectIcon[type]->SetProperty("MousePassThroughEnabled", "True"); + m_pButtonConnectIcon[type]->SetCursorPassThroughEnabled(true); // Info button + icon fX = fX + fConnectButtonWidth + SB_SMALL_SPACER; @@ -392,7 +392,7 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pButtonInfoIcon[type] = reinterpret_cast(pManager->CreateStaticImage(m_pButtonInfo[type])); m_pButtonInfoIcon[type]->SetSize(CVector2D(1, 1), true); m_pButtonInfoIcon[type]->LoadFromFile("cgui\\images\\serverbrowser\\info.png"); - m_pButtonInfoIcon[type]->SetProperty("MousePassThroughEnabled", "True"); + m_pButtonInfoIcon[type]->SetCursorPassThroughEnabled(true); // Search bar + type combo fX = m_WidgetSize.fX - SB_SMALL_SPACER - fSearchBarSizeX; @@ -409,7 +409,7 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pSearchTypeIcon[type] = reinterpret_cast(pManager->CreateStaticImage(m_pComboSearchType[type])); m_pSearchTypeIcon[type]->SetPosition(CVector2D(2, 4), false); m_pSearchTypeIcon[type]->SetSize(CVector2D(29, SB_SEARCHBAR_COMBOBOX_SIZE_Y - 6), false); - m_pSearchTypeIcon[type]->SetProperty("MousePassThroughEnabled", "True"); + m_pSearchTypeIcon[type]->SetCursorPassThroughEnabled(true); m_pSearchTypeIcon[type]->SetAlwaysOnTop(true); m_pSearchTypeIcon[type]->LoadFromFile(m_szSearchTypePath[SearchTypes::SERVERS]); @@ -424,16 +424,16 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pLabelSearchDescription[type]->SetTextColor(0, 0, 0); m_pLabelSearchDescription[type]->SetSize(CVector2D(1, 1), true); m_pLabelSearchDescription[type]->SetAlpha(0.6f); - m_pLabelSearchDescription[type]->SetProperty("MousePassThroughEnabled", "True"); - m_pLabelSearchDescription[type]->SetProperty("DistributeCapturedInputs", "True"); + m_pLabelSearchDescription[type]->SetCursorPassThroughEnabled(true); + m_pLabelSearchDescription[type]->SetDistributeCapturedInputs(true); // Server search icon m_pServerSearchIcon[type] = reinterpret_cast(pManager->CreateStaticImage(m_pEditSearch[type])); m_pServerSearchIcon[type]->SetPosition(CVector2D(fWidth - 18, (SB_SEARCHBAR_COMBOBOX_SIZE_Y - 16) / 2), false); m_pServerSearchIcon[type]->SetSize(CVector2D(16, 16), false); m_pServerSearchIcon[type]->LoadFromFile("cgui\\images\\serverbrowser\\search.png"); - m_pServerSearchIcon[type]->SetProperty("MousePassThroughEnabled", "True"); - m_pServerSearchIcon[type]->SetProperty("DistributeCapturedInputs", "True"); + m_pServerSearchIcon[type]->SetCursorPassThroughEnabled(true); + m_pServerSearchIcon[type]->SetDistributeCapturedInputs(true); // Create the serverlist fX = 5; @@ -541,8 +541,8 @@ void CServerBrowser::CreateTab(ServerBrowserType type, const char* szName) m_pServerListStatus[type]->SetSize(CVector2D(m_WidgetSize.fX, fLineHeight), true); m_pServerListStatus[type]->MoveToBack(); m_pServerListStatus[type]->SetZOrderingEnabled(false); - m_pServerListStatus[type]->SetProperty("MousePassThroughEnabled", "True"); - m_pServerListStatus[type]->SetProperty("DistributeCapturedInputs", "True"); + m_pServerListStatus[type]->SetCursorPassThroughEnabled(true); + m_pServerListStatus[type]->SetDistributeCapturedInputs(true); // Back button fX = m_WidgetSize.fX - fPlayerListSizeX - SB_SMALL_SPACER; @@ -961,7 +961,7 @@ void CServerBrowser::UpdateHistoryList() int iRowCount = pServerList->GetItemCount(); for (int i = 0; i < iRowCount; i++) { - CGUIListItem* item = pServerList->GetItemByIndex(i); + CGUIStandardItem* item = pServerList->GetItemByIndex(i); const char* szAddress = (const char*)item->GetData(); // Find our corresponding server item @@ -2251,7 +2251,7 @@ void CServerBrowser::SetNextHistoryText(bool bDown) int iRowCount = pServerList->GetItemCount(); for (int i = 0; i < iRowCount; i++) { - CGUIListItem* item = pServerList->GetItemByIndex(i); + CGUIStandardItem* item = pServerList->GetItemByIndex(i); const char* szAddress = (const char*)item->GetData(); if (("mtasa://" + std::string(szAddress)) == m_pEditAddress[Type]->GetText()) { diff --git a/Client/gui/CGUIButton_Impl.cpp b/Client/gui/CGUIButton_Impl.cpp index ac48dc86f5..f45dd2b33c 100644 --- a/Client/gui/CGUIButton_Impl.cpp +++ b/Client/gui/CGUIButton_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUIBUTTON_NAME "CGUI/Button" +#define CGUIBUTTON_NAME "Button" CGUIButton_Impl::CGUIButton_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption) { @@ -22,12 +22,12 @@ CGUIButton_Impl::CGUIButton_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const ch pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIBUTTON_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIBUTTON_NAME, szUnique); m_pWindow->setDestroyedByParent(false); m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); - - m_pWindow->setSize(CEGUI::Absolute, CEGUI::Size(128.0f, 24.0f)); + + m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 24.0f)); m_pWindow->setVisible(true); // Store the pointer to this CGUI element in the CEGUI element diff --git a/Client/gui/CGUICheckBox_Impl.cpp b/Client/gui/CGUICheckBox_Impl.cpp index e7967fe126..3567fc2023 100644 --- a/Client/gui/CGUICheckBox_Impl.cpp +++ b/Client/gui/CGUICheckBox_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUICHECKBOX_NAME "CGUI/Checkbox" +#define CGUICHECKBOX_NAME "Checkbox" CGUICheckBox_Impl::CGUICheckBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption, bool bChecked) { @@ -22,12 +22,12 @@ CGUICheckBox_Impl::CGUICheckBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, cons pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUICHECKBOX_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUICHECKBOX_NAME, szUnique); m_pWindow->setDestroyedByParent(false); m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); - m_pWindow->setSize(CEGUI::Absolute, CEGUI::Size(128.0f, 16.0f)); + m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 16.0f)); m_pWindow->setVisible(true); // Store the pointer to this CGUI element in the CEGUI element @@ -58,10 +58,10 @@ CGUICheckBox_Impl::~CGUICheckBox_Impl() void CGUICheckBox_Impl::SetSelected(bool bChecked) { - reinterpret_cast(m_pWindow)->setSelected(!bChecked); + reinterpret_cast(m_pWindow)->setSelected(!bChecked); } bool CGUICheckBox_Impl::GetSelected() { - return !(reinterpret_cast(m_pWindow)->isSelected()); + return !(reinterpret_cast(m_pWindow)->isSelected()); } diff --git a/Client/gui/CGUIComboBox_Impl.cpp b/Client/gui/CGUIComboBox_Impl.cpp index b5783e8848..3ef959b519 100644 --- a/Client/gui/CGUIComboBox_Impl.cpp +++ b/Client/gui/CGUIComboBox_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUICOMBOBOX_NAME "CGUI/Combobox" +#define CGUICOMBOBOX_NAME "Combobox" CGUIComboBox_Impl::CGUIComboBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption) { @@ -22,7 +22,7 @@ CGUIComboBox_Impl::CGUIComboBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, cons pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUICOMBOBOX_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUICOMBOBOX_NAME, szUnique); m_pWindow->setDestroyedByParent(false); // This needs a better alternative, so changing comboBox will change this - Jyrno42 @@ -30,7 +30,7 @@ CGUIComboBox_Impl::CGUIComboBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, cons m_pWindow->setText(storedCaption); - m_pWindow->setSize(CEGUI::Absolute, CEGUI::Size(128.0f, 24.0f)); + m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 24.0f)); m_pWindow->setVisible(true); // Store the pointer to this CGUI element in the CEGUI element @@ -60,19 +60,19 @@ CGUIComboBox_Impl::~CGUIComboBox_Impl() DestroyElement(); } -CGUIListItem* CGUIComboBox_Impl::AddItem(const char* szText) +CGUIStandardItem* CGUIComboBox_Impl::AddItem(const char* szText) { - CGUIListItem_Impl* pNewItem = new CGUIListItem_Impl(szText, CGUIListItem_Impl::TextItem, NULL); - CEGUI::ListboxItem* pListboxItem = pNewItem->GetListItem(); + CGUIStandardItem_Impl* pNewItem = new CGUIStandardItem_Impl(m_pManager, szText, CGUIStandardItem_Impl::TextItem, NULL); + CEGUI::StandardItem* pListboxItem = pNewItem->GetListItem(); reinterpret_cast(m_pWindow)->addItem(pListboxItem); m_Items[pNewItem->GetListItem()] = pNewItem; return pNewItem; } -CGUIListItem* CGUIComboBox_Impl::AddItem(CGUIStaticImage* pImage) +CGUIStandardItem* CGUIComboBox_Impl::AddItem(CGUIStaticImage* pImage) { - CGUIListItem_Impl* pNewItem = new CGUIListItem_Impl("", CGUIListItem_Impl::ImageItem, (CGUIStaticImage_Impl*)pImage); - CEGUI::ListboxItem* pListboxItem = pNewItem->GetListItem(); + CGUIStandardItem_Impl* pNewItem = new CGUIStandardItem_Impl(m_pManager, "", CGUIStandardItem_Impl::ImageItem, (CGUIStaticImage_Impl*)pImage); + CEGUI::StandardItem* pListboxItem = pNewItem->GetListItem(); reinterpret_cast(m_pWindow)->addItem(pListboxItem); m_Items[pNewItem->GetListItem()] = pNewItem; return pNewItem; @@ -82,8 +82,9 @@ bool CGUIComboBox_Impl::RemoveItem(int index) { try { - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getListboxItemFromIndex(index); - if (pItem->isSelected()) // if this is currently selected, let's update the editbox. + auto window = reinterpret_cast(m_pWindow); + CEGUI::StandardItem* pItem = reinterpret_cast(m_pWindow)->getItemFromIndex(index); + if (pItem && window->isItemSelected(index)) // if this is currently selected, let's update the editbox. { m_pWindow->setText(storedCaption); } @@ -97,15 +98,16 @@ bool CGUIComboBox_Impl::RemoveItem(int index) return false; } -CGUIListItem* CGUIComboBox_Impl::GetSelectedItem() +CGUIStandardItem* CGUIComboBox_Impl::GetSelectedItem() { return GetListItem(reinterpret_cast(m_pWindow)->getSelectedItem()); } int CGUIComboBox_Impl::GetSelectedItemIndex() { - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getSelectedItem(); - CFastHashMap::iterator it; + CEGUI::StandardItem* pItem = reinterpret_cast(m_pWindow)->getSelectedItem(); + + CFastHashMap::iterator it; it = m_Items.find(pItem); if (it == m_Items.end()) return -1; @@ -120,10 +122,11 @@ int CGUIComboBox_Impl::GetSelectedItemIndex() } } -int CGUIComboBox_Impl::GetItemIndex(CGUIListItem* pItem) +int CGUIComboBox_Impl::GetItemIndex(CGUIStandardItem* pItem) { - CFastHashMap::iterator it; - bool found; + CFastHashMap::iterator it; + + bool found = false; for (it = m_Items.begin(); it != m_Items.end(); it++) { @@ -137,7 +140,7 @@ int CGUIComboBox_Impl::GetItemIndex(CGUIListItem* pItem) { try { - return reinterpret_cast(m_pWindow)->getItemIndex(it->first); + return reinterpret_cast(m_pWindow)->getItemIndex((CEGUI::StandardItem*)it->first); } catch (...) { @@ -154,14 +157,14 @@ const char* CGUIComboBox_Impl::GetItemText(int index) { if (index == -1) { - return m_pWindow->getText().c_str(); + return (const char*)m_pWindow->getText().c_str(); } else { - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getListboxItemFromIndex(index); + CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); if (pItem != NULL) { - return pItem->getText().c_str(); + return (const char*)pItem->getText().c_str(); } } } @@ -176,8 +179,8 @@ bool CGUIComboBox_Impl::SetItemText(int index, const char* szText) { try { - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getListboxItemFromIndex(index); - pItem->setText(CGUI_Impl::GetUTFString(szText), NULL); + CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); + pItem->setText(CGUI_Impl::GetUTFString(szText)); if (pItem->isSelected()) // if this is currently selected, let's update the editbox. { m_pWindow->setText(CGUI_Impl::GetUTFString(szText)); @@ -191,10 +194,10 @@ bool CGUIComboBox_Impl::SetItemText(int index, const char* szText) return false; } -CGUIListItem* CGUIComboBox_Impl::GetItemByIndex(int index) +CGUIStandardItem* CGUIComboBox_Impl::GetItemByIndex(int index) { - CEGUI::ListboxItem* pCEGUIItem = reinterpret_cast(m_pWindow)->getListboxItemFromIndex(index); - CGUIListItem* pItem = GetListItem(pCEGUIItem); + CEGUI::StandardItem* pCEGUIItem = reinterpret_cast(m_pWindow)->getItemFromIndex(index); + CGUIStandardItem* pItem = GetListItem(pCEGUIItem); return pItem; } @@ -202,7 +205,8 @@ bool CGUIComboBox_Impl::SetSelectedItemByIndex(int index) { try { - reinterpret_cast(m_pWindow)->clearAllSelections(); + auto combobox = reinterpret_cast(m_pWindow); + combobox->clearAllSelections(); if (index == -1) { @@ -211,11 +215,11 @@ bool CGUIComboBox_Impl::SetSelectedItemByIndex(int index) } else { - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getListboxItemFromIndex(index); + CEGUI::StandardItem* pItem = combobox->getItemFromIndex(index); if (pItem != NULL) { - pItem->setSelected(true); - m_pWindow->setText(pItem->getText()); + combobox->setItemSelectState(index, true); + combobox->setText(pItem->getText()); return true; } } @@ -229,9 +233,9 @@ bool CGUIComboBox_Impl::SetSelectedItemByIndex(int index) void CGUIComboBox_Impl::Clear() { - reinterpret_cast(m_pWindow)->getDropList()->resetList(); + reinterpret_cast(m_pWindow)->getDropList()->clearList(); - CFastHashMap::iterator it; + CFastHashMap::iterator it; for (it = m_Items.begin(); it != m_Items.end(); it++) { delete it->second; @@ -251,9 +255,9 @@ void CGUIComboBox_Impl::SetReadOnly(bool bReadonly) reinterpret_cast(m_pWindow)->setReadOnly(bReadonly); } -CGUIListItem_Impl* CGUIComboBox_Impl::GetListItem(CEGUI::ListboxItem* pItem) +CGUIStandardItem_Impl* CGUIComboBox_Impl::GetListItem(CEGUI::StandardItem* pItem) { - CFastHashMap::iterator it; + CFastHashMap::iterator it; it = m_Items.find(pItem); if (it == m_Items.end()) return NULL; @@ -293,7 +297,7 @@ bool CGUIComboBox_Impl::Event_OnDropListRemoved(const CEGUI::EventArgs& e) void CGUIComboBox_Impl::ShowDropList() { reinterpret_cast(m_pWindow)->showDropList(); - reinterpret_cast(m_pWindow)->setSingleClickEnabled(true); + reinterpret_cast(m_pWindow)->setSingleCursorActivationEnabled(true); } void CGUIComboBox_Impl::HideDropList() diff --git a/Client/gui/CGUIComboBox_Impl.h b/Client/gui/CGUIComboBox_Impl.h index 00becb458b..06143927e3 100644 --- a/Client/gui/CGUIComboBox_Impl.h +++ b/Client/gui/CGUIComboBox_Impl.h @@ -12,7 +12,7 @@ #pragma once #include "CGUIElement_Impl.h" -#include "CGUIListItem_Impl.h" +#include "CGUIGridListItem_Impl.h" class CGUIComboBox_Impl : public CGUIComboBox, public CGUIElement_Impl { @@ -22,19 +22,19 @@ class CGUIComboBox_Impl : public CGUIComboBox, public CGUIElement_Impl eCGUIType GetType() { return CGUI_COMBOBOX; }; - CGUIListItem* AddItem(const char* szText); - CGUIListItem* AddItem(CGUIStaticImage* pImage); - bool RemoveItem(int index); - CGUIListItem* GetItemByIndex(int index); - CGUIListItem* GetSelectedItem(); - int GetSelectedItemIndex(); - size_t GetItemCount(); - int GetItemIndex(CGUIListItem* pItem); - const char* GetItemText(int index); - bool SetItemText(int index, const char* szText); - bool SetSelectedItemByIndex(int index); - void Clear(); - bool IsOpen(); + CGUIStandardItem* AddItem(const char* szText); + CGUIStandardItem* AddItem(CGUIStaticImage* pImage); + bool RemoveItem(int index); + CGUIStandardItem* GetItemByIndex(int index); + CGUIStandardItem* GetSelectedItem(); + int GetSelectedItemIndex(); + size_t GetItemCount(); + int GetItemIndex(CGUIStandardItem* pItem); + const char* GetItemText(int index); + bool SetItemText(int index, const char* szText); + bool SetSelectedItemByIndex(int index); + void Clear(); + bool IsOpen(); void SetReadOnly(bool bReadonly); @@ -44,15 +44,15 @@ class CGUIComboBox_Impl : public CGUIComboBox, public CGUIElement_Impl void ShowDropList(); void HideDropList(); - #include "CGUIElement_Inc.h" +#include "CGUIElement_Inc.h" protected: - CFastHashMap m_Items; - - bool Event_OnSelectionAccepted(const CEGUI::EventArgs& e); - bool Event_OnDropListRemoved(const CEGUI::EventArgs& e); - CGUIListItem_Impl* GetListItem(CEGUI::ListboxItem* pItem); - CEGUI::String storedCaption; - GUI_CALLBACK m_OnSelectChange; - GUI_CALLBACK m_OnDropListRemoved; + CFastHashMap m_Items; + + bool Event_OnSelectionAccepted(const CEGUI::EventArgs& e); + bool Event_OnDropListRemoved(const CEGUI::EventArgs& e); + CGUIStandardItem_Impl* GetListItem(CEGUI::StandardItem* pItem); + CEGUI::String storedCaption; + GUI_CALLBACK m_OnSelectChange; + GUI_CALLBACK m_OnDropListRemoved; }; diff --git a/Client/gui/CGUIEdit_Impl.cpp b/Client/gui/CGUIEdit_Impl.cpp index ddb7c91f17..617c8a9299 100644 --- a/Client/gui/CGUIEdit_Impl.cpp +++ b/Client/gui/CGUIEdit_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUIEDIT_NAME "CGUI/Editbox" +#define CGUIEDIT_NAME "Editbox" CGUIEdit_Impl::CGUIEdit_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szEdit) { @@ -22,9 +22,9 @@ CGUIEdit_Impl::CGUIEdit_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* pGUI->GetUniqueName(szUnique); // Create the edit and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIEDIT_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIEDIT_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setRect(CEGUI::Absolute, CEGUI::Rect(0.00f, 0.00f, 0.128f, 0.24f)); + m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0, 0.00f), CEGUI::UDim(0, 0.00f), CEGUI::UDim(0, 0.128f), CEGUI::UDim(0, 0.24f))); // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); @@ -78,12 +78,12 @@ bool CGUIEdit_Impl::IsReadOnly() void CGUIEdit_Impl::SetMasked(bool bMasked) { - reinterpret_cast(m_pWindow)->setTextMasked(bMasked); + reinterpret_cast(m_pWindow)->setTextMaskingEnabled(bMasked); } bool CGUIEdit_Impl::IsMasked() { - return reinterpret_cast(m_pWindow)->isTextMasked(); + return reinterpret_cast(m_pWindow)->isTextMaskingEnabled(); } void CGUIEdit_Impl::SetMaxLength(unsigned int uiMaxLength) @@ -103,12 +103,12 @@ void CGUIEdit_Impl::SetSelection(unsigned int uiStart, unsigned int uiEnd) unsigned int CGUIEdit_Impl::GetSelectionStart() { - return static_cast(reinterpret_cast(m_pWindow)->getSelectionStartIndex()); + return static_cast(reinterpret_cast(m_pWindow)->getSelectionStart()); } unsigned int CGUIEdit_Impl::GetSelectionEnd() { - return static_cast(reinterpret_cast(m_pWindow)->getSelectionEndIndex()); + return static_cast(reinterpret_cast(m_pWindow)->getSelectionEnd()); } unsigned int CGUIEdit_Impl::GetSelectionLength() @@ -118,22 +118,22 @@ unsigned int CGUIEdit_Impl::GetSelectionLength() void CGUIEdit_Impl::SetCaretIndex(unsigned int uiIndex) { - return reinterpret_cast(m_pWindow)->setCaratIndex(uiIndex); + return reinterpret_cast(m_pWindow)->setCaretIndex(uiIndex); } void CGUIEdit_Impl::SetCaretAtStart() { - reinterpret_cast(m_pWindow)->setCaratIndex(0); + reinterpret_cast(m_pWindow)->setCaretIndex(0); } void CGUIEdit_Impl::SetCaretAtEnd() { - reinterpret_cast(m_pWindow)->setCaratIndex(GetText().length()); + reinterpret_cast(m_pWindow)->setCaretIndex(GetText().length()); } unsigned int CGUIEdit_Impl::GetCaretIndex() { - return static_cast(reinterpret_cast(m_pWindow)->getCaratIndex()); + return static_cast(reinterpret_cast(m_pWindow)->getCaretIndex()); } void CGUIEdit_Impl::SetTextAcceptedHandler(GUI_CALLBACK Callback) @@ -192,7 +192,8 @@ bool CGUIEdit_Impl::Event_OnRenderingStarted(const CEGUI::EventArgs& e) bool CGUIEdit_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) { const CEGUI::KeyEventArgs& KeyboardArgs = reinterpret_cast(e); - if (KeyboardArgs.scancode == CGUIKeys::Tab) + auto scancode = (CGUIKeys::Scan)KeyboardArgs.d_key; + if (scancode == CGUIKeys::Scan::Tab) { // tab pressed, if we are in a window with tab enabled, just switch to the next element if (GetParent() == NULL) @@ -204,7 +205,7 @@ bool CGUIEdit_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) pTabList->SelectNext(this); } } - else if (KeyboardArgs.scancode == CGUIKeys::Return || KeyboardArgs.scancode == CGUIKeys::NumpadEnter) + else if (scancode == CGUIKeys::Return || scancode == CGUIKeys::NumpadEnter) { // Enter/Return event is split from Tab now, since we use that for Console, Quick Connect, etc. as enter-only if (m_OnTextAccepted) diff --git a/Client/gui/CGUIElement_Impl.cpp b/Client/gui/CGUIElement_Impl.cpp index e8815c6159..eac9eccee8 100644 --- a/Client/gui/CGUIElement_Impl.cpp +++ b/Client/gui/CGUIElement_Impl.cpp @@ -83,135 +83,123 @@ void CGUIElement_Impl::MoveToBack() void CGUIElement_Impl::SetPosition(const CVector2D& Position, bool bRelative) { - CEGUI::Point Temp = CEGUI::Point(Position.fX, Position.fY); + CEGUI::UVector2 position; if (bRelative) - m_pWindow->setPosition(CEGUI::Relative, Temp); + position = CEGUI::UVector2(CEGUI::UDim(Position.fX, 0), CEGUI::UDim(Position.fY, 0)); else - m_pWindow->setPosition(CEGUI::Absolute, Temp); + position = CEGUI::UVector2(CEGUI::UDim(0, Position.fX), CEGUI::UDim(0, Position.fY)); - CorrectEdges(); + m_pWindow->setPosition(position); } CVector2D CGUIElement_Impl::GetPosition(bool bRelative) { - CEGUI::Point CEGUITemp; + CEGUI::UVector2 position = m_pWindow->getPosition(); + float x = position.d_x.d_offset; + float y = position.d_y.d_offset; if (bRelative) - CEGUITemp = m_pWindow->getPosition(CEGUI::Relative); - else - CEGUITemp = m_pWindow->getPosition(CEGUI::Absolute); + { + x = position.d_x.d_scale; + y = position.d_y.d_scale; + } - return CVector2D(CEGUITemp.d_x, CEGUITemp.d_y); + return CVector2D(x, y); } void CGUIElement_Impl::GetPosition(CVector2D& vecPosition, bool bRelative) { - CEGUI::MetricsMode type = CEGUI::Absolute; - - if (bRelative) - type = CEGUI::Relative; - - CEGUI::Point Temp = m_pWindow->getPosition(type); - - vecPosition.fX = Temp.d_x; - vecPosition.fY = Temp.d_y; + CVector2D position = GetPosition(bRelative); + vecPosition = position; } void CGUIElement_Impl::SetWidth(float fX, bool bRelative) { - if (bRelative) - m_pWindow->setWidth(CEGUI::Relative, fX); - else - m_pWindow->setWidth(CEGUI::Absolute, fX); + m_pWindow->setWidth({bRelative ? fX : 0, bRelative ? 0 : fX}); } void CGUIElement_Impl::SetHeight(float fY, bool bRelative) { - if (bRelative) - m_pWindow->setHeight(CEGUI::Relative, fY); - else - m_pWindow->setHeight(CEGUI::Absolute, fY); + m_pWindow->setHeight({bRelative ? fY : 0, bRelative ? 0 : fY}); } void CGUIElement_Impl::SetSize(const CVector2D& vecSize, bool bRelative) { + CEGUI::USize size; + if (bRelative) - m_pWindow->setSize(CEGUI::Relative, CEGUI::Size(vecSize.fX, vecSize.fY)); + size = CEGUI::USize(CEGUI::UDim(vecSize.fX, 0), CEGUI::UDim(vecSize.fY, 0)); else - m_pWindow->setSize(CEGUI::Absolute, CEGUI::Size(vecSize.fX, vecSize.fY)); + size = CEGUI::USize(CEGUI::UDim(0, vecSize.fX), CEGUI::UDim(0, vecSize.fY)); - CorrectEdges(); + m_pWindow->setSize(size); } CVector2D CGUIElement_Impl::GetSize(bool bRelative) { - CEGUI::Size TempSize; + CEGUI::USize size = m_pWindow->getSize(); + float width = size.d_width.d_offset; + float height = size.d_height.d_offset; if (bRelative) - TempSize = m_pWindow->getRelativeSize(); - else - TempSize = m_pWindow->getAbsoluteSize(); + { + width = size.d_width.d_scale; + height = size.d_height.d_scale; + } - return CVector2D(TempSize.d_width, TempSize.d_height); + return CVector2D(width, height); } void CGUIElement_Impl::GetSize(CVector2D& vecSize, bool bRelative) { - CEGUI::Size TempSize; - - if (bRelative) - TempSize = m_pWindow->getRelativeSize(); - else - TempSize = m_pWindow->getAbsoluteSize(); - - vecSize.fX = TempSize.d_width; - vecSize.fY = TempSize.d_height; + CVector2D size = GetSize(bRelative); + vecSize = size; } void CGUIElement_Impl::AutoSize(const char* Text, float fPaddingX, float fPaddingY) { - const CEGUI::Font* pFont = m_pWindow->getFont(); - m_pWindow->setSize(CEGUI::Absolute, - CEGUI::Size(pFont->getTextExtent(CGUI_Impl::GetUTFString(Text ? Text : GetText())) + fPaddingX, - pFont->getFontHeight() + fPaddingY)); // Add hack factor to height to allow for long characters such as 'g' or 'j' + CEGUI::Font* pFont = m_pWindow->getFont(); + + if (!pFont) + return; + + // Add hack factor to height to allow for long characters such as 'g' or 'j' + m_pWindow->setSize(CEGUI::USize(CEGUI::UDim(0, pFont->getTextExtent(Text ? Text : GetText()) + fPaddingX), CEGUI::UDim(0, pFont->getFontHeight() + fPaddingY))); } void CGUIElement_Impl::SetMinimumSize(const CVector2D& vecSize) { - m_pWindow->setMetricsMode(CEGUI::Absolute); - m_pWindow->setMinimumSize(CEGUI::Size(vecSize.fX, vecSize.fY)); + m_pWindow->setMinSize(CEGUI::USize(CEGUI::UDim(0, vecSize.fX), CEGUI::UDim(0, vecSize.fY))); } CVector2D CGUIElement_Impl::GetMinimumSize() { - const CEGUI::Size& TempSize = m_pWindow->getMinimumSize(); - return CVector2D(TempSize.d_width, TempSize.d_height); + const CEGUI::USize& size = m_pWindow->getMinSize(); + return CVector2D(size.d_width.d_offset, size.d_height.d_offset); } void CGUIElement_Impl::GetMinimumSize(CVector2D& vecSize) { - const CEGUI::Size& Temp = m_pWindow->getMinimumSize(); - vecSize.fX = Temp.d_width; - vecSize.fY = Temp.d_height; + const CEGUI::USize& size = m_pWindow->getMinSize(); + vecSize = CVector2D(size.d_width.d_offset, size.d_height.d_offset); } void CGUIElement_Impl::SetMaximumSize(const CVector2D& vecSize) { - m_pWindow->setMaximumSize(CEGUI::Size(vecSize.fX, vecSize.fY)); + m_pWindow->setMaxSize(CEGUI::USize(CEGUI::UDim(0, vecSize.fX), CEGUI::UDim(0, vecSize.fY))); } CVector2D CGUIElement_Impl::GetMaximumSize() { - const CEGUI::Size& TempSize = m_pWindow->getMaximumSize(); - return CVector2D(TempSize.d_width, TempSize.d_height); + const CEGUI::USize& size = m_pWindow->getMaxSize(); + return CVector2D(size.d_width.d_offset, size.d_height.d_offset); } void CGUIElement_Impl::GetMaximumSize(CVector2D& vecSize) { - const CEGUI::Size& Temp = m_pWindow->getSize(); - vecSize.fX = Temp.d_width; - vecSize.fY = Temp.d_height; + const CEGUI::USize& size = m_pWindow->getSize(); + vecSize = CVector2D(size.d_width.d_offset, size.d_height.d_offset); } void CGUIElement_Impl::SetText(const char* szText) @@ -221,7 +209,7 @@ void CGUIElement_Impl::SetText(const char* szText) std::string CGUIElement_Impl::GetText() { - return CGUI_Impl::GetUTFString(m_pWindow->getText().c_str()).c_str(); + return (const char*)CGUI_Impl::GetUTFString((const char*)m_pWindow->getText().c_str()).c_str(); } void CGUIElement_Impl::SetAlpha(float fAlpha) @@ -276,30 +264,58 @@ bool CGUIElement_Impl::IsAlwaysOnTop() CRect2D CGUIElement_Impl::AbsoluteToRelative(const CRect2D& Rect) { - CEGUI::Rect TempRect = CEGUI::Rect(Rect.fX1, Rect.fY1, Rect.fX2, Rect.fY2); - TempRect = m_pWindow->absoluteToRelative(TempRect); - return CRect2D(TempRect.d_left, TempRect.d_top, TempRect.d_right, TempRect.d_bottom); + float fLeft = CEGUI::CoordConverter::screenToWindowX(*m_pWindow, Rect.fX1); + float fTop = CEGUI::CoordConverter::screenToWindowY(*m_pWindow, Rect.fY1); + float fRight = CEGUI::CoordConverter::screenToWindowX(*m_pWindow, Rect.fX2); + float fBottom = CEGUI::CoordConverter::screenToWindowY(*m_pWindow, Rect.fY2); + + return CRect2D(fLeft, fTop, fRight, fBottom); } CVector2D CGUIElement_Impl::AbsoluteToRelative(const CVector2D& Vector) { - CEGUI::Size TempSize = CEGUI::Size(Vector.fX, Vector.fY); - TempSize = m_pWindow->absoluteToRelative(TempSize); - return CVector2D(TempSize.d_width, TempSize.d_height); + CEGUI::UDim absoluteWidth = CEGUI::UDim(0, Vector.fX); + CEGUI::UDim absoluteHeight = CEGUI::UDim(0, Vector.fY); + CEGUI::USize baseSize = m_pWindow->getSize(); + + float fRelativeWidth = CEGUI::CoordConverter::asRelative(absoluteWidth, baseSize.d_width.d_offset); + float fRelativeHeight = CEGUI::CoordConverter::asRelative(absoluteHeight, baseSize.d_height.d_offset); + + return CVector2D(fRelativeWidth, fRelativeHeight); } CRect2D CGUIElement_Impl::RelativeToAbsolute(const CRect2D& Rect) { - CEGUI::Rect TempRect = CEGUI::Rect(Rect.fX1, Rect.fY1, Rect.fX2, Rect.fY2); - TempRect = m_pWindow->relativeToAbsolute(TempRect); - return CRect2D(TempRect.d_left, TempRect.d_top, TempRect.d_right, TempRect.d_bottom); + CEGUI::UDim relativeLeft = CEGUI::UDim(Rect.fX1, 0); + CEGUI::UDim relativeTop = CEGUI::UDim(Rect.fY1, 0); + CEGUI::UDim relativeRight = CEGUI::UDim(Rect.fX2, 0); + CEGUI::UDim relativeBottom = CEGUI::UDim(Rect.fY2, 0); + + CEGUI::URect area = m_pWindow->getArea(); + + float fBaseLeft = area.getPosition().d_x.d_offset; + float fBaseTop = area.getPosition().d_y.d_offset; + float fBaseRight = area.getWidth().d_offset; + float fBaseBottom = area.getHeight().d_offset; + + float fAbsoluteLeft = CEGUI::CoordConverter::asAbsolute(relativeLeft, fBaseLeft); + float fAbsoluteTop = CEGUI::CoordConverter::asAbsolute(relativeTop, fBaseTop); + float fAbsoluteRight = CEGUI::CoordConverter::asAbsolute(relativeRight, fBaseRight); + float fAbsoluteBottom = CEGUI::CoordConverter::asAbsolute(relativeBottom, fBaseBottom); + + return CRect2D(fAbsoluteLeft, fAbsoluteTop, fAbsoluteRight, fAbsoluteBottom); } CVector2D CGUIElement_Impl::RelativeToAbsolute(const CVector2D& Vector) { - CEGUI::Size TempSize = CEGUI::Size(Vector.fX, Vector.fY); - TempSize = m_pWindow->relativeToAbsolute(TempSize); - return CVector2D(TempSize.d_width, TempSize.d_height); + CEGUI::USize relativeSize = CEGUI::USize(CEGUI::UDim(Vector.fX, 0), CEGUI::UDim(Vector.fY, 0)); + CEGUI::USize baseSize = m_pWindow->getSize(); + + CEGUI::Sizef size = CEGUI::Sizef(baseSize.d_width.d_offset, baseSize.d_height.d_offset); + + CEGUI::Sizef absoluteSize = CEGUI::CoordConverter::asAbsolute(relativeSize, size, true); + + return CVector2D(absoluteSize.d_width, absoluteSize.d_height); } void CGUIElement_Impl::SetParent(CGUIElement* pParent) @@ -312,7 +328,7 @@ void CGUIElement_Impl::SetParent(CGUIElement* pParent) { CGUIElement_Impl* pElement = dynamic_cast(pParent); if (pElement) - pElement->m_pWindow->addChildWindow(m_pWindow); + pElement->m_pWindow->addChild(m_pWindow); } m_pParent = pParent; } @@ -333,25 +349,29 @@ CEGUI::Window* CGUIElement_Impl::GetWindow() void CGUIElement_Impl::CorrectEdges() { - CEGUI::Point currentPoint = m_pWindow->getPosition(CEGUI::Absolute); - CEGUI::Size currentSize = m_pWindow->getSize(CEGUI::Absolute); + CEGUI::UVector2 currentPosition = m_pWindow->getPosition(); + CEGUI::USize currentSize = m_pWindow->getSize(); + + std::string strType = (const char*)m_pWindow->getType().c_str(); + std::string strParentType = (const char*)m_pWindow->getParent()->getType().c_str(); + // Label turns out to be buggy - if (m_pWindow->getType() == "CGUI/StaticText") + if (strType == m_pManager->GetElementPrefix() + "/StaticText") return; - if (m_pWindow->getParent()->getType() == "CGUI/FrameWindow") + if (strParentType == m_pManager->GetElementPrefix() + "/FrameWindow") { - CEGUI::Size parentSize = m_pWindow->getParent()->getSize(CEGUI::Absolute); - if (currentPoint.d_x < CGUI_NODRAW_LEFT) - currentPoint.d_x += CGUI_NODRAW_LEFT - currentPoint.d_x; - if (currentPoint.d_y < CGUI_NODRAW_TOP) - currentPoint.d_y += CGUI_NODRAW_TOP - currentPoint.d_x; - if ((currentSize.d_height + currentPoint.d_y) > (parentSize.d_height - CGUI_NODRAW_BOTTOM)) - currentSize.d_height -= (currentSize.d_height + currentPoint.d_y) - (parentSize.d_height - CGUI_NODRAW_BOTTOM); - if ((currentSize.d_width + currentPoint.d_x) > (parentSize.d_width - CGUI_NODRAW_RIGHT)) - currentSize.d_width -= (currentSize.d_width + currentPoint.d_x) - (parentSize.d_width - CGUI_NODRAW_RIGHT); - m_pWindow->setPosition(CEGUI::Absolute, currentPoint); - m_pWindow->setSize(CEGUI::Absolute, currentSize); + CEGUI::USize parentSize = m_pWindow->getParent()->getSize(); + if (currentPosition.d_x.d_offset < CGUI_NODRAW_LEFT) + currentPosition.d_x.d_offset += CGUI_NODRAW_LEFT - currentPosition.d_x.d_offset; + if (currentPosition.d_y.d_offset < CGUI_NODRAW_TOP) + currentPosition.d_y.d_offset += CGUI_NODRAW_TOP - currentPosition.d_x.d_offset; + if ((currentSize.d_height.d_offset + currentPosition.d_y.d_offset) > (parentSize.d_height.d_offset - CGUI_NODRAW_BOTTOM)) + currentSize.d_height.d_offset -= (currentSize.d_height.d_offset + currentPosition.d_y.d_offset) - (parentSize.d_height.d_offset - CGUI_NODRAW_BOTTOM); + if ((currentSize.d_width.d_offset + currentPosition.d_x.d_offset) > (parentSize.d_width.d_offset - CGUI_NODRAW_RIGHT)) + currentSize.d_width.d_offset -= (currentSize.d_width.d_offset + currentPosition.d_x.d_offset) - (parentSize.d_width.d_offset - CGUI_NODRAW_RIGHT); + m_pWindow->setPosition(currentPosition); + m_pWindow->setSize(currentSize); } } @@ -377,7 +397,7 @@ std::string CGUIElement_Impl::GetFont() { // Return the contname. std::string will copy it. CEGUI::String strFontName = pFont->getName(); - return strFontName.c_str(); + return (const char*)strFontName.c_str(); } } catch (CEGUI::Exception e) @@ -398,32 +418,76 @@ void CGUIElement_Impl::SetProperty(const char* szProperty, const char* szValue) } } +void CGUIElement_Impl::SetCursorPassThroughEnabled(bool enabled) +{ + try + { + m_pWindow->setCursorPassThroughEnabled(enabled); + } + catch (CEGUI::Exception e) + { + } +} + +bool CGUIElement_Impl::IsCursorPassThroughEnabled() +{ + try + { + return m_pWindow->isCursorPassThroughEnabled(); + } + catch (CEGUI::Exception e) + { + } +} + +void CGUIElement_Impl::SetDistributeCapturedInputs(bool enabled) +{ + try + { + m_pWindow->setDistributesCapturedInputs(enabled); + } + catch (CEGUI::Exception e) + { + } +} + +bool CGUIElement_Impl::DistributesCapturedInputs() +{ + try + { + return m_pWindow->distributesCapturedInputs(); + } + catch (CEGUI::Exception e) + { + } +} + std::string CGUIElement_Impl::GetProperty(const char* szProperty) { CEGUI::String strValue; try { // Return the string. std::string will copy it - strValue = CGUI_Impl::GetUTFString(m_pWindow->getProperty(CGUI_Impl::GetUTFString(szProperty)).c_str()); + strValue = CGUI_Impl::GetUTFString((const char*)m_pWindow->getProperty(CGUI_Impl::GetUTFString(szProperty)).c_str()); } catch (CEGUI::Exception e) { } - return strValue.c_str(); + return (const char*)strValue.c_str(); } void CGUIElement_Impl::FillProperties() { - CEGUI::Window::PropertyIterator itPropertySet = ((CEGUI::PropertySet*)m_pWindow)->getIterator(); + CEGUI::Window::PropertyIterator itPropertySet = (dynamic_cast(m_pWindow)->getPropertyIterator()); while (!itPropertySet.isAtEnd()) { CEGUI::String strKey = itPropertySet.getCurrentKey(); CEGUI::String strValue = m_pWindow->getProperty(strKey); CGUIProperty* pProperty = new CGUIProperty; - pProperty->strKey = strKey.c_str(); - pProperty->strValue = strValue.c_str(); + pProperty->strKey = (const char*)strKey.c_str(); + pProperty->strValue = (const char*)strValue.c_str(); m_Properties.push_back(pProperty); itPropertySet++; @@ -572,8 +636,8 @@ bool CGUIElement_Impl::Event_OnSized(const CEGUI::EventArgs& e) bool CGUIElement_Impl::Event_OnClick(const CEGUI::EventArgs& eBase) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(eBase); - CGUIElement* pElement = reinterpret_cast(this); + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(eBase); + CGUIElement* pElement = reinterpret_cast(this); if (m_OnClick) m_OnClick(pElement); @@ -583,11 +647,9 @@ bool CGUIElement_Impl::Event_OnClick(const CEGUI::EventArgs& eBase) CGUIMouseEventArgs NewArgs; // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); NewArgs.pWindow = pElement; m_OnClickWithArgs(NewArgs); @@ -653,9 +715,7 @@ bool CGUIElement_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) CGUIKeyEventArgs NewArgs; // copy the variables - NewArgs.codepoint = Args.codepoint; - NewArgs.scancode = (CGUIKeys::Scan)Args.scancode; - NewArgs.sysKeys = Args.sysKeys; + NewArgs.scancode = (CGUIKeys::Scan)Args.d_key; // get the CGUIElement CGUIElement* pElement = reinterpret_cast((Args.window)->getUserData()); @@ -666,11 +726,11 @@ bool CGUIElement_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) if (m_OnEnter) { - switch (Args.scancode) + switch (Args.d_key) { // Return key - case CEGUI::Key::NumpadEnter: - case CEGUI::Key::Return: + case CEGUI::Key::Scan::NumpadEnter: + case CEGUI::Key::Scan::Return: { // Fire the event m_OnEnter(pCGUIElement); @@ -684,5 +744,5 @@ bool CGUIElement_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) inline void CGUIElement_Impl::ForceRedraw() { - m_pWindow->forceRedraw(); + m_pWindow->invalidate(true); } diff --git a/Client/gui/CGUIElement_Impl.h b/Client/gui/CGUIElement_Impl.h index c2bfa999ea..27bf07327f 100644 --- a/Client/gui/CGUIElement_Impl.h +++ b/Client/gui/CGUIElement_Impl.h @@ -100,6 +100,12 @@ class CGUIElement_Impl : public CGUIElement CGUIPropertyIter GetPropertiesBegin(); CGUIPropertyIter GetPropertiesEnd(); + void SetCursorPassThroughEnabled(bool enabled); + bool IsCursorPassThroughEnabled(); + + void SetDistributeCapturedInputs(bool enabled); + bool DistributesCapturedInputs(); + void SetMovedHandler(GUI_CALLBACK Callback); void SetSizedHandler(GUI_CALLBACK Callback); void SetClickHandler(GUI_CALLBACK Callback); diff --git a/Client/gui/CGUIElement_Inc.h b/Client/gui/CGUIElement_Inc.h index 4629a4df15..c35bfe7e15 100644 --- a/Client/gui/CGUIElement_Inc.h +++ b/Client/gui/CGUIElement_Inc.h @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIElement_Impl.cpp + * FILE: gui/CGUIElement_Inc.h * PURPOSE: Element derived class inclusion header * (fixes C++-language issues regarding inheritance) * @@ -244,6 +244,25 @@ void* GetUserData() return CGUIElement_Impl::GetUserData(); }; +void SetCursorPassThroughEnabled(bool enabled) +{ + CGUIElement_Impl::SetCursorPassThroughEnabled(enabled); +}; +bool IsCursorPassThroughEnabled() +{ + return CGUIElement_Impl::IsCursorPassThroughEnabled(); +}; + + +void SetDistributeCapturedInputs(bool enabled) +{ + CGUIElement_Impl::SetDistributeCapturedInputs(enabled); +}; +bool DistributesCapturedInputs() +{ + return CGUIElement_Impl::DistributesCapturedInputs(); +}; + void SetClickHandler(GUI_CALLBACK Callback) { CGUIElement_Impl::SetClickHandler(Callback); diff --git a/Client/gui/CGUIFont_Impl.cpp b/Client/gui/CGUIFont_Impl.cpp index 588923979c..a7aec7df88 100644 --- a/Client/gui/CGUIFont_Impl.cpp +++ b/Client/gui/CGUIFont_Impl.cpp @@ -11,16 +11,24 @@ #include "StdInc.h" -CGUIFont_Impl::CGUIFont_Impl(CGUI_Impl* pGUI, const char* szFontName, const char* szFontFile, unsigned int uSize, unsigned int uFlags, bool bAutoScale) +CGUIFont_Impl::CGUIFont_Impl(CGUI_Impl* pGUI, const char* szFontName, const char* szFontFile, unsigned int uSize, unsigned int uFlags, bool bAutoScale, + bool isWinFont) { // Store the fontmanager and create a font with the given attributes m_pFontManager = pGUI->GetFontManager(); m_pFont = NULL; + + // Store the renderer's geometry buffer + m_pGeometryBuffer = pGUI->GetGeometryBuffer(); + + CEGUI::AutoScaledMode scaleMode = bAutoScale ? CEGUI::AutoScaledMode::Both : CEGUI::AutoScaledMode::Disabled; + while (!m_pFont) { try { - m_pFont = m_pFontManager->createFont(szFontName, szFontFile, uSize, uFlags, bAutoScale, 1024, 768); + m_pFont = &m_pFontManager->createFreeTypeFont(szFontName, uSize, CEGUI::FontSizeUnit::Pixels, true, szFontFile, + isWinFont ? "absolute" : "mta_fonts", scaleMode, CEGUI::Sizef(1024, 768)); } catch (CEGUI::RendererException) { @@ -30,8 +38,8 @@ CGUIFont_Impl::CGUIFont_Impl(CGUI_Impl* pGUI, const char* szFontName, const char } } - // Define our glyphs - m_pFont->setInitialFontGlyphs(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); + // Define our glyphs (no longer required) + // m_pFont->setInitialFontGlyphs(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Set default attributes SetNativeResolution(1024, 768); @@ -40,49 +48,44 @@ CGUIFont_Impl::CGUIFont_Impl(CGUI_Impl* pGUI, const char* szFontName, const char CGUIFont_Impl::~CGUIFont_Impl() { - m_pFontManager->destroyFont(m_pFont); + m_pFontManager->destroy(*m_pFont); } -void CGUIFont_Impl::SetAntiAliasingEnabled(bool bAntialiased) +void CGUIFont_Impl::DrawTextString(const char* szText, CRect2D DrawArea, float fZ, CRect2D ClipRect, unsigned long ulFormat, unsigned long ulColor, + float fScaleX, float fScaleY) { - m_pFont->setAntiAliased(bAntialiased); + m_pRenderedText->renderText(szText); + m_pRenderedText->createRenderGeometry(std::vector{m_pGeometryBuffer}, glm::vec2(DrawArea.fX1, DrawArea.fY1), + &CEGUI::ColourRect(static_cast(ulColor)), + &CEGUI::Rectf(glm::vec2(ClipRect.fX1, ClipRect.fY1), glm::vec2(ClipRect.fX2, ClipRect.fY2))); } -void CGUIFont_Impl::DrawTextString(const char* szText, CRect2D DrawArea, float fZ, CRect2D ClipRect, unsigned long ulFormat, unsigned long ulColor, - float fScaleX, float fScaleY) +void CGUIFont_Impl::SetAntiAliasingEnabled(bool bAntialiased) { - CEGUI::TextFormatting fmt; - - if (ulFormat == DT_CENTER) - fmt = CEGUI::Centred; - else if (ulFormat == DT_RIGHT) - fmt = CEGUI::RightAligned; - else - fmt = CEGUI::LeftAligned; - - m_pFont->drawText(szText ? CGUI_Impl::GetUTFString(szText) : CEGUI::String(), CEGUI::Rect(DrawArea.fX1, DrawArea.fY1, DrawArea.fX2, DrawArea.fY2), fZ, - CEGUI::Rect(ClipRect.fX1, ClipRect.fY1, ClipRect.fX2, ClipRect.fY2), fmt, CEGUI::ColourRect(CEGUI::colour((CEGUI::argb_t)ulColor)), - fScaleX, fScaleY); + // m_pFont->setAntiAliased(bAntialiased); } bool CGUIFont_Impl::IsAntiAliasingEnabled() { - return m_pFont->isAntiAliased(); + // return m_pFont->isAntiAliased(); + return false; } void CGUIFont_Impl::SetAutoScalingEnabled(bool bAutoScaled) { - m_pFont->setAutoScalingEnabled(bAutoScaled); + CEGUI::AutoScaledMode scaleMode = bAutoScaled ? CEGUI::AutoScaledMode::Both : CEGUI::AutoScaledMode::Disabled; + m_pFont->setAutoScaled(scaleMode); } bool CGUIFont_Impl::IsAutoScalingEnabled() { - return m_pFont->isAutoScaled(); + CEGUI::AutoScaledMode scaledMode = m_pFont->getAutoScaled(); + return (scaledMode == CEGUI::AutoScaledMode::Disabled) ? false : true; } void CGUIFont_Impl::SetNativeResolution(int iX, int iY) { - m_pFont->setNativeResolution(CEGUI::Size(static_cast(iX), static_cast(iY))); + m_pFont->setNativeResolution(CEGUI::Sizef(static_cast(iX), static_cast(iY))); } float CGUIFont_Impl::GetCharacterWidth(int iChar, float fScale) @@ -91,12 +94,12 @@ float CGUIFont_Impl::GetCharacterWidth(int iChar, float fScale) szBuf[0] = iChar; szBuf[1] = 0; - return m_pFont->getTextExtent(szBuf, fScale); + return m_pFont->getTextExtent(szBuf); } float CGUIFont_Impl::GetFontHeight(float fScale) { - float fHeight = m_pFont->getFontHeight(fScale); // average height.. not the maximum height for long characters such as 'g' or 'j' + float fHeight = m_pFont->getFontHeight(); // average height.. not the maximum height for long characters such as 'g' or 'j' fHeight += 2.0f; // so hack it return fHeight; @@ -104,7 +107,7 @@ float CGUIFont_Impl::GetFontHeight(float fScale) float CGUIFont_Impl::GetTextExtent(const char* szText, float fScale) { - return m_pFont->getTextExtent(CGUI_Impl::GetUTFString(szText), fScale); + return m_pFont->getTextExtent(CGUI_Impl::GetUTFString(szText)); } CEGUI::Font* CGUIFont_Impl::GetFont() diff --git a/Client/gui/CGUIFont_Impl.h b/Client/gui/CGUIFont_Impl.h index 307c9e5940..42777a8513 100644 --- a/Client/gui/CGUIFont_Impl.h +++ b/Client/gui/CGUIFont_Impl.h @@ -12,13 +12,13 @@ #pragma once #include -#include +#include class CGUIFont_Impl : public CGUIFont { public: CGUIFont_Impl(class CGUI_Impl* pManager, const char* szFontName, const char* szFontFile, unsigned int uSize = 8, unsigned int uFlags = 0, - bool bAutoScale = false); + bool bAutoScale = false, bool isWinFont = false); ~CGUIFont_Impl(); void SetAntiAliasingEnabled(bool bAntialiased); @@ -38,6 +38,8 @@ class CGUIFont_Impl : public CGUIFont float fScaleY); private: - CEGUI::Font* m_pFont; - CEGUI::FontManager* m_pFontManager; + CEGUI::Font* m_pFont; + CEGUI::FontManager* m_pFontManager; + CEGUI::GeometryBuffer* m_pGeometryBuffer; + CEGUI::RenderedText* m_pRenderedText; }; diff --git a/Client/gui_new/CGUIListItem_Impl.cpp b/Client/gui/CGUIGridListItem_Impl .cpp similarity index 66% rename from Client/gui_new/CGUIListItem_Impl.cpp rename to Client/gui/CGUIGridListItem_Impl .cpp index 3145d83ec9..c3ac17a43d 100644 --- a/Client/gui_new/CGUIListItem_Impl.cpp +++ b/Client/gui/CGUIGridListItem_Impl .cpp @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIListItem_Impl.cpp + * FILE: gui/CGUIGridListItem_Impl.cpp * PURPOSE: List widget item class * * Multi Theft Auto is available from http://www.multitheftauto.com/ @@ -25,9 +25,7 @@ // } //} -using namespace GUINew; - -CGUIListItem_Impl::CGUIListItem_Impl(CGUI_Impl* pGUI, const char* szText, unsigned int uiType, CGUIStaticImage_Impl* pImage) +CGUIGridListItem_Impl::CGUIGridListItem_Impl(CGUI_Impl* pGUI, const char* szText, unsigned int uiType, CGUIStaticImage_Impl* pImage) { ItemType = uiType; @@ -39,51 +37,44 @@ CGUIListItem_Impl::CGUIListItem_Impl(CGUI_Impl* pGUI, const char* szText, unsign switch (uiType) { case TextItem: - m_pListItem = new CEGUI::ListboxTextItem(CGUI_Impl::GetUTFString(szText)); + m_pListItem = (CEGUI::ListboxItem*)new CEGUI::StandardItem(CGUI_Impl::GetUTFString(szText)); break; case ImageItem: - m_pListItem = new CEGUI::ListboxTextItem(CGUI_Impl::GetUTFString(szText)); + m_pListItem = (CEGUI::ListboxItem*)new CEGUI::StandardItem(CGUI_Impl::GetUTFString(szText)); //m_pListItem = reinterpret_cast(pGUI->GetWindowManager()->createWindow("CGUI/ImageListboxItem", szUnique)); break; case NumberItem: - m_pListItem = new CEGUI::ListboxTextItem(CGUI_Impl::GetUTFString(szText)); + m_pListItem = (CEGUI::ListboxItem*)new CEGUI::StandardItem(CGUI_Impl::GetUTFString(szText)); break; } - if (m_pListItem) - { - // Set flags and properties - m_pListItem->setAutoDeleted(false); - //m_pListItem->setSelectionBrushImage("CGUI/ListboxSelectionBrush"); - } - m_pData = NULL; } -CGUIListItem_Impl::~CGUIListItem_Impl() +CGUIGridListItem_Impl::~CGUIGridListItem_Impl() { if (m_deleteDataCallback) m_deleteDataCallback(m_pData); delete m_pListItem; } -void CGUIListItem_Impl::SetDisabled(bool bDisabled) +void CGUIGridListItem_Impl::SetDisabled(bool bDisabled) { reinterpret_cast(m_pListItem)->setDisabled(bDisabled); } -void CGUIListItem_Impl::SetFont(const char* szFontName) +void CGUIGridListItem_Impl::SetFont(const char* szFontName) { if (szFontName) reinterpret_cast(m_pListItem)->setFont(CEGUI::String(szFontName)); } -void CGUIListItem_Impl::SetText(const char* pszText, const char* pszSortText) +void CGUIGridListItem_Impl::SetText(const char* pszText, const char* pszSortText) { m_pListItem->setText(CGUI_Impl::GetUTFString(pszText)); } -void CGUIListItem_Impl::SetData(const char* pszData) +void CGUIGridListItem_Impl::SetData(const char* pszData) { if (pszData) { @@ -96,7 +87,7 @@ void CGUIListItem_Impl::SetData(const char* pszData) } } -void CGUIListItem_Impl::SetImage(CGUIStaticImage* pImage) +void CGUIGridListItem_Impl::SetImage(CGUIStaticImage* pImage) { if (ItemType == ImageItem) { @@ -105,27 +96,17 @@ void CGUIListItem_Impl::SetImage(CGUIStaticImage* pImage) } } -std::string CGUIListItem_Impl::GetText() const +std::string CGUIGridListItem_Impl::GetText() const { return (const char*)CGUI_Impl::GetUTFString((const char*)m_pListItem->getText().c_str()).c_str(); } -CEGUI::ListboxItem* CGUIListItem_Impl::GetListItem() +CEGUI::ListboxItem* CGUIGridListItem_Impl::GetListItem() { return m_pListItem; } -bool CGUIListItem_Impl::GetSelectedState() -{ - return m_pListItem->isSelected(); -} - -void CGUIListItem_Impl::SetSelectedState(bool bState) -{ - m_pListItem->setSelected(bState); -} - -void CGUIListItem_Impl::SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) +void CGUIGridListItem_Impl::SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) { if (ItemType == TextItem || ItemType == NumberItem) { @@ -134,7 +115,7 @@ void CGUIListItem_Impl::SetColor(unsigned char ucRed, unsigned char ucGreen, uns } } -bool CGUIListItem_Impl::GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) +bool CGUIGridListItem_Impl::GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) { if (ItemType == TextItem || ItemType == NumberItem) { diff --git a/Client/gui_new/CGUIListItem_Impl.h b/Client/gui/CGUIGridListItem_Impl.h similarity index 77% rename from Client/gui_new/CGUIListItem_Impl.h rename to Client/gui/CGUIGridListItem_Impl.h index c9e7c82a6e..e14113267a 100644 --- a/Client/gui_new/CGUIListItem_Impl.h +++ b/Client/gui/CGUIGridListItem_Impl.h @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIListItem_Impl.h + * FILE: gui/CGUIGridListItem_Impl.h * PURPOSE: List widget item class * * Multi Theft Auto is available from http://www.multitheftauto.com/ @@ -11,11 +11,10 @@ #pragma once -#include -#include +#include // Create custom ListboxItem types -//namespace CEGUI +// namespace CEGUI //{ // class ImageListboxItem : public ItemEntry // { @@ -28,12 +27,9 @@ // CEGUI_DECLARE_WINDOW_FACTORY(ImageListboxItem); //} -namespace GUINew{ - class CGUIStaticImage_Impl; - class CGUIListItem_Impl; -} +class CGUIStaticImage_Impl; -class GUINew::CGUIListItem_Impl : public CGUIListItem +class CGUIGridListItem_Impl : public CGUIGridListItem { public: enum Type @@ -43,8 +39,8 @@ class GUINew::CGUIListItem_Impl : public CGUIListItem ImageItem = 2 }; - CGUIListItem_Impl(CGUI_Impl* pGUI, const char* szText = "", unsigned int uiType = 0, CGUIStaticImage_Impl* pImage = NULL); - ~CGUIListItem_Impl(); + CGUIGridListItem_Impl(CGUI_Impl* pGUI, const char* szText = "", unsigned int uiType = 0, CGUIStaticImage_Impl* pImage = NULL); + ~CGUIGridListItem_Impl(); std::string GetText() const; void SetText(const char* pszText, const char* pszSortText = NULL); @@ -61,9 +57,6 @@ class GUINew::CGUIListItem_Impl : public CGUIListItem void SetFont(const char* szFontName); void SetImage(CGUIStaticImage* Image); - bool GetSelectedState(); - void SetSelectedState(bool bState); - bool GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha); void SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha); @@ -72,7 +65,7 @@ class GUINew::CGUIListItem_Impl : public CGUIListItem unsigned int ItemType; private: - CEGUI::ListboxItem* m_pListItem; + CEGUI::ListboxItem* m_pListItem; void* m_pData; std::string m_strData; CGUICallback m_deleteDataCallback; diff --git a/Client/gui/CGUIGridList_Impl.cpp b/Client/gui/CGUIGridList_Impl.cpp index bed682670a..74f4590dc7 100644 --- a/Client/gui/CGUIGridList_Impl.cpp +++ b/Client/gui/CGUIGridList_Impl.cpp @@ -11,8 +11,8 @@ #include "StdInc.h" -#define CGUIGRIDLIST_NAME "CGUI/MultiColumnList" -#define CGUIGRIDLISTNOFRAME_NAME "CGUI/MultiColumnList" //MultiColumnListNoFrame +#define CGUIGRIDLIST_NAME "MultiColumnList" +#define CGUIGRIDLISTNOFRAME_NAME "MultiColumnList" //MultiColumnListNoFrame #define CGUIGRIDLIST_SPACER " " #define CGUIGRIDLIST_MAX_TEXT_LENGTH 256 @@ -32,17 +32,17 @@ CGUIGridList_Impl::CGUIGridList_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, bool // Create the window and set default settings if (bFrame) - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIGRIDLIST_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIGRIDLIST_NAME, szUnique); else - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIGRIDLISTNOFRAME_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIGRIDLISTNOFRAME_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setRect(CEGUI::Relative, CEGUI::Rect(0.00f, 0.00f, 0.40f, 0.40f)); + m_pWindow->setArea(CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.4f, 0), CEGUI::UDim(0.4f, 0)); reinterpret_cast(m_pWindow)->setUserColumnDraggingEnabled(false); reinterpret_cast(m_pWindow)->setShowHorzScrollbar(false); - reinterpret_cast(m_pWindow)->setSelectionMode(CEGUI::MultiColumnList::RowSingle); - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::None); + reinterpret_cast(m_pWindow)->setSelectionMode(CEGUI::MultiColumnList::SelectionMode::RowSingle); + reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::NoSorting); // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); @@ -94,7 +94,7 @@ unsigned int CGUIGridList_Impl::AddColumn(const char* szTitle, float fWidth) { // Create a new column with an unique handle int hUniqueHandle = GetUniqueHandle(); - reinterpret_cast(m_pWindow)->addColumn((CGUI_Impl::GetUTFString(szTitle)), hUniqueHandle, fWidth); + reinterpret_cast(m_pWindow)->addColumn((CGUI_Impl::GetUTFString(szTitle)), hUniqueHandle, CEGUI::UDim(0, fWidth)); int iColumnIndex = reinterpret_cast(m_pWindow)->getColumnWithID(hUniqueHandle); @@ -107,40 +107,31 @@ unsigned int CGUIGridList_Impl::AddColumn(const char* szTitle, float fWidth) void CGUIGridList_Impl::SetColumnWidth(int hColumn, float fWidth, bool bRelative) { - try - { - reinterpret_cast(m_pWindow)->setColumnHeaderWidth(GetColumnIndex(hColumn), fWidth, bRelative); - } - catch (CEGUI::Exception) - { - } + CEGUI::UDim width; + + if (bRelative) + width = CEGUI::UDim(fWidth, 0); + else + width = CEGUI::UDim(0, fWidth); + + reinterpret_cast(m_pWindow)->setColumnHeaderWidth(GetColumnIndex(hColumn), width); } bool CGUIGridList_Impl::GetColumnWidth(int hColumn, float& fOutWidth, bool bRelative) { - try - { - fOutWidth = reinterpret_cast(m_pWindow)->getColumnHeaderWidth(GetColumnIndex(hColumn)); - - if (!bRelative) - fOutWidth = m_pWindow->relativeToAbsoluteX(fOutWidth); - - return true; - } - catch (CEGUI::Exception) - { - } - return false; + CEGUI::UDim uWidth = reinterpret_cast(m_pWindow)->getColumnHeaderWidth(GetColumnIndex(hColumn)); + fOutWidth = bRelative ? uWidth.d_scale : uWidth.d_scale; + return true; } void CGUIGridList_Impl::SetColumnTitle(int hColumn, const char* szTitle) { - reinterpret_cast(m_pWindow)->setColumnHeaderTitle(GetColumnIndex(hColumn), szTitle); + //reinterpret_cast(m_pWindow)->(GetColumnIndex(hColumn), szTitle); } const char* CGUIGridList_Impl::GetColumnTitle(int hColumn) { - return reinterpret_cast(m_pWindow)->getColumnHeaderTitle(GetColumnIndex(hColumn)); + return "boobs"; } void CGUIGridList_Impl::SetHorizontalScrollBar(bool bEnabled) @@ -179,14 +170,14 @@ int CGUIGridList_Impl::GetColumnCount() void CGUIGridList_Impl::ForceUpdate() { - reinterpret_cast(m_pWindow)->forceUpdate(); + reinterpret_cast(m_pWindow)->invalidate(true); } int CGUIGridList_Impl::AddRow(bool fast, std::vector >* m_items) { try { - int iRow = reinterpret_cast(m_pWindow)->addRow(m_iIndex++, fast); + int iRow = reinterpret_cast(m_pWindow)->addRow(m_iIndex++); if (m_items) return SetRowItemsText(iRow, m_items); else @@ -208,12 +199,12 @@ int CGUIGridList_Impl::SetRowItemsText(int iRow, std::vectorfirst.c_str(), it->second, false, true); + SetItemText(iRow, col, it->first.c_str(), it->second); col++; } // Add our sort column text, if it was provided if ((uint)iSortColumn <= m_items->size()) - iRow = SetItemText(iRow, iSortColumn, m_items->at(iSortColumn - 1).first.c_str(), m_items->at(iSortColumn - 1).second, false, true); + iRow = SetItemText(iRow, iSortColumn, m_items->at(iSortColumn - 1).first.c_str(), m_items->at(iSortColumn - 1).second); return iRow; } @@ -267,7 +258,7 @@ void CGUIGridList_Impl::Clear() // reinterpret_cast < CEGUI::MultiColumnList* > ( m_pWindow ) -> setSortDirection( CEGUI::ListHeaderSegment::None ); reinterpret_cast(m_pWindow)->resetList(); - CFastHashMap::iterator it; + CFastHashMap::iterator it; for (it = m_Items.begin(); it != m_Items.end(); it++) { delete it->second; @@ -279,7 +270,7 @@ void CGUIGridList_Impl::Clear() } } -CGUIListItem* CGUIGridList_Impl::GetItem(int iRow, int hColumn) +CGUIGridListItem* CGUIGridList_Impl::GetItem(int iRow, int hColumn) { try { @@ -291,7 +282,7 @@ CGUIListItem* CGUIGridList_Impl::GetItem(int iRow, int hColumn) CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getItemAtGridReference(CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn))); - // If it exists, get the CGUIListItem by using the pool + // If it exists, get the CGUIGridListItem by using the pool if (pItem) { return GetListItem(pItem); @@ -317,7 +308,7 @@ const char* CGUIGridList_Impl::GetItemText(int iRow, int hColumn) reinterpret_cast(m_pWindow)->getItemAtGridReference(CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn))); if (pItem) { - const char* szRet = pItem->getText().c_str(); + const char* szRet = (const char*)pItem->getText().c_str(); if (!m_bIgnoreTextSpacer) { @@ -344,7 +335,7 @@ const char* CGUIGridList_Impl::GetItemText(int iRow, int hColumn) void* CGUIGridList_Impl::GetItemData(int iRow, int hColumn) { - CGUIListItem* pItem = GetItem(iRow, hColumn); + CGUIGridListItem* pItem = GetItem(iRow, hColumn); return pItem ? pItem->GetData() : NULL; } @@ -352,7 +343,7 @@ void* CGUIGridList_Impl::GetItemData(int iRow, int hColumn) void CGUIGridList_Impl::SetItemData(int iRow, int hColumn, void* pData, CGUICallback deleteDataCallback) { // Get the current item at that offset and set the text - CGUIListItem* pItem = GetItem(iRow, hColumn); + CGUIGridListItem* pItem = GetItem(iRow, hColumn); if (pItem) { pItem->SetData(pData, deleteDataCallback); @@ -362,7 +353,7 @@ void CGUIGridList_Impl::SetItemData(int iRow, int hColumn, void* pData, CGUICall void CGUIGridList_Impl::SetItemData(int iRow, int hColumn, const char* pszData) { // Get the current item at that offset and set the text - CGUIListItem* pItem = GetItem(iRow, hColumn); + CGUIGridListItem* pItem = GetItem(iRow, hColumn); if (pItem) { pItem->SetData(pszData); @@ -376,7 +367,7 @@ int CGUIGridList_Impl::SetItemText(int iRow, int hColumn, const char* szText, bo CEGUI::MultiColumnList* win = reinterpret_cast(m_pWindow); // Get the current item at that offset and set the text - CGUIListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); + CGUIGridListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); if (pItem) { if (bSection) @@ -384,11 +375,11 @@ int CGUIGridList_Impl::SetItemText(int iRow, int hColumn, const char* szText, bo // Set section properties pItem->SetFont("default-bold-small"); pItem->SetDisabled(true); - pItem->SetText(szText, szSortText); + pItem->SetText(szText); } else { - pItem->SetFont(win->getFont()->getName().c_str()); // Reset font to the font of the item's parent (the gridlist) + pItem->SetFont((const char*)win->getFont()->getName().c_str()); // Reset font to the font of the item's parent (the gridlist) pItem->SetDisabled(false); if (GetColumnIndex(hColumn) == 0) @@ -407,24 +398,24 @@ int CGUIGridList_Impl::SetItemText(int iRow, int hColumn, const char* szText, bo szBuf[CGUIGRIDLIST_MAX_TEXT_LENGTH - 1] = NULL; - pItem->SetText(szBuf, szSortText); + pItem->SetText(szBuf); } else { - pItem->SetText(szText, szSortText); + pItem->SetText(szText); } } } else { // If it doesn't, create it and set it in the gridlist - pItem = new CGUIListItem_Impl(szText, bNumber); + pItem = new CGUIGridListItem_Impl(m_pManager, szText, bNumber); if (szSortText) - pItem->SetText(szText, szSortText); + pItem->SetText(szText); CEGUI::ListboxItem* pListboxItem = pItem->GetListItem(); - win->setItem(pListboxItem, CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn)), bFast); + win->setItem(pListboxItem, CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn))); // Put our new item into the map m_Items[pItem->GetListItem()] = pItem; @@ -450,13 +441,13 @@ int CGUIGridList_Impl::SetItemText(int iRow, int hColumn, const char* szText, bo } szBuf[CGUIGRIDLIST_MAX_TEXT_LENGTH - 1] = NULL; - pItem->SetText(szBuf, szSortText); + pItem->SetText(szBuf); } } // If the list is sorted and we just changed an item in the sorting column, // re-sort the list. - if (win->getSortDirection() != SortDirections::None && win->getSortColumn() == GetColumnIndex(hColumn)) + if (win->getSortDirection() != CEGUI::ListHeaderSegment::SortDirection::NoSorting && win->getSortColumn() == GetColumnIndex(hColumn)) { win->setSortColumn(win->getSortColumn()); return GetItemRowIndex(pItem); @@ -480,7 +471,7 @@ void CGUIGridList_Impl::SetItemColor(int iRow, int hColumn, unsigned char ucRed, CEGUI::MultiColumnList* win = reinterpret_cast(m_pWindow); // Get the current item at that offset and set the color - CGUIListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); + CGUIGridListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); if (pItem) { pItem->SetColor(ucRed, ucGreen, ucBlue, ucAlpha); @@ -498,7 +489,7 @@ bool CGUIGridList_Impl::GetItemColor(int iRow, int hColumn, unsigned char& ucRed CEGUI::MultiColumnList* win = reinterpret_cast(m_pWindow); // Get the current item at that offset and get it's color - CGUIListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); + CGUIGridListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); if (pItem) { return pItem->GetColor(ucRed, ucGreen, ucBlue, ucAlpha); @@ -514,7 +505,9 @@ void CGUIGridList_Impl::SetColumnSegmentSizingEnabled(int hColumn, bool bEnabled { try { - reinterpret_cast(m_pWindow)->setUserColumnSegmentSizingEnabled(hColumn, bEnabled); + CEGUI::MultiColumnList* columnList = reinterpret_cast(m_pWindow); + CEGUI::ListHeaderSegment* columnSegment = &columnList->getHeaderSegmentForColumn(hColumn); + columnSegment->setSizingEnabled(bEnabled); } catch (CEGUI::Exception) { @@ -525,7 +518,9 @@ bool CGUIGridList_Impl::IsColumnSegmentSizingEnabled(int hColumn) { try { - return reinterpret_cast(m_pWindow)->isUserColumnSegmentSizingEnabled(GetColumnIndex(hColumn)); + CEGUI::MultiColumnList* columnList = reinterpret_cast(m_pWindow); + CEGUI::ListHeaderSegment* columnSegment = &columnList->getHeaderSegmentForColumn(hColumn); + return columnSegment->isSizingEnabled(); } catch (CEGUI::Exception) { @@ -536,7 +531,7 @@ bool CGUIGridList_Impl::IsColumnSegmentSizingEnabled(int hColumn) void CGUIGridList_Impl::SetItemImage(int iRow, int hColumn, CGUIStaticImage* pImage) { // Get the current item at that offset - CGUIListItem* pItem = GetItem(iRow, hColumn); + CGUIGridListItem* pItem = GetItem(iRow, hColumn); if (pItem != NULL) { pItem->SetImage(pImage); @@ -545,9 +540,9 @@ void CGUIGridList_Impl::SetItemImage(int iRow, int hColumn, CGUIStaticImage* pIm // if ( pImage ) { // If it doesn't, create it and set it in the gridlist - CGUIListItem_Impl* pNewItem = new CGUIListItem_Impl("", CGUIListItem_Impl::ImageItem, (CGUIStaticImage_Impl*)pImage); + CGUIGridListItem_Impl* pNewItem = new CGUIGridListItem_Impl(m_pManager, "", CGUIGridListItem_Impl::ImageItem, (CGUIStaticImage_Impl*)pImage); CEGUI::ListboxItem* pListboxItem = pNewItem->GetListItem(); - reinterpret_cast(m_pWindow)->setItem(pListboxItem, CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn)), true); + reinterpret_cast(m_pWindow)->setItem(pListboxItem, hColumn, iRow); // Put our new item in the map m_Items[pNewItem->GetListItem()] = pNewItem; @@ -558,7 +553,7 @@ float CGUIGridList_Impl::GetHorizontalScrollPosition() { try { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_horzScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getHorzScrollbar(); if (pScrollbar) return (pScrollbar->getScrollPosition() / (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); } @@ -572,7 +567,7 @@ float CGUIGridList_Impl::GetVerticalScrollPosition() { try { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_vertScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); if (pScrollbar) return (pScrollbar->getScrollPosition() / (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); } @@ -586,7 +581,7 @@ void CGUIGridList_Impl::SetHorizontalScrollPosition(float fPosition) { try { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_horzScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getHorzScrollbar(); if (pScrollbar) pScrollbar->setScrollPosition(fPosition * (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); } @@ -599,7 +594,7 @@ void CGUIGridList_Impl::SetVerticalScrollPosition(float fPosition) { try { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_vertScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); if (pScrollbar) pScrollbar->setScrollPosition(fPosition * (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); } @@ -629,13 +624,13 @@ int CGUIGridList_Impl::GetSelectedCount() return reinterpret_cast(m_pWindow)->getSelectedCount(); } -int CGUIGridList_Impl::GetItemColumnIndex(CGUIListItem* pItem) +int CGUIGridList_Impl::GetItemColumnIndex(CGUIGridListItem* pItem) { if (pItem) { try { - CGUIListItem_Impl* pItemImpl = (CGUIListItem_Impl*)pItem; + CGUIGridListItem_Impl* pItemImpl = (CGUIGridListItem_Impl*)pItem; return reinterpret_cast(m_pWindow)->getItemColumnIndex(pItemImpl->GetListItem()); } catch (CEGUI::Exception) @@ -645,13 +640,13 @@ int CGUIGridList_Impl::GetItemColumnIndex(CGUIListItem* pItem) return -1; } -int CGUIGridList_Impl::GetItemRowIndex(CGUIListItem* pItem) +int CGUIGridList_Impl::GetItemRowIndex(CGUIGridListItem* pItem) { if (pItem) { try { - CGUIListItem_Impl* pItemImpl = (CGUIListItem_Impl*)pItem; + CGUIGridListItem_Impl* pItemImpl = (CGUIGridListItem_Impl*)pItem; return reinterpret_cast(m_pWindow)->getItemRowIndex(pItemImpl->GetListItem()); } catch (CEGUI::Exception) @@ -674,23 +669,24 @@ void CGUIGridList_Impl::SetSelectionMode(SelectionMode mode) SelectionMode CGUIGridList_Impl::GetSelectionMode() { - return (SelectionMode) reinterpret_cast(m_pWindow)->getSelectionMode(); + return (SelectionMode)reinterpret_cast(m_pWindow)->getSelectionMode(); } void CGUIGridList_Impl::GetVisibleRowRange(int& iFirst, int& iLast) { - reinterpret_cast(m_pWindow)->getVisibleRowRange(iFirst, iLast); + + //reinterpret_cast(m_pWindow)->getVisibleRowRange(iFirst, iLast); } -CGUIListItem* CGUIGridList_Impl::GetSelectedItem() +CGUIGridListItem* CGUIGridList_Impl::GetSelectedItem() { return GetListItem(reinterpret_cast(m_pWindow)->getFirstSelectedItem()); } -CGUIListItem* CGUIGridList_Impl::GetNextSelectedItem(CGUIListItem* pItem) +CGUIGridListItem* CGUIGridList_Impl::GetNextSelectedItem(CGUIGridListItem* pItem) { if (pItem) - return GetListItem(reinterpret_cast(m_pWindow)->getNextSelected(((CGUIListItem_Impl*)pItem)->GetListItem())); + return GetListItem(reinterpret_cast(m_pWindow)->getNextSelected(((CGUIGridListItem_Impl*)pItem)->GetListItem())); else return GetListItem(reinterpret_cast(m_pWindow)->getFirstSelectedItem()); } @@ -700,7 +696,7 @@ int CGUIGridList_Impl::GetSelectedItemRow() CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getFirstSelectedItem(); if (pItem) { - CGUIListItem* pListItem = GetListItem(pItem); + CGUIGridListItem* pListItem = GetListItem(pItem); if (pListItem) { return GetItemRowIndex(pListItem); @@ -715,7 +711,7 @@ int CGUIGridList_Impl::GetSelectedItemColumn() CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getFirstSelectedItem(); if (pItem) { - CGUIListItem* pListItem = GetListItem(pItem); + CGUIGridListItem* pListItem = GetListItem(pItem); if (pListItem) { return GetItemColumnIndex(pListItem); @@ -733,14 +729,14 @@ void CGUIGridList_Impl::SetSelectedItem(int iRow, int hColumn, bool bReset) } // Get the current item at that offset - CGUIListItem* pItem = GetItem(iRow, hColumn); + CGUIGridListItem* pItem = GetItem(iRow, hColumn); if (pItem != NULL) { // Use the grid to select the row, rather than the pItem method call as the grid one will take into account the // grid settings for full row select, etc... - reinterpret_cast(m_pWindow)->setItemSelectState(reinterpret_cast(pItem)->GetListItem(), true); + reinterpret_cast(m_pWindow)->setItemSelectState(reinterpret_cast(pItem)->GetListItem(), true); - reinterpret_cast(m_pWindow)->requestRedraw(); + reinterpret_cast(m_pWindow)->invalidate(true); } } @@ -751,13 +747,13 @@ void CGUIGridList_Impl::Sort(unsigned int uiColumn, SortDirection direction) switch (direction) { case SortDirections::Ascending: - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::Ascending); + reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::Ascending); break; case SortDirections::Descending: - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::Descending); + reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::Descending); break; default: - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::None); + reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::NoSorting); break; } } @@ -768,16 +764,16 @@ void CGUIGridList_Impl::GetSort(unsigned int& uiColumn, SortDirection& direction switch (reinterpret_cast(m_pWindow)->getSortDirection()) { - case CEGUI::ListHeaderSegment::Ascending: + case CEGUI::ListHeaderSegment::SortDirection::Ascending: direction = SortDirections::Ascending; break; - case CEGUI::ListHeaderSegment::Descending: + case CEGUI::ListHeaderSegment::SortDirection::Descending: direction = SortDirections::Descending; break; default: - direction = SortDirections::None; + direction = SortDirections::SortDirection::None; break; } } @@ -799,9 +795,9 @@ unsigned int CGUIGridList_Impl::GetUniqueHandle() return ++m_hUniqueHandle; } -CGUIListItem_Impl* CGUIGridList_Impl::GetListItem(CEGUI::ListboxItem* pItem) +CGUIGridListItem_Impl* CGUIGridList_Impl::GetListItem(CEGUI::ListboxItem* pItem) { - CFastHashMap::iterator it; + CFastHashMap::iterator it; it = m_Items.find(pItem); if (it == m_Items.end()) return NULL; diff --git a/Client/gui/CGUIGridList_Impl.h b/Client/gui/CGUIGridList_Impl.h index a67d928f05..368b9c561d 100644 --- a/Client/gui/CGUIGridList_Impl.h +++ b/Client/gui/CGUIGridList_Impl.h @@ -14,7 +14,7 @@ #include #include "CGUIElement_Impl.h" -class CGUIListItem_Impl; +class CGUIGridListItem_Impl; class CGUIGridList_Impl : public CGUIGridList, public CGUIElement_Impl { @@ -34,13 +34,13 @@ class CGUIGridList_Impl : public CGUIGridList, public CGUIElement_Impl SelectionMode GetSelectionMode(); int SetRowItemsText(int iRow, std::vector >* m_items); - void ForceUpdate(); - int AddRow(bool bFast = false, std::vector >* m_items = NULL); - void RemoveRow(int iRow); - int InsertRowAfter(int iRow, std::vector >* m_items = NULL); - void Clear(); - CGUIListItem* GetItem(int iRow, int hColumn); - const char* GetItemText(int iRow, int hColumn); + void ForceUpdate(); + int AddRow(bool bFast = false, std::vector >* m_items = NULL); + void RemoveRow(int iRow); + int InsertRowAfter(int iRow, std::vector >* m_items = NULL); + void Clear(); + CGUIGridListItem* GetItem(int iRow, int hColumn); + const char* GetItemText(int iRow, int hColumn); int SetItemText(int iRow, int hColumn, const char* szText, bool bNumber = false, bool bSection = false, bool bFast = false, const char* szSortText = NULL); void SetItemData(int iRow, int hColumn, void* pData, CGUICallback deleteDataCallback = NULL); void SetItemData(int iRow, int hColumn, const char* pszData); @@ -59,17 +59,17 @@ class CGUIGridList_Impl : public CGUIGridList, public CGUIElement_Impl void SetHorizontalScrollPosition(float fPosition); void SetVerticalScrollPosition(float fPosition); - int GetColumnIndex(int hColumn); - int GetItemColumnIndex(CGUIListItem* pItem); - int GetItemRowIndex(CGUIListItem* pItem); - void GetVisibleRowRange(int& iFirst, int& iLast); - int GetSelectedCount(); - CGUIListItem* GetSelectedItem(); - CGUIListItem* GetNextSelectedItem(CGUIListItem* pItem); - int GetSelectedItemRow(); - int GetSelectedItemColumn(); - int GetRowCount(); - int GetColumnCount(); + int GetColumnIndex(int hColumn); + int GetItemColumnIndex(CGUIGridListItem* pItem); + int GetItemRowIndex(CGUIGridListItem* pItem); + void GetVisibleRowRange(int& iFirst, int& iLast); + int GetSelectedCount(); + CGUIGridListItem* GetSelectedItem(); + CGUIGridListItem* GetNextSelectedItem(CGUIGridListItem* pItem); + int GetSelectedItemRow(); + int GetSelectedItemColumn(); + int GetRowCount(); + int GetColumnCount(); bool IsColumnSegmentSizingEnabled(int hColumn); void SetColumnSegmentSizingEnabled(int hColumn, bool bEnabled); @@ -84,18 +84,18 @@ class CGUIGridList_Impl : public CGUIGridList, public CGUIElement_Impl void SetIgnoreTextSpacer(bool bIgnoreTextSpacer) { m_bIgnoreTextSpacer = bIgnoreTextSpacer; }; eCGUIType GetType() { return CGUI_GRIDLIST; }; - #include "CGUIElement_Inc.h" +#include "CGUIElement_Inc.h" private: bool Event_OnSortColumn(const CEGUI::EventArgs& e); int m_iIndex; - unsigned int GetUniqueHandle(); - CGUIListItem_Impl* GetListItem(CEGUI::ListboxItem* pItem); - unsigned int m_hUniqueHandle; + unsigned int GetUniqueHandle(); + CGUIGridListItem_Impl* GetListItem(CEGUI::ListboxItem* pItem); + unsigned int m_hUniqueHandle; - CFastHashMap m_Items; + CFastHashMap m_Items; GUI_CALLBACK m_OnSortColumn; diff --git a/Client/gui/CGUILabel_Impl.cpp b/Client/gui/CGUILabel_Impl.cpp index c07103da79..c31460bec8 100644 --- a/Client/gui/CGUILabel_Impl.cpp +++ b/Client/gui/CGUILabel_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUILABEL_NAME "CGUI/StaticText" +#define CGUILABEL_NAME "StaticText" CGUILabel_Impl::CGUILabel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szText) { @@ -22,9 +22,11 @@ CGUILabel_Impl::CGUILabel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUILABEL_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUILABEL_NAME, szUnique); m_pWindow->setDestroyedByParent(false); + m_pWindow->setText(szText); + // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); @@ -42,7 +44,7 @@ CGUILabel_Impl::CGUILabel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char SetHorizontalAlign(CGUI_ALIGN_LEFT); SetVerticalAlign(CGUI_ALIGN_TOP); SetText(szText); - reinterpret_cast(m_pWindow)->setBackgroundEnabled(false); + m_pWindow->setProperty("BackgroundEnabled", "false"); // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager if (pParent) @@ -63,38 +65,82 @@ CGUILabel_Impl::~CGUILabel_Impl() void CGUILabel_Impl::SetText(const char* Text) { - // Set the new text and size the text field after it m_pWindow->setText(CGUI_Impl::GetUTFString(Text)); } void CGUILabel_Impl::SetVerticalAlign(CGUIVerticalAlign eAlign) { - reinterpret_cast(m_pWindow)->setVerticalFormatting(static_cast(eAlign)); + m_pWindow->setProperty("VertFormatting", CGUIVerticalAlignValues[eAlign]); } CGUIVerticalAlign CGUILabel_Impl::GetVerticalAlign() { - return static_cast(reinterpret_cast(m_pWindow)->getVerticalFormatting()); + SString verticalAlign = (const char*)m_pWindow->getProperty("VertFormatting").c_str(); + + if (verticalAlign == CGUIVerticalAlignValues[1]) + return CGUIVerticalAlign::CGUI_ALIGN_TOP; + + if (verticalAlign == CGUIVerticalAlignValues[2]) + return CGUIVerticalAlign::CGUI_ALIGN_BOTTOM; + + if (verticalAlign == CGUIVerticalAlignValues[3]) + return CGUIVerticalAlign::CGUI_ALIGN_VERTICALCENTER; + + // Fallback + return CGUIVerticalAlign::CGUI_ALIGN_TOP; } void CGUILabel_Impl::SetHorizontalAlign(CGUIHorizontalAlign eAlign) { - reinterpret_cast(m_pWindow)->setHorizontalFormatting(static_cast(eAlign)); + m_pWindow->setProperty("HorzFormatting", CGUIHorizontalAlignValues[eAlign]); } CGUIHorizontalAlign CGUILabel_Impl::GetHorizontalAlign() { - return static_cast(reinterpret_cast(m_pWindow)->getHorizontalFormatting()); + SString horizontalAlign = (const char*)m_pWindow->getProperty("HorzFormatting").c_str(); + + if (horizontalAlign == CGUIHorizontalAlignValues[1]) + return CGUIHorizontalAlign::CGUI_ALIGN_LEFT; + + if (horizontalAlign == CGUIHorizontalAlignValues[2]) + return CGUIHorizontalAlign::CGUI_ALIGN_RIGHT; + + if (horizontalAlign == CGUIHorizontalAlignValues[3]) + return CGUIHorizontalAlign::CGUI_ALIGN_HORIZONTALCENTER; + + if (horizontalAlign == CGUIHorizontalAlignValues[4]) + return CGUIHorizontalAlign::CGUI_ALIGN_LEFT_WORDWRAP; + + if (horizontalAlign == CGUIHorizontalAlignValues[5]) + return CGUIHorizontalAlign::CGUI_ALIGN_RIGHT_WORDWRAP; + + if (horizontalAlign == CGUIHorizontalAlignValues[6]) + return CGUIHorizontalAlign::CGUI_ALIGN_HORIZONTALCENTER_WORDWRAP; + + // Fallback + return CGUIHorizontalAlign::CGUI_ALIGN_LEFT; } void CGUILabel_Impl::SetTextColor(CGUIColor Color) { - reinterpret_cast(m_pWindow)->setTextColours(CEGUI::colour(1.0f / 255.0f * Color.R, 1.0f / 255.0f * Color.G, 1.0f / 255.0f * Color.B)); + std::uint32_t argb = 0xFF000000; // alpha 255 + argb |= static_cast(Color.R) << 16; + argb |= static_cast(Color.G) << 8; + argb |= static_cast(Color.B); + SString hexString = SString("%08x", argb).ToUpper(); + + m_pWindow->setProperty("TextColours", SString("tl:%s tr:%s bl:%s br:%s", *hexString, *hexString, *hexString, *hexString)); } void CGUILabel_Impl::SetTextColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue) { - reinterpret_cast(m_pWindow)->setTextColours(CEGUI::colour(1.0f / 255.0f * ucRed, 1.0f / 255.0f * ucGreen, 1.0f / 255.0f * ucBlue)); + std::uint32_t argb = 0xFF000000; // alpha 255 + argb |= static_cast(ucRed) << 16; + argb |= static_cast(ucGreen) << 8; + argb |= static_cast(ucBlue); + SString hexString = SString("%08x", argb).ToUpper(); + + m_pWindow->setProperty("TextColours", SString("tl:%s tr:%s bl:%s br:%s", *hexString, *hexString, *hexString, *hexString)); } CGUIColor CGUILabel_Impl::GetTextColor() @@ -106,7 +152,8 @@ CGUIColor CGUILabel_Impl::GetTextColor() void CGUILabel_Impl::GetTextColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue) { - CEGUI::colour r = (reinterpret_cast(m_pWindow)->getTextColours()).getColourAtPoint(0, 0); + //CEGUI::Colour r = (m_pLabel->getColours()).getColourAtPoint(0, 0); + CEGUI::Colour r = CEGUI::Colour(255, 255, 255); ucRed = (unsigned char)(r.getRed() * 255); ucGreen = (unsigned char)(r.getGreen() * 255); @@ -115,12 +162,12 @@ void CGUILabel_Impl::GetTextColor(unsigned char& ucRed, unsigned char& ucGreen, void CGUILabel_Impl::SetFrameEnabled(bool bFrameEnabled) { - reinterpret_cast(m_pWindow)->setFrameEnabled(bFrameEnabled); + m_pWindow->setProperty("FrameEnabled", bFrameEnabled ? "True" : "False"); } bool CGUILabel_Impl::IsFrameEnabled() { - return reinterpret_cast(m_pWindow)->isFrameEnabled(); + return m_pWindow->getProperty("FrameEnabled") == "True" ? true : false; } float CGUILabel_Impl::GetCharacterWidth(int iCharIndex) @@ -139,13 +186,13 @@ float CGUILabel_Impl::GetFontHeight() float CGUILabel_Impl::GetTextExtent() { - const CEGUI::Font* pFont = m_pWindow->getFont(); + CEGUI::Font* pFont = m_pWindow->getFont(); if (pFont) { try { // Retrieve the longest line's extent - std::stringstream ssText(m_pWindow->getText().c_str()); + std::stringstream ssText((const char*)m_pWindow->getText().c_str()); std::string sLineText; float fMax = 0.0f, fLineExtent = 0.0f; diff --git a/Client/gui/CGUILabel_Impl.h b/Client/gui/CGUILabel_Impl.h index 121c7cb3e6..8885b5b20a 100644 --- a/Client/gui/CGUILabel_Impl.h +++ b/Client/gui/CGUILabel_Impl.h @@ -46,4 +46,6 @@ class CGUILabel_Impl : public CGUILabel, public CGUIElement_Impl #define EXCLUDE_SET_TEXT #include "CGUIElement_Inc.h" #undef EXCLUDE_SET_TEXT +private: + CEGUI::TextComponent* m_pLabel; }; diff --git a/Client/gui/CGUIListItem_Impl.cpp b/Client/gui/CGUIListItem_Impl.cpp deleted file mode 100644 index 0a2e8c6569..0000000000 --- a/Client/gui/CGUIListItem_Impl.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIListItem_Impl.cpp - * PURPOSE: List widget item class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -CGUIListItem_Impl::CGUIListItem_Impl(const char* szText, unsigned int uiType, CGUIStaticImage_Impl* pImage) -{ - ItemType = uiType; - - // Create the requested list item type - switch (uiType) - { - case TextItem: - m_pListItem = new CEGUI::ListboxTextItem(CGUI_Impl::GetUTFString(szText)); - break; - case ImageItem: - m_pListItem = new CEGUI::ListboxImageItem(pImage ? pImage->GetDirectImage() : NULL); - break; - case NumberItem: - m_pListItem = new CEGUI::ListboxNumberItem(CGUI_Impl::GetUTFString(szText)); - break; - } - - if (m_pListItem) - { - // Set flags and properties - m_pListItem->setAutoDeleted(false); - m_pListItem->setSelectionBrushImage("CGUI-Images", "ListboxSelectionBrush"); - } - - m_pData = NULL; -} - -CGUIListItem_Impl::~CGUIListItem_Impl() -{ - if (m_deleteDataCallback) - m_deleteDataCallback(m_pData); - delete m_pListItem; -} - -void CGUIListItem_Impl::SetDisabled(bool bDisabled) -{ - reinterpret_cast(m_pListItem)->setDisabled(bDisabled); -} - -void CGUIListItem_Impl::SetFont(const char* szFontName) -{ - if (szFontName) - reinterpret_cast(m_pListItem)->setFont(CEGUI::String(szFontName)); -} - -void CGUIListItem_Impl::SetText(const char* pszText, const char* pszSortText) -{ - m_pListItem->setText(CGUI_Impl::GetUTFString(pszText), pszSortText); -} - -void CGUIListItem_Impl::SetData(const char* pszData) -{ - if (pszData) - { - m_strData = pszData; - m_pData = (void*)m_strData.c_str(); - } - else - { - m_pData = NULL; - } -} - -void CGUIListItem_Impl::SetImage(CGUIStaticImage* pImage) -{ - if (ItemType == ImageItem) - { - CGUIStaticImage_Impl* pImageImpl = (CGUIStaticImage_Impl*)pImage; - reinterpret_cast(m_pListItem)->setImage(pImageImpl ? pImageImpl->GetDirectImage() : NULL); - } -} - -std::string CGUIListItem_Impl::GetText() const -{ - return CGUI_Impl::GetUTFString(m_pListItem->getText().c_str()).c_str(); -} - -CEGUI::ListboxItem* CGUIListItem_Impl::GetListItem() -{ - return m_pListItem; -} - -bool CGUIListItem_Impl::GetSelectedState() -{ - return m_pListItem->isSelected(); -} - -void CGUIListItem_Impl::SetSelectedState(bool bState) -{ - m_pListItem->setSelected(bState); -} - -void CGUIListItem_Impl::SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) -{ - if (ItemType == TextItem) - { - reinterpret_cast(m_pListItem) - ->setTextColours(CEGUI::colour((float)ucRed / 255.0f, (float)ucGreen / 255.0f, (float)ucBlue / 255.0f, (float)ucAlpha / 255.0f)); - } - else if (ItemType == NumberItem) - { - reinterpret_cast(m_pListItem) - ->setTextColours(CEGUI::colour((float)ucRed / 255.0f, (float)ucGreen / 255.0f, (float)ucBlue / 255.0f, (float)ucAlpha / 255.0f)); - } -} - -bool CGUIListItem_Impl::GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) -{ - if (ItemType == TextItem) - { - CEGUI::colour color = reinterpret_cast(m_pListItem)->getTextColours().d_top_left; - ucRed = static_cast(color.getRed() * 255); - ucGreen = static_cast(color.getGreen() * 255); - ucBlue = static_cast(color.getBlue() * 255); - ucAlpha = static_cast(color.getAlpha() * 255); - return true; - } - else if (ItemType == NumberItem) - { - CEGUI::colour color = reinterpret_cast(m_pListItem)->getTextColours().d_top_left; - ucRed = static_cast(color.getRed() * 255); - ucGreen = static_cast(color.getGreen() * 255); - ucBlue = static_cast(color.getBlue() * 255); - ucAlpha = static_cast(color.getAlpha() * 255); - return true; - } - return false; -} diff --git a/Client/gui/CGUIMemo_Impl.cpp b/Client/gui/CGUIMemo_Impl.cpp index 61746b29f0..a05ae4b0a1 100644 --- a/Client/gui/CGUIMemo_Impl.cpp +++ b/Client/gui/CGUIMemo_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUIMEMO_NAME "CGUI/MultiLineEditbox" +#define CGUIMEMO_NAME "MultiLineEditbox" CGUIMemo_Impl::CGUIMemo_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szEdit) { @@ -22,7 +22,7 @@ CGUIMemo_Impl::CGUIMemo_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIMEMO_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIMEMO_NAME, szUnique); m_pWindow->setDestroyedByParent(false); // Store the pointer to this CGUI element in the CEGUI element @@ -78,22 +78,22 @@ bool CGUIMemo_Impl::IsReadOnly() void CGUIMemo_Impl::EnsureCaratIsVisible() { CEGUI::MultiLineEditbox* wndMemo = reinterpret_cast(m_pWindow); - wndMemo->setCaratIndex((wndMemo->getText()).length()); + wndMemo->setCaretIndex((wndMemo->getText()).length()); } unsigned int CGUIMemo_Impl::GetCaretIndex() { - return static_cast(reinterpret_cast(m_pWindow)->getCaratIndex()); + return static_cast(reinterpret_cast(m_pWindow)->getCaretIndex()); } void CGUIMemo_Impl::SetCaretIndex(unsigned int uiIndex) { - reinterpret_cast(m_pWindow)->setCaratIndex(uiIndex); + reinterpret_cast(m_pWindow)->setCaretIndex(uiIndex); } float CGUIMemo_Impl::GetVerticalScrollPosition() { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_vertScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); if (pScrollbar) { return pScrollbar->getScrollPosition(); @@ -104,7 +104,7 @@ float CGUIMemo_Impl::GetVerticalScrollPosition() void CGUIMemo_Impl::SetVerticalScrollPosition(float fPosition) { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_vertScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); if (pScrollbar) { pScrollbar->setScrollPosition(fPosition); @@ -118,7 +118,7 @@ float CGUIMemo_Impl::GetMaxVerticalScrollPosition() float CGUIMemo_Impl::GetScrollbarDocumentSize() { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_vertScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); if (pScrollbar) { return pScrollbar->getDocumentSize(); @@ -129,7 +129,7 @@ float CGUIMemo_Impl::GetScrollbarDocumentSize() float CGUIMemo_Impl::GetScrollbarPageSize() { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->d_vertScrollbar; + CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); if (pScrollbar) { return pScrollbar->getPageSize(); @@ -145,12 +145,12 @@ void CGUIMemo_Impl::SetSelection(unsigned int uiStart, unsigned int uiEnd) unsigned int CGUIMemo_Impl::GetSelectionStart() { - return static_cast(reinterpret_cast(m_pWindow)->getSelectionStartIndex()); + return static_cast(reinterpret_cast(m_pWindow)->getSelectionStart()); } unsigned int CGUIMemo_Impl::GetSelectionEnd() { - return static_cast(reinterpret_cast(m_pWindow)->getSelectionEndIndex()); + return static_cast(reinterpret_cast(m_pWindow)->getSelectionEnd()); } unsigned int CGUIMemo_Impl::GetSelectionLength() @@ -185,7 +185,7 @@ bool CGUIMemo_Impl::Event_TextChanged(const CEGUI::EventArgs& e) bool CGUIMemo_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) { const CEGUI::KeyEventArgs& KeyboardArgs = reinterpret_cast(e); - if (KeyboardArgs.scancode == CGUIKeys::Tab) + if ((CGUIKeys::Scan)KeyboardArgs.d_key == CGUIKeys::Scan::Tab) { // tab pressed, if we are in a window with tab enabled, just switch to the next element if (GetParent() == NULL) diff --git a/Client/gui/CGUIMessageBox_Impl.h b/Client/gui/CGUIMessageBox_Impl.h index 5c4bf7e3f8..05e419864d 100644 --- a/Client/gui/CGUIMessageBox_Impl.h +++ b/Client/gui/CGUIMessageBox_Impl.h @@ -31,7 +31,7 @@ class CGUIMessageBox_Impl : public CGUIMessageBox void SetClickHandler(GUI_CALLBACK Callback); - CGUIWindow* GetWindow(); + ::CGUIWindow* GetWindow(); private: bool OnResponseHandler(CGUIElement* pElement); diff --git a/Client/gui/CGUIProgressBar_Impl.cpp b/Client/gui/CGUIProgressBar_Impl.cpp index 113afc5fa9..643bb5da6a 100644 --- a/Client/gui/CGUIProgressBar_Impl.cpp +++ b/Client/gui/CGUIProgressBar_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUILABEL_NAME "CGUI/ProgressBar" +#define CGUILABEL_NAME "ProgressBar" CGUIProgressBar_Impl::CGUIProgressBar_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) { @@ -22,7 +22,7 @@ CGUIProgressBar_Impl::CGUIProgressBar_Impl(CGUI_Impl* pGUI, CGUIElement* pParent pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUILABEL_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUILABEL_NAME, szUnique); m_pWindow->setDestroyedByParent(false); // Store the pointer to this CGUI element in the CEGUI element diff --git a/Client/gui/CGUIRadioButton_Impl.cpp b/Client/gui/CGUIRadioButton_Impl.cpp index dee554707d..d7dddfbe58 100644 --- a/Client/gui/CGUIRadioButton_Impl.cpp +++ b/Client/gui/CGUIRadioButton_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUIRADIOBUTTON_NAME "CGUI/RadioButton" +#define CGUIRADIOBUTTON_NAME "RadioButton" CGUIRadioButton_Impl::CGUIRadioButton_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption) { @@ -22,12 +22,12 @@ CGUIRadioButton_Impl::CGUIRadioButton_Impl(CGUI_Impl* pGUI, CGUIElement* pParent pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIRADIOBUTTON_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIRADIOBUTTON_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); + m_pWindow->setText(szCaption); - m_pWindow->setSize(CEGUI::Absolute, CEGUI::Size(128.0f, 16.0f)); + m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 16.0f)); m_pWindow->setVisible(true); // Store the pointer to this CGUI element in the CEGUI element diff --git a/Client/gui/CGUIScrollBar_Impl.cpp b/Client/gui/CGUIScrollBar_Impl.cpp index 07e8cc61ad..06d006f0ba 100644 --- a/Client/gui/CGUIScrollBar_Impl.cpp +++ b/Client/gui/CGUIScrollBar_Impl.cpp @@ -11,8 +11,8 @@ #include "StdInc.h" -#define CGUISCROLLBAR_HORIZONTAL_NAME "CGUI/HorizontalScrollbar" -#define CGUISCROLLBAR_VERTICAL_NAME "CGUI/VerticalScrollbar" +#define CGUISCROLLBAR_HORIZONTAL_NAME "HorizontalScrollbar" +#define CGUISCROLLBAR_VERTICAL_NAME "VerticalScrollbar" CGUIScrollBar_Impl::CGUIScrollBar_Impl(CGUI_Impl* pGUI, bool bHorizontal, CGUIElement* pParent) { @@ -23,7 +23,7 @@ CGUIScrollBar_Impl::CGUIScrollBar_Impl(CGUI_Impl* pGUI, bool bHorizontal, CGUIEl pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(bHorizontal ? CGUISCROLLBAR_HORIZONTAL_NAME : CGUISCROLLBAR_VERTICAL_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(bHorizontal ? pGUI->GetElementPrefix() + "/" + CGUISCROLLBAR_HORIZONTAL_NAME : pGUI->GetElementPrefix() + "/" + CGUISCROLLBAR_VERTICAL_NAME, szUnique); m_pWindow->setDestroyedByParent(false); // Store the pointer to this CGUI element in the CEGUI element diff --git a/Client/gui/CGUIScrollPane_Impl.cpp b/Client/gui/CGUIScrollPane_Impl.cpp index 2849308aa1..5c25cc38ac 100644 --- a/Client/gui/CGUIScrollPane_Impl.cpp +++ b/Client/gui/CGUIScrollPane_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUISCROLLPANE_NAME "CGUI/ScrollablePane" +#define CGUISCROLLPANE_NAME "ScrollablePane" CGUIScrollPane_Impl::CGUIScrollPane_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) { @@ -25,9 +25,9 @@ CGUIScrollPane_Impl::CGUIScrollPane_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUISCROLLPANE_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUISCROLLPANE_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setRect(CEGUI::Relative, CEGUI::Rect(0.9f, 0.9f, 0.9f, 0.9f)); + m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0))); // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); @@ -54,12 +54,12 @@ CGUIScrollPane_Impl::~CGUIScrollPane_Impl() void CGUIScrollPane_Impl::SetHorizontalScrollBar(bool bEnabled) { - reinterpret_cast(m_pWindow)->setShowHorzScrollbar(bEnabled); + reinterpret_cast(m_pWindow)->setAlwaysShowHorizontalScrollbar(bEnabled); } void CGUIScrollPane_Impl::SetVerticalScrollBar(bool bEnabled) { - reinterpret_cast(m_pWindow)->setShowVertScrollbar(bEnabled); + reinterpret_cast(m_pWindow)->setAlwaysShowVerticalScrollbar(bEnabled); } void CGUIScrollPane_Impl::SetHorizontalScrollPosition(float fPosition) @@ -67,8 +67,8 @@ void CGUIScrollPane_Impl::SetHorizontalScrollPosition(float fPosition) try { CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - float fFullWidth = pScrollPane->getContentPaneArea().getWidth(); - float fViewWidth = pScrollPane->getAbsoluteWidth(); + float fFullWidth = pScrollPane->getContentPane()->getWidth().d_offset; + float fViewWidth = pScrollPane->getWidth().d_offset; pScrollPane->setHorizontalScrollPosition(fPosition * ((fFullWidth - fViewWidth) / fFullWidth)); } @@ -82,8 +82,8 @@ void CGUIScrollPane_Impl::SetVerticalScrollPosition(float fPosition) try { CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - float fFullHeight = pScrollPane->getContentPaneArea().getHeight(); - float fViewHeight = pScrollPane->getAbsoluteHeight(); + float fFullHeight = pScrollPane->getContentPane()->getHeight().d_offset; + float fViewHeight = pScrollPane->getHeight().d_offset; pScrollPane->setVerticalScrollPosition(fPosition * ((fFullHeight - fViewHeight) / fFullHeight)); } @@ -98,8 +98,8 @@ float CGUIScrollPane_Impl::GetHorizontalScrollPosition() { CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - float fFullWidth = pScrollPane->getContentPaneArea().getWidth(); - float fViewWidth = pScrollPane->getAbsoluteWidth(); + float fFullWidth = pScrollPane->getContentPane()->getWidth().d_offset; + float fViewWidth = pScrollPane->getWidth().d_offset; // Prevent division by zero if (fFullWidth == fViewWidth) @@ -119,8 +119,8 @@ float CGUIScrollPane_Impl::GetVerticalScrollPosition() { CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - float fFullHeight = pScrollPane->getContentPaneArea().getHeight(); - float fViewHeight = pScrollPane->getAbsoluteHeight(); + float fFullHeight = pScrollPane->getContentPane()->getHeight().d_offset; + float fViewHeight = pScrollPane->getHeight().d_offset; // Prevent division by zero if (fFullHeight == fViewHeight) diff --git a/Client/gui/CGUIStandardItem_Impl.cpp b/Client/gui/CGUIStandardItem_Impl.cpp new file mode 100644 index 0000000000..5e19ba49de --- /dev/null +++ b/Client/gui/CGUIStandardItem_Impl.cpp @@ -0,0 +1,131 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: gui/CGUIStandardItem_Impl.cpp + * PURPOSE: List widget item class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "CEGUI/widgets/Combobox.h" + +// Define custom ListboxItem stuff +//namespace CEGUI +//{ +// CEGUI_DEFINE_WINDOW_FACTORY(ImageListboxItem) +// const String ImageListboxItem::WidgetTypeName("CEGUI/CheckListboxItem"); +// ImageListboxItem::ImageListboxItem(const String &type, const String &name) : +// CEGUI::ItemEntry(type, name) +// { +// } +// ImageListboxItem::~ImageListboxItem() +// { +// } +//} + +CGUIStandardItem_Impl::CGUIStandardItem_Impl(CGUI_Impl* pGUI, const char* szText, unsigned int uiType, CGUIStaticImage_Impl* pImage) +{ + ItemType = uiType; + + // Get an unique identifier for CEGUI + char szUnique[CGUI_CHAR_SIZE]; + pGUI->GetUniqueName(szUnique); + + // Create the requested list item type + switch (uiType) + { + case TextItem: + m_pListItem = new CEGUI::StandardItem(CGUI_Impl::GetUTFString(szText)); + break; + case ImageItem: + m_pListItem = new CEGUI::StandardItem(CGUI_Impl::GetUTFString(szText)); + //m_pListItem = reinterpret_cast(pGUI->GetWindowManager()->createWindow("CGUI/ImageListboxItem", szUnique)); + break; + case NumberItem: + m_pListItem = new CEGUI::StandardItem(CGUI_Impl::GetUTFString(szText)); + break; + } + + m_pData = NULL; +} + +CGUIStandardItem_Impl::~CGUIStandardItem_Impl() +{ + if (m_deleteDataCallback) + m_deleteDataCallback(m_pData); + delete m_pListItem; +} + +void CGUIStandardItem_Impl::SetDisabled(bool bDisabled) +{ + reinterpret_cast(m_pListItem)->setDisabled(bDisabled); +} + +void CGUIStandardItem_Impl::SetFont(const char* szFontName) +{ + if (szFontName) + reinterpret_cast(m_pListItem)->setFont(CEGUI::String(szFontName)); +} + +void CGUIStandardItem_Impl::SetText(const char* pszText, const char* pszSortText) +{ + m_pListItem->setText(CGUI_Impl::GetUTFString(pszText)); +} + +void CGUIStandardItem_Impl::SetData(const char* pszData) +{ + if (pszData) + { + m_strData = pszData; + m_pData = (void*)m_strData.c_str(); + } + else + { + m_pData = NULL; + } +} + +void CGUIStandardItem_Impl::SetImage(CGUIStaticImage* pImage) +{ + if (ItemType == ImageItem) + { + //CGUIStaticImage_Impl* pImageImpl = (CGUIStaticImage_Impl*)pImage; + //m_pListItem->setImage(pImageImpl ? pImageImpl->GetDirectImage() : NULL); + } +} + +std::string CGUIStandardItem_Impl::GetText() const +{ + return (const char*)CGUI_Impl::GetUTFString((const char*)m_pListItem->getText().c_str()).c_str(); +} + +CEGUI::StandardItem* CGUIStandardItem_Impl::GetListItem() +{ + return m_pListItem; +} + +void CGUIStandardItem_Impl::SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) +{ + if (ItemType == TextItem || ItemType == NumberItem) + { + reinterpret_cast(m_pListItem) + ->setTextColours(CEGUI::Colour((float)ucRed / 255.0f, (float)ucGreen / 255.0f, (float)ucBlue / 255.0f, (float)ucAlpha / 255.0f)); + } +} + +bool CGUIStandardItem_Impl::GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) +{ + if (ItemType == TextItem || ItemType == NumberItem) + { + CEGUI::Colour color = reinterpret_cast(m_pListItem)->getTextColours().d_top_left; + ucRed = static_cast(color.getRed() * 255); + ucGreen = static_cast(color.getGreen() * 255); + ucBlue = static_cast(color.getBlue() * 255); + ucAlpha = static_cast(color.getAlpha() * 255); + return true; + } + return false; +} diff --git a/Client/gui/CGUIListItem_Impl.h b/Client/gui/CGUIStandardItem_Impl.h similarity index 62% rename from Client/gui/CGUIListItem_Impl.h rename to Client/gui/CGUIStandardItem_Impl.h index cacc63abfa..35260b9aa2 100644 --- a/Client/gui/CGUIListItem_Impl.h +++ b/Client/gui/CGUIStandardItem_Impl.h @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIListItem_Impl.h + * FILE: gui/CGUIStandardItem_Impl.h * PURPOSE: List widget item class * * Multi Theft Auto is available from http://www.multitheftauto.com/ @@ -11,13 +11,31 @@ #pragma once -#include -#include +#include +#include + +// Create custom ListboxItem types +// namespace CEGUI +//{ +// class ImageListboxItem : public ItemEntry +// { +// protected: +// public: +// ImageListboxItem(const String &type, const String &name); +// virtual ~ImageListboxItem(); +// static const String WidgetTypeName; +// }; +// CEGUI_DECLARE_WINDOW_FACTORY(ImageListboxItem); +//} + +namespace CEGUI +{ + class ComboBox; +} -class CGUIStaticImage; class CGUIStaticImage_Impl; -class CGUIListItem_Impl : public CGUIListItem +class CGUIStandardItem_Impl : public CGUIStandardItem { public: enum Type @@ -27,8 +45,8 @@ class CGUIListItem_Impl : public CGUIListItem ImageItem = 2 }; - CGUIListItem_Impl(const char* szText = "", unsigned int uiType = 0, CGUIStaticImage_Impl* pImage = NULL); - ~CGUIListItem_Impl(); + CGUIStandardItem_Impl(CGUI_Impl* pGUI, const char* szText = "", unsigned int uiType = 0, CGUIStaticImage_Impl* pImage = NULL); + ~CGUIStandardItem_Impl(); std::string GetText() const; void SetText(const char* pszText, const char* pszSortText = NULL); @@ -45,19 +63,17 @@ class CGUIListItem_Impl : public CGUIListItem void SetFont(const char* szFontName); void SetImage(CGUIStaticImage* Image); - bool GetSelectedState(); - void SetSelectedState(bool bState); - bool GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha); void SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha); - CEGUI::ListboxItem* GetListItem(); + CEGUI::StandardItem* GetListItem(); unsigned int ItemType; private: - CEGUI::ListboxItem* m_pListItem; + CEGUI::StandardItem* m_pListItem; void* m_pData; std::string m_strData; CGUICallback m_deleteDataCallback; + CEGUI::GenericItem* m_comboBox; }; diff --git a/Client/gui/CGUIStaticImage_Impl.cpp b/Client/gui/CGUIStaticImage_Impl.cpp index 0151e9aa2a..f1d46cf7a1 100644 --- a/Client/gui/CGUIStaticImage_Impl.cpp +++ b/Client/gui/CGUIStaticImage_Impl.cpp @@ -10,29 +10,31 @@ *****************************************************************************/ #include "StdInc.h" +#include "CEGUI/RendererModules/Direct3D9/Renderer.h" -#define CGUISTATICIMAGE_NAME "CGUI/StaticImage" +#define CGUISTATICIMAGE_NAME "StaticImage" CGUIStaticImage_Impl::CGUIStaticImage_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) { // Initialize - m_pImagesetManager = pGUI->GetImageSetManager(); - m_pImageset = NULL; + m_pImagesetManager = pGUI->GetImageManager(); m_pImage = NULL; + m_pTexture = NULL; m_pGUI = pGUI; m_pManager = pGUI; - m_pTexture = NULL; - m_bCreatedTexture = false; // Get an unique identifier for CEGUI char szUnique[CGUI_CHAR_SIZE]; pGUI->GetUniqueName(szUnique); // Create the control and set default properties - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUISTATICIMAGE_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUISTATICIMAGE_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setRect(CEGUI::Relative, CEGUI::Rect(0.0f, 0.0f, 1.0f, 1.0f)); - reinterpret_cast(m_pWindow)->setBackgroundEnabled(false); + m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.0f, 0), CEGUI::UDim(1.0f, 0), CEGUI::UDim(1.0f, 0))); + m_pWindow->setProperty("BackgroundEnabled", "False"); + + // Make sure frame is disabled + SetFrameEnabled(false); // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); @@ -61,35 +63,47 @@ CGUIStaticImage_Impl::~CGUIStaticImage_Impl() bool CGUIStaticImage_Impl::LoadFromFile(const char* szFilename, const char* szResourceGroup) { - // Load texture - if (!m_pTexture) + // Ensure we don't already have an image + Clear(); + + // Check if the image already exists and load it + if (m_pImagesetManager->isDefined(szFilename)) + m_pImage = dynamic_cast(&m_pImagesetManager->get(szFilename)); + else { - m_pTexture = new CGUITexture_Impl(m_pGUI); - m_bCreatedTexture = true; + // Define a new image in the ImageManager + try + { + m_pImagesetManager->addBitmapImageFromFile(szFilename, szFilename, szResourceGroup); + } + catch (CEGUI::Exception e) + { + printf("why?"); + } + + // Failed to create image + if (!m_pImagesetManager->isDefined(szFilename)) + return false; + + // Get the image from the image manager and cast to BasicImage + m_pImage = dynamic_cast(&m_pImagesetManager->get(szFilename)); } - if (!m_pTexture->LoadFromFile(szFilename)) - return false; + // Set image to window + m_pWindow->setProperty("Image", szFilename); - // Load image - return LoadFromTexture(m_pTexture); + return true; } bool CGUIStaticImage_Impl::LoadFromTexture(CGUITexture* pTexture) { - if (m_pImageset && m_pImage) - { - m_pImageset->undefineAllImages(); - } + // Ensure we don't already have an image + Clear(); if (m_pTexture && pTexture != m_pTexture) { - if (m_bCreatedTexture) - { - delete m_pTexture; - m_pTexture = NULL; - m_bCreatedTexture = false; - } + delete m_pTexture; + m_pTexture = NULL; } m_pTexture = (CGUITexture_Impl*)pTexture; @@ -97,27 +111,22 @@ bool CGUIStaticImage_Impl::LoadFromTexture(CGUITexture* pTexture) // Get CEGUI texture CEGUI::Texture* pCEGUITexture = m_pTexture->GetTexture(); - // Get an unique identifier for CEGUI for the imageset + // Get an unique identifier for CEGUI for the image char szUnique[CGUI_CHAR_SIZE]; m_pGUI->GetUniqueName(szUnique); - // Create an imageset - if (!m_pImageset) - { - while (m_pImagesetManager->isImagesetPresent(szUnique)) - m_pGUI->GetUniqueName(szUnique); - m_pImageset = m_pImagesetManager->createImageset(szUnique, pCEGUITexture, true); - } + // Define a new image in the ImageManager + m_pImage = dynamic_cast(&m_pImagesetManager->create("BitmapImage", szUnique)); - // Get an unique identifier for CEGUI for the image - m_pGUI->GetUniqueName(szUnique); + // Set the texture of the created image + m_pImage->setTexture(pCEGUITexture); - // Define an image and get its pointer - m_pImageset->defineImage(szUnique, CEGUI::Point(0, 0), CEGUI::Size(pCEGUITexture->getWidth(), pCEGUITexture->getHeight()), CEGUI::Point(0, 0)); - m_pImage = &m_pImageset->getImage(szUnique); + // Set the image size based on texture + auto& size = pCEGUITexture->getSize(); + m_pImage->setImageArea(CEGUI::Rectf(0.0f, size.d_width, size.d_height, 0.0f)); - // Set the image just loaded as the image to be drawn for the widget - reinterpret_cast(m_pWindow)->setImage(m_pImage); + // Set image to window + m_pWindow->setProperty("Image", szUnique); // Success return true; @@ -125,55 +134,42 @@ bool CGUIStaticImage_Impl::LoadFromTexture(CGUITexture* pTexture) void CGUIStaticImage_Impl::Clear() { - // Stop the control from using it - reinterpret_cast(m_pWindow)->setImage(NULL); + if (!m_pImage) + return; - // Kill the images - if (m_pImageset) - { - m_pImageset->undefineAllImages(); - m_pImagesetManager->destroyImageset(m_pImageset); - if (m_bCreatedTexture) - { - delete m_pTexture; - m_pTexture = NULL; - m_bCreatedTexture = false; - } - m_pImage = NULL; - m_pImageset = NULL; - } + //m_pImagesetManager->destroy(m_pImage->getName()); } bool CGUIStaticImage_Impl::GetNativeSize(CVector2D& vecSize) { - if (m_pTexture) - { - if (m_pTexture->GetTexture()) - { - vecSize.fX = m_pTexture->GetTexture()->getWidth(); - vecSize.fY = m_pTexture->GetTexture()->getHeight(); - return true; - } - } - return false; + if (!m_pTexture && !m_pImage) + return false; + + const CEGUI::Sizef* size = m_pTexture ? &m_pTexture->GetTexture()->getSize() : &m_pImage->getRenderedSize(); + + vecSize.fX = size->d_width; + vecSize.fY = size->d_height; + + return true; } void CGUIStaticImage_Impl::SetFrameEnabled(bool bFrameEnabled) { - reinterpret_cast(m_pWindow)->setFrameEnabled(bFrameEnabled); + m_pWindow->setProperty("FrameEnabled", bFrameEnabled ? "True" : "False"); } bool CGUIStaticImage_Impl::IsFrameEnabled() { - return reinterpret_cast(m_pWindow)->isFrameEnabled(); + return m_pWindow->getProperty("FrameEnabled") == "True" ? true : false; } CEGUI::Image* CGUIStaticImage_Impl::GetDirectImage() { - return const_cast(reinterpret_cast(m_pWindow)->getImage()); + return m_pImage; } +/* Unused? */ void CGUIStaticImage_Impl::Render() { - return reinterpret_cast(m_pWindow)->render(); + return m_pWindow->draw(); } diff --git a/Client/gui/CGUIStaticImage_Impl.h b/Client/gui/CGUIStaticImage_Impl.h index 10526aa283..7af960ac1e 100644 --- a/Client/gui/CGUIStaticImage_Impl.h +++ b/Client/gui/CGUIStaticImage_Impl.h @@ -38,12 +38,10 @@ class CGUIStaticImage_Impl : public CGUIStaticImage, public CGUIElement_Impl, pu eCGUIType GetType() { return CGUI_STATICIMAGE; } private: - class CGUI_Impl* m_pGUI; - bool m_bCreatedTexture; - CGUITexture_Impl* m_pTexture; - CEGUI::ImagesetManager* m_pImagesetManager; - CEGUI::Imageset* m_pImageset; - const CEGUI::Image* m_pImage; + CGUI_Impl* m_pGUI; + CGUITexture_Impl* m_pTexture; + CEGUI::BitmapImage* m_pImage; + CEGUI::ImageManager* m_pImagesetManager; #include "CGUIElement_Inc.h" }; diff --git a/Client/gui/CGUITabPanel_Impl.cpp b/Client/gui/CGUITabPanel_Impl.cpp index 8ad196a467..c3ed4bde5c 100644 --- a/Client/gui/CGUITabPanel_Impl.cpp +++ b/Client/gui/CGUITabPanel_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUITABPANEL_NAME "CGUI/TabControl" +#define CGUITABPANEL_NAME "TabControl" CGUITabPanel_Impl::CGUITabPanel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) { @@ -25,10 +25,11 @@ CGUITabPanel_Impl::CGUITabPanel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) pGUI->GetUniqueName(szUnique); // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUITABPANEL_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUITABPANEL_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setRect(CEGUI::Relative, CEGUI::Rect(0.9f, 0.9f, 0.9f, 0.9f)); - reinterpret_cast(m_pWindow)->setAbsoluteTabTextPadding(10.0f); + m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0))); + + dynamic_cast(m_pWindow)->setTabTextPadding(CEGUI::UDim(0, 10.0f)); // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); diff --git a/Client/gui/CGUITab_Impl.cpp b/Client/gui/CGUITab_Impl.cpp index 11e7860bf7..657db66424 100644 --- a/Client/gui/CGUITab_Impl.cpp +++ b/Client/gui/CGUITab_Impl.cpp @@ -36,7 +36,7 @@ CGUITab_Impl::CGUITab_Impl(CGUI_Impl* pGUI, CGUIElement_Impl* pParent, const cha SetParent(pParent); // Adjust the tab button (pParent should be a TabControl!) - reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow)->setAbsoluteTabHeight(24.0f); + reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow)->setTabHeight(CEGUI::UDim(0, 24.0f)); } else { @@ -63,27 +63,27 @@ void CGUITab_Impl::SetVisible(bool bVisible) { CGUIElement_Impl* pParent = static_cast(m_pParent); CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - pControl->getButtonForTabContents(m_pWindow)->setVisible(bVisible); - pControl->requestChildWindowLayout(); + m_pWindow->setVisible(bVisible); + //pControl->requestChildWindowLayout(); } bool CGUITab_Impl::IsVisible() { CGUIElement_Impl* pParent = static_cast(m_pParent); CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - return pControl->getButtonForTabContents(m_pWindow)->isVisible(); + return m_pWindow->isVisible(); } void CGUITab_Impl::SetEnabled(bool bEnabled) { CGUIElement_Impl* pParent = static_cast(m_pParent); CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - pControl->getButtonForTabContents(m_pWindow)->setEnabled(bEnabled); + m_pWindow->setEnabled(bEnabled); } bool CGUITab_Impl::IsEnabled() { CGUIElement_Impl* pParent = static_cast(m_pParent); CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - return !pControl->getButtonForTabContents(m_pWindow)->isDisabled(); + return !m_pWindow->isDisabled(); } diff --git a/Client/gui/CGUITexture_Impl.cpp b/Client/gui/CGUITexture_Impl.cpp index 11c38d3b83..2da7c8f22b 100644 --- a/Client/gui/CGUITexture_Impl.cpp +++ b/Client/gui/CGUITexture_Impl.cpp @@ -14,16 +14,21 @@ CGUITexture_Impl::CGUITexture_Impl(CGUI_Impl* pGUI) { // Save the renderer - m_pRenderer = pGUI->GetRenderer(); + m_pRenderer = &pGUI->GetRenderer(); + m_pGUI = pGUI; + + // Get an unique identifier for CEGUI for the texture + char szUnique[CGUI_CHAR_SIZE]; + m_pGUI->GetUniqueName(szUnique); // Create the texture - m_pTexture = m_pRenderer->createTexture(); + m_pTexture = &m_pRenderer->createTexture(szUnique); } CGUITexture_Impl::~CGUITexture_Impl() { if (m_pTexture) - m_pRenderer->destroyTexture(m_pTexture); + m_pRenderer->destroyTexture(*m_pTexture); } bool CGUITexture_Impl::LoadFromFile(const char* szFilename, const char* szResourceGroup) @@ -31,9 +36,9 @@ bool CGUITexture_Impl::LoadFromFile(const char* szFilename, const char* szResour // Try to load it try { - m_pTexture->loadFromFile(szFilename, ""); + m_pTexture->loadFromFile(szFilename, szResourceGroup); } - catch (CEGUI::Exception) + catch (CEGUI::FileIOException) { return false; } @@ -42,14 +47,18 @@ bool CGUITexture_Impl::LoadFromFile(const char* szFilename, const char* szResour void CGUITexture_Impl::LoadFromMemory(const void* pBuffer, unsigned int uiWidth, unsigned int uiHeight) { - m_pTexture->loadFromMemory(pBuffer, uiWidth, uiHeight); + m_pTexture->loadFromMemory(pBuffer, CEGUI::Sizef(uiWidth, uiHeight), CEGUI::Texture::PixelFormat::Rgba); } void CGUITexture_Impl::Clear() { // Destroy the previous texture and recreate it (empty) - m_pRenderer->destroyTexture(m_pTexture); - m_pTexture = m_pRenderer->createTexture(); + m_pRenderer->destroyTexture(*m_pTexture); + + // Get an unique identifier for CEGUI for the texture + char szUnique[CGUI_CHAR_SIZE]; + m_pGUI->GetUniqueName(szUnique); + m_pTexture = &m_pRenderer->createTexture(szUnique); } CEGUI::Texture* CGUITexture_Impl::GetTexture() @@ -64,10 +73,10 @@ void CGUITexture_Impl::SetTexture(CEGUI::Texture* pTexture) LPDIRECT3DTEXTURE9 CGUITexture_Impl::GetD3DTexture() { - return reinterpret_cast(m_pTexture)->getD3DTexture(); + return reinterpret_cast(m_pTexture)->getDirect3D9Texture(); } void CGUITexture_Impl::CreateTexture(unsigned int width, unsigned int height) { - return reinterpret_cast(m_pTexture)->createRenderTarget(width, height); + //return reinterpret_cast(m_pTexture)->createRenderTarget(width, height); } diff --git a/Client/gui/CGUITexture_Impl.h b/Client/gui/CGUITexture_Impl.h index 453a2b73b3..5aa90089e9 100644 --- a/Client/gui/CGUITexture_Impl.h +++ b/Client/gui/CGUITexture_Impl.h @@ -36,6 +36,7 @@ class CGUITexture_Impl : public CGUITexture void CreateTexture(unsigned int width, unsigned int height); private: - CEGUI::Renderer* m_pRenderer; - CEGUI::Texture* m_pTexture; + class CGUI_Impl* m_pGUI; + CEGUI::Direct3D9Renderer* m_pRenderer; + CEGUI::Texture* m_pTexture; }; diff --git a/Client/gui/CGUIWebBrowser_Impl.cpp b/Client/gui/CGUIWebBrowser_Impl.cpp index 308f2945d0..74cb7185a2 100644 --- a/Client/gui/CGUIWebBrowser_Impl.cpp +++ b/Client/gui/CGUIWebBrowser_Impl.cpp @@ -14,22 +14,22 @@ CGUIWebBrowser_Impl::CGUIWebBrowser_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) { // Initialize - m_pImagesetManager = pGUI->GetImageSetManager(); - m_pImageset = nullptr; m_pImage = nullptr; m_pGUI = pGUI; - m_pManager = pGUI; m_pWebView = nullptr; + // Save the renderer + m_pRenderer = &m_pGUI->GetRenderer(); + // Get an unique identifier for CEGUI char szUnique[CGUI_CHAR_SIZE]; pGUI->GetUniqueName(szUnique); // Create the control and set default properties - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIWEBBROWSER_NAME, szUnique); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIWEBBROWSER_NAME, szUnique); m_pWindow->setDestroyedByParent(false); - m_pWindow->setRect(CEGUI::Relative, CEGUI::Rect(0.0f, 0.0f, 1.0f, 1.0f)); - reinterpret_cast(m_pWindow)->setBackgroundEnabled(false); + m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.0f, 0), CEGUI::UDim(1.0f, 0), CEGUI::UDim(1.0f, 0))); + m_pWindow->setProperty("BackgroundEnabled", "false"); // Store the pointer to this CGUI element in the CEGUI element m_pWindow->setUserData(reinterpret_cast(this)); @@ -38,10 +38,10 @@ CGUIWebBrowser_Impl::CGUIWebBrowser_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) // Apply browser events m_pWindow->subscribeEvent(CEGUI::Window::EventMouseButtonDown, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseButtonDown, this)); + m_pWindow->subscribeEvent(CEGUI::Window::EventDoubleClick, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseDoubleClick, this)); m_pWindow->subscribeEvent(CEGUI::Window::EventMouseButtonUp, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseButtonUp, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventMouseDoubleClick, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseDoubleClick, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventMouseMove, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseMove, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventMouseWheel, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseWheel, this)); + m_pWindow->subscribeEvent(CEGUI::Window::EventCursorMove, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseMove, this)); + m_pWindow->subscribeEvent(CEGUI::Window::EventScroll, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseWheel, this)); m_pWindow->subscribeEvent(CEGUI::Window::EventActivated, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_Activated, this)); m_pWindow->subscribeEvent(CEGUI::Window::EventDeactivated, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_Deactivated, this)); @@ -66,72 +66,73 @@ CGUIWebBrowser_Impl::~CGUIWebBrowser_Impl() void CGUIWebBrowser_Impl::Clear() { - // Stop the control from using it - reinterpret_cast(m_pWindow)->setImage(nullptr); - // Kill the images - if (m_pImageset) + if (m_pImage) { - m_pImageset->undefineAllImages(); - m_pImagesetManager->destroyImageset(m_pImageset); + delete m_pImage; m_pImage = nullptr; - m_pImageset = nullptr; + + m_pRenderer->destroyTexture(m_pTexture->getName()); + m_pTexture = nullptr; } } -void CGUIWebBrowser_Impl::LoadFromWebView(CWebViewInterface* pWebView) +void CGUIWebBrowser_Impl::LoadFromWebView(::CWebViewInterface* pWebView) { m_pWebView = pWebView; - if (m_pImageset && m_pImage) - { - m_pImageset->undefineAllImages(); - } + if (m_pImage) + Clear(); - CGUIWebBrowserTexture* pCEGUITexture = new CGUIWebBrowserTexture(m_pGUI->GetRenderer(), m_pWebView); + //CGUIWebBrowserTexture* pCEGUITexture = new CGUIWebBrowserTexture(&m_pGUI->GetRenderer(), m_pWebView, *m_pTexture); // Get an unique identifier for CEGUI for the imageset char szUnique[CGUI_CHAR_SIZE]; m_pGUI->GetUniqueName(szUnique); + m_pTexture = &m_pRenderer->createTexture(szUnique, pWebView->GetTexture()); + + // Set the BasicImage texture + m_pImage->setTexture(m_pTexture); + // Create an imageset - if (!m_pImageset) - { - while (m_pImagesetManager->isImagesetPresent(szUnique)) - m_pGUI->GetUniqueName(szUnique); - m_pImageset = m_pImagesetManager->createImageset(szUnique, pCEGUITexture, true); - } + //if (!m_pImageset) + //{ + // while (m_pImagesetManager->isImagesetPresent(szUnique)) + // m_pGUI->GetUniqueName(szUnique); + // m_pImageset = m_pImagesetManager->createImageset(szUnique, pCEGUITexture, true); + //} // Get an unique identifier for CEGUI for the image m_pGUI->GetUniqueName(szUnique); // Define an image and get its pointer - m_pImageset->defineImage(szUnique, CEGUI::Point(0, 0), CEGUI::Size(pCEGUITexture->getWidth(), pCEGUITexture->getHeight()), CEGUI::Point(0, 0)); - m_pImage = const_cast( - &m_pImageset->getImage(szUnique)); // const_cast here is a huge hack, but is okay here since all images generated here are unique + //m_pImageset->defineImage(szUnique, CEGUI::Point(0, 0), CEGUI::Size(pCEGUITexture->getWidth(), pCEGUITexture->getHeight()), CEGUI::Point(0, 0)); + //m_pImage = const_cast( + // &m_pImageset->getImage(szUnique)); // const_cast here is a huge hack, but is okay here since all images generated here are unique // Set the image just loaded as the image to be drawn for the widget - reinterpret_cast(m_pWindow)->setImage(m_pImage); + //reinterpret_cast(m_pWindow)->setImage(m_pImage); } void CGUIWebBrowser_Impl::SetFrameEnabled(bool bFrameEnabled) { - reinterpret_cast(m_pWindow)->setFrameEnabled(bFrameEnabled); + reinterpret_cast(m_pWindow)->setFrameEnabled(bFrameEnabled); } bool CGUIWebBrowser_Impl::IsFrameEnabled() { - return reinterpret_cast(m_pWindow)->isFrameEnabled(); + return reinterpret_cast(m_pWindow)->isFrameEnabled(); } CEGUI::Image* CGUIWebBrowser_Impl::GetDirectImage() { - return const_cast(reinterpret_cast(m_pWindow)->getImage()); + return m_pImage; } void CGUIWebBrowser_Impl::Render() { - return reinterpret_cast(m_pWindow)->render(); + return m_pWindow->draw(); } bool CGUIWebBrowser_Impl::HasInputFocus() @@ -145,9 +146,11 @@ void CGUIWebBrowser_Impl::SetSize(const CVector2D& vecSize, bool bRelative) CGUIElement_Impl::SetSize(vecSize, bRelative); auto absSize = CGUIElement_Impl::GetSize(false); + CEGUI::Rectf imageSize = CEGUI::Rectf(glm::vec2(0.0f, 0.0f), CEGUI::Sizef(absSize.fX, absSize.fY)); + // Update image area if (m_pImage) - m_pImage->setSourceTextureArea(CEGUI::Rect(0, 0, absSize.fX, absSize.fY)); + m_pImage->setImageArea(imageSize); // Resize underlying web view as well if (m_pWebView) @@ -156,59 +159,60 @@ void CGUIWebBrowser_Impl::SetSize(const CVector2D& vecSize, bool bRelative) bool CGUIWebBrowser_Impl::Event_MouseButtonDown(const CEGUI::EventArgs& e) { - const CEGUI::MouseEventArgs& args = reinterpret_cast(e); + const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - if (args.button == CEGUI::MouseButton::LeftButton) + if (args.d_button == CEGUI::MouseButton::Left) m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT, 1); - else if (args.button == CEGUI::MouseButton::MiddleButton) + else if (args.d_button == CEGUI::MouseButton::Middle) m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE, 1); - else if (args.button == CEGUI::MouseButton::RightButton) + else if (args.d_button == CEGUI::MouseButton::Right) m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT, 1); return true; } -bool CGUIWebBrowser_Impl::Event_MouseButtonUp(const CEGUI::EventArgs& e) +bool CGUIWebBrowser_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& e) { - const CEGUI::MouseEventArgs& args = reinterpret_cast(e); + const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - if (args.button == CEGUI::MouseButton::LeftButton) - m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT); - else if (args.button == CEGUI::MouseButton::MiddleButton) - m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE); - else if (args.button == CEGUI::MouseButton::RightButton) - m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT); + if (args.d_button == CEGUI::MouseButton::Left) + m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT, 2); + else if (args.d_button == CEGUI::MouseButton::Middle) + m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE, 2); + else if (args.d_button == CEGUI::MouseButton::Right) + m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT, 2); return true; } -bool CGUIWebBrowser_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& e) +bool CGUIWebBrowser_Impl::Event_MouseButtonUp(const CEGUI::EventArgs& e) { - const CEGUI::MouseEventArgs& args = reinterpret_cast(e); + const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - if (args.button == CEGUI::MouseButton::LeftButton) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT, 2); - else if (args.button == CEGUI::MouseButton::MiddleButton) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE, 2); - else if (args.button == CEGUI::MouseButton::RightButton) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT, 2); + if (args.d_button == CEGUI::MouseButton::Left) + m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT); + else if (args.d_button == CEGUI::MouseButton::Middle) + m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE); + else if (args.d_button == CEGUI::MouseButton::Right) + m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT); return true; } bool CGUIWebBrowser_Impl::Event_MouseMove(const CEGUI::EventArgs& e) { - const CEGUI::MouseEventArgs& args = reinterpret_cast(e); + const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); + CEGUI::UVector2 position = m_pWindow->getPosition(); - m_pWebView->InjectMouseMove((int)(args.position.d_x - m_pWindow->windowToScreenX(0.0f)), (int)(args.position.d_y - m_pWindow->windowToScreenY(0.0f))); + m_pWebView->InjectMouseMove((int)(args.d_globalPos.x - position.d_x.d_offset), (int)(args.d_globalPos.y - position.d_y.d_offset)); return true; } bool CGUIWebBrowser_Impl::Event_MouseWheel(const CEGUI::EventArgs& e) { - const CEGUI::MouseEventArgs& args = reinterpret_cast(e); + const CEGUI::ScrollEventArgs& args = reinterpret_cast(e); - m_pWebView->InjectMouseWheel((int)(args.wheelChange * 40), 0); + m_pWebView->InjectMouseWheel((int)(args.d_delta * 40), 0); return true; } @@ -224,21 +228,21 @@ bool CGUIWebBrowser_Impl::Event_Deactivated(const CEGUI::EventArgs& e) return true; } -CGUIWebBrowserTexture::CGUIWebBrowserTexture(CEGUI::Renderer* pOwner, CWebViewInterface* pWebView) : CEGUI::DirectX9Texture(pOwner), m_pWebView(pWebView) -{ -} - -ushort CGUIWebBrowserTexture::getWidth() const -{ - return static_cast(m_pWebView->GetSize().fX); -} - -ushort CGUIWebBrowserTexture::getHeight() const -{ - return static_cast(m_pWebView->GetSize().fY); -} - -LPDIRECT3DTEXTURE9 CGUIWebBrowserTexture::getD3DTexture() const -{ - return m_pWebView->GetTexture(); -} +//CGUIWebBrowserTexture::CGUIWebBrowserTexture(CEGUI::Renderer* pOwner, CWebViewInterface* pWebView) : CEGUI::Direct3D9Texture(pOwner), m_pWebView(pWebView) +//{ +//} +// +//ushort CGUIWebBrowserTexture::getWidth() const +//{ +// return static_cast(m_pWebView->GetSize().fX); +//} +// +//ushort CGUIWebBrowserTexture::getHeight() const +//{ +// return static_cast(m_pWebView->GetSize().fY); +//} +// +//LPDIRECT3DTEXTURE9 CGUIWebBrowserTexture::getD3DTexture() const +//{ +// return m_pWebView->GetTexture(); +//} diff --git a/Client/gui/CGUIWebBrowser_Impl.h b/Client/gui/CGUIWebBrowser_Impl.h index c9f2c1aa00..e96b093b90 100644 --- a/Client/gui/CGUIWebBrowser_Impl.h +++ b/Client/gui/CGUIWebBrowser_Impl.h @@ -12,10 +12,9 @@ #include #include "CGUITexture_Impl.h" -#include // Use StaticImage here as we'd have to add the same definition twice to the Falagard definition file otherwise -#define CGUIWEBBROWSER_NAME "StaticImage" +#define CGUIWEBBROWSER_NAME "TaharezLook/StaticImage" class CGUITexture; class CGUITexture_Impl; @@ -53,35 +52,35 @@ class CGUIWebBrowser_Impl : public CGUIWebBrowser, public CGUIElement_Impl bool Event_Deactivated(const CEGUI::EventArgs& e); private: - CGUI_Impl* m_pGUI; - CEGUI::ImagesetManager* m_pImagesetManager; - CEGUI::Imageset* m_pImageset; - CEGUI::Image* m_pImage; + CGUI_Impl* m_pGUI; + CEGUI::BitmapImage* m_pImage; + CEGUI::Texture* m_pTexture; + CEGUI::Direct3D9Renderer* m_pRenderer; - CWebViewInterface* m_pWebView; + ::CWebViewInterface* m_pWebView; - #define EXCLUDE_SET_SIZE // WTF? TODO: Refactor this - #include "CGUIElement_Inc.h" - #undef EXCLUDE_SET_SIZE +#define EXCLUDE_SET_SIZE // WTF? TODO: Refactor this +#include "CGUIElement_Inc.h" +#undef EXCLUDE_SET_SIZE }; // The purpose of this class is to provide an externally managed DirectX texture -class CGUIWebBrowserTexture : public CEGUI::DirectX9Texture -{ -public: - CGUIWebBrowserTexture(CEGUI::Renderer* pOwner, CWebViewInterface* pWebView); - - virtual ushort getWidth() const override; - virtual ushort getHeight() const override; - - // Override with empty function (--> eliminate the functinions from DirectX9Texture) - virtual void loadFromFile(const CEGUI::String& filename, const CEGUI::String& resourceGroup) override{}; - virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight) override{}; - - virtual LPDIRECT3DTEXTURE9 getD3DTexture() const override; - virtual void preD3DReset(){}; - virtual void postD3DReset(){}; - -private: - CWebViewInterface* m_pWebView; -}; +// class CGUIWebBrowserTexture : public CEGUI::Direct3D9Texture +//{ +// public: +// CGUIWebBrowserTexture(CEGUI::Renderer* pOwner, CWebViewInterface* pWebView); +// +// virtual ushort getWidth() const; +// virtual ushort getHeight() const; +// +// // Override with empty function (--> eliminate the functinions from DirectX9Texture) +// virtual void loadFromFile(const CEGUI::String& filename, const CEGUI::String& resourceGroup) override{}; +// virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight) override{}; +// +// virtual LPDIRECT3DTEXTURE9 getD3DTexture() const override; +// virtual void preD3DReset(){}; +// virtual void postD3DReset(){}; +// +// private: +// CWebViewInterface* m_pWebView; +//}; diff --git a/Client/gui/CGUIWindow_Impl.cpp b/Client/gui/CGUIWindow_Impl.cpp index 6936cbdbc9..0830fa3659 100644 --- a/Client/gui/CGUIWindow_Impl.cpp +++ b/Client/gui/CGUIWindow_Impl.cpp @@ -11,7 +11,7 @@ #include "StdInc.h" -#define CGUIWINDOW_NAME "CGUI/FrameWindow" +#define CGUIWINDOW_NAME "FrameWindow" CGUIWindow_Impl::CGUIWindow_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption, const SString& strLayoutFile) { @@ -26,14 +26,14 @@ CGUIWindow_Impl::CGUIWindow_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const ch if (!strLayoutFile.empty()) { // Load from XML file - m_pWindow = pGUI->GetWindowManager()->loadWindowLayout(strLayoutFile); + m_pWindow = pGUI->GetWindowManager()->loadLayoutFromFile(strLayoutFile); } if (!m_pWindow) { // Create new here - m_pWindow = pGUI->GetWindowManager()->createWindow(CGUIWINDOW_NAME, szUnique); - m_pWindow->setRect(CEGUI::Relative, CEGUI::Rect(0.10f, 0.10f, 0.60f, 0.90f)); + m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIWINDOW_NAME, szUnique); + m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.10f, 0), CEGUI::UDim(0.10f, 0), CEGUI::UDim(0.60f, 0), CEGUI::UDim(0.90f, 0))); m_pWindow->setAlpha(0.8f); // Give the window a caption @@ -46,14 +46,17 @@ CGUIWindow_Impl::CGUIWindow_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const ch m_pWindow->setUserData(reinterpret_cast(this)); // Set fixed minimum size to 96x48 - m_pWindow->setMetricsMode(CEGUI::Absolute); - m_pWindow->setMinimumSize(CEGUI::Size(96.0f, 48.0f)); + //m_pWindow->setMetricsMode(CEGUI::Absolute); + m_pWindow->setMinSize(CEGUI::USize(CEGUI::UDim(0, 96.0f), CEGUI::UDim(0, 48.0f))); + + // Don't enable the close button by default + reinterpret_cast(m_pWindow)->setCloseButtonEnabled(false); // Some window specific style options - reinterpret_cast(m_pWindow)->setTitlebarFont("default-bold-small"); + reinterpret_cast(m_pWindow)->getTitlebar()->setFont("default-bold-small"); // Register our events - m_pWindow->subscribeEvent(CEGUI::FrameWindow::EventCloseClicked, CEGUI::Event::Subscriber(&CGUIWindow_Impl::Event_OnCloseClick, this)); + m_pWindow->subscribeEvent(CEGUI::FrameWindow::EventCloseClicked, &CGUIWindow_Impl::Event_OnCloseClick, this); AddEvents(); // Disable rolling up, because we don't need it and it causes a freeze @@ -98,12 +101,12 @@ bool CGUIWindow_Impl::IsSizingEnabled() void CGUIWindow_Impl::SetFrameEnabled(bool bFrameEnabled) { - reinterpret_cast(m_pWindow)->setFrameEnabled(bFrameEnabled); + m_pWindow->setProperty("FrameEnabled", bFrameEnabled ? "True" : "False"); } bool CGUIWindow_Impl::IsFrameEnabled() { - return reinterpret_cast(m_pWindow)->isFrameEnabled(); + return m_pWindow->getProperty("FrameEnabled") == "True" ? true : false; } void CGUIWindow_Impl::SetCloseButtonEnabled(bool bCloseButtonEnabled) diff --git a/Client/gui/CGUI_Impl.cpp b/Client/gui/CGUI_Impl.cpp index 6674ff05cd..f5b18d0fed 100644 --- a/Client/gui/CGUI_Impl.cpp +++ b/Client/gui/CGUI_Impl.cpp @@ -10,65 +10,97 @@ *****************************************************************************/ #include "StdInc.h" -#include "CEGUIExceptions.h" +#include "CEGUI/Exceptions.h" using std::list; -#define CGUI_MTA_DEFAULT_FONT "tahoma.ttf" // %WINDIR%/font/<...> -#define CGUI_MTA_DEFAULT_FONT_BOLD "tahomabd.ttf" // %WINDIR%/font/<...> -#define CGUI_MTA_CLEAR_FONT "verdana.ttf" // %WINDIR%/font/<...> +#define CGUI_MTA_DEFAULT_FONT "tahoma.ttf" // %WINDIR%/font/<...> +#define CGUI_MTA_DEFAULT_FONT_BOLD "tahomabd.ttf" // %WINDIR%/font/<...> +#define CGUI_MTA_CLEAR_FONT "verdana.ttf" // %WINDIR%/font/<...> -#define CGUI_MTA_DEFAULT_REG "Tahoma (TrueType)" -#define CGUI_MTA_DEFAULT_REG_BOLD "Tahoma Bold (TrueType)" -#define CGUI_MTA_CLEAR_REG "Verdana (TrueType)" +#define CGUI_MTA_DEFAULT_REG "Tahoma (TrueType)" +#define CGUI_MTA_DEFAULT_REG_BOLD "Tahoma Bold (TrueType)" +#define CGUI_MTA_CLEAR_REG "Verdana (TrueType)" -#define CGUI_MTA_SUBSTITUTE_FONT "cgui/unifont.ttf" // GTA/MTA/<...> -#define CGUI_MTA_SANS_FONT "cgui/sans.ttf" // GTA/MTA/<...> -#define CGUI_SA_HEADER_FONT "cgui/saheader.ttf" // GTA/MTA/<...> -#define CGUI_SA_GOTHIC_FONT "cgui/sagothic.ttf" // GTA/MTA/<...> -#define CGUI_SA_HEADER_SIZE 26 -#define CGUI_SA_GOTHIC_SIZE 47 -#define CGUI_MTA_SANS_FONT_SIZE 9 +#define CGUI_MTA_SUBSTITUTE_FONT "unifont-5.1.20080907.ttf" // GTA/MTA/<...> +#define CGUI_MTA_SANS_FONT "sans.ttf" // GTA/MTA/<...> +#define CGUI_SA_HEADER_FONT "saheader.ttf" // GTA/MTA/<...> +#define CGUI_SA_GOTHIC_FONT "sagothic.ttf" // GTA/MTA/<...> +#define CGUI_SA_HEADER_SIZE 26 +#define CGUI_SA_GOTHIC_SIZE 47 +#define CGUI_MTA_SANS_FONT_SIZE 9 -const char* const CEGUI_DEFAULT_SKIN_NAME = "Default"; -const char* const CEGUI_ELEMENT_PREFIX = "CGUI"; // e.g CGUI/Button -const char* const CEGUI_IMAGESET_PREFIX = "CGUI-Images"; // e.g CGUI-Images/MouseArrow +const char* CEGUI_DEFAULT_SKIN_NAME = "GWEN"; +const char* CEGUI_ELEMENT_PREFIX = "GWEN"; // e.g CGUI/Button +const char* CEGUI_IMAGESET_PREFIX = "GWEN"; // e.g CGUI-Images/MouseArrow -CGUI_Impl::CGUI_Impl(IDirect3DDevice9* pDevice) : m_HasSchemeLoaded(false), m_fCurrentServerCursorAlpha(1.0f) +CGUI_Impl::CGUI_Impl(IDirect3DDevice9* pDevice) + : m_HasSchemeLoaded(false), + m_fCurrentServerCursorAlpha(1.0f), + m_pRenderer(&CEGUI::Direct3D9Renderer::bootstrapSystem(pDevice, 299990, CalcMTASAPath("MTA").data())) { m_RenderOkTimer.SetMaxIncrement(100); // Init m_pDevice = pDevice; - /* - m_pCharacterKeyHandler = NULL; - m_pKeyDownHandler = NULL; - m_pMouseClickHandler = NULL; - m_pMouseDoubleClickHandler = NULL; - m_pMouseWheelHandler = NULL; - m_pMouseMoveHandler = NULL; - m_pMouseEnterHandler = NULL; - m_pMouseLeaveHandler = NULL; - m_pMovedHandler = NULL; - m_pSizedHandler = NULL; - */ + m_Channel = INPUT_CORE; - // Create a GUI system and get the windowmanager - m_pRenderer = new CEGUI::DirectX9Renderer(pDevice, 0); - m_pSystem = new CEGUI::System(m_pRenderer, CEGUI::String(CalcMTASAPath(PathJoin("MTA", "logs", "CEGUI.log"))).data()); + // Store the pointers for the CEGUI system + m_pSystem = CEGUI::System::getSingletonPtr(); // Get pointers to various stuff from CEGUI singletons m_pFontManager = CEGUI::FontManager::getSingletonPtr(); - m_pImageSetManager = CEGUI::ImagesetManager::getSingletonPtr(); + m_pImageSetManager = CEGUI::ImageManager::getSingletonPtr(); m_pSchemeManager = CEGUI::SchemeManager::getSingletonPtr(); m_pWindowManager = CEGUI::WindowManager::getSingletonPtr(); - - SetDefaultGuiWorkingDirectory(CalcMTASAPath("MTA")); - - // Set logging to Informative for debug and Standard for release + m_pWindowFactoryManager = CEGUI::WindowFactoryManager::getSingletonPtr(); + + auto renderMaterial = &m_pRenderer->createRenderMaterial(CEGUI::DefaultShaderType::Solid); + m_pGeometryBuffer = &m_pRenderer->createGeometryBufferColoured(*renderMaterial); + + m_pResourceProvider = m_pSystem->getResourceProvider(); + m_pDefaultResourceProvider = static_cast(m_pSystem->getResourceProvider()); + + m_pDefaultResourceProvider->setResourceGroupDirectory("absolute", ""); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_cgui", CalcMTASAPath("MTA/cgui-0.8.7").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta", CalcMTASAPath("MTA").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_images", CalcMTASAPath("MTA/cgui/images").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_basedir", GetMTASABaseDir().data()); + + // CEGUI layout group directories + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_schemes", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/schemes").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_imagesets", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/imagesets").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_fonts", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/fonts").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_layouts", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/layouts").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_looknfeels", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/looknfeel").data()); + m_pDefaultResourceProvider->setResourceGroupDirectory("mta_xml_schemas", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/xml_schemas").data()); + + // Set the group directories + CEGUI::Scheme::setDefaultResourceGroup("mta_schemes"); + CEGUI::ImageManager::setImagesetDefaultResourceGroup("mta_imagesets"); + CEGUI::WindowManager::setDefaultResourceGroup("mta_layouts"); + CEGUI::Font::setDefaultResourceGroup("mta_fonts"); + CEGUI::WidgetLookManager::setDefaultResourceGroup("mta_looknfeels"); + + // Set XML parser defaults + m_pXMLParser = m_pSystem->getXMLParser(); + + auto resolution = GetResolution(); + CEGUI::TextureTarget* renderTextureTarget = m_pSystem->getRenderer()->createTextureTarget(false); + renderTextureTarget->declareRenderSize(CEGUI::Sizef(resolution.fX, resolution.fY)); + m_pDefaultGUIContext = &m_pSystem->createGUIContext(static_cast(*renderTextureTarget)); + + if (m_pXMLParser->isPropertyPresent("SchemaDefaultResourceGroup")) + m_pXMLParser->setProperty("SchemaDefaultResourceGroup", "mta_xml_schemas"); + + // Declare our custom CEGUI element types in the WindowFactoryManager (like ImageListboxItem) + // m_pWindowFactoryManager->addFactory(&CEGUI::getImageListboxItemFactory()); + // m_pWindowFactoryManager->addFalagardWindowMapping("CGUI/ImageListboxItem", "CEGUI/ItemEntry", "CGUI/ImageListboxItem", "Falagard/ItemEntry"); + + // Set logging to Informative for debug and Standard for release #if defined(_DEBUG) || defined(DEBUG) - CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative); + CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::LoggingLevel::Informative); #else CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Standard); #endif @@ -78,12 +110,11 @@ CGUI_Impl::CGUI_Impl(IDirect3DDevice9* pDevice) : m_HasSchemeLoaded(false), m_fC try { - m_pUniFont = (CGUIFont_Impl*)CreateFnt("unifont", CGUI_MTA_SUBSTITUTE_FONT, 9, 0, false); - m_pFontManager->setSubstituteFont(m_pUniFont->GetFont()); + m_pUniFont = (CGUIFont_Impl*)CreateFnt("unifont", CGUI_MTA_SUBSTITUTE_FONT, 9, 0, false, false); } catch (CEGUI::InvalidRequestException e) { - SString strMessage = e.getMessage().c_str(); + SString strMessage = (const char*)e.getMessage().c_str(); BrowseToSolution("create-fonts", EXIT_GAME_FIRST | ASK_GO_ONLINE, SString("Error loading fonts!\n\n%s", *strMessage)); } @@ -95,20 +126,35 @@ CGUI_Impl::CGUI_Impl(IDirect3DDevice9* pDevice) : m_HasSchemeLoaded(false), m_fC try { - m_pSAHeaderFont = (CGUIFont_Impl*)CreateFnt("sa-header", CGUI_SA_HEADER_FONT, CGUI_SA_HEADER_SIZE, 0, true); - m_pSAGothicFont = (CGUIFont_Impl*)CreateFnt("sa-gothic", CGUI_SA_GOTHIC_FONT, CGUI_SA_GOTHIC_SIZE, 0, true); - m_pSansFont = (CGUIFont_Impl*)CreateFnt("sans", CGUI_MTA_SANS_FONT, CGUI_MTA_SANS_FONT_SIZE, 0, false); + m_pSAHeaderFont = (CGUIFont_Impl*)CreateFnt("sa-header", CGUI_SA_HEADER_FONT, CGUI_SA_HEADER_SIZE, 0, true, false); + m_pSAGothicFont = (CGUIFont_Impl*)CreateFnt("sa-gothic", CGUI_SA_GOTHIC_FONT, CGUI_SA_GOTHIC_SIZE, 0, true, false); + m_pSansFont = (CGUIFont_Impl*)CreateFnt("sans", CGUI_MTA_SANS_FONT, CGUI_MTA_SANS_FONT_SIZE, 0, false, false); } catch (CEGUI::InvalidRequestException e) { - SString strMessage = e.getMessage().c_str(); + SString strMessage = (const char*)e.getMessage().c_str(); BrowseToSolution("create-fonts", EXIT_GAME_FIRST | ASK_GO_ONLINE, SString("Error loading fonts!\n\n%s", *strMessage)); } } -CGUI_Impl::~CGUI_Impl() +void CGUI_Impl::destroy() +{ + m_pSystem->destroy(); +} + +SString CGUI_Impl::GetDefaultSkinName() +{ + return CEGUI_DEFAULT_SKIN_NAME; +} + +SString CGUI_Impl::GetElementPrefix() +{ + return CEGUI_ELEMENT_PREFIX; +} + +SString CGUI_Impl::GetImagesetPrefix() { - delete CEGUI::System::getSingletonPtr(); + return CEGUI_IMAGESET_PREFIX; } void CGUI_Impl::SetSkin(const char* szName) @@ -116,34 +162,34 @@ void CGUI_Impl::SetSkin(const char* szName) if (m_HasSchemeLoaded) { CEGUI::GlobalEventSet::getSingletonPtr()->removeAllEvents(); - CEGUI::SchemeManager::getSingleton().unloadScheme(m_CurrentSchemeName); + m_pSchemeManager->destroy(m_CurrentScheme->getName().c_str()); } - PushGuiWorkingDirectory(CalcMTASAPath(PathJoin("skins", szName))); + std::string schemeFileName = szName; + schemeFileName += ".scheme"; - CEGUI::Scheme* scheme = CEGUI::SchemeManager::getSingleton().loadScheme("CGUI.xml"); - m_CurrentSchemeName = scheme->getName().c_str(); - m_HasSchemeLoaded = true; + m_CurrentScheme = &m_pSchemeManager->createFromFile(schemeFileName.c_str(), "mta_schemes"); - PopGuiWorkingDirectory(); + m_HasSchemeLoaded = true; - CEGUI::System::getSingleton().setDefaultMouseCursor("CGUI-Images", "MouseArrow"); + m_pDefaultGUIContext->setDefaultCursorImage(GetImagesetPrefix() + "/Scroller.ButtonV.Normal.Top"); + // m_pSystem->getSingleton().getDefaultGUIContext().setDefaultTooltipType(GetElementPrefix() + "/Tooltip"); // Destroy any windows we already have - CEGUI::WindowManager::getSingleton().destroyAllWindows(); + m_pWindowManager->destroyAllWindows(); // Create dummy GUI root - m_pTop = reinterpret_cast(m_pWindowManager->createWindow("DefaultWindow", "guiroot")); - m_pSystem->setGUISheet(m_pTop); + m_pTop = m_pWindowManager->createWindow("DefaultWindow", "guiroot"); + m_pDefaultGUIContext->setRootWindow(m_pTop); // Disable single click timeouts - m_pSystem->setSingleClickTimeout(100000000.0f); + m_pDefaultGUIContext->setMouseButtonMultiClickTimeout(100000000.0f); // Set our default font - m_pSystem->setDefaultFont(m_pDefaultFont->GetFont()); + m_pDefaultGUIContext->setDefaultFont(m_pDefaultFont->GetFont()); // Grab our default cursor - m_pCursor = m_pSystem->getDefaultMouseCursor(); + m_pCursor = m_pDefaultGUIContext->getDefaultCursorImage(); // Used to create unique names for widget instances m_ulPreviousUnique = 0; @@ -151,12 +197,15 @@ void CGUI_Impl::SetSkin(const char* szName) SubscribeToMouseEvents(); // Disallow input routing to the GUI unless edit box has focus - m_eInputMode = INPUTMODE_NO_BINDS_ON_EDIT; + m_eInputMode = eInputMode::INPUTMODE_NO_BINDS_ON_EDIT; + + // The transfer box is not visible by default + m_bTransferBoxVisible = false; } void CGUI_Impl::SetBidiEnabled(bool bEnabled) { - m_pSystem->SetBidiEnabled(bEnabled); + // m_pSystem->SetBidiEnabled(bEnabled); } void CGUI_Impl::SubscribeToMouseEvents() @@ -166,29 +215,30 @@ void CGUI_Impl::SubscribeToMouseEvents() pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCharacterKey, CEGUI::Event::Subscriber(&CGUI_Impl::Event_CharacterKey, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventKeyDown, CEGUI::Event::Subscriber(&CGUI_Impl::Event_KeyDown, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseClick, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseClick, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseDoubleClick, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseDoubleClick, this)); + pEvents->subscribeEvent("Window/" + CEGUI::Window::EventClick, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseClick, this)); + pEvents->subscribeEvent("Window/" + CEGUI::Window::EventDoubleClick, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseDoubleClick, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseButtonDown, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseButtonDown, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseButtonUp, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseButtonUp, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseWheel, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseWheel, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseMove, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseMove, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseEnters, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseEnter, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseLeaves, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseLeave, this)); + pEvents->subscribeEvent("Window/" + CEGUI::Window::EventScroll, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseWheel, this)); + pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCursorMove, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseMove, this)); + pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCursorEntersArea, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseEnter, this)); + pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCursorLeavesArea, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseLeave, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMoved, CEGUI::Event::Subscriber(&CGUI_Impl::Event_Moved, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventSized, CEGUI::Event::Subscriber(&CGUI_Impl::Event_Sized, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventRedrawRequested, CEGUI::Event::Subscriber(&CGUI_Impl::Event_RedrawRequested, this)); + // pEvents->subscribeEvent("Window/" + CEGUI::Window::EventRedrawRequested, CEGUI::Event::Subscriber(&CGUI_Impl::Event_RedrawRequested, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventActivated, CEGUI::Event::Subscriber(&CGUI_Impl::Event_FocusGained, this)); pEvents->subscribeEvent("Window/" + CEGUI::Window::EventDeactivated, CEGUI::Event::Subscriber(&CGUI_Impl::Event_FocusLost, this)); } CVector2D CGUI_Impl::GetResolution() { - return CVector2D(m_pRenderer->getWidth(), m_pRenderer->getHeight()); + CEGUI::Sizef pResolution = m_pRenderer->getDisplaySize(); + return CVector2D(pResolution.d_width, pResolution.d_height); } void CGUI_Impl::SetResolution(float fWidth, float fHeight) { - reinterpret_cast(m_pRenderer)->setDisplaySize(CEGUI::Size(fWidth, fHeight)); + m_pRenderer->setDisplaySize(CEGUI::Sizef(fWidth, fHeight)); } void CGUI_Impl::Draw() @@ -204,66 +254,61 @@ void CGUI_Impl::Draw() m_RedrawQueue.clear(); } - if (!m_pSystem->renderGUI()) - { - if (m_RenderOkTimer.Get() > 4000) - { - // 4 seconds and over 40 failed calls means we have a problem - BrowseToSolution("gui-render", EXIT_GAME_FIRST, "Some sort of DirectX problem has occurred"); - } - } - else - m_RenderOkTimer.Reset(); + m_pSystem->renderAllGUIContexts(); + + // I don't think this is required anymore? There's most likely a better way to catch rendering issues now + // if (!m_pSystem->renderAllGUIContexts()) + //{ + // if (m_RenderOkTimer.Get() > 4000) + // { + // // 4 seconds and over 40 failed calls means we have a problem + // BrowseToSolution("gui-render", EXIT_GAME_FIRST, "Some sort of DirectX problem has occurred"); + // } + //} + // else + // m_RenderOkTimer.Reset(); } void CGUI_Impl::Invalidate() { - reinterpret_cast(m_pRenderer)->preD3DReset(); + m_pRenderer->preD3DReset(); } void CGUI_Impl::Restore() { try { - reinterpret_cast(m_pRenderer)->postD3DReset(); + m_pRenderer->postD3DReset(); } catch (CEGUI::RendererException& exception) { - MessageBox(0, exception.getMessage().c_str(), "CEGUI Exception", MB_OK | MB_ICONERROR | MB_TOPMOST); + MessageBox(0, (const char*)exception.getMessage().c_str(), "CEGUI Exception", MB_OK | MB_ICONERROR | MB_TOPMOST); TerminateProcess(GetCurrentProcess(), 1); } } -void CGUI_Impl::DrawMouseCursor() -{ - CEGUI::MouseCursor::getSingleton().draw(); -} - void CGUI_Impl::ProcessMouseInput(CGUIMouseInput eMouseInput, unsigned long ulX, unsigned long ulY, CGUIMouseButton eMouseButton) { switch (eMouseInput) { case CGUI_MI_MOUSEMOVE: - m_pSystem->injectMouseMove(static_cast(ulX), static_cast(ulY)); + m_pDefaultGUIContext->injectMouseMove(static_cast(ulX), static_cast(ulY)); break; case CGUI_MI_MOUSEPOS: - m_pSystem->injectMousePosition(static_cast(ulX), static_cast(ulY)); + m_pDefaultGUIContext->injectMousePosition(static_cast(ulX), static_cast(ulY)); break; case CGUI_MI_MOUSEDOWN: - m_pSystem->injectMouseButtonDown(static_cast(eMouseButton)); + m_pDefaultGUIContext->injectMouseButtonDown(static_cast(eMouseButton)); break; case CGUI_MI_MOUSEUP: - m_pSystem->injectMouseButtonUp(static_cast(eMouseButton)); + m_pDefaultGUIContext->injectMouseButtonUp(static_cast(eMouseButton)); break; case CGUI_MI_MOUSEWHEEL: - if ((signed long)ulX > 0) - m_pSystem->injectMouseWheelChange(+1); - else - m_pSystem->injectMouseWheelChange(-1); + m_pDefaultGUIContext->injectMouseWheelChange((signed long)ulX > 0 ? +1 : -1); break; } } @@ -272,29 +317,14 @@ void CGUI_Impl::ProcessKeyboardInput(unsigned long ulKey, bool bIsDown) { if (bIsDown) { - m_pSystem->injectKeyDown(ulKey); + m_pDefaultGUIContext->injectKeyDown(CEGUI::Key::Scan(ulKey)); } else { - m_pSystem->injectKeyUp(ulKey); + m_pDefaultGUIContext->injectKeyUp(CEGUI::Key::Scan(ulKey)); } } -SString CGUI_Impl::GetDefaultSkinName() -{ - return CEGUI_DEFAULT_SKIN_NAME; -} - -SString CGUI_Impl::GetElementPrefix() -{ - return CEGUI_ELEMENT_PREFIX; -} - -SString CGUI_Impl::GetImagesetPrefix() -{ - return CEGUI_IMAGESET_PREFIX; -} - bool CGUI_Impl::GetGUIInputEnabled() { switch (m_eInputMode) @@ -307,22 +337,23 @@ bool CGUI_Impl::GetGUIInputEnabled() break; case INPUTMODE_NO_BINDS_ON_EDIT: { - CEGUI::Window* pActiveWindow = m_pTop->getActiveChild(); + CEGUI::Window* pActiveWindow = m_pDefaultGUIContext->getActiveWindow(); + if (!pActiveWindow || pActiveWindow == m_pTop || !pActiveWindow->isVisible()) { return false; } - if (pActiveWindow->getType() == "CGUI/Editbox") + if (pActiveWindow->getType() == GetElementPrefix() + "/Editbox") { CEGUI::Editbox* pEditBox = reinterpret_cast(pActiveWindow); return (!pEditBox->isReadOnly() && pEditBox->hasInputFocus()); } - else if (pActiveWindow->getType() == "CGUI/MultiLineEditbox") + else if (pActiveWindow->getType() == GetElementPrefix() + "/MultiLineEditbox") { CEGUI::MultiLineEditbox* pMultiLineEditBox = reinterpret_cast(pActiveWindow); return (!pMultiLineEditBox->isReadOnly() && pMultiLineEditBox->hasInputFocus()); } - else if (pActiveWindow->getType() == CGUIWEBBROWSER_NAME) + else if (pActiveWindow->getType() == GetElementPrefix() + "/" + CGUIWEBBROWSER_NAME) { auto pElement = reinterpret_cast(pActiveWindow->getUserData()); if (pElement->GetType() == CGUI_WEBBROWSER) @@ -351,19 +382,19 @@ eInputMode CGUI_Impl::GetGUIInputMode() CEGUI::String CGUI_Impl::GetUTFString(const char* szInput) { - CEGUI::String strUTF = (CEGUI::utf8*)szInput; // Convert into a CEGUI String + CEGUI::String strUTF = szInput; // Convert into a CEGUI String return strUTF; } CEGUI::String CGUI_Impl::GetUTFString(const std::string& strInput) { - CEGUI::String strUTF = (CEGUI::utf8*)strInput.c_str(); // Convert into a CEGUI String + CEGUI::String strUTF = strInput.c_str(); // Convert into a CEGUI String return strUTF; } void CGUI_Impl::ProcessCharacter(unsigned long ulCharacter) { - m_pSystem->injectChar(ulCharacter); + m_pSystem->getGUIContexts()[0]->injectChar(ulCharacter); } CGUIMessageBox* CGUI_Impl::CreateMessageBox(const char* szTitle, const char* szMessage, unsigned int uiFlags) @@ -393,7 +424,7 @@ CGUIEdit* CGUI_Impl::_CreateEdit(CGUIElement_Impl* pParent, const char* szText) CGUIFont* CGUI_Impl::CreateFnt(const char* szFontName, const char* szFontFile, unsigned int uSize, unsigned int uFlags, bool bAutoScale, bool isWinFont) { - return new CGUIFont_Impl(this, szFontName, szFontFile, uSize, uFlags, bAutoScale); + return new CGUIFont_Impl(this, szFontName, szFontFile, uSize, uFlags, bAutoScale, isWinFont); } CGUIFont* CGUI_Impl::CreateFntFromWinFont(const char* szFontName, const char* szFontWinReg, const char* szFontWinFile, unsigned int uSize, unsigned int uFlags, @@ -404,10 +435,10 @@ CGUIFont* CGUI_Impl::CreateFntFromWinFont(const char* szFontName, const char* sz // Compile a list of places to look std::vector lookList; + lookList.push_back(PathJoin("cgui", szFontWinFile)); if (strFontWinRegName.Contains(":") || strFontWinRegName.BeginsWith("\\") || strFontWinRegName.BeginsWith("/")) lookList.push_back(strFontWinRegName); lookList.push_back(PathJoin(strWinFontsPath, strFontWinRegName)); - lookList.push_back(PathJoin("cgui", szFontWinFile)); lookList.push_back(PathJoin(strWinFontsPath, szFontWinFile)); // Try each place @@ -418,7 +449,7 @@ CGUIFont* CGUI_Impl::CreateFntFromWinFont(const char* szFontName, const char* sz { try { - pResult = (CGUIFont_Impl*)CreateFnt(szFontName, lookList[i], uSize, uFlags, bAutoScale); + pResult = (CGUIFont_Impl*)CreateFnt(szFontName, lookList[i], uSize, uFlags, bAutoScale, (i != 0)); } catch (CEGUI::Exception e) { @@ -498,24 +529,17 @@ CGUIWindow* CGUI_Impl::CreateWnd(CGUIElement* pParent, const char* szCaption) void CGUI_Impl::SetCursorEnabled(bool bEnabled) { - if (bEnabled) - { - CEGUI::MouseCursor::getSingleton().show(); - } - else - { - CEGUI::MouseCursor::getSingleton().hide(); - } + m_pDefaultGUIContext->setCursorVisible(bEnabled); } bool CGUI_Impl::IsCursorEnabled() { - return CEGUI::MouseCursor::getSingleton().isVisible(); + return m_pDefaultGUIContext->isCursorVisible(); } void CGUI_Impl::SetCursorAlpha(float fAlpha, bool bOnlyCurrentServer) { - CEGUI::MouseCursor::getSingleton().setAlpha(fAlpha); + // m_pMouseCursor->setAlpha(fAlpha) if (bOnlyCurrentServer) SetCurrentServerCursorAlpha(fAlpha); @@ -533,7 +557,7 @@ float CGUI_Impl::GetCurrentServerCursorAlpha() eCursorType CGUI_Impl::GetCursorType() { - auto image = CEGUI::MouseCursor::getSingleton().getImage(); + auto image = m_pDefaultGUIContext->getCursorImage(); if (image == nullptr) return CURSORTYPE_NONE; @@ -560,7 +584,7 @@ eCursorType CGUI_Impl::GetCursorType() void CGUI_Impl::AddChild(CGUIElement_Impl* pChild) { - m_pTop->addChildWindow(pChild->GetWindow()); + m_pTop->addChild(pChild->GetWindow()); } CGUIWindow* CGUI_Impl::LoadLayout(CGUIElement* pParent, const SString& strFilename) @@ -579,16 +603,14 @@ bool CGUI_Impl::LoadImageset(const SString& strFilename) { try { - return GetImageSetManager()->createImageset(strFilename, "", true) != NULL; + m_pImageSetManager->loadImageset(strFilename); } - catch (CEGUI::AlreadyExistsException exc) - { - return true; - } - catch (...) + catch (CEGUI::Exception e) { return false; } + + return true; } CEGUI::FontManager* CGUI_Impl::GetFontManager() @@ -596,7 +618,7 @@ CEGUI::FontManager* CGUI_Impl::GetFontManager() return m_pFontManager; } -CEGUI::ImagesetManager* CGUI_Impl::GetImageSetManager() +CEGUI::ImageManager* CGUI_Impl::GetImageManager() { return m_pImageSetManager; } @@ -606,9 +628,9 @@ CEGUI::System* CGUI_Impl::GetGUISystem() return m_pSystem; } -CEGUI::Renderer* CGUI_Impl::GetRenderer() +CEGUI::Direct3D9Renderer& CGUI_Impl::GetRenderer() { - return m_pRenderer; + return *m_pRenderer; } CEGUI::SchemeManager* CGUI_Impl::GetSchemeManager() @@ -635,9 +657,8 @@ bool CGUI_Impl::Event_CharacterKey(const CEGUI::EventArgs& Args) CGUIKeyEventArgs NewArgs; // copy the variables - NewArgs.codepoint = e.codepoint; - NewArgs.scancode = (CGUIKeys::Scan)e.scancode; - NewArgs.sysKeys = e.sysKeys; + NewArgs.scancode = (CGUIKeys::Scan)e.d_key; + NewArgs.modifiers = e.d_modifiers.getMask(); // get the CGUIElement CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); @@ -685,7 +706,7 @@ CGUIFont* CGUI_Impl::GetSansFont() float CGUI_Impl::GetTextExtent(const char* szText, const char* szFont) { - return m_pFontManager->getFont(szFont)->getTextExtent(CGUI_Impl::GetUTFString(szText)); + return m_pFontManager->get(szFont).getTextExtent(CGUI_Impl::GetUTFString(szText)); } float CGUI_Impl::GetMaxTextExtent(SString strFont, SString arg, ...) @@ -694,7 +715,7 @@ float CGUI_Impl::GetMaxTextExtent(SString strFont, SString arg, ...) va_list arguments; for (va_start(arguments, arg); arg != ""; arg = va_arg(arguments, SString)) { - float fExtent = m_pFontManager->getFont(strFont)->getTextExtent(CGUI_Impl::GetUTFString(arg)); + float fExtent = m_pFontManager->get(strFont).getTextExtent(CGUI_Impl::GetUTFString(arg)); if (fExtent > fMaxTextExtent) fMaxTextExtent = fExtent; } @@ -714,9 +735,8 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) CGUIKeyEventArgs NewArgs; // copy the variables - NewArgs.codepoint = e.codepoint; - NewArgs.scancode = (CGUIKeys::Scan)e.scancode; - NewArgs.sysKeys = e.sysKeys; + NewArgs.scancode = (CGUIKeys::Scan)e.d_key; + NewArgs.modifiers = e.d_modifiers.getMask(); // get the CGUIElement CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); @@ -725,34 +745,34 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) m_KeyDownHandlers[m_Channel](NewArgs); } - switch (KeyboardArgs.scancode) + switch (KeyboardArgs.d_key) { // Cut/Copy keys - case CEGUI::Key::X: - case CEGUI::Key::C: + case CEGUI::Key::Scan::X: + case CEGUI::Key::Scan::C: { - if (KeyboardArgs.sysKeys & CEGUI::Control) + if (KeyboardArgs.d_modifiers.hasAll(CEGUI::ModifierKeys::Ctrl())) { // Data to copy CEGUI::String strTemp; // Edit boxes CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); - if (Wnd->getType() == "CGUI/Editbox") + if (Wnd->getType() == GetElementPrefix() + "/Editbox") { // Turn our event window into an editbox CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); // Don't allow cutting/copying if the editbox is masked - if (!WndEdit->isTextMasked()) + if (!WndEdit->isTextMaskingEnabled()) { // Get the text from the editbox - size_t sizeSelectionStart = WndEdit->getSelectionStartIndex(); + size_t sizeSelectionStart = WndEdit->getSelectionStart(); size_t sizeSelectionLength = WndEdit->getSelectionLength(); strTemp = WndEdit->getText().substr(sizeSelectionStart, sizeSelectionLength); // If the user cut, remove the text too - if (KeyboardArgs.scancode == CEGUI::Key::X) + if (KeyboardArgs.d_key == CEGUI::Key::Scan::X) { // Read only? if (!WndEdit->isReadOnly()) @@ -767,18 +787,18 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } // Multiline editboxes - if (Wnd->getType() == "CGUI/MultiLineEditbox") + if (Wnd->getType() == GetElementPrefix() + "/MultiLineEditbox") { // Turn our event window into an editbox CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); // Get the text from the editbox - size_t sizeSelectionStart = WndEdit->getSelectionStartIndex(); + size_t sizeSelectionStart = WndEdit->getSelectionStart(); size_t sizeSelectionLength = WndEdit->getSelectionLength(); strTemp = WndEdit->getText().substr(sizeSelectionStart, sizeSelectionLength); // If the user cut, remove the text too - if (KeyboardArgs.scancode == CEGUI::Key::X) + if (KeyboardArgs.d_key == CEGUI::Key::Scan::X) { // Read only? if (!WndEdit->isReadOnly()) @@ -795,7 +815,7 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) if (strTemp.length() > 0) { // Convert it to Unicode - std::wstring strUTF = MbUTF8ToUTF16(strTemp.c_str()); + std::wstring strUTF = MbUTF8ToUTF16((const char*)strTemp.c_str()); // Open and empty the clipboard OpenClipboard(NULL); @@ -819,12 +839,12 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } // Paste keys - case CEGUI::Key::V: + case CEGUI::Key::Scan::V: { - if (KeyboardArgs.sysKeys & CEGUI::Control) + if (KeyboardArgs.d_modifiers.hasAll(CEGUI::ModifierKeys::Ctrl())) { CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); - if (Wnd->getType() == "CGUI/Editbox" || Wnd->getType() == "CGUI/MultiLineEditbox") + if (Wnd->getType() == GetElementPrefix() + "/Editbox" || Wnd->getType() == GetElementPrefix() + "/MultiLineEditbox") { // Open the clipboard OpenClipboard(NULL); @@ -840,7 +860,7 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) bool bReplaceNewLines = true; bool bIsBoxFull = false; - if (Wnd->getType() == "CGUI/Editbox") + if (Wnd->getType() == GetElementPrefix() + "/Editbox") { // Turn our event window into an editbox CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); @@ -851,10 +871,10 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) return true; } strEditText = WndEdit->getText(); - iSelectionStart = WndEdit->getSelectionStartIndex(); + iSelectionStart = WndEdit->getSelectionStart(); iSelectionLength = WndEdit->getSelectionLength(); iMaxLength = WndEdit->getMaxTextLength(); - iCaratIndex = WndEdit->getCaratIndex(); + iCaratIndex = WndEdit->getCaretIndex(); } else { @@ -867,10 +887,10 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } strEditText = WndEdit->getText(); - iSelectionStart = WndEdit->getSelectionStartIndex(); + iSelectionStart = WndEdit->getSelectionStart(); iSelectionLength = WndEdit->getSelectionLength(); iMaxLength = WndEdit->getMaxTextLength(); - iCaratIndex = WndEdit->getCaratIndex(); + iCaratIndex = WndEdit->getCaretIndex(); bReplaceNewLines = false; // Plus one character, because there is always an extra '\n' in @@ -906,7 +926,7 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } // Put the editbox's data into a string and insert the data if it has not reached it's maximum text length - std::wstring tmp = MbUTF8ToUTF16(strEditText.c_str()); + std::wstring tmp = MbUTF8ToUTF16((const char*)strEditText.c_str()); if ((strClipboardText.length() + tmp.length() - iSelectionLength) <= iMaxLength) { // Are there characters selected? @@ -925,7 +945,7 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } // Set the new text and move the carat at the end of what we pasted - CEGUI::String strText((CEGUI::utf8*)UTF16ToMbUTF8(tmp).c_str()); + CEGUI::String strText(UTF16ToMbUTF8(tmp).c_str()); strEditText = strText; iCaratIndex = sizeCaratIndex; } @@ -936,7 +956,7 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) if (bIsBoxFull) { // Fire an event if the editbox is full - if (Wnd->getType() == "CGUI/Editbox") + if (Wnd->getType() == GetElementPrefix() + "/Editbox") { CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); CEGUI::WindowEventArgs args(WndEdit); @@ -951,17 +971,17 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } else { - if (Wnd->getType() == "CGUI/Editbox") + if (Wnd->getType() == GetElementPrefix() + "/Editbox") { CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); WndEdit->setText(strEditText); - WndEdit->setCaratIndex(iCaratIndex); + WndEdit->setCaretIndex(iCaratIndex); } else { CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); WndEdit->setText(strEditText); - WndEdit->setCaratIndex(iCaratIndex); + WndEdit->setCaretIndex(iCaratIndex); } } } @@ -975,27 +995,27 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) } // Select all key - case CEGUI::Key::A: + case CEGUI::Key::Scan::A: + { + if (KeyboardArgs.d_modifiers.hasAll(CEGUI::ModifierKeys::Ctrl())) { - if (KeyboardArgs.sysKeys & CEGUI::Control) + // Edit boxes + CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); + if (Wnd->getType() == GetElementPrefix() + "/Editbox") { - // Edit boxes - CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); - if (Wnd->getType() == "CGUI/Editbox") - { - // Turn our event window into an editbox - CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); - WndEdit->setSelection(0, WndEdit->getText().size()); - } - else if (Wnd->getType() == "CGUI/MultiLineEditbox") - { - // Turn our event window into a multiline editbox - CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); - WndEdit->setSelection(0, WndEdit->getText().size()); - } + // Turn our event window into an editbox + CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); + WndEdit->setSelection(0, WndEdit->getText().size()); } + else if (Wnd->getType() == GetElementPrefix() + "/MultiLineEditbox") + { + // Turn our event window into a multiline editbox + CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); + WndEdit->setSelection(0, WndEdit->getText().size()); + } + } - break; + break; } } @@ -1004,41 +1024,41 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) void CGUI_Impl::SetDefaultGuiWorkingDirectory(const SString& strDir) { - assert(m_GuiWorkingDirectoryStack.empty()); - m_GuiWorkingDirectoryStack.push_back(PathConform(strDir + "\\")); - ApplyGuiWorkingDirectory(); + // assert(m_GuiWorkingDirectoryStack.empty()); + // m_GuiWorkingDirectoryStack.push_back(PathConform(strDir + "\\")); + // ApplyGuiWorkingDirectory(); } void CGUI_Impl::PushGuiWorkingDirectory(const SString& strDir) { - m_GuiWorkingDirectoryStack.push_back(PathConform(strDir + "\\")); - ApplyGuiWorkingDirectory(); + // m_GuiWorkingDirectoryStack.push_back(PathConform(strDir + "\\")); + // ApplyGuiWorkingDirectory(); } void CGUI_Impl::PopGuiWorkingDirectory(const SString& strDirCheck) { - if (m_GuiWorkingDirectoryStack.size() < 2) - { - OutputDebugLine(SString("CGUI_Impl::PopWorkingDirectory - Stack empty. Expected '%s'", *strDirCheck)); - } - else - { - if (!strDirCheck.empty()) - { - const SString& strWas = m_GuiWorkingDirectoryStack.back(); - if (strDirCheck != strWas) - { - OutputDebugLine(SString("CGUI_Impl::PopWorkingDirectory - Mismatch. Got '%s', expected '%s'", *strWas, *strDirCheck)); - } - } - m_GuiWorkingDirectoryStack.pop_back(); - } - ApplyGuiWorkingDirectory(); + // if (m_GuiWorkingDirectoryStack.size() < 2) + //{ + // OutputDebugLine(SString("CGUI_Impl::PopWorkingDirectory - Stack empty. Expected '%s'", *strDirCheck)); + // } + // else + //{ + // if (!strDirCheck.empty()) + // { + // const SString& strWas = m_GuiWorkingDirectoryStack.back(); + // if (strDirCheck != strWas) + // { + // OutputDebugLine(SString("CGUI_Impl::PopWorkingDirectory - Mismatch. Got '%s', expected '%s'", *strWas, *strDirCheck)); + // } + // } + // m_GuiWorkingDirectoryStack.pop_back(); + // } + // ApplyGuiWorkingDirectory(); } void CGUI_Impl::ApplyGuiWorkingDirectory() { - CEGUI::System::getSingleton().SetGuiWorkingDirectory(m_GuiWorkingDirectoryStack.back()); + // CEGUI::System::getSingleton().SetGuiWorkingDirectory(m_GuiWorkingDirectoryStack.back()); } const SString& CGUI_Impl::GetGuiWorkingDirectory() const @@ -1049,7 +1069,7 @@ const SString& CGUI_Impl::GetGuiWorkingDirectory() const bool CGUI_Impl::Event_MouseClick(const CEGUI::EventArgs& Args) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1069,11 +1089,9 @@ bool CGUI_Impl::Event_MouseClick(const CEGUI::EventArgs& Args) CGUIMouseEventArgs NewArgs; // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); NewArgs.pWindow = pElement; m_MouseClickHandlers[m_Channel](NewArgs); @@ -1083,7 +1101,7 @@ bool CGUI_Impl::Event_MouseClick(const CEGUI::EventArgs& Args) bool CGUI_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& Args) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1103,11 +1121,9 @@ bool CGUI_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& Args) CGUIMouseEventArgs NewArgs; // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); NewArgs.pWindow = pElement; m_MouseDoubleClickHandlers[m_Channel](NewArgs); @@ -1117,7 +1133,7 @@ bool CGUI_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& Args) bool CGUI_Impl::Event_MouseButtonDown(const CEGUI::EventArgs& Args) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1134,11 +1150,11 @@ bool CGUI_Impl::Event_MouseButtonDown(const CEGUI::EventArgs& Args) else { // If there's no element, we're probably dealing with the root element - CEGUI::Window* pActiveWindow = m_pTop->getActiveChild(); + CEGUI::Window* pActiveWindow = m_pDefaultGUIContext->getActiveWindow(); if (m_pTop == wnd && pActiveWindow) { - // Deactivate active window to trigger onClientGUIBlur - pActiveWindow->deactivate(); + // Deactivate active window to trigger onClientGUIBlur + pActiveWindow->deactivate(); } } @@ -1147,11 +1163,9 @@ bool CGUI_Impl::Event_MouseButtonDown(const CEGUI::EventArgs& Args) CGUIMouseEventArgs NewArgs; // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); NewArgs.pWindow = pElement; m_MouseButtonDownHandlers[m_Channel](NewArgs); @@ -1164,8 +1178,8 @@ bool CGUI_Impl::Event_MouseButtonUp(const CEGUI::EventArgs& Args) { if (m_MouseButtonUpHandlers[m_Channel]) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); + CGUIMouseEventArgs NewArgs; // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1174,11 +1188,9 @@ bool CGUI_Impl::Event_MouseButtonUp(const CEGUI::EventArgs& Args) wnd = GetMasterWindow(wnd); // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); // get the CGUIElement CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); @@ -1193,8 +1205,8 @@ bool CGUI_Impl::Event_MouseWheel(const CEGUI::EventArgs& Args) { if (m_MouseWheelHandlers[m_Channel]) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); + CGUIMouseEventArgs NewArgs; // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1203,11 +1215,9 @@ bool CGUI_Impl::Event_MouseWheel(const CEGUI::EventArgs& Args) wnd = GetMasterWindow(wnd); // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); // get the CGUIElement CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); @@ -1222,8 +1232,8 @@ bool CGUI_Impl::Event_MouseMove(const CEGUI::EventArgs& Args) { if (m_MouseMoveHandlers[m_Channel]) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); + CGUIMouseEventArgs NewArgs; // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1232,11 +1242,9 @@ bool CGUI_Impl::Event_MouseMove(const CEGUI::EventArgs& Args) wnd = GetMasterWindow(wnd); // copy the variables - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); // get the CGUIElement CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); @@ -1249,7 +1257,8 @@ bool CGUI_Impl::Event_MouseMove(const CEGUI::EventArgs& Args) bool CGUI_Impl::Event_MouseEnter(const CEGUI::EventArgs& Args) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); + CGUIMouseEventArgs NewArgs; // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1270,22 +1279,22 @@ bool CGUI_Impl::Event_MouseEnter(const CEGUI::EventArgs& Args) // copy the variables NewArgs.pWindow = pElement; - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; - NewArgs.clickCount = e.clickCount; - if (e.switchedWindow) + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); + + CEGUI::Window* switchedWindow = m_pDefaultGUIContext->getWindowContainingCursor(); + + if (switchedWindow) { - CEGUI::Window* Master = GetMasterWindow(e.switchedWindow); - // If the source and target windows are the same, don't bother triggering this - if (Master == wnd) - return true; - NewArgs.pSwitchedWindow = reinterpret_cast(Master->getUserData()); + CEGUI::Window* Master = GetMasterWindow(switchedWindow); + // If the source and target windows are the same, don't bother triggering this + if (Master == wnd) + return true; + NewArgs.pSwitchedWindow = reinterpret_cast(Master->getUserData()); } else - NewArgs.pSwitchedWindow = NULL; + NewArgs.pSwitchedWindow = NULL; m_MouseEnterHandlers[m_Channel](NewArgs); } @@ -1295,7 +1304,8 @@ bool CGUI_Impl::Event_MouseEnter(const CEGUI::EventArgs& Args) bool CGUI_Impl::Event_MouseLeave(const CEGUI::EventArgs& Args) { - const CEGUI::MouseEventArgs& e = reinterpret_cast(Args); + const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); + CGUIMouseEventArgs NewArgs; // get the approriate cegui window CEGUI::Window* wnd = e.window; @@ -1311,7 +1321,7 @@ bool CGUI_Impl::Event_MouseLeave(const CEGUI::EventArgs& Args) { pElement = reinterpret_cast(wnd->getUserData()); if (pElement) - pElement->Event_OnMouseLeave(); + pElement->Event_OnMouseLeave(); } if (m_MouseLeaveHandlers[m_Channel]) @@ -1320,22 +1330,22 @@ bool CGUI_Impl::Event_MouseLeave(const CEGUI::EventArgs& Args) // copy the variables NewArgs.pWindow = pElement; - NewArgs.button = static_cast(e.button); - NewArgs.moveDelta = CVector2D(e.moveDelta.d_x, e.moveDelta.d_y); - NewArgs.position = CGUIPosition(e.position.d_x, e.position.d_y); - NewArgs.sysKeys = e.sysKeys; - NewArgs.wheelChange = e.wheelChange; - NewArgs.clickCount = e.clickCount; - if (e.switchedWindow) + NewArgs.button = static_cast(e.d_button); + NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); + NewArgs.modifiers = e.d_modifiers.getMask(); + + CEGUI::Window* switchedWindow = m_pDefaultGUIContext->getWindowContainingCursor(); + + if (switchedWindow) { - CEGUI::Window* Master = GetMasterWindow(e.switchedWindow); - // If the source and target windows are the same, don't bother triggering this - if (Master == wnd) - return true; - NewArgs.pSwitchedWindow = reinterpret_cast(Master->getUserData()); + CEGUI::Window* Master = GetMasterWindow(switchedWindow); + // If the source and target windows are the same, don't bother triggering this + if (Master == wnd) + return true; + NewArgs.pSwitchedWindow = reinterpret_cast(Master->getUserData()); } else - NewArgs.pSwitchedWindow = NULL; + NewArgs.pSwitchedWindow = NULL; m_MouseLeaveHandlers[m_Channel](NewArgs); } @@ -1379,7 +1389,7 @@ bool CGUI_Impl::Event_RedrawRequested(const CEGUI::EventArgs& Args) if (pElement) AddToRedrawQueue(pElement); else - e.window->forceRedraw(); + e.window->invalidate(true); return true; } @@ -1399,7 +1409,7 @@ bool CGUI_Impl::Event_FocusGained(const CEGUI::EventArgs& Args) NewArgs.pDeactivatedWindow = NULL; if (e.otherWindow) { - NewArgs.pDeactivatedWindow = reinterpret_cast((e.otherWindow)->getUserData()); + NewArgs.pDeactivatedWindow = reinterpret_cast((e.otherWindow)->getUserData()); } m_FocusGainedHandlers[m_Channel](NewArgs); @@ -1422,7 +1432,7 @@ bool CGUI_Impl::Event_FocusLost(const CEGUI::EventArgs& Args) NewArgs.pActivatedWindow = NULL; if (e.otherWindow) { - NewArgs.pActivatedWindow = reinterpret_cast((e.otherWindow)->getUserData()); + NewArgs.pActivatedWindow = reinterpret_cast((e.otherWindow)->getUserData()); } m_FocusLostHandlers[m_Channel](NewArgs); @@ -1440,18 +1450,18 @@ void CGUI_Impl::AddToRedrawQueue(CGUIElement* pWindow) { if (pWindow->GetParent() == *iter) { - return; + return; } else if ((*iter)->GetParent() == pWindow) { - m_RedrawQueue.remove(*iter); - if (m_RedrawQueue.empty()) - return; - iter = m_RedrawQueue.begin(); + m_RedrawQueue.remove(*iter); + if (m_RedrawQueue.empty()) + return; + iter = m_RedrawQueue.begin(); } else if (*iter == pWindow) { - return; + return; } } m_RedrawQueue.push_back(pWindow); @@ -1681,26 +1691,13 @@ void CGUI_Impl::ClearInputHandlers(eInputChannel channel) m_FocusLostHandlers[channel] = GUI_CALLBACK_FOCUS(); } -void CGUI_Impl::ClearSystemKeys() -{ - // Unpress any held system keys - unsigned int uiSysKeys = CEGUI::System::getSingleton().getSystemKeys(); - - if (uiSysKeys & CEGUI::Control) - ProcessKeyboardInput(CGUIKeys::LeftControl, false); - if (uiSysKeys & CEGUI::Shift) - ProcessKeyboardInput(CGUIKeys::LeftShift, false); - if (uiSysKeys & CEGUI::Alt) - ProcessKeyboardInput(CGUIKeys::LeftAlt, false); -} - CEGUI::Window* CGUI_Impl::GetMasterWindow(CEGUI::Window* wnd) { // A titlebar should always return the parent (i.e. the frame window) - if (wnd->testClassName(CEGUI::Titlebar::EventNamespace)) + if (wnd->getType() == GetElementPrefix() + "/" + CEGUI::Titlebar::EventNamespace) { if (wnd->getParent()) - return wnd->getParent(); + return wnd->getParent(); return wnd; } @@ -1712,10 +1709,29 @@ CEGUI::Window* CGUI_Impl::GetMasterWindow(CEGUI::Window* wnd) // So keep propogating upwards until we find an MTA element while (parent) { - if (parent->getUserData()) - return parent; - parent = parent->getParent(); + if (parent->getUserData()) + return parent; + parent = parent->getParent(); } } return wnd; } + +CEGUI::USize CGUI_Impl::CreateAbsoluteSize(float width, float height) +{ + return CEGUI::USize(CEGUI::UDim(0, width), CEGUI::UDim(0, height)); +} + +CEGUI::USize CGUI_Impl::CreateRelativeSize(float width, float height) +{ + return CEGUI::USize(CEGUI::UDim(width, 0), CEGUI::UDim(height, 0)); +} + +CEGUI::GeometryBuffer* CGUI_Impl::GetGeometryBuffer() +{ + return m_pGeometryBuffer; +} + +void CGUI_Impl::ClearSystemKeys() +{ +} diff --git a/Client/gui/CGUI_Impl.h b/Client/gui/CGUI_Impl.h index b26b7a4d5f..2bd6d4415b 100644 --- a/Client/gui/CGUI_Impl.h +++ b/Client/gui/CGUI_Impl.h @@ -9,8 +9,6 @@ * *****************************************************************************/ -class CGUI_Impl; - #pragma once #include @@ -19,28 +17,6 @@ class CGUI_Impl; #define CGUI_CHAR_SIZE 6 -class CGUIElement; -class CGUIElement_Impl; -class CGUIButton; -class CGUICheckBox; -class CGUIEdit; -class CGUIEvent; -class CGUIFont; -class CGUIFont_Impl; -class CGUIGridList; -class CGUILabel; -class CGUIMemo; -class CGUIMessageBox; -class CGUIProgressBar; -class CGUIRadioButton; -class CGUIStaticImage; -class CGUIScrollBar; -class CGUIScrollPane; -class CGUIComboBox; -class CGUITexture; -class CGUIWindow; -class CGUITab; -class CGUITabPanel; struct IDirect3DDevice9; namespace CEGUI @@ -48,20 +24,23 @@ namespace CEGUI class FontManager; class ImagesetManager; class Renderer; - class System; class SchemeManager; class WindowManager; class Image; + class Texture; class EventArgs; class GUISheet; - typedef GUISheet DefaultWindow; + // typedef GUISheet DefaultWindow; } // namespace CEGUI +class CGUIElement_Impl; +class CGUIFont_Impl; + class CGUI_Impl : public CGUI, public CGUITabList { public: CGUI_Impl(IDirect3DDevice9* pDevice); - ~CGUI_Impl(); + void destroy(); void SetSkin(const char* szName); void SetBidiEnabled(bool bEnabled); @@ -70,15 +49,9 @@ class CGUI_Impl : public CGUI, public CGUITabList void Invalidate(); void Restore(); - void DrawMouseCursor(); - void ProcessMouseInput(CGUIMouseInput eMouseInput, unsigned long ulX = 0, unsigned long ulY = 0, CGUIMouseButton eMouseButton = NoButton); void ProcessKeyboardInput(unsigned long ulKey, bool bIsDown); void ProcessCharacter(unsigned long ulCharacter); - - SString GetDefaultSkinName(); - SString GetElementPrefix(); - SString GetImagesetPrefix(); // bool GetGUIInputEnabled(); @@ -86,7 +59,11 @@ class CGUI_Impl : public CGUI, public CGUITabList eInputMode GetGUIInputMode(); static CEGUI::String GetUTFString(const char* szInput); static CEGUI::String GetUTFString(const std::string& strInput); - static CEGUI::String GetUTFString(const CEGUI::String& strInput); // Not defined + // static CEGUI::String GetUTFString(const CEGUI::String& strInput); // Not defined + + SString GetDefaultSkinName(); + SString GetElementPrefix(); + SString GetImagesetPrefix(); // CGUIMessageBox* CreateMessageBox(const char* szTitle, const char* szMessage, unsigned int uiFlags); @@ -142,7 +119,9 @@ class CGUI_Impl : public CGUI, public CGUITabList // CGUITexture* CreateTexture(); - CGUIFont* CreateFnt(const char* szFontName, const char* szFontFile, unsigned int uSize = 8, unsigned int uFlags = 0, bool bAutoScale = false, bool isWinFont = false); + + CGUIFont* CreateFnt(const char* szFontName, const char* szFontFile, unsigned int uSize = 8, unsigned int uFlags = 0, bool bAutoScale = false, + bool isWinFont = false); void SetCursorEnabled(bool bEnabled); bool IsCursorEnabled(); @@ -151,15 +130,20 @@ class CGUI_Impl : public CGUI, public CGUITabList float GetCurrentServerCursorAlpha(); eCursorType GetCursorType(); - void AddChild(CGUIElement_Impl* pChild); - CEGUI::FontManager* GetFontManager(); - CEGUI::ImagesetManager* GetImageSetManager(); - CEGUI::Renderer* GetRenderer(); - CEGUI::System* GetGUISystem(); - CEGUI::SchemeManager* GetSchemeManager(); - CEGUI::WindowManager* GetWindowManager(); - void GetUniqueName(char* pBuf); - CEGUI::Window* GetMasterWindow(CEGUI::Window* Window); + void AddChild(CGUIElement_Impl* pChild); + CEGUI::FontManager* GetFontManager(); + CEGUI::ImageManager* GetImageManager(); + CEGUI::Direct3D9Renderer& GetRenderer(); + CEGUI::System* GetGUISystem(); + CEGUI::SchemeManager* GetSchemeManager(); + CEGUI::WindowManager* GetWindowManager(); + void GetUniqueName(char* pBuf); + CEGUI::Window* GetMasterWindow(CEGUI::Window* Window); + + CEGUI::GeometryBuffer* GetGeometryBuffer(); + + CEGUI::USize CreateAbsoluteSize(float width, float height); + CEGUI::USize CreateRelativeSize(float width, float height); CVector2D GetResolution(); void SetResolution(float fWidth, float fHeight); @@ -171,7 +155,7 @@ class CGUI_Impl : public CGUI, public CGUITabList CGUIFont* GetSAHeaderFont(); CGUIFont* GetSAGothicFont(); CGUIFont* GetSansFont(); - bool IsFontPresent(const char* szFont) { return m_pFontManager->isFontPresent(szFont); } + bool IsFontPresent(const char* szFont) { return m_pFontManager->isDefined(szFont); } float GetTextExtent(const char* szText, const char* szFont = "default-normal"); float GetMaxTextExtent(SString strFont, SString arg, ...); @@ -260,6 +244,9 @@ class CGUI_Impl : public CGUI, public CGUITabList void ClearInputHandlers(eInputChannel channel); void ClearSystemKeys(); + bool IsTransferBoxVisible() { return m_bTransferBoxVisible; }; + void SetTransferBoxVisible(bool bVisible) { m_bTransferBoxVisible = bVisible; }; + bool Event_CharacterKey(const CEGUI::EventArgs& e); bool Event_KeyDown(const CEGUI::EventArgs& e); bool Event_MouseClick(const CEGUI::EventArgs& e); @@ -306,16 +293,25 @@ class CGUI_Impl : public CGUI, public CGUITabList IDirect3DDevice9* m_pDevice; - CEGUI::Renderer* m_pRenderer; - CEGUI::System* m_pSystem; - CEGUI::FontManager* m_pFontManager; - CEGUI::ImagesetManager* m_pImageSetManager; - CEGUI::SchemeManager* m_pSchemeManager; - CEGUI::WindowManager* m_pWindowManager; + CEGUI::Direct3D9Renderer* m_pRenderer; + CEGUI::System* m_pSystem; + CEGUI::FontManager* m_pFontManager; + CEGUI::ImageManager* m_pImageSetManager; + CEGUI::SchemeManager* m_pSchemeManager; + CEGUI::WindowManager* m_pWindowManager; + CEGUI::WindowFactoryManager* m_pWindowFactoryManager; + + CEGUI::XMLParser* m_pXMLParser; + + CEGUI::ResourceProvider* m_pResourceProvider; + CEGUI::DefaultResourceProvider* m_pDefaultResourceProvider; - CEGUI::DefaultWindow* m_pTop; - const CEGUI::Image* m_pCursor; - float m_fCurrentServerCursorAlpha; + CEGUI::GeometryBuffer* m_pGeometryBuffer; + CEGUI::GUIContext* m_pDefaultGUIContext; + + CEGUI::Window* m_pTop; + const CEGUI::Image* m_pCursor; + float m_fCurrentServerCursorAlpha; CGUIFont_Impl* m_pDefaultFont; CGUIFont_Impl* m_pSmallFont; @@ -351,7 +347,9 @@ class CGUI_Impl : public CGUI, public CGUITabList std::list m_GuiWorkingDirectoryStack; - bool m_HasSchemeLoaded; - SString m_CurrentSchemeName; - CElapsedTime m_RenderOkTimer; + bool m_bTransferBoxVisible; + + bool m_HasSchemeLoaded; + CEGUI::Scheme* m_CurrentScheme; + CElapsedTime m_RenderOkTimer; }; diff --git a/Client/gui_new/Main.h b/Client/gui/Main.h similarity index 100% rename from Client/gui_new/Main.h rename to Client/gui/Main.h diff --git a/Client/gui/StdInc.h b/Client/gui/StdInc.h index e2a040a0ee..8cee866dcc 100644 --- a/Client/gui/StdInc.h +++ b/Client/gui/StdInc.h @@ -1,5 +1,5 @@ -#include +#include #include #define MTA_CLIENT #define SHARED_UTIL_WITH_FAST_HASH_MAP @@ -8,10 +8,11 @@ #include #include #include +#include #include -#include -#include +#include +#include #include "CGUITabListItem.h" #include "CGUITabList.h" @@ -22,7 +23,8 @@ #include "CGUIFont_Impl.h" #include "CGUIGridList_Impl.h" #include "CGUILabel_Impl.h" -#include "CGUIListItem_Impl.h" +#include "CGUIStandardItem_Impl.h" +#include "CGUIGridListItem_Impl.h" #include "CGUIMemo_Impl.h" #include "CGUIProgressBar_Impl.h" #include "CGUIRadioButton_Impl.h" diff --git a/Client/gui/premake5.lua b/Client/gui/premake5.lua index 9fa53ab4f6..e10ae7f1a2 100644 --- a/Client/gui/premake5.lua +++ b/Client/gui/premake5.lua @@ -9,10 +9,13 @@ project "GUI" filter {} includedirs { - "../../Shared/sdk", + "../../Shared/sdk", "../sdk", - "../../vendor/cegui-0.4.0-custom/include", - "../../vendor/sparsehash/src/" + "../../vendor/cegui-0.8.7/include", + "../../vendor/cegui-0.8.7/dependencies/glm-0.9.4.5", + "../../vendor/cegui-0.8.7/dependencies/pcre-8.12", + "../../vendor/sparsehash/src/", + "../../vendor/freetype/include", } pchheader "StdInc.h" @@ -23,8 +26,15 @@ project "GUI" } links { - "CEGUI", "DirectX9GUIRenderer", "Falagard", + "CEGUI-0.8.7", + "CEGUICoreWindowRendererSet", + "CEGUISILLYImageCodec", + "CEGUIDirect3D9Renderer", + "CEGUITinyXML2Parser", + "glm-0.9.4.5", + "pcre-8.12", "d3dx9.lib", + "d3d9.lib", "dxerr.lib" } @@ -38,10 +48,16 @@ project "GUI" "premake5.lua", "*.h", "*.cpp" - } + } - filter "architecture:not x86" + filter "architecture:x64" flags { "ExcludeFromBuild" } filter "system:not windows" - flags { "ExcludeFromBuild" } + flags { "ExcludeFromBuild" } + + filter {"system:windows"} + buildoptions { "-Zm180" } + + filter {"configurations:Debug"} + links { "dbghelp" } diff --git a/Client/gui_new/CGUIButton_Impl.cpp b/Client/gui_new/CGUIButton_Impl.cpp deleted file mode 100644 index 3e3c9feef8..0000000000 --- a/Client/gui_new/CGUIButton_Impl.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIButton_Impl.cpp - * PURPOSE: Button widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUIBUTTON_NAME "Button" - -using namespace GUINew; - -CGUIButton_Impl::CGUIButton_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIBUTTON_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); - - m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 24.0f)); - m_pWindow->setVisible(true); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIButton_Impl::~CGUIButton_Impl() -{ - DestroyElement(); -} diff --git a/Client/gui_new/CGUIButton_Impl.h b/Client/gui_new/CGUIButton_Impl.h deleted file mode 100644 index ec20823b83..0000000000 --- a/Client/gui_new/CGUIButton_Impl.h +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIButton_Impl.h - * PURPOSE: Button widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIButton_Impl; -} - -class GUINew::CGUIButton_Impl : public CGUIButton, public CGUIElement_Impl -{ -public: - CGUIButton_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szCaption = ""); - ~CGUIButton_Impl(); - - eCGUIType GetType() { return CGUI_BUTTON; }; - - #include "CGUIElement_Inc.h" -}; diff --git a/Client/gui_new/CGUICheckBox_Impl.cpp b/Client/gui_new/CGUICheckBox_Impl.cpp deleted file mode 100644 index 6b1b31946c..0000000000 --- a/Client/gui_new/CGUICheckBox_Impl.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUICheckBox_Impl.cpp - * PURPOSE: Checkbox widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUICHECKBOX_NAME "Checkbox" - -using namespace GUINew; - -CGUICheckBox_Impl::CGUICheckBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption, bool bChecked) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUICHECKBOX_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); - - m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 16.0f)); - m_pWindow->setVisible(true); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Register our events - AddEvents(); - - // Set selected state - SetSelected(bChecked); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUICheckBox_Impl::~CGUICheckBox_Impl() -{ - DestroyElement(); -} - -void CGUICheckBox_Impl::SetSelected(bool bChecked) -{ - reinterpret_cast(m_pWindow)->setSelected(!bChecked); -} - -bool CGUICheckBox_Impl::GetSelected() -{ - return !(reinterpret_cast(m_pWindow)->isSelected()); -} diff --git a/Client/gui_new/CGUICheckBox_Impl.h b/Client/gui_new/CGUICheckBox_Impl.h deleted file mode 100644 index 8c14269c92..0000000000 --- a/Client/gui_new/CGUICheckBox_Impl.h +++ /dev/null @@ -1,33 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUICheckBox_Impl.h - * PURPOSE: Checkbox widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUICheckBox_Impl; -} - -class GUINew::CGUICheckBox_Impl : public CGUICheckBox, public CGUIElement_Impl -{ -public: - CGUICheckBox_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szCaption = "", bool bChecked = false); - ~CGUICheckBox_Impl(); - - void SetSelected(bool bChecked); - bool GetSelected(); - - eCGUIType GetType() { return CGUI_CHECKBOX; }; - - #include "CGUIElement_Inc.h" -}; diff --git a/Client/gui_new/CGUIComboBox_Impl.cpp b/Client/gui_new/CGUIComboBox_Impl.cpp deleted file mode 100644 index 1b21ddf1ba..0000000000 --- a/Client/gui_new/CGUIComboBox_Impl.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIComboBox_Impl.h - * PURPOSE: Combobox widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUICOMBOBOX_NAME "Combobox" - -using namespace GUINew; - -CGUIComboBox_Impl::CGUIComboBox_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUICOMBOBOX_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - // This needs a better alternative, so changing comboBox will change this - Jyrno42 - storedCaption = CGUI_Impl::GetUTFString(szCaption); - - m_pWindow->setText(storedCaption); - - m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 24.0f)); - m_pWindow->setVisible(true); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Add out changed event - m_pWindow->subscribeEvent(CEGUI::Combobox::EventListSelectionAccepted, CEGUI::Event::Subscriber(&CGUIComboBox_Impl::Event_OnSelectionAccepted, this)); - m_pWindow->subscribeEvent(CEGUI::Combobox::EventDropListRemoved, CEGUI::Event::Subscriber(&CGUIComboBox_Impl::Event_OnDropListRemoved, this)); - - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIComboBox_Impl::~CGUIComboBox_Impl() -{ - Clear(); - DestroyElement(); -} - -CGUIListItem* CGUIComboBox_Impl::AddItem(const char* szText) -{ - CGUIListItem_Impl* pNewItem = new CGUIListItem_Impl(m_pManager, szText, CGUIListItem_Impl::TextItem, NULL); - CEGUI::ListboxItem* pListboxItem = pNewItem->GetListItem(); - reinterpret_cast(m_pWindow)->addItem((CEGUI::StandardItem*)pListboxItem); - m_Items[pNewItem->GetListItem()] = pNewItem; - return pNewItem; -} - -CGUIListItem* CGUIComboBox_Impl::AddItem(CGUIStaticImage* pImage) -{ - CGUIListItem_Impl* pNewItem = new CGUIListItem_Impl(m_pManager, "", CGUIListItem_Impl::ImageItem, (CGUIStaticImage_Impl*)pImage); - CEGUI::ListboxItem* pListboxItem = pNewItem->GetListItem(); - reinterpret_cast(m_pWindow)->addItem((CEGUI::StandardItem*)pListboxItem); - m_Items[pNewItem->GetListItem()] = pNewItem; - return pNewItem; -} - -bool CGUIComboBox_Impl::RemoveItem(int index) -{ - try - { - CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); - if (pItem->isSelected()) // if this is currently selected, let's update the editbox. - { - m_pWindow->setText(storedCaption); - } - reinterpret_cast(m_pWindow)->removeItem((CEGUI::StandardItem*)pItem); - return true; - } - catch (...) - { - return false; - } - return false; -} - -CGUIListItem* CGUIComboBox_Impl::GetSelectedItem() -{ - return GetListItem((CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getSelectedItem()); -} - -int CGUIComboBox_Impl::GetSelectedItemIndex() -{ - CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getSelectedItem(); - - CFastHashMap::iterator it; - it = m_Items.find(pItem); - if (it == m_Items.end()) - return -1; - - try - { - return reinterpret_cast(m_pWindow)->getItemIndex((CEGUI::StandardItem*)it->first); - } - catch (...) - { - return -1; - } -} - -int CGUIComboBox_Impl::GetItemIndex(CGUIListItem* pItem) -{ - CFastHashMap::iterator it; - bool found; - - for (it = m_Items.begin(); it != m_Items.end(); it++) - { - if (it->second == pItem) - { - found = true; - break; - } - } - if (found) - { - try - { - return reinterpret_cast(m_pWindow)->getItemIndex((CEGUI::StandardItem*)it->first); - } - catch (...) - { - return -1; - } - } - - return -1; -} - -const char* CGUIComboBox_Impl::GetItemText(int index) -{ - try - { - if (index == -1) - { - return (const char*)m_pWindow->getText().c_str(); - } - else - { - CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); - if (pItem != NULL) - { - return (const char*)pItem->getText().c_str(); - } - } - } - catch (...) - { - return ""; - } - return ""; -} - -bool CGUIComboBox_Impl::SetItemText(int index, const char* szText) -{ - try - { - CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); - pItem->setText(CGUI_Impl::GetUTFString(szText)); - if (pItem->isSelected()) // if this is currently selected, let's update the editbox. - { - m_pWindow->setText(CGUI_Impl::GetUTFString(szText)); - } - return true; - } - catch (...) - { - return false; - } - return false; -} - -CGUIListItem* CGUIComboBox_Impl::GetItemByIndex(int index) -{ - CEGUI::ListboxItem* pCEGUIItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); - CGUIListItem* pItem = GetListItem(pCEGUIItem); - return pItem; -} - -bool CGUIComboBox_Impl::SetSelectedItemByIndex(int index) -{ - try - { - reinterpret_cast(m_pWindow)->clearAllSelections(); - - if (index == -1) - { - m_pWindow->setText(storedCaption); - return true; - } - else - { - CEGUI::ListboxItem* pItem = (CEGUI::ListboxItem*)reinterpret_cast(m_pWindow)->getItemFromIndex(index); - if (pItem != NULL) - { - pItem->setSelected(true); - m_pWindow->setText(pItem->getText()); - return true; - } - } - } - catch (...) - { - return false; - } - return false; -} - -void CGUIComboBox_Impl::Clear() -{ - reinterpret_cast(m_pWindow)->getDropList()->clearList(); - - CFastHashMap::iterator it; - for (it = m_Items.begin(); it != m_Items.end(); it++) - { - delete it->second; - } - - m_Items.clear(); - m_pWindow->setText(storedCaption); -} - -bool CGUIComboBox_Impl::IsOpen() -{ - return reinterpret_cast(m_pWindow)->isDropDownListVisible(); -} - -void CGUIComboBox_Impl::SetReadOnly(bool bReadonly) -{ - reinterpret_cast(m_pWindow)->setReadOnly(bReadonly); -} - -CGUIListItem_Impl* CGUIComboBox_Impl::GetListItem(CEGUI::ListboxItem* pItem) -{ - CFastHashMap::iterator it; - it = m_Items.find(pItem); - if (it == m_Items.end()) - return NULL; - - return it->second; -} - -size_t CGUIComboBox_Impl::GetItemCount() -{ - return reinterpret_cast(m_pWindow)->getItemCount(); -} - -void CGUIComboBox_Impl::SetSelectionHandler(GUI_CALLBACK Callback) -{ - m_OnSelectChange = Callback; -} - -void CGUIComboBox_Impl::SetDropListRemoveHandler(GUI_CALLBACK Callback) -{ - m_OnDropListRemoved = Callback; -} - -bool CGUIComboBox_Impl::Event_OnSelectionAccepted(const CEGUI::EventArgs& e) -{ - if (m_OnSelectChange) - m_OnSelectChange(reinterpret_cast(this)); - return true; -} - -bool CGUIComboBox_Impl::Event_OnDropListRemoved(const CEGUI::EventArgs& e) -{ - if (m_OnDropListRemoved) - m_OnDropListRemoved(reinterpret_cast(this)); - return true; -} - -void CGUIComboBox_Impl::ShowDropList() -{ - reinterpret_cast(m_pWindow)->showDropList(); - reinterpret_cast(m_pWindow)->setSingleCursorActivationEnabled(true); -} - -void CGUIComboBox_Impl::HideDropList() -{ - reinterpret_cast(m_pWindow)->hideDropList(); -} diff --git a/Client/gui_new/CGUIComboBox_Impl.h b/Client/gui_new/CGUIComboBox_Impl.h deleted file mode 100644 index fa360ee49d..0000000000 --- a/Client/gui_new/CGUIComboBox_Impl.h +++ /dev/null @@ -1,62 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIComboBox_Impl.h - * PURPOSE: Combobox widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include "CGUIElement_Impl.h" -#include "CGUIListItem_Impl.h" - -namespace GUINew{ - class CGUIComboBox_Impl; -} - -class GUINew::CGUIComboBox_Impl : public CGUIComboBox, public CGUIElement_Impl -{ -public: - CGUIComboBox_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szCaption = ""); - ~CGUIComboBox_Impl(); - - eCGUIType GetType() { return CGUI_COMBOBOX; }; - - CGUIListItem* AddItem(const char* szText); - CGUIListItem* AddItem(CGUIStaticImage* pImage); - bool RemoveItem(int index); - CGUIListItem* GetItemByIndex(int index); - CGUIListItem* GetSelectedItem(); - int GetSelectedItemIndex(); - size_t GetItemCount(); - int GetItemIndex(CGUIListItem* pItem); - const char* GetItemText(int index); - bool SetItemText(int index, const char* szText); - bool SetSelectedItemByIndex(int index); - void Clear(); - bool IsOpen(); - - void SetReadOnly(bool bReadonly); - - void SetSelectionHandler(GUI_CALLBACK Callback); - void SetDropListRemoveHandler(GUI_CALLBACK Callback); - - void ShowDropList(); - void HideDropList(); - - #include "CGUIElement_Inc.h" - -protected: - CFastHashMap m_Items; - - bool Event_OnSelectionAccepted(const CEGUI::EventArgs& e); - bool Event_OnDropListRemoved(const CEGUI::EventArgs& e); - CGUIListItem_Impl* GetListItem(CEGUI::ListboxItem* pItem); - CEGUI::String storedCaption; - GUI_CALLBACK m_OnSelectChange; - GUI_CALLBACK m_OnDropListRemoved; -}; diff --git a/Client/gui_new/CGUIEdit_Impl.cpp b/Client/gui_new/CGUIEdit_Impl.cpp deleted file mode 100644 index 4725850c5e..0000000000 --- a/Client/gui_new/CGUIEdit_Impl.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIEdit_Impl.cpp - * PURPOSE: Edit box widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUIEDIT_NAME "Editbox" - -using namespace GUINew; - -CGUIEdit_Impl::CGUIEdit_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szEdit) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the edit and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIEDIT_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0, 0.00f), CEGUI::UDim(0, 0.00f), CEGUI::UDim(0, 0.128f), CEGUI::UDim(0, 0.24f))); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Register our event - m_pWindow->subscribeEvent(CEGUI::Editbox::EventKeyDown, CEGUI::Event::Subscriber(&CGUIEdit_Impl::Event_OnKeyDown, this)); - m_pWindow->subscribeEvent(CEGUI::Editbox::EventTextChanged, CEGUI::Event::Subscriber(&CGUIEdit_Impl::Event_OnTextChanged, this)); - m_pWindow->subscribeEvent(CEGUI::Editbox::EventRenderingEnded, CEGUI::Event::Subscriber(&CGUIEdit_Impl::Event_OnRenderingEnded, this)); - m_pWindow->subscribeEvent(CEGUI::Editbox::EventRenderingStarted, CEGUI::Event::Subscriber(&CGUIEdit_Impl::Event_OnRenderingStarted, this)); - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(reinterpret_cast(pParent)); - if (CGUITabList* pTabList = dynamic_cast(pParent)) - { - pTabList->AddItem(this); - } - } - else - { - pGUI->AddChild(this); - pGUI->AddItem(this); - SetParent(NULL); - } -} - -CGUIEdit_Impl::~CGUIEdit_Impl() -{ - if (GetParent() == NULL) - { - m_pManager->RemoveItem(this); - } - else if (CGUITabList* pTabList = dynamic_cast(GetParent())) - { - pTabList->RemoveItem(this); - } - DestroyElement(); -} - -void CGUIEdit_Impl::SetReadOnly(bool bReadOnly) -{ - reinterpret_cast(m_pWindow)->setReadOnly(bReadOnly); -} - -bool CGUIEdit_Impl::IsReadOnly() -{ - return reinterpret_cast(m_pWindow)->isReadOnly(); -} - -void CGUIEdit_Impl::SetMasked(bool bMasked) -{ - reinterpret_cast(m_pWindow)->setTextMaskingEnabled(bMasked); -} - -bool CGUIEdit_Impl::IsMasked() -{ - return reinterpret_cast(m_pWindow)->isTextMaskingEnabled(); -} - -void CGUIEdit_Impl::SetMaxLength(unsigned int uiMaxLength) -{ - reinterpret_cast(m_pWindow)->setMaxTextLength(uiMaxLength); -} - -unsigned int CGUIEdit_Impl::GetMaxLength() -{ - return static_cast(reinterpret_cast(m_pWindow)->getMaxTextLength()); -} - -void CGUIEdit_Impl::SetSelection(unsigned int uiStart, unsigned int uiEnd) -{ - reinterpret_cast(m_pWindow)->setSelection(uiStart, uiEnd); -} - -unsigned int CGUIEdit_Impl::GetSelectionStart() -{ - return static_cast(reinterpret_cast(m_pWindow)->getSelectionStart()); -} - -unsigned int CGUIEdit_Impl::GetSelectionEnd() -{ - return static_cast(reinterpret_cast(m_pWindow)->getSelectionEnd()); -} - -unsigned int CGUIEdit_Impl::GetSelectionLength() -{ - return static_cast(reinterpret_cast(m_pWindow)->getSelectionLength()); -} - -void CGUIEdit_Impl::SetCaretIndex(unsigned int uiIndex) -{ - return reinterpret_cast(m_pWindow)->setCaretIndex(uiIndex); -} - -void CGUIEdit_Impl::SetCaretAtStart() -{ - reinterpret_cast(m_pWindow)->setCaretIndex(0); -} - -void CGUIEdit_Impl::SetCaretAtEnd() -{ - reinterpret_cast(m_pWindow)->setCaretIndex(GetText().length()); -} - -unsigned int CGUIEdit_Impl::GetCaretIndex() -{ - return static_cast(reinterpret_cast(m_pWindow)->getCaretIndex()); -} - -void CGUIEdit_Impl::SetTextAcceptedHandler(GUI_CALLBACK Callback) -{ - m_OnTextAccepted = Callback; -} - -void CGUIEdit_Impl::SetTextChangedHandler(GUI_CALLBACK Callback) -{ - m_OnTextChanged = Callback; -} - -void CGUIEdit_Impl::SetRenderingEndedHandler(GUI_CALLBACK Callback) -{ - m_OnRenderingEnded = Callback; -} - -void CGUIEdit_Impl::SetRenderingStartedHandler(GUI_CALLBACK Callback) -{ - m_OnRenderingStarted = Callback; -} - -bool CGUIEdit_Impl::ActivateOnTab() -{ - // Only select this as active if its visible and writable - if (IsVisible() && !IsReadOnly()) - { - Activate(); - SetCaretIndex(GetText().length()); - return true; - } - return false; -} - -bool CGUIEdit_Impl::Event_OnTextChanged(const CEGUI::EventArgs& e) -{ - if (m_OnTextChanged) - m_OnTextChanged(reinterpret_cast(this)); - return true; -} - -bool CGUIEdit_Impl::Event_OnRenderingEnded(const CEGUI::EventArgs& e) -{ - if (m_OnRenderingEnded) - m_OnRenderingEnded(reinterpret_cast(this)); - return true; -} - -bool CGUIEdit_Impl::Event_OnRenderingStarted(const CEGUI::EventArgs& e) -{ - if (m_OnRenderingStarted) - m_OnRenderingStarted(reinterpret_cast(this)); - return true; -} - -bool CGUIEdit_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) -{ - const CEGUI::KeyEventArgs& KeyboardArgs = reinterpret_cast(e); - auto scancode = (CGUIKeys::Scan)KeyboardArgs.d_key; - if (scancode == CGUIKeys::Scan::Tab) - { - // tab pressed, if we are in a window with tab enabled, just switch to the next element - if (GetParent() == NULL) - { - m_pManager->SelectNext(this); - } - else if (CGUITabList* pTabList = dynamic_cast(GetParent())) - { - pTabList->SelectNext(this); - } - } - else if (scancode == CGUIKeys::Return || scancode == CGUIKeys::NumpadEnter) - { - // Enter/Return event is split from Tab now, since we use that for Console, Quick Connect, etc. as enter-only - if (m_OnTextAccepted) - m_OnTextAccepted(reinterpret_cast(this)); - } - return true; -} diff --git a/Client/gui_new/CGUIEdit_Impl.h b/Client/gui_new/CGUIEdit_Impl.h deleted file mode 100644 index d42b2730ab..0000000000 --- a/Client/gui_new/CGUIEdit_Impl.h +++ /dev/null @@ -1,66 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIEdit_Impl.h - * PURPOSE: Edit box widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIEdit_Impl; -} - -class GUINew::CGUIEdit_Impl : public CGUIEdit, public CGUIElement_Impl, public CGUITabListItem -{ -public: - CGUIEdit_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szText = ""); - ~CGUIEdit_Impl(); - - void SetReadOnly(bool bReadOnly); - bool IsReadOnly(); - void SetMasked(bool bMasked); - bool IsMasked(); - - void SetMaxLength(unsigned int uiMaxLength); - unsigned int GetMaxLength(); - - void SetSelection(unsigned int uiStart, unsigned int uiEnd); - unsigned int GetSelectionStart(); - unsigned int GetSelectionEnd(); - unsigned int GetSelectionLength(); - - void SetCaretIndex(unsigned int uiIndex); - void SetCaretAtStart(); - void SetCaretAtEnd(); - unsigned int GetCaretIndex(); - - void SetTextAcceptedHandler(GUI_CALLBACK Callback); - void SetTextChangedHandler(GUI_CALLBACK Callback); - void SetRenderingEndedHandler(GUI_CALLBACK Callback); - void SetRenderingStartedHandler(GUI_CALLBACK Callback); - - bool ActivateOnTab(); - - eCGUIType GetType() { return CGUI_EDIT; }; - - #include "CGUIElement_Inc.h" - -protected: - bool Event_OnTextChanged(const CEGUI::EventArgs& e); - bool Event_OnKeyDown(const CEGUI::EventArgs& e); - bool Event_OnRenderingEnded(const CEGUI::EventArgs& e); - bool Event_OnRenderingStarted(const CEGUI::EventArgs& e); - - GUI_CALLBACK m_OnTextAccepted; - GUI_CALLBACK m_OnTextChanged; - GUI_CALLBACK m_OnRenderingEnded; - GUI_CALLBACK m_OnRenderingStarted; -}; diff --git a/Client/gui_new/CGUIElement_Impl.cpp b/Client/gui_new/CGUIElement_Impl.cpp deleted file mode 100644 index 3e44d491a4..0000000000 --- a/Client/gui_new/CGUIElement_Impl.cpp +++ /dev/null @@ -1,706 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIElement_Impl.cpp - * PURPOSE: Element (widget) base class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -// Define no-drawing zones, a.k.a. the inside borders in the FrameWindow of BlueLook in pixels -// If something is drawn inside of these areas, the theme border is drawn on top of it -#define CGUI_NODRAW_LEFT 9.0f -#define CGUI_NODRAW_RIGHT 9.0f -#define CGUI_NODRAW_TOP 9.0f -#define CGUI_NODRAW_BOTTOM 9.0f - -using namespace GUINew; - -CGUIElement_Impl::CGUIElement_Impl() -{ - m_pData = NULL; - m_pWindow = NULL; - m_pParent = NULL; - m_pManager = NULL; -} - -void CGUIElement_Impl::DestroyElement() -{ - m_pManager->RemoveFromRedrawQueue(reinterpret_cast((m_pWindow)->getUserData())); - - // Clear pointer back to this - m_pWindow->setUserData(NULL); - - // Destroy the control - m_pManager->GetWindowManager()->destroyWindow(m_pWindow); - - // Destroy the properties list - EmptyProperties(); -} - -void CGUIElement_Impl::SetVisible(bool bVisible) -{ - m_pWindow->setVisible(bVisible); -} - -bool CGUIElement_Impl::IsVisible() -{ - return m_pWindow->isVisible(); -} - -void CGUIElement_Impl::SetEnabled(bool bEnabled) -{ - m_pWindow->setEnabled(bEnabled); - // m_pWindow->setZOrderingEnabled ( bEnabled ); -} - -bool CGUIElement_Impl::IsEnabled() -{ - return !m_pWindow->isDisabled(); -} - -void CGUIElement_Impl::SetZOrderingEnabled(bool bZOrderingEnabled) -{ - m_pWindow->setZOrderingEnabled(bZOrderingEnabled); -} - -bool CGUIElement_Impl::IsZOrderingEnabled() -{ - return m_pWindow->isZOrderingEnabled(); -} - -void CGUIElement_Impl::BringToFront() -{ - m_pWindow->moveToFront(); -} - -void CGUIElement_Impl::MoveToBack() -{ - m_pWindow->moveToBack(); -} - -void CGUIElement_Impl::SetPosition(const CVector2D& Position, bool bRelative) -{ - CEGUI::UVector2 position; - - if (bRelative) - position = CEGUI::UVector2(CEGUI::UDim(Position.fX, 0), CEGUI::UDim(Position.fY, 0)); - else - position = CEGUI::UVector2(CEGUI::UDim(0, Position.fX), CEGUI::UDim(0, Position.fY)); - - m_pWindow->setPosition(position); -} - -CVector2D CGUIElement_Impl::GetPosition(bool bRelative) -{ - CEGUI::UVector2 position = m_pWindow->getPosition(); - float x = position.d_x.d_offset; - float y = position.d_y.d_offset; - - if (bRelative) - { - x = position.d_x.d_scale; - y = position.d_y.d_scale; - } - - return CVector2D(x, y); -} - -void CGUIElement_Impl::GetPosition(CVector2D& vecPosition, bool bRelative) -{ - CVector2D position = GetPosition(bRelative); - vecPosition = position; -} - -void CGUIElement_Impl::SetWidth(float fX, bool bRelative) -{ - m_pWindow->setWidth({bRelative ? fX : 0, bRelative ? 0 : fX}); -} - -void CGUIElement_Impl::SetHeight(float fY, bool bRelative) -{ - m_pWindow->setHeight({bRelative ? fY : 0, bRelative ? 0 : fY}); -} - -void CGUIElement_Impl::SetSize(const CVector2D& vecSize, bool bRelative) -{ - CEGUI::USize size; - - if (bRelative) - size = CEGUI::USize(CEGUI::UDim(vecSize.fX, 0), CEGUI::UDim(vecSize.fY, 0)); - else - size = CEGUI::USize(CEGUI::UDim(0, vecSize.fX), CEGUI::UDim(0, vecSize.fY)); - - m_pWindow->setSize(size); -} - -CVector2D CGUIElement_Impl::GetSize(bool bRelative) -{ - CEGUI::USize size = m_pWindow->getSize(); - float width = size.d_width.d_offset; - float height = size.d_height.d_offset; - - if (bRelative) - { - width = size.d_width.d_scale; - height = size.d_height.d_scale; - } - - return CVector2D(width, height); -} - -void CGUIElement_Impl::GetSize(CVector2D& vecSize, bool bRelative) -{ - CVector2D size = GetSize(bRelative); - vecSize = size; -} - -void CGUIElement_Impl::AutoSize(const char* Text, float fPaddingX, float fPaddingY) -{ - CEGUI::Font* pFont = m_pWindow->getFont(); - - if (!pFont) - return; - - // Add hack factor to height to allow for long characters such as 'g' or 'j' - m_pWindow->setSize(CEGUI::USize(CEGUI::UDim(0, pFont->getTextExtent(Text ? Text : GetText()) + fPaddingX), CEGUI::UDim(0, pFont->getFontHeight() + fPaddingY))); -} - -void CGUIElement_Impl::SetMinimumSize(const CVector2D& vecSize) -{ - m_pWindow->setMinSize(CEGUI::USize(CEGUI::UDim(0, vecSize.fX), CEGUI::UDim(0, vecSize.fY))); -} - -CVector2D CGUIElement_Impl::GetMinimumSize() -{ - const CEGUI::USize& size = m_pWindow->getMinSize(); - return CVector2D(size.d_width.d_offset, size.d_height.d_offset); -} - -void CGUIElement_Impl::GetMinimumSize(CVector2D& vecSize) -{ - const CEGUI::USize& size = m_pWindow->getMinSize(); - vecSize = CVector2D(size.d_width.d_offset, size.d_height.d_offset); -} - -void CGUIElement_Impl::SetMaximumSize(const CVector2D& vecSize) -{ - m_pWindow->setMaxSize(CEGUI::USize(CEGUI::UDim(0, vecSize.fX), CEGUI::UDim(0, vecSize.fY))); -} - -CVector2D CGUIElement_Impl::GetMaximumSize() -{ - const CEGUI::USize& size = m_pWindow->getMaxSize(); - return CVector2D(size.d_width.d_offset, size.d_height.d_offset); -} - -void CGUIElement_Impl::GetMaximumSize(CVector2D& vecSize) -{ - const CEGUI::USize& size = m_pWindow->getSize(); - vecSize = CVector2D(size.d_width.d_offset, size.d_height.d_offset); -} - -void CGUIElement_Impl::SetText(const char* szText) -{ - m_pWindow->setText(CGUI_Impl::GetUTFString(szText)); -} - -std::string CGUIElement_Impl::GetText() -{ - return (const char*)CGUI_Impl::GetUTFString((const char*)m_pWindow->getText().c_str()).c_str(); -} - -void CGUIElement_Impl::SetAlpha(float fAlpha) -{ - m_pWindow->setAlpha(fAlpha); -} - -float CGUIElement_Impl::GetAlpha() -{ - return m_pWindow->getAlpha(); -} - -float CGUIElement_Impl::GetEffectiveAlpha() -{ - return m_pWindow->getEffectiveAlpha(); -} - -void CGUIElement_Impl::SetInheritsAlpha(bool bInheritsAlpha) -{ - m_pWindow->setInheritsAlpha(bInheritsAlpha); -} - -bool CGUIElement_Impl::GetInheritsAlpha() -{ - return m_pWindow->inheritsAlpha(); -} - -void CGUIElement_Impl::Activate() -{ - m_pWindow->activate(); -} - -void CGUIElement_Impl::Deactivate() -{ - m_pWindow->deactivate(); -} - -bool CGUIElement_Impl::IsActive() -{ - return m_pWindow->isActive(); -} - -void CGUIElement_Impl::SetAlwaysOnTop(bool bAlwaysOnTop) -{ - m_pWindow->setAlwaysOnTop(bAlwaysOnTop); -} - -bool CGUIElement_Impl::IsAlwaysOnTop() -{ - return m_pWindow->isAlwaysOnTop(); -} - -CRect2D CGUIElement_Impl::AbsoluteToRelative(const CRect2D& Rect) -{ - float fLeft = CEGUI::CoordConverter::screenToWindowX(*m_pWindow, Rect.fX1); - float fTop = CEGUI::CoordConverter::screenToWindowY(*m_pWindow, Rect.fY1); - float fRight = CEGUI::CoordConverter::screenToWindowX(*m_pWindow, Rect.fX2); - float fBottom = CEGUI::CoordConverter::screenToWindowY(*m_pWindow, Rect.fY2); - - return CRect2D(fLeft, fTop, fRight, fBottom); -} - -CVector2D CGUIElement_Impl::AbsoluteToRelative(const CVector2D& Vector) -{ - CEGUI::UDim absoluteWidth = CEGUI::UDim(0, Vector.fX); - CEGUI::UDim absoluteHeight = CEGUI::UDim(0, Vector.fY); - CEGUI::USize baseSize = m_pWindow->getSize(); - - float fRelativeWidth = CEGUI::CoordConverter::asRelative(absoluteWidth, baseSize.d_width.d_offset); - float fRelativeHeight = CEGUI::CoordConverter::asRelative(absoluteHeight, baseSize.d_height.d_offset); - - return CVector2D(fRelativeWidth, fRelativeHeight); -} - -CRect2D CGUIElement_Impl::RelativeToAbsolute(const CRect2D& Rect) -{ - CEGUI::UDim relativeLeft = CEGUI::UDim(Rect.fX1, 0); - CEGUI::UDim relativeTop = CEGUI::UDim(Rect.fY1, 0); - CEGUI::UDim relativeRight = CEGUI::UDim(Rect.fX2, 0); - CEGUI::UDim relativeBottom = CEGUI::UDim(Rect.fY2, 0); - - CEGUI::URect area = m_pWindow->getArea(); - - float fBaseLeft = area.getPosition().d_x.d_offset; - float fBaseTop = area.getPosition().d_y.d_offset; - float fBaseRight = area.getWidth().d_offset; - float fBaseBottom = area.getHeight().d_offset; - - float fAbsoluteLeft = CEGUI::CoordConverter::asAbsolute(relativeLeft, fBaseLeft); - float fAbsoluteTop = CEGUI::CoordConverter::asAbsolute(relativeTop, fBaseTop); - float fAbsoluteRight = CEGUI::CoordConverter::asAbsolute(relativeRight, fBaseRight); - float fAbsoluteBottom = CEGUI::CoordConverter::asAbsolute(relativeBottom, fBaseBottom); - - return CRect2D(fAbsoluteLeft, fAbsoluteTop, fAbsoluteRight, fAbsoluteBottom); -} - -CVector2D CGUIElement_Impl::RelativeToAbsolute(const CVector2D& Vector) -{ - CEGUI::USize relativeSize = CEGUI::USize(CEGUI::UDim(Vector.fX, 0), CEGUI::UDim(Vector.fY, 0)); - CEGUI::USize baseSize = m_pWindow->getSize(); - - CEGUI::Sizef size = CEGUI::Sizef(baseSize.d_width.d_offset, baseSize.d_height.d_offset); - - CEGUI::Sizef absoluteSize = CEGUI::CoordConverter::asAbsolute(relativeSize, size, true); - - return CVector2D(absoluteSize.d_width, absoluteSize.d_height); -} - -void CGUIElement_Impl::SetParent(CGUIElement* pParent) -{ - // Disable z-sorting if the label has a parent - if (GetType() == CGUI_LABEL) - m_pWindow->setZOrderingEnabled(pParent == NULL); - - if (pParent) - { - CGUIElement_Impl* pElement = dynamic_cast(pParent); - if (pElement) - pElement->m_pWindow->addChild(m_pWindow); - } - m_pParent = pParent; -} - -CGUIElement* CGUIElement_Impl::GetParent() -{ - // Validate - if (m_pParent && m_pWindow && !m_pWindow->getParent()) - return NULL; - - return m_pParent; -} - -CEGUI::Window* CGUIElement_Impl::GetWindow() -{ - return m_pWindow; -} - -void CGUIElement_Impl::CorrectEdges() -{ - CEGUI::UVector2 currentPosition = m_pWindow->getPosition(); - CEGUI::USize currentSize = m_pWindow->getSize(); - - std::string strType = (const char*)m_pWindow->getType().c_str(); - std::string strParentType = (const char*)m_pWindow->getParent()->getType().c_str(); - - // Label turns out to be buggy - if (strType == m_pManager->GetElementPrefix() + "/StaticText") - return; - - if (strParentType == m_pManager->GetElementPrefix() + "/FrameWindow") - { - CEGUI::USize parentSize = m_pWindow->getParent()->getSize(); - if (currentPosition.d_x.d_offset < CGUI_NODRAW_LEFT) - currentPosition.d_x.d_offset += CGUI_NODRAW_LEFT - currentPosition.d_x.d_offset; - if (currentPosition.d_y.d_offset < CGUI_NODRAW_TOP) - currentPosition.d_y.d_offset += CGUI_NODRAW_TOP - currentPosition.d_x.d_offset; - if ((currentSize.d_height.d_offset + currentPosition.d_y.d_offset) > (parentSize.d_height.d_offset - CGUI_NODRAW_BOTTOM)) - currentSize.d_height.d_offset -= (currentSize.d_height.d_offset + currentPosition.d_y.d_offset) - (parentSize.d_height.d_offset - CGUI_NODRAW_BOTTOM); - if ((currentSize.d_width.d_offset + currentPosition.d_x.d_offset) > (parentSize.d_width.d_offset - CGUI_NODRAW_RIGHT)) - currentSize.d_width.d_offset -= (currentSize.d_width.d_offset + currentPosition.d_x.d_offset) - (parentSize.d_width.d_offset - CGUI_NODRAW_RIGHT); - m_pWindow->setPosition(currentPosition); - m_pWindow->setSize(currentSize); - } -} - -bool CGUIElement_Impl::SetFont(const char* szFontName) -{ - try - { - m_pWindow->setFont(CEGUI::String(szFontName)); - return true; - } - catch (CEGUI::Exception e) - { - return false; - } -} - -std::string CGUIElement_Impl::GetFont() -{ - try - { - const CEGUI::Font* pFont = m_pWindow->getFont(); - if (pFont) - { - // Return the contname. std::string will copy it. - CEGUI::String strFontName = pFont->getName(); - return (const char*)strFontName.c_str(); - } - } - catch (CEGUI::Exception e) - { - } - - return ""; -} - -void CGUIElement_Impl::SetProperty(const char* szProperty, const char* szValue) -{ - try - { - m_pWindow->setProperty(CGUI_Impl::GetUTFString(szProperty), CGUI_Impl::GetUTFString(szValue)); - } - catch (CEGUI::Exception e) - { - } -} - -std::string CGUIElement_Impl::GetProperty(const char* szProperty) -{ - CEGUI::String strValue; - try - { - // Return the string. std::string will copy it - strValue = CGUI_Impl::GetUTFString((const char*)m_pWindow->getProperty(CGUI_Impl::GetUTFString(szProperty)).c_str()); - } - catch (CEGUI::Exception e) - { - } - - return (const char*)strValue.c_str(); -} - -void CGUIElement_Impl::FillProperties() -{ - CEGUI::Window::PropertyIterator itPropertySet = (dynamic_cast(m_pWindow)->getPropertyIterator()); - while (!itPropertySet.isAtEnd()) - { - CEGUI::String strKey = itPropertySet.getCurrentKey(); - CEGUI::String strValue = m_pWindow->getProperty(strKey); - - CGUIProperty* pProperty = new CGUIProperty; - pProperty->strKey = (const char*)strKey.c_str(); - pProperty->strValue = (const char*)strValue.c_str(); - - m_Properties.push_back(pProperty); - itPropertySet++; - } -} - -void CGUIElement_Impl::EmptyProperties() -{ - if (!m_Properties.empty()) - { - CGUIPropertyIter iter = m_Properties.begin(); - CGUIPropertyIter iterEnd = m_Properties.end(); - for (; iter != iterEnd; iter++) - { - if (*iter) - { - delete (*iter); - } - } - } -} - -CGUIPropertyIter CGUIElement_Impl::GetPropertiesBegin() -{ - try - { - // Fill the properties list, if it's still empty (on first call) - if (m_Properties.empty()) - FillProperties(); - - // Return the list begin iterator - return m_Properties.begin(); - } - catch (CEGUI::Exception e) - { - return *(CGUIPropertyIter*)NULL; - } -} - -CGUIPropertyIter CGUIElement_Impl::GetPropertiesEnd() -{ - try - { - // Fill the properties list, if it's still empty (on first call) - if (m_Properties.empty()) - FillProperties(); - - // Return the list begin iterator - return m_Properties.end(); - } - catch (CEGUI::Exception e) - { - return *(CGUIPropertyIter*)NULL; - } -} - -void CGUIElement_Impl::SetMovedHandler(GUI_CALLBACK Callback) -{ - m_OnMoved = Callback; -} - -void CGUIElement_Impl::SetSizedHandler(GUI_CALLBACK Callback) -{ - m_OnSized = Callback; -} - -void CGUIElement_Impl::SetClickHandler(GUI_CALLBACK Callback) -{ - m_OnClick = Callback; -} - -void CGUIElement_Impl::SetClickHandler(const GUI_CALLBACK_MOUSE& Callback) -{ - m_OnClickWithArgs = Callback; -} - -void CGUIElement_Impl::SetDoubleClickHandler(GUI_CALLBACK Callback) -{ - m_OnDoubleClick = Callback; -} - -void CGUIElement_Impl::SetMouseEnterHandler(GUI_CALLBACK Callback) -{ - m_OnMouseEnter = Callback; -} - -void CGUIElement_Impl::SetMouseLeaveHandler(GUI_CALLBACK Callback) -{ - m_OnMouseLeave = Callback; -} - -void CGUIElement_Impl::SetMouseButtonDownHandler(GUI_CALLBACK Callback) -{ - m_OnMouseDown = Callback; -} - -void CGUIElement_Impl::SetActivateHandler(GUI_CALLBACK Callback) -{ - m_OnActivate = Callback; -} - -void CGUIElement_Impl::SetDeactivateHandler(GUI_CALLBACK Callback) -{ - m_OnDeactivate = Callback; -} - -void CGUIElement_Impl::SetKeyDownHandler(GUI_CALLBACK Callback) -{ - m_OnKeyDown = Callback; -} - -void CGUIElement_Impl::SetEnterKeyHandler(GUI_CALLBACK Callback) -{ - m_OnEnter = Callback; -} - -void CGUIElement_Impl::SetKeyDownHandler(const GUI_CALLBACK_KEY& Callback) -{ - m_OnKeyDownWithArgs = Callback; -} - -void CGUIElement_Impl::AddEvents() -{ - // Note: Mouse Click, Double Click, Enter, Leave and ButtonDown are handled by global events in CGUI_Impl - // Register our events - m_pWindow->subscribeEvent(CEGUI::Window::EventMoved, CEGUI::Event::Subscriber(&CGUIElement_Impl::Event_OnMoved, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventSized, CEGUI::Event::Subscriber(&CGUIElement_Impl::Event_OnSized, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventActivated, CEGUI::Event::Subscriber(&CGUIElement_Impl::Event_OnActivated, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventDeactivated, CEGUI::Event::Subscriber(&CGUIElement_Impl::Event_OnDeactivated, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventKeyDown, CEGUI::Event::Subscriber(&CGUIElement_Impl::Event_OnKeyDown, this)); -} - -bool CGUIElement_Impl::Event_OnMoved(const CEGUI::EventArgs& e) -{ - if (m_OnMoved) - m_OnMoved(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnSized(const CEGUI::EventArgs& e) -{ - if (m_OnSized) - m_OnSized(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnClick(const CEGUI::EventArgs& eBase) -{ - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(eBase); - CGUIElement* pElement = reinterpret_cast(this); - - if (m_OnClick) - m_OnClick(pElement); - - if (m_OnClickWithArgs) - { - CGUIMouseEventArgs NewArgs; - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - NewArgs.pWindow = pElement; - - m_OnClickWithArgs(NewArgs); - } - - return true; -} - -bool CGUIElement_Impl::Event_OnDoubleClick() -{ - if (m_OnDoubleClick) - m_OnDoubleClick(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnMouseEnter() -{ - if (m_OnMouseEnter) - m_OnMouseEnter(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnMouseLeave() -{ - if (m_OnMouseLeave) - m_OnMouseLeave(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnMouseButtonDown() -{ - if (m_OnMouseDown) - m_OnMouseDown(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnActivated(const CEGUI::EventArgs& e) -{ - if (m_OnActivate) - m_OnActivate(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnDeactivated(const CEGUI::EventArgs& e) -{ - if (m_OnDeactivate) - m_OnDeactivate(reinterpret_cast(this)); - return true; -} - -bool CGUIElement_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) -{ - const CEGUI::KeyEventArgs& Args = reinterpret_cast(e); - CGUIElement* pCGUIElement = reinterpret_cast(this); - - if (m_OnKeyDown) - { - m_OnKeyDown(pCGUIElement); - } - - if (m_OnKeyDownWithArgs) - { - CGUIKeyEventArgs NewArgs; - - // copy the variables - NewArgs.scancode = (CGUIKeys::Scan)Args.d_key; - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast((Args.window)->getUserData()); - NewArgs.pWindow = pElement; - - m_OnKeyDownWithArgs(NewArgs); - } - - if (m_OnEnter) - { - switch (Args.d_key) - { - // Return key - case CEGUI::Key::Scan::NumpadEnter: - case CEGUI::Key::Scan::Return: - { - // Fire the event - m_OnEnter(pCGUIElement); - break; - } - } - } - - return true; -} - -inline void CGUIElement_Impl::ForceRedraw() -{ - m_pWindow->invalidate(true); -} diff --git a/Client/gui_new/CGUIElement_Impl.h b/Client/gui_new/CGUIElement_Impl.h deleted file mode 100644 index a179b86265..0000000000 --- a/Client/gui_new/CGUIElement_Impl.h +++ /dev/null @@ -1,165 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIElement_Impl.h - * PURPOSE: Element (widget) base class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include - -#include - -namespace CEGUI -{ - class Window; - class EventArgs; -} // namespace CEGUI -class GUINew::CGUI_Impl; - -namespace GUINew{ - class CGUIElement_Impl; -} - -class GUINew::CGUIElement_Impl : public CGUIElement -{ -public: - CGUIElement_Impl(); - - void SetVisible(bool bVisible); - bool IsVisible(); - - void SetEnabled(bool bEnabled); - bool IsEnabled(); - void SetZOrderingEnabled(bool bZOrderingEnabled); - bool IsZOrderingEnabled(); - - void BringToFront(); - void MoveToBack(); - - void SetPosition(const CVector2D& vecPosition, bool bRelative = false); - CVector2D GetPosition(bool bRelative = false); - void GetPosition(CVector2D& vecPosition, bool bRelative = false); - - void SetWidth(float fX, bool bRelative = false); - void SetHeight(float fY, bool bRelative = false); - - void SetSize(const CVector2D& vecSize, bool bRelative = false); - CVector2D GetSize(bool bRelative = false); - void GetSize(CVector2D& vecSize, bool bRelative = false); - - void AutoSize(const char* Text = NULL, float fPaddingX = 0.0f, float fPaddingY = 2.0f); - - bool SetFont(const char* szFontName); - std::string GetFont(); - - void SetProperty(const char* szProperty, const char* szValue); - std::string GetProperty(const char* szProperty); - - void SetMinimumSize(const CVector2D& vecSize); - CVector2D GetMinimumSize(); - void GetMinimumSize(CVector2D& vecSize); - - void SetMaximumSize(const CVector2D& vecSize); - CVector2D GetMaximumSize(); - void GetMaximumSize(CVector2D& vecSize); - - void SetText(const char* Text); - std::string GetText(); - - void SetAlpha(float fAlpha); - float GetAlpha(); - float GetEffectiveAlpha(); - void SetInheritsAlpha(bool bInheritsAlpha); - bool GetInheritsAlpha(); - - void Activate(); - void Deactivate(); - bool IsActive(); - - void SetAlwaysOnTop(bool bAlwaysOnTop); - bool IsAlwaysOnTop(); - - CRect2D AbsoluteToRelative(const CRect2D& Rect); - CVector2D AbsoluteToRelative(const CVector2D& Vector); - - CRect2D RelativeToAbsolute(const CRect2D& Rect); - CVector2D RelativeToAbsolute(const CVector2D& Vector); - - void SetParent(CGUIElement* pParent); - CGUIElement* GetParent(); - - CEGUI::Window* GetWindow(); - - void ForceRedraw(); - - void SetUserData(void* pData) { m_pData = pData; } - void* GetUserData() { return m_pData; } - - CGUIPropertyIter GetPropertiesBegin(); - CGUIPropertyIter GetPropertiesEnd(); - - void SetMovedHandler(GUI_CALLBACK Callback); - void SetSizedHandler(GUI_CALLBACK Callback); - void SetClickHandler(GUI_CALLBACK Callback); - void SetClickHandler(const GUI_CALLBACK_MOUSE& Callback); - void SetDoubleClickHandler(GUI_CALLBACK Callback); - void SetMouseEnterHandler(GUI_CALLBACK Callback); - void SetMouseLeaveHandler(GUI_CALLBACK Callback); - void SetMouseButtonDownHandler(GUI_CALLBACK Callback); - void SetActivateHandler(GUI_CALLBACK Callback); - void SetDeactivateHandler(GUI_CALLBACK Callback); - void SetKeyDownHandler(GUI_CALLBACK Callback); - void SetKeyDownHandler(const GUI_CALLBACK_KEY& Callback); - void SetEnterKeyHandler(GUI_CALLBACK Callback); - - bool Event_OnClick(const CEGUI::EventArgs& e); - bool Event_OnDoubleClick(); - bool Event_OnMouseEnter(); - bool Event_OnMouseLeave(); - bool Event_OnMouseButtonDown(); - -protected: - void DestroyElement(); - - void CorrectEdges(); - void FillProperties(); - void EmptyProperties(); - - void AddEvents(); - - bool Event_OnMoved(const CEGUI::EventArgs& e); - bool Event_OnSized(const CEGUI::EventArgs& e); - bool Event_OnActivated(const CEGUI::EventArgs& e); - bool Event_OnDeactivated(const CEGUI::EventArgs& e); - bool Event_OnKeyDown(const CEGUI::EventArgs& e); - - CEGUI::Window* m_pWindow; - CGUIElement* m_pParent; - - CGUI_Impl* m_pManager; - - void* m_pData; - - std::list m_Properties; - - GUI_CALLBACK m_OnClick; - GUI_CALLBACK m_OnDoubleClick; - GUI_CALLBACK m_OnMoved; - GUI_CALLBACK m_OnSized; - GUI_CALLBACK m_OnMouseEnter; - GUI_CALLBACK m_OnMouseLeave; - GUI_CALLBACK m_OnMouseDown; - GUI_CALLBACK m_OnActivate; - GUI_CALLBACK m_OnDeactivate; - GUI_CALLBACK m_OnKeyDown; - GUI_CALLBACK m_OnEnter; - - GUI_CALLBACK_MOUSE m_OnClickWithArgs; - GUI_CALLBACK_KEY m_OnKeyDownWithArgs; -}; diff --git a/Client/gui_new/CGUIElement_Inc.h b/Client/gui_new/CGUIElement_Inc.h deleted file mode 100644 index 42b9ed71a9..0000000000 --- a/Client/gui_new/CGUIElement_Inc.h +++ /dev/null @@ -1,319 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIElement_Inc.h - * PURPOSE: Element derived class inclusion header - * (fixes C++-language issues regarding inheritance) - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -void SetProperty(const char* szProperty, const char* szValue) -{ - GUINew::CGUIElement_Impl::SetProperty(szProperty, szValue); -}; -std::string GetProperty(const char* szProperty) -{ - return GUINew::CGUIElement_Impl::GetProperty(szProperty); -}; - -CGUIPropertyIter GetPropertiesBegin() -{ - return GUINew::CGUIElement_Impl::GetPropertiesBegin(); -}; -CGUIPropertyIter GetPropertiesEnd() -{ - return GUINew::CGUIElement_Impl::GetPropertiesEnd(); -}; - -bool SetFont(const char* szFontName) -{ - return GUINew::CGUIElement_Impl::SetFont(szFontName); -}; -std::string GetFont() -{ - return GUINew::CGUIElement_Impl::GetFont(); -}; - -#ifndef SETVISIBLE_HACK -void SetVisible(bool bVisible) -{ - GUINew::CGUIElement_Impl::SetVisible(bVisible); -}; -bool IsVisible() -{ - return GUINew::CGUIElement_Impl::IsVisible(); -}; -#endif - -#ifndef SETENABLED_HACK -void SetEnabled(bool bEnabled) -{ - GUINew::CGUIElement_Impl::SetEnabled(bEnabled); -}; -bool IsEnabled() -{ - return GUINew::CGUIElement_Impl::IsEnabled(); -}; -#endif -void SetZOrderingEnabled(bool bZOrderingEnabled) -{ - GUINew::CGUIElement_Impl::SetZOrderingEnabled(bZOrderingEnabled); -}; -bool IsZOrderingEnabled() -{ - return GUINew::CGUIElement_Impl::IsZOrderingEnabled(); -}; - -void BringToFront() -{ - GUINew::CGUIElement_Impl::BringToFront(); -}; -void MoveToBack() -{ - GUINew::CGUIElement_Impl::MoveToBack(); -}; - -void SetPosition(const CVector2D& vecPosition, bool bRelative = false) -{ - GUINew::CGUIElement_Impl::SetPosition(vecPosition, bRelative); -}; -CVector2D GetPosition(bool bRelative = false) -{ - return GUINew::CGUIElement_Impl::GetPosition(bRelative); -}; -void GetPosition(CVector2D& vecPosition, bool bRelative = false) -{ - GUINew::CGUIElement_Impl::GetPosition(vecPosition, bRelative); -}; - -void SetWidth(float fX, bool bRelative = false) -{ - GUINew::CGUIElement_Impl::SetWidth(fX, bRelative); -}; -void SetHeight(float fY, bool bRelative = false) -{ - GUINew::CGUIElement_Impl::SetHeight(fY, bRelative); -}; - -#ifndef EXCLUDE_SET_SIZE // WTF? TODO: Refactor this -void SetSize(const CVector2D& vecSize, bool bRelative = false) -{ - GUINew::CGUIElement_Impl::SetSize(vecSize, bRelative); -}; -#endif -CVector2D GetSize(bool bRelative = false) -{ - return GUINew::CGUIElement_Impl::GetSize(bRelative); -}; -void GetSize(CVector2D& vecSize, bool bRelative = false) -{ - GUINew::CGUIElement_Impl::GetSize(vecSize, bRelative); -}; - -void AutoSize(const char* Text = NULL, float fPaddingX = 0.0f, float fPaddingY = 2.0f) -{ - GUINew::CGUIElement_Impl::AutoSize(Text, fPaddingX, fPaddingY); -}; - -void SetMinimumSize(const CVector2D& vecSize) -{ - GUINew::CGUIElement_Impl::SetMinimumSize(vecSize); -}; -CVector2D GetMinimumSize() -{ - return GUINew::CGUIElement_Impl::GetMinimumSize(); -}; -void GetMinimumSize(CVector2D& vecSize) -{ - GUINew::CGUIElement_Impl::GetMinimumSize(vecSize); -}; - -void SetMaximumSize(const CVector2D& vecSize) -{ - GUINew::CGUIElement_Impl::SetMaximumSize(vecSize); -}; -CVector2D GetMaximumSize() -{ - return GUINew::CGUIElement_Impl::GetMaximumSize(); -}; -void GetMaximumSize(CVector2D& vecSize) -{ - GUINew::CGUIElement_Impl::GetMaximumSize(vecSize); -}; - -#ifndef EXCLUDE_SET_TEXT -void SetText(const char* Text) -{ - GUINew::CGUIElement_Impl::SetText(Text); -}; -#endif - -std::string GetText() -{ - return GUINew::CGUIElement_Impl::GetText(); -}; - -void SetAlpha(float fAlpha) -{ - GUINew::CGUIElement_Impl::SetAlpha(fAlpha); -}; -float GetAlpha() -{ - return GUINew::CGUIElement_Impl::GetAlpha(); -}; -float GetEffectiveAlpha() -{ - return GUINew::CGUIElement_Impl::GetEffectiveAlpha(); -}; -void SetInheritsAlpha(bool bInheritsAlpha) -{ - GUINew::CGUIElement_Impl::SetInheritsAlpha(bInheritsAlpha); -}; -bool GetInheritsAlpha() -{ - return GUINew::CGUIElement_Impl::GetInheritsAlpha(); -}; - -void Activate() -{ - GUINew::CGUIElement_Impl::Activate(); -}; -void Deactivate() -{ - GUINew::CGUIElement_Impl::Deactivate(); -}; -bool IsActive() -{ - return GUINew::CGUIElement_Impl::IsActive(); -}; - -void ForceRedraw() -{ - GUINew::CGUIElement_Impl::ForceRedraw(); -}; -void SetAlwaysOnTop(bool bAlwaysOnTop) -{ - GUINew::CGUIElement_Impl::SetAlwaysOnTop(bAlwaysOnTop); -}; -bool IsAlwaysOnTop() -{ - return GUINew::CGUIElement_Impl::IsAlwaysOnTop(); -}; - -CRect2D AbsoluteToRelative(const CRect2D& Rect) -{ - return CGUIElement_Impl::AbsoluteToRelative(Rect); -}; -CVector2D AbsoluteToRelative(const CVector2D& Vector) -{ - return CGUIElement_Impl::AbsoluteToRelative(Vector); -}; - -CRect2D RelativeToAbsolute(const CRect2D& Rect) -{ - return CGUIElement_Impl::RelativeToAbsolute(Rect); -}; -CVector2D RelativeToAbsolute(const CVector2D& Vector) -{ - return CGUIElement_Impl::RelativeToAbsolute(Vector); -}; - -void SetParent(CGUIElement* pParent) -{ - GUINew::CGUIElement_Impl::SetParent(pParent); -}; -CGUIElement* GetParent() -{ - return GUINew::CGUIElement_Impl::GetParent(); -}; - -CEGUI::Window* GetWindow() -{ - return GUINew::CGUIElement_Impl::GetWindow(); -}; - -void SetUserData(void* pData) -{ - GUINew::CGUIElement_Impl::SetUserData(pData); -}; -void* GetUserData() -{ - return GUINew::CGUIElement_Impl::GetUserData(); -}; - -void SetClickHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetClickHandler(Callback); -}; -void SetClickHandler(const GUI_CALLBACK_MOUSE& Callback) -{ - GUINew::CGUIElement_Impl::SetClickHandler(Callback); -}; -void SetDoubleClickHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetDoubleClickHandler(Callback); -}; -void SetMovedHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetMovedHandler(Callback); -}; -void SetSizedHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetSizedHandler(Callback); -}; -void SetMouseEnterHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetMouseEnterHandler(Callback); -}; -void SetMouseLeaveHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetMouseLeaveHandler(Callback); -}; -void SetMouseButtonDownHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetMouseButtonDownHandler(Callback); -}; -void SetActivateHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetActivateHandler(Callback); -}; -void SetDeactivateHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetDeactivateHandler(Callback); -}; -void SetKeyDownHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetKeyDownHandler(Callback); -}; -void SetKeyDownHandler(const GUI_CALLBACK_KEY& Callback) -{ - GUINew::CGUIElement_Impl::SetKeyDownHandler(Callback); -}; -void SetEnterKeyHandler(GUI_CALLBACK Callback) -{ - GUINew::CGUIElement_Impl::SetEnterKeyHandler(Callback); -}; - -bool Event_OnClick(const CEGUI::EventArgs& e) -{ - return GUINew::CGUIElement_Impl::Event_OnClick(e); -}; -bool Event_OnDoubleClick() -{ - return GUINew::CGUIElement_Impl::Event_OnDoubleClick(); -}; -bool Event_OnMouseEnter() -{ - return GUINew::CGUIElement_Impl::Event_OnMouseEnter(); -}; -bool Event_OnMouseLeave() -{ - return GUINew::CGUIElement_Impl::Event_OnMouseLeave(); -}; -bool Event_OnMouseButtonDown() -{ - return GUINew::CGUIElement_Impl::Event_OnMouseButtonDown(); -}; diff --git a/Client/gui_new/CGUIFont_Impl.cpp b/Client/gui_new/CGUIFont_Impl.cpp deleted file mode 100644 index d36db0cf8d..0000000000 --- a/Client/gui_new/CGUIFont_Impl.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIFont_Impl.cpp - * PURPOSE: Font type class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -using namespace GUINew; - -CGUIFont_Impl::CGUIFont_Impl(CGUI_Impl* pGUI, const char* szFontName, const char* szFontFile, unsigned int uSize, unsigned int uFlags, bool bAutoScale, - bool isWinFont) -{ - // Store the fontmanager and create a font with the given attributes - m_pFontManager = pGUI->GetFontManager(); - m_pFont = NULL; - - // Store the renderer's geometry buffer - m_pGeometryBuffer = pGUI->GetGeometryBuffer(); - - CEGUI::AutoScaledMode scaleMode = bAutoScale ? CEGUI::AutoScaledMode::Both : CEGUI::AutoScaledMode::Disabled; - - while (!m_pFont) - { - try - { - m_pFont = &m_pFontManager->createFreeTypeFont(szFontName, uSize, CEGUI::FontSizeUnit::Pixels, true, szFontFile, - isWinFont ? "absolute" : "mta_fonts", scaleMode, CEGUI::Sizef(1024, 768)); - } - catch (CEGUI::RendererException) - { - // Reduce size until it can fit into a texture - if (--uSize == 1) - throw; - } - } - - // Define our glyphs (no longer required) - // m_pFont->setInitialFontGlyphs(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); - - // Set default attributes - SetNativeResolution(1024, 768); - SetAutoScalingEnabled(bAutoScale); -} - -CGUIFont_Impl::~CGUIFont_Impl() -{ - m_pFontManager->destroy(*m_pFont); -} - -void CGUIFont_Impl::DrawTextString(const char* szText, CRect2D DrawArea, float fZ, CRect2D ClipRect, unsigned long ulFormat, unsigned long ulColor, - float fScaleX, float fScaleY) -{ - m_pRenderedText->renderText(szText); - m_pRenderedText->createRenderGeometry(std::vector{m_pGeometryBuffer}, glm::vec2(DrawArea.fX1, DrawArea.fY1), - &CEGUI::ColourRect(static_cast(ulColor)), - &CEGUI::Rectf(glm::vec2(ClipRect.fX1, ClipRect.fY1), glm::vec2(ClipRect.fX2, ClipRect.fY2))); -} - -void CGUIFont_Impl::SetAntiAliasingEnabled(bool bAntialiased) -{ - // m_pFont->setAntiAliased(bAntialiased); -} - -bool CGUIFont_Impl::IsAntiAliasingEnabled() -{ - // return m_pFont->isAntiAliased(); - return false; -} - -void CGUIFont_Impl::SetAutoScalingEnabled(bool bAutoScaled) -{ - CEGUI::AutoScaledMode scaleMode = bAutoScaled ? CEGUI::AutoScaledMode::Both : CEGUI::AutoScaledMode::Disabled; - m_pFont->setAutoScaled(scaleMode); -} - -bool CGUIFont_Impl::IsAutoScalingEnabled() -{ - CEGUI::AutoScaledMode scaledMode = m_pFont->getAutoScaled(); - return (scaledMode == CEGUI::AutoScaledMode::Disabled) ? false : true; -} - -void CGUIFont_Impl::SetNativeResolution(int iX, int iY) -{ - m_pFont->setNativeResolution(CEGUI::Sizef(static_cast(iX), static_cast(iY))); -} - -float CGUIFont_Impl::GetCharacterWidth(int iChar, float fScale) -{ - char szBuf[2]; - szBuf[0] = iChar; - szBuf[1] = 0; - - return m_pFont->getTextExtent(szBuf); -} - -float CGUIFont_Impl::GetFontHeight(float fScale) -{ - float fHeight = m_pFont->getFontHeight(); // average height.. not the maximum height for long characters such as 'g' or 'j' - fHeight += 2.0f; // so hack it - - return fHeight; -} - -float CGUIFont_Impl::GetTextExtent(const char* szText, float fScale) -{ - return m_pFont->getTextExtent(CGUI_Impl::GetUTFString(szText)); -} - -CEGUI::Font* CGUIFont_Impl::GetFont() -{ - return m_pFont; -} diff --git a/Client/gui_new/CGUIFont_Impl.h b/Client/gui_new/CGUIFont_Impl.h deleted file mode 100644 index c0d6189a5a..0000000000 --- a/Client/gui_new/CGUIFont_Impl.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIFont_Impl.h - * PURPOSE: Font type class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include - -namespace GUINew{ - class CGUIFont_Impl; -} - -class GUINew::CGUIFont_Impl : public CGUIFont -{ -public: - CGUIFont_Impl(class CGUI_Impl* pManager, const char* szFontName, const char* szFontFile, unsigned int uSize = 8, unsigned int uFlags = 0, - bool bAutoScale = false, bool isWinFont = false); - ~CGUIFont_Impl(); - - void SetAntiAliasingEnabled(bool bAntialiased); - bool IsAntiAliasingEnabled(); - void SetAutoScalingEnabled(bool bAutoScaled); - bool IsAutoScalingEnabled(); - - void SetNativeResolution(int iX, int iY); - - float GetCharacterWidth(int iChar, float fScale = 1.0f); - float GetFontHeight(float fScale = 1.0f); - float GetTextExtent(const char* szText, float fScale = 1.0f); - - CEGUI::Font* GetFont(); - - void DrawTextString(const char* szText, CRect2D DrawArea, float fZ, CRect2D ClipRect, unsigned long ulFormat, unsigned long ulColor, float fScaleX, - float fScaleY); - -private: - CEGUI::Font* m_pFont; - CEGUI::FontManager* m_pFontManager; - CEGUI::GeometryBuffer* m_pGeometryBuffer; - CEGUI::RenderedText* m_pRenderedText; -}; diff --git a/Client/gui_new/CGUIGridList_Impl.cpp b/Client/gui_new/CGUIGridList_Impl.cpp deleted file mode 100644 index a9483babbc..0000000000 --- a/Client/gui_new/CGUIGridList_Impl.cpp +++ /dev/null @@ -1,808 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIGridList_Impl.cpp - * PURPOSE: Grid list widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUIGRIDLIST_NAME "MultiColumnList" -#define CGUIGRIDLISTNOFRAME_NAME "MultiColumnList" //MultiColumnListNoFrame -#define CGUIGRIDLIST_SPACER " " - -#define CGUIGRIDLIST_MAX_TEXT_LENGTH 256 - -using namespace GUINew; - -CGUIGridList_Impl::CGUIGridList_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, bool bFrame) -{ - m_pManager = pGUI; - - // Initialize - m_hUniqueHandle = 0; - m_iIndex = 0; - m_bIgnoreTextSpacer = false; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - if (bFrame) - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIGRIDLIST_NAME, szUnique); - else - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIGRIDLISTNOFRAME_NAME, szUnique); - - m_pWindow->setDestroyedByParent(false); - m_pWindow->setArea(CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.4f, 0), CEGUI::UDim(0.4f, 0)); - - reinterpret_cast(m_pWindow)->setUserColumnDraggingEnabled(false); - reinterpret_cast(m_pWindow)->setShowHorzScrollbar(false); - reinterpret_cast(m_pWindow)->setSelectionMode(CEGUI::MultiColumnList::SelectionMode::RowSingle); - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::NoSorting); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Register our events - m_pWindow->subscribeEvent(CEGUI::MultiColumnList::EventSortColumnChanged, CEGUI::Event::Subscriber(&CGUIGridList_Impl::Event_OnSortColumn, this)); - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIGridList_Impl::~CGUIGridList_Impl() -{ - Clear(); - DestroyElement(); -} - -void CGUIGridList_Impl::SetSortingEnabled(bool bEnabled) -{ - reinterpret_cast(m_pWindow)->setUserSortControlEnabled(bEnabled); -} - -bool CGUIGridList_Impl::IsSortingEnabled() -{ - return reinterpret_cast(m_pWindow)->isUserSortControlEnabled(); -} - -void CGUIGridList_Impl::RemoveColumn(unsigned int uiColumn) -{ - try - { - reinterpret_cast(m_pWindow)->removeColumn(GetColumnIndex(uiColumn)); - } - catch (CEGUI::Exception) - { - } -} - -unsigned int CGUIGridList_Impl::AddColumn(const char* szTitle, float fWidth) -{ - // Create a new column with an unique handle - int hUniqueHandle = GetUniqueHandle(); - reinterpret_cast(m_pWindow)->addColumn((CGUI_Impl::GetUTFString(szTitle)), hUniqueHandle, CEGUI::UDim(0, fWidth)); - - int iColumnIndex = reinterpret_cast(m_pWindow)->getColumnWithID(hUniqueHandle); - - // Adjust the header style (zero-based) - reinterpret_cast(m_pWindow)->getHeaderSegmentForColumn(iColumnIndex).setFont("default-small"); - - // Return the id (zero-based) - return iColumnIndex + 1; -} - -void CGUIGridList_Impl::SetColumnWidth(int hColumn, float fWidth, bool bRelative) -{ - CEGUI::UDim width; - - if (bRelative) - width = CEGUI::UDim(fWidth, 0); - else - width = CEGUI::UDim(0, fWidth); - - reinterpret_cast(m_pWindow)->setColumnHeaderWidth(GetColumnIndex(hColumn), width); -} - -bool CGUIGridList_Impl::GetColumnWidth(int hColumn, float& fOutWidth, bool bRelative) -{ - CEGUI::UDim uWidth = reinterpret_cast(m_pWindow)->getColumnHeaderWidth(GetColumnIndex(hColumn)); - fOutWidth = bRelative ? uWidth.d_scale : uWidth.d_scale; - return true; -} - -void CGUIGridList_Impl::SetColumnTitle(int hColumn, const char* szTitle) -{ - //reinterpret_cast(m_pWindow)->(GetColumnIndex(hColumn), szTitle); -} - -const char* CGUIGridList_Impl::GetColumnTitle(int hColumn) -{ - return "boobs"; -} - -void CGUIGridList_Impl::SetHorizontalScrollBar(bool bEnabled) -{ - reinterpret_cast(m_pWindow)->setShowHorzScrollbar(bEnabled); -} - -void CGUIGridList_Impl::SetVerticalScrollBar(bool bEnabled) -{ - reinterpret_cast(m_pWindow)->setShowVertScrollbar(bEnabled); -} - -int CGUIGridList_Impl::GetRowCount() -{ - try - { - return reinterpret_cast(m_pWindow)->getRowCount(); - } - catch (CEGUI::Exception) - { - return 0; - } -} - -int CGUIGridList_Impl::GetColumnCount() -{ - try - { - return reinterpret_cast(m_pWindow)->getColumnCount(); - } - catch (CEGUI::Exception) - { - return 0; - } -} - -void CGUIGridList_Impl::ForceUpdate() -{ - reinterpret_cast(m_pWindow)->invalidate(true); -} - -int CGUIGridList_Impl::AddRow(bool fast, std::vector >* m_items) -{ - try - { - int iRow = reinterpret_cast(m_pWindow)->addRow(m_iIndex++); - if (m_items) - return SetRowItemsText(iRow, m_items); - else - return iRow; - } - catch (CEGUI::Exception) - { - return -1; - } -} - -int CGUIGridList_Impl::SetRowItemsText(int iRow, std::vector >* m_items) -{ - int iSortColumn = reinterpret_cast(m_pWindow)->getSortColumn() + 1; // MTA columns start at 1, CEGUI at 0 - - std::vector >::iterator it = m_items->begin(); - int col = 1; - for (it; it != m_items->end(); it++) - { - // Loop through every item. We add each one unless it's the sorted by column, which we do last - if (col != iSortColumn) - SetItemText(iRow, col, it->first.c_str(), it->second); - col++; - } - // Add our sort column text, if it was provided - if ((uint)iSortColumn <= m_items->size()) - iRow = SetItemText(iRow, iSortColumn, m_items->at(iSortColumn - 1).first.c_str(), m_items->at(iSortColumn - 1).second); - - return iRow; -} - -void CGUIGridList_Impl::RemoveRow(int iRow) -{ - try - { - return reinterpret_cast(m_pWindow)->removeRow(iRow); - } - catch (CEGUI::Exception) - { - } -} - -int CGUIGridList_Impl::InsertRowAfter(int iRow, std::vector >* m_items) -{ - try - { - int iNewRow = reinterpret_cast(m_pWindow)->insertRow(iRow + 1, m_iIndex++); - if (m_items) - return SetRowItemsText(iNewRow, m_items); - else - return iNewRow; - } - catch (CEGUI::Exception) - { - return -1; - } -} - -void CGUIGridList_Impl::AutoSizeColumn(unsigned int hColumn) -{ - try - { - reinterpret_cast(m_pWindow)->autoSizeColumnHeader(GetColumnIndex(hColumn)); - } - catch (CEGUI::Exception) - { - } -} - -void CGUIGridList_Impl::Clear() -{ - try - { - m_iIndex = 0; - - // Don't remove sort options when the list is cleared - // reinterpret_cast < CEGUI::MultiColumnList* > ( m_pWindow ) -> setSortColumn( 0 ); - // reinterpret_cast < CEGUI::MultiColumnList* > ( m_pWindow ) -> setSortDirection( CEGUI::ListHeaderSegment::None ); - reinterpret_cast(m_pWindow)->resetList(); - - CFastHashMap::iterator it; - for (it = m_Items.begin(); it != m_Items.end(); it++) - { - delete it->second; - } - m_Items.clear(); - } - catch (CEGUI::Exception) - { - } -} - -CGUIListItem* CGUIGridList_Impl::GetItem(int iRow, int hColumn) -{ - try - { - CEGUI::MultiColumnList* pMultiColumnList = reinterpret_cast(m_pWindow); - if ((uint)iRow >= pMultiColumnList->getRowCount() || (uint)GetColumnIndex(hColumn) >= pMultiColumnList->getColumnCount()) - return NULL; - - // Grab the item at the chosen row / column - CEGUI::ListboxItem* pItem = - reinterpret_cast(m_pWindow)->getItemAtGridReference(CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn))); - - // If it exists, get the CGUIListItem by using the pool - if (pItem) - { - return GetListItem(pItem); - } - } - catch (CEGUI::Exception) - { - } - - return NULL; -} - -const char* CGUIGridList_Impl::GetItemText(int iRow, int hColumn) -{ - try - { - CEGUI::MultiColumnList* pMultiColumnList = reinterpret_cast(m_pWindow); - if ((uint)iRow >= pMultiColumnList->getRowCount() || (uint)GetColumnIndex(hColumn) >= pMultiColumnList->getColumnCount()) - return ""; - - // Grab the item at the chosen row / column - CEGUI::ListboxItem* pItem = - reinterpret_cast(m_pWindow)->getItemAtGridReference(CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn))); - if (pItem) - { - const char* szRet = (const char*)pItem->getText().c_str(); - - if (!m_bIgnoreTextSpacer) - { - unsigned char ucSpacerSize = (unsigned char)(strlen(CGUIGRIDLIST_SPACER)); - - if (GetColumnIndex(hColumn) == 0) - { - // Make sure there is a spacer to skip - if (strncmp(szRet, CGUIGRIDLIST_SPACER, strlen(CGUIGRIDLIST_SPACER)) == 0) - szRet += ucSpacerSize; - } - } - - return szRet; - } - } - catch (CEGUI::Exception) - { - return ""; - } - - return ""; -} - -void* CGUIGridList_Impl::GetItemData(int iRow, int hColumn) -{ - CGUIListItem* pItem = GetItem(iRow, hColumn); - - return pItem ? pItem->GetData() : NULL; -} - -void CGUIGridList_Impl::SetItemData(int iRow, int hColumn, void* pData, CGUICallback deleteDataCallback) -{ - // Get the current item at that offset and set the text - CGUIListItem* pItem = GetItem(iRow, hColumn); - if (pItem) - { - pItem->SetData(pData, deleteDataCallback); - } -} - -void CGUIGridList_Impl::SetItemData(int iRow, int hColumn, const char* pszData) -{ - // Get the current item at that offset and set the text - CGUIListItem* pItem = GetItem(iRow, hColumn); - if (pItem) - { - pItem->SetData(pszData); - } -} - -int CGUIGridList_Impl::SetItemText(int iRow, int hColumn, const char* szText, bool bNumber, bool bSection, bool bFast, const char* szSortText) -{ - try - { - CEGUI::MultiColumnList* win = reinterpret_cast(m_pWindow); - - // Get the current item at that offset and set the text - CGUIListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); - if (pItem) - { - if (bSection) - { - // Set section properties - pItem->SetFont("default-bold-small"); - pItem->SetDisabled(true); - pItem->SetText(szText); - } - else - { - pItem->SetFont((const char*)win->getFont()->getName().c_str()); // Reset font to the font of the item's parent (the gridlist) - pItem->SetDisabled(false); - - if (GetColumnIndex(hColumn) == 0) - { - // Enable some spacing on regular items, if this is the first item - - char szBuf[CGUIGRIDLIST_MAX_TEXT_LENGTH]; - if (m_bIgnoreTextSpacer) - { - snprintf(szBuf, CGUIGRIDLIST_MAX_TEXT_LENGTH - 1, "%s", szText); - } - else - { - snprintf(szBuf, CGUIGRIDLIST_MAX_TEXT_LENGTH - 1, "%s%s", CGUIGRIDLIST_SPACER, szText); - } - - szBuf[CGUIGRIDLIST_MAX_TEXT_LENGTH - 1] = NULL; - - pItem->SetText(szBuf); - } - else - { - pItem->SetText(szText); - } - } - } - else - { - // If it doesn't, create it and set it in the gridlist - pItem = new CGUIListItem_Impl(m_pManager, szText, bNumber); - - if (szSortText) - pItem->SetText(szText); - - CEGUI::ListboxItem* pListboxItem = pItem->GetListItem(); - win->setItem(pListboxItem, CEGUI::MCLGridRef(iRow, GetColumnIndex(hColumn))); - - // Put our new item into the map - m_Items[pItem->GetListItem()] = pItem; - - if (bSection) - { - // Set section properties - pItem->SetFont("default-bold-small"); - pItem->SetDisabled(true); - } - else if (GetColumnIndex(hColumn) == 0) - { - // Enable some spacing on regular items, if this is the first item - char szBuf[CGUIGRIDLIST_MAX_TEXT_LENGTH]; - - if (m_bIgnoreTextSpacer) - { - snprintf(szBuf, CGUIGRIDLIST_MAX_TEXT_LENGTH - 1, "%s", szText); - } - else - { - snprintf(szBuf, CGUIGRIDLIST_MAX_TEXT_LENGTH - 1, "%s%s", CGUIGRIDLIST_SPACER, szText); - } - - szBuf[CGUIGRIDLIST_MAX_TEXT_LENGTH - 1] = NULL; - pItem->SetText(szBuf); - } - } - - // If the list is sorted and we just changed an item in the sorting column, - // re-sort the list. - if (win->getSortDirection() != CEGUI::ListHeaderSegment::SortDirection::NoSorting && win->getSortColumn() == GetColumnIndex(hColumn)) - { - win->setSortColumn(win->getSortColumn()); - return GetItemRowIndex(pItem); - } - else - { - return iRow; - } - } - catch (CEGUI::Exception) - { - } - - return 0; -} - -void CGUIGridList_Impl::SetItemColor(int iRow, int hColumn, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) -{ - try - { - CEGUI::MultiColumnList* win = reinterpret_cast(m_pWindow); - - // Get the current item at that offset and set the color - CGUIListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); - if (pItem) - { - pItem->SetColor(ucRed, ucGreen, ucBlue, ucAlpha); - } - } - catch (CEGUI::Exception) - { - } -} - -bool CGUIGridList_Impl::GetItemColor(int iRow, int hColumn, unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) -{ - try - { - CEGUI::MultiColumnList* win = reinterpret_cast(m_pWindow); - - // Get the current item at that offset and get it's color - CGUIListItem_Impl* pItem = reinterpret_cast(GetItem(iRow, hColumn)); - if (pItem) - { - return pItem->GetColor(ucRed, ucGreen, ucBlue, ucAlpha); - } - } - catch (CEGUI::Exception) - { - } - return false; -} - -void CGUIGridList_Impl::SetColumnSegmentSizingEnabled(int hColumn, bool bEnabled) -{ - try - { - CEGUI::MultiColumnList* columnList = reinterpret_cast(m_pWindow); - CEGUI::ListHeaderSegment* columnSegment = &columnList->getHeaderSegmentForColumn(hColumn); - columnSegment->setSizingEnabled(bEnabled); - } - catch (CEGUI::Exception) - { - } -} - -bool CGUIGridList_Impl::IsColumnSegmentSizingEnabled(int hColumn) -{ - try - { - CEGUI::MultiColumnList* columnList = reinterpret_cast(m_pWindow); - CEGUI::ListHeaderSegment* columnSegment = &columnList->getHeaderSegmentForColumn(hColumn); - return columnSegment->isSizingEnabled(); - } - catch (CEGUI::Exception) - { - return false; - } -} - -void CGUIGridList_Impl::SetItemImage(int iRow, int hColumn, CGUIStaticImage* pImage) -{ - // Get the current item at that offset - CGUIListItem* pItem = GetItem(iRow, hColumn); - if (pItem != NULL) - { - pItem->SetImage(pImage); - } - else - // if ( pImage ) - { - // If it doesn't, create it and set it in the gridlist - CGUIListItem_Impl* pNewItem = new CGUIListItem_Impl(m_pManager, "", CGUIListItem_Impl::ImageItem, (CGUIStaticImage_Impl*)pImage); - CEGUI::ListboxItem* pListboxItem = pNewItem->GetListItem(); - reinterpret_cast(m_pWindow)->setItem(pListboxItem, hColumn, iRow); - - // Put our new item in the map - m_Items[pNewItem->GetListItem()] = pNewItem; - } -} - -float CGUIGridList_Impl::GetHorizontalScrollPosition() -{ - try - { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getHorzScrollbar(); - if (pScrollbar) - return (pScrollbar->getScrollPosition() / (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); - } - catch (CEGUI::Exception) - { - } - return 0.0f; -} - -float CGUIGridList_Impl::GetVerticalScrollPosition() -{ - try - { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); - if (pScrollbar) - return (pScrollbar->getScrollPosition() / (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); - } - catch (CEGUI::Exception) - { - } - return 0.0f; -} - -void CGUIGridList_Impl::SetHorizontalScrollPosition(float fPosition) -{ - try - { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getHorzScrollbar(); - if (pScrollbar) - pScrollbar->setScrollPosition(fPosition * (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); - } - catch (CEGUI::Exception) - { - } -} - -void CGUIGridList_Impl::SetVerticalScrollPosition(float fPosition) -{ - try - { - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); - if (pScrollbar) - pScrollbar->setScrollPosition(fPosition * (pScrollbar->getDocumentSize() - pScrollbar->getPageSize())); - } - catch (CEGUI::Exception) - { - } -} - -int CGUIGridList_Impl::GetColumnIndex(int hColumn) -{ - /* - try - { - // non zero-based - return reinterpret_cast < CEGUI::MultiColumnList* > ( m_pWindow ) -> getColumnWithID ( hColumn ); - } - catch ( CEGUI::Exception ) - { - return -1; - } - */ - return hColumn - 1; -} - -int CGUIGridList_Impl::GetSelectedCount() -{ - return reinterpret_cast(m_pWindow)->getSelectedCount(); -} - -int CGUIGridList_Impl::GetItemColumnIndex(CGUIListItem* pItem) -{ - if (pItem) - { - try - { - CGUIListItem_Impl* pItemImpl = (CGUIListItem_Impl*)pItem; - return reinterpret_cast(m_pWindow)->getItemColumnIndex(pItemImpl->GetListItem()); - } - catch (CEGUI::Exception) - { - } - } - return -1; -} - -int CGUIGridList_Impl::GetItemRowIndex(CGUIListItem* pItem) -{ - if (pItem) - { - try - { - CGUIListItem_Impl* pItemImpl = (CGUIListItem_Impl*)pItem; - return reinterpret_cast(m_pWindow)->getItemRowIndex(pItemImpl->GetListItem()); - } - catch (CEGUI::Exception) - { - } - } - return -1; -} - -void CGUIGridList_Impl::SetSelectionMode(SelectionMode mode) -{ - try - { - reinterpret_cast(m_pWindow)->setSelectionMode((CEGUI::MultiColumnList::SelectionMode)mode); - } - catch (CEGUI::Exception) - { - } -} - -SelectionMode CGUIGridList_Impl::GetSelectionMode() -{ - return (SelectionMode)reinterpret_cast(m_pWindow)->getSelectionMode(); -} - -void CGUIGridList_Impl::GetVisibleRowRange(int& iFirst, int& iLast) -{ - - //reinterpret_cast(m_pWindow)->getVisibleRowRange(iFirst, iLast); -} - -CGUIListItem* CGUIGridList_Impl::GetSelectedItem() -{ - return GetListItem(reinterpret_cast(m_pWindow)->getFirstSelectedItem()); -} - -CGUIListItem* CGUIGridList_Impl::GetNextSelectedItem(CGUIListItem* pItem) -{ - if (pItem) - return GetListItem(reinterpret_cast(m_pWindow)->getNextSelected(((CGUIListItem_Impl*)pItem)->GetListItem())); - else - return GetListItem(reinterpret_cast(m_pWindow)->getFirstSelectedItem()); -} - -int CGUIGridList_Impl::GetSelectedItemRow() -{ - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getFirstSelectedItem(); - if (pItem) - { - CGUIListItem* pListItem = GetListItem(pItem); - if (pListItem) - { - return GetItemRowIndex(pListItem); - } - } - - return -1; -} - -int CGUIGridList_Impl::GetSelectedItemColumn() -{ - CEGUI::ListboxItem* pItem = reinterpret_cast(m_pWindow)->getFirstSelectedItem(); - if (pItem) - { - CGUIListItem* pListItem = GetListItem(pItem); - if (pListItem) - { - return GetItemColumnIndex(pListItem); - } - } - - return -1; -} - -void CGUIGridList_Impl::SetSelectedItem(int iRow, int hColumn, bool bReset) -{ - if (bReset) - { - reinterpret_cast(m_pWindow)->clearAllSelections(); - } - - // Get the current item at that offset - CGUIListItem* pItem = GetItem(iRow, hColumn); - if (pItem != NULL) - { - // Use the grid to select the row, rather than the pItem method call as the grid one will take into account the - // grid settings for full row select, etc... - reinterpret_cast(m_pWindow)->setItemSelectState(reinterpret_cast(pItem)->GetListItem(), true); - - reinterpret_cast(m_pWindow)->invalidate(true); - } -} - -void CGUIGridList_Impl::Sort(unsigned int uiColumn, SortDirection direction) -{ - reinterpret_cast(m_pWindow)->setSortColumn(GetColumnIndex(uiColumn)); - - switch (direction) - { - case SortDirections::Ascending: - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::Ascending); - break; - case SortDirections::Descending: - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::Descending); - break; - default: - reinterpret_cast(m_pWindow)->setSortDirection(CEGUI::ListHeaderSegment::SortDirection::NoSorting); - break; - } -} - -void CGUIGridList_Impl::GetSort(unsigned int& uiColumn, SortDirection& direction) -{ - uiColumn = reinterpret_cast(m_pWindow)->getSortColumn() + 1; - - switch (reinterpret_cast(m_pWindow)->getSortDirection()) - { - case CEGUI::ListHeaderSegment::SortDirection::Ascending: - direction = SortDirections::Ascending; - break; - - case CEGUI::ListHeaderSegment::SortDirection::Descending: - direction = SortDirections::Descending; - break; - - default: - direction = SortDirections::SortDirection::None; - break; - } -} - -void CGUIGridList_Impl::SetSortColumnHandler(GUI_CALLBACK Callback) -{ - m_OnSortColumn = Callback; -} - -bool CGUIGridList_Impl::Event_OnSortColumn(const CEGUI::EventArgs& e) -{ - if (m_OnSortColumn) - m_OnSortColumn(reinterpret_cast(this)); - return true; -} - -unsigned int CGUIGridList_Impl::GetUniqueHandle() -{ - return ++m_hUniqueHandle; -} - -CGUIListItem_Impl* CGUIGridList_Impl::GetListItem(CEGUI::ListboxItem* pItem) -{ - CFastHashMap::iterator it; - it = m_Items.find(pItem); - if (it == m_Items.end()) - return NULL; - - return it->second; -} diff --git a/Client/gui_new/CGUIGridList_Impl.h b/Client/gui_new/CGUIGridList_Impl.h deleted file mode 100644 index e7527a1cda..0000000000 --- a/Client/gui_new/CGUIGridList_Impl.h +++ /dev/null @@ -1,106 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIGridList_Impl.h - * PURPOSE: Grid list widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIListItem_Impl; - class CGUIGridList_Impl; -} - -class GUINew::CGUIGridList_Impl : public CGUIGridList, public CGUIElement_Impl -{ -public: - CGUIGridList_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, bool bFrame = true); - ~CGUIGridList_Impl(); - - unsigned int AddColumn(const char* szTitle, float fWidth); - void RemoveColumn(unsigned int uiColumn); - void AutoSizeColumn(unsigned int hColumn); - void SetColumnWidth(int hColumn, float fWidth, bool bRelative = true); - bool GetColumnWidth(int hColumn, float& fOutWidth, bool bRelative = true); - void SetColumnTitle(int hColumn, const char* szTitle); - const char* GetColumnTitle(int hColumn); - - void SetSelectionMode(SelectionMode mode); - SelectionMode GetSelectionMode(); - int SetRowItemsText(int iRow, std::vector >* m_items); - - void ForceUpdate(); - int AddRow(bool bFast = false, std::vector >* m_items = NULL); - void RemoveRow(int iRow); - int InsertRowAfter(int iRow, std::vector >* m_items = NULL); - void Clear(); - CGUIListItem* GetItem(int iRow, int hColumn); - const char* GetItemText(int iRow, int hColumn); - int SetItemText(int iRow, int hColumn, const char* szText, bool bNumber = false, bool bSection = false, bool bFast = false, const char* szSortText = NULL); - void SetItemData(int iRow, int hColumn, void* pData, CGUICallback deleteDataCallback = NULL); - void SetItemData(int iRow, int hColumn, const char* pszData); - void* GetItemData(int iRow, int hColumn); - void SetItemColor(int iRow, int hColumn, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha); - bool GetItemColor(int iRow, int hColumn, unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha); - - void SetHorizontalScrollBar(bool bEnabled); - void SetVerticalScrollBar(bool bEnabled); - void SetSortingEnabled(bool bEnabled); - bool IsSortingEnabled(); - void SetItemImage(int iRow, int hColumn, CGUIStaticImage* pImage); - - float GetHorizontalScrollPosition(); - float GetVerticalScrollPosition(); - void SetHorizontalScrollPosition(float fPosition); - void SetVerticalScrollPosition(float fPosition); - - int GetColumnIndex(int hColumn); - int GetItemColumnIndex(CGUIListItem* pItem); - int GetItemRowIndex(CGUIListItem* pItem); - void GetVisibleRowRange(int& iFirst, int& iLast); - int GetSelectedCount(); - CGUIListItem* GetSelectedItem(); - CGUIListItem* GetNextSelectedItem(CGUIListItem* pItem); - int GetSelectedItemRow(); - int GetSelectedItemColumn(); - int GetRowCount(); - int GetColumnCount(); - - bool IsColumnSegmentSizingEnabled(int hColumn); - void SetColumnSegmentSizingEnabled(int hColumn, bool bEnabled); - - void Sort(unsigned int uiColumn, SortDirection direction); - void GetSort(unsigned int& uiColumn, SortDirection& direction); - - void SetSelectedItem(int iRow, int hColumn, bool bReset); - - void SetSortColumnHandler(GUI_CALLBACK Callback); - - void SetIgnoreTextSpacer(bool bIgnoreTextSpacer) { m_bIgnoreTextSpacer = bIgnoreTextSpacer; }; - eCGUIType GetType() { return CGUI_GRIDLIST; }; - - #include "CGUIElement_Inc.h" - -private: - bool Event_OnSortColumn(const CEGUI::EventArgs& e); - - int m_iIndex; - - unsigned int GetUniqueHandle(); - CGUIListItem_Impl* GetListItem(CEGUI::ListboxItem* pItem); - unsigned int m_hUniqueHandle; - - CFastHashMap m_Items; - - GUI_CALLBACK m_OnSortColumn; - - bool m_bIgnoreTextSpacer; -}; diff --git a/Client/gui_new/CGUILabel_Impl.cpp b/Client/gui_new/CGUILabel_Impl.cpp deleted file mode 100644 index aef7a4b144..0000000000 --- a/Client/gui_new/CGUILabel_Impl.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUILabel_Impl.cpp - * PURPOSE: Label widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUILABEL_NAME "StaticText" - -using namespace GUINew; - -CGUILabel_Impl::CGUILabel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szText) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUILABEL_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - m_pWindow->setText(szText); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - AddEvents(); - - // Do some hardcore disabling on the labels - // m_pWindow->moveToBack ( ); - // m_pWindow->disable ( ); - - // not sure what that was for, disabled - // m_pWindow->setZOrderingEnabled ( false ); - // m_pWindow->setAlwaysOnTop ( true ); - - SetFrameEnabled(false); - SetHorizontalAlign(CGUI_ALIGN_LEFT); - SetVerticalAlign(CGUI_ALIGN_TOP); - SetText(szText); - m_pWindow->setProperty("BackgroundEnabled", "false"); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUILabel_Impl::~CGUILabel_Impl() -{ - DestroyElement(); -} - -void CGUILabel_Impl::SetText(const char* Text) -{ - m_pWindow->setText(CGUI_Impl::GetUTFString(Text)); -} - -void CGUILabel_Impl::SetVerticalAlign(CGUIVerticalAlign eAlign) -{ - m_pWindow->setProperty("VertFormatting", CGUIVerticalAlignValues[eAlign]); -} - -CGUIVerticalAlign CGUILabel_Impl::GetVerticalAlign() -{ - SString verticalAlign = (const char*)m_pWindow->getProperty("VertFormatting").c_str(); - - if (verticalAlign == CGUIVerticalAlignValues[1]) - return CGUIVerticalAlign::CGUI_ALIGN_TOP; - - if (verticalAlign == CGUIVerticalAlignValues[2]) - return CGUIVerticalAlign::CGUI_ALIGN_BOTTOM; - - if (verticalAlign == CGUIVerticalAlignValues[3]) - return CGUIVerticalAlign::CGUI_ALIGN_VERTICALCENTER; - - // Fallback - return CGUIVerticalAlign::CGUI_ALIGN_TOP; -} - -void CGUILabel_Impl::SetHorizontalAlign(CGUIHorizontalAlign eAlign) -{ - m_pWindow->setProperty("HorzFormatting", CGUIHorizontalAlignValues[eAlign]); -} - -CGUIHorizontalAlign CGUILabel_Impl::GetHorizontalAlign() -{ - SString horizontalAlign = (const char*)m_pWindow->getProperty("HorzFormatting").c_str(); - - if (horizontalAlign == CGUIHorizontalAlignValues[1]) - return CGUIHorizontalAlign::CGUI_ALIGN_LEFT; - - if (horizontalAlign == CGUIHorizontalAlignValues[2]) - return CGUIHorizontalAlign::CGUI_ALIGN_RIGHT; - - if (horizontalAlign == CGUIHorizontalAlignValues[3]) - return CGUIHorizontalAlign::CGUI_ALIGN_HORIZONTALCENTER; - - if (horizontalAlign == CGUIHorizontalAlignValues[4]) - return CGUIHorizontalAlign::CGUI_ALIGN_LEFT_WORDWRAP; - - if (horizontalAlign == CGUIHorizontalAlignValues[5]) - return CGUIHorizontalAlign::CGUI_ALIGN_RIGHT_WORDWRAP; - - if (horizontalAlign == CGUIHorizontalAlignValues[6]) - return CGUIHorizontalAlign::CGUI_ALIGN_HORIZONTALCENTER_WORDWRAP; - - // Fallback - return CGUIHorizontalAlign::CGUI_ALIGN_LEFT; -} - -void CGUILabel_Impl::SetTextColor(CGUIColor Color) -{ - std::uint32_t argb = 0xFF000000; // alpha 255 - argb |= static_cast(Color.R) << 16; - argb |= static_cast(Color.G) << 8; - argb |= static_cast(Color.B); - SString hexString = SString("%08x", argb).ToUpper(); - - m_pWindow->setProperty("TextColours", SString("tl:%s tr:%s bl:%s br:%s", *hexString, *hexString, *hexString, *hexString)); -} - -void CGUILabel_Impl::SetTextColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue) -{ - std::uint32_t argb = 0xFF000000; // alpha 255 - argb |= static_cast(ucRed) << 16; - argb |= static_cast(ucGreen) << 8; - argb |= static_cast(ucBlue); - SString hexString = SString("%08x", argb).ToUpper(); - - m_pWindow->setProperty("TextColours", SString("tl:%s tr:%s bl:%s br:%s", *hexString, *hexString, *hexString, *hexString)); -} - -CGUIColor CGUILabel_Impl::GetTextColor() -{ - CGUIColor temp; - GetTextColor(temp.R, temp.G, temp.B); - return temp; -} - -void CGUILabel_Impl::GetTextColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue) -{ - //CEGUI::Colour r = (m_pLabel->getColours()).getColourAtPoint(0, 0); - CEGUI::Colour r = CEGUI::Colour(255, 255, 255); - - ucRed = (unsigned char)(r.getRed() * 255); - ucGreen = (unsigned char)(r.getGreen() * 255); - ucBlue = (unsigned char)(r.getBlue() * 255); -} - -void CGUILabel_Impl::SetFrameEnabled(bool bFrameEnabled) -{ - m_pWindow->setProperty("FrameEnabled", bFrameEnabled ? "True" : "False"); -} - -bool CGUILabel_Impl::IsFrameEnabled() -{ - return m_pWindow->getProperty("FrameEnabled") == "True" ? true : false; -} - -float CGUILabel_Impl::GetCharacterWidth(int iCharIndex) -{ - if (true) - return true; -} - -float CGUILabel_Impl::GetFontHeight() -{ - const CEGUI::Font* pFont = m_pWindow->getFont(); - if (pFont) - return pFont->getFontHeight(); - return 14.0f; -} - -float CGUILabel_Impl::GetTextExtent() -{ - CEGUI::Font* pFont = m_pWindow->getFont(); - if (pFont) - { - try - { - // Retrieve the longest line's extent - std::stringstream ssText((const char*)m_pWindow->getText().c_str()); - std::string sLineText; - float fMax = 0.0f, fLineExtent = 0.0f; - - while (std::getline(ssText, sLineText)) - { - fLineExtent = pFont->getTextExtent(CGUI_Impl::GetUTFString(sLineText)); - if (fLineExtent > fMax) - fMax = fLineExtent; - } - return fMax; - } - catch (CEGUI::Exception e) - { - } - } - - return 0.0f; -} diff --git a/Client/gui_new/CGUILabel_Impl.h b/Client/gui_new/CGUILabel_Impl.h deleted file mode 100644 index b63a3a3382..0000000000 --- a/Client/gui_new/CGUILabel_Impl.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUILabel_Impl.h - * PURPOSE: Label widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -class CGUIFont; - -namespace GUINew{ - class CGUILabel_Impl; -} - -class GUINew::CGUILabel_Impl : public CGUILabel, public CGUIElement_Impl -{ -public: - CGUILabel_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szText = ""); - ~CGUILabel_Impl(); - - void SetText(const char* Text); - - void SetVerticalAlign(CGUIVerticalAlign eAlign); - CGUIVerticalAlign GetVerticalAlign(); - void SetHorizontalAlign(CGUIHorizontalAlign eAlign); - CGUIHorizontalAlign GetHorizontalAlign(); - - void SetTextColor(CGUIColor Color); - void SetTextColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue); - CGUIColor GetTextColor(); - void GetTextColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue); - - void SetFrameEnabled(bool bFrameEnabled); - bool IsFrameEnabled(); - - float GetCharacterWidth(int iCharIndex); - float GetFontHeight(); - float GetTextExtent(); - - eCGUIType GetType() { return CGUI_LABEL; }; - - #define EXCLUDE_SET_TEXT - #include "CGUIElement_Inc.h" - #undef EXCLUDE_SET_TEXT -private: - CEGUI::TextComponent* m_pLabel; -}; diff --git a/Client/gui_new/CGUIMemo_Impl.cpp b/Client/gui_new/CGUIMemo_Impl.cpp deleted file mode 100644 index 19de7a2e00..0000000000 --- a/Client/gui_new/CGUIMemo_Impl.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIMemo_Impl.cpp - * PURPOSE: Multi-line edit box widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUIMEMO_NAME "MultiLineEditbox" - -using namespace GUINew; - -CGUIMemo_Impl::CGUIMemo_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szEdit) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIMEMO_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // m_pWindow->setRect ( CEGUI::Relative, CEGUI::Rect (0.00f, 0.00f, 0.40f, 0.40f ) ); - - // Register our events - m_pWindow->subscribeEvent(CEGUI::MultiLineEditbox::EventTextChanged, CEGUI::Event::Subscriber(&CGUIMemo_Impl::Event_TextChanged, this)); - m_pWindow->subscribeEvent(CEGUI::MultiLineEditbox::EventKeyDown, CEGUI::Event::Subscriber(&CGUIMemo_Impl::Event_OnKeyDown, this)); - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - if (CGUITabList* pTabList = dynamic_cast(pParent)) - { - pTabList->AddItem(this); - } - } - else - { - pGUI->AddChild(this); - pGUI->AddItem(this); - SetParent(NULL); - } -} - -CGUIMemo_Impl::~CGUIMemo_Impl() -{ - if (GetParent() == NULL) - { - m_pManager->RemoveItem(this); - } - else if (CGUITabList* pTabList = dynamic_cast(GetParent())) - { - pTabList->RemoveItem(this); - } - DestroyElement(); -} - -void CGUIMemo_Impl::SetReadOnly(bool bReadOnly) -{ - reinterpret_cast(m_pWindow)->setReadOnly(bReadOnly); -} - -bool CGUIMemo_Impl::IsReadOnly() -{ - return reinterpret_cast(m_pWindow)->isReadOnly(); -} - -void CGUIMemo_Impl::EnsureCaratIsVisible() -{ - CEGUI::MultiLineEditbox* wndMemo = reinterpret_cast(m_pWindow); - wndMemo->setCaretIndex((wndMemo->getText()).length()); -} - -unsigned int CGUIMemo_Impl::GetCaretIndex() -{ - return static_cast(reinterpret_cast(m_pWindow)->getCaretIndex()); -} - -void CGUIMemo_Impl::SetCaretIndex(unsigned int uiIndex) -{ - reinterpret_cast(m_pWindow)->setCaretIndex(uiIndex); -} - -float CGUIMemo_Impl::GetVerticalScrollPosition() -{ - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); - if (pScrollbar) - { - return pScrollbar->getScrollPosition(); - } - - return 0.0f; -} - -void CGUIMemo_Impl::SetVerticalScrollPosition(float fPosition) -{ - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); - if (pScrollbar) - { - pScrollbar->setScrollPosition(fPosition); - } -} - -float CGUIMemo_Impl::GetMaxVerticalScrollPosition() -{ - return GetScrollbarDocumentSize() - GetScrollbarPageSize(); -} - -float CGUIMemo_Impl::GetScrollbarDocumentSize() -{ - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); - if (pScrollbar) - { - return pScrollbar->getDocumentSize(); - } - - return 1.0f; -} - -float CGUIMemo_Impl::GetScrollbarPageSize() -{ - CEGUI::Scrollbar* pScrollbar = reinterpret_cast(m_pWindow)->getVertScrollbar(); - if (pScrollbar) - { - return pScrollbar->getPageSize(); - } - - return 1.0f; -} - -void CGUIMemo_Impl::SetSelection(unsigned int uiStart, unsigned int uiEnd) -{ - reinterpret_cast(m_pWindow)->setSelection(uiStart, uiEnd); -} - -unsigned int CGUIMemo_Impl::GetSelectionStart() -{ - return static_cast(reinterpret_cast(m_pWindow)->getSelectionStart()); -} - -unsigned int CGUIMemo_Impl::GetSelectionEnd() -{ - return static_cast(reinterpret_cast(m_pWindow)->getSelectionEnd()); -} - -unsigned int CGUIMemo_Impl::GetSelectionLength() -{ - return static_cast(reinterpret_cast(m_pWindow)->getSelectionLength()); -} - -bool CGUIMemo_Impl::ActivateOnTab() -{ - // Only select this as active if its visible and writable - if (IsVisible() && !IsReadOnly()) - { - Activate(); - SetCaretIndex(GetText().length()); - return true; - } - return false; -} - -void CGUIMemo_Impl::SetTextChangedHandler(const GUI_CALLBACK& Callback) -{ - m_TextChanged = Callback; -} - -bool CGUIMemo_Impl::Event_TextChanged(const CEGUI::EventArgs& e) -{ - if (m_TextChanged) - m_TextChanged(reinterpret_cast(this)); - return true; -} - -bool CGUIMemo_Impl::Event_OnKeyDown(const CEGUI::EventArgs& e) -{ - const CEGUI::KeyEventArgs& KeyboardArgs = reinterpret_cast(e); - if ((CGUIKeys::Scan)KeyboardArgs.d_key == CGUIKeys::Scan::Tab) - { - // tab pressed, if we are in a window with tab enabled, just switch to the next element - if (GetParent() == NULL) - { - m_pManager->SelectNext(this); - } - else if (CGUITabList* pTabList = dynamic_cast(GetParent())) - { - pTabList->SelectNext(this); - } - } - return true; -} diff --git a/Client/gui_new/CGUIMemo_Impl.h b/Client/gui_new/CGUIMemo_Impl.h deleted file mode 100644 index 8ce8793598..0000000000 --- a/Client/gui_new/CGUIMemo_Impl.h +++ /dev/null @@ -1,59 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIMemo_Impl.h - * PURPOSE: Multi-line edit box widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIMemo_Impl; -} - -class GUINew::CGUIMemo_Impl : public CGUIMemo, public CGUIElement_Impl, public CGUITabListItem -{ -public: - CGUIMemo_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szText = ""); - ~CGUIMemo_Impl(); - - void SetReadOnly(bool bReadOnly); - bool IsReadOnly(); - - size_t GetCaretIndex(); - void SetCaretIndex(size_t Index); - - float GetVerticalScrollPosition(); - void SetVerticalScrollPosition(float fPosition); - float GetMaxVerticalScrollPosition(); - float GetScrollbarDocumentSize(); - float GetScrollbarPageSize(); - - void SetSelection(unsigned int uiStart, unsigned int uiEnd); - unsigned int GetSelectionStart(); - unsigned int GetSelectionEnd(); - unsigned int GetSelectionLength(); - - void EnsureCaratIsVisible(); - - bool ActivateOnTab(); - - void SetTextChangedHandler(const GUI_CALLBACK& Callback); - - eCGUIType GetType() { return CGUI_MEMO; }; - - #include "CGUIElement_Inc.h" - -private: - bool Event_TextChanged(const CEGUI::EventArgs& e); - bool Event_OnKeyDown(const CEGUI::EventArgs& e); - - GUI_CALLBACK m_TextChanged; -}; diff --git a/Client/gui_new/CGUIMessageBox_Impl.cpp b/Client/gui_new/CGUIMessageBox_Impl.cpp deleted file mode 100644 index 6ffda15cf5..0000000000 --- a/Client/gui_new/CGUIMessageBox_Impl.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIMessageBox_Impl.cpp - * PURPOSE: Message box class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" -#include "../core/CFilePathTranslator.h" - -#define MESSAGEBOX_WIDTH 400.0f -#define MESSAGEBOX_HEIGHT 150.0f -#define MESSAGEBOX_SPACER 20 -#define MESSAGEBOX_ICON_SIZE 42 - -using namespace GUINew; - -CGUIMessageBox_Impl::CGUIMessageBox_Impl(CGUI_Impl* pGUI, const char* szTitle, const char* szCaption, unsigned int uiFlags) -{ - // Initialize - m_bAutoDestroy = true; // TODO: If any buttons.. - m_pIcon = NULL; - m_pButton = NULL; - m_pLabelCaption = NULL; - - // Create window - CVector2D ScreenSize = pGUI->GetResolution(); - m_pWindow = pGUI->CreateWnd(NULL, szTitle); - m_pWindow->SetAlwaysOnTop(true); - m_pWindow->SetCloseButtonEnabled(false); - m_pWindow->SetSizingEnabled(false); - m_pWindow->SetPosition(CVector2D(ScreenSize.fX * 0.5f - MESSAGEBOX_WIDTH * 0.5f, ScreenSize.fY * 0.5f - MESSAGEBOX_HEIGHT * 0.5f)); - m_pWindow->SetSize(CVector2D(MESSAGEBOX_WIDTH, MESSAGEBOX_HEIGHT)); // relative 0.35, 0.225 - - // Create the icon - m_pIcon = pGUI->CreateStaticImage(m_pWindow); - m_pIcon->SetFrameEnabled(false); - m_pIcon->SetPosition(CVector2D(MESSAGEBOX_SPACER, MESSAGEBOX_HEIGHT / 2 - MESSAGEBOX_ICON_SIZE / 2)); - m_pIcon->SetSize(CVector2D(MESSAGEBOX_ICON_SIZE, MESSAGEBOX_ICON_SIZE)); - - if (uiFlags & MB_ICON_INFO) - m_pIcon->LoadFromFile(CGUI_ICON_MESSAGEBOX_INFO); - else if (uiFlags & MB_ICON_QUESTION) - m_pIcon->LoadFromFile(CGUI_ICON_MESSAGEBOX_QUESTION); - else if (uiFlags & MB_ICON_WARNING) - m_pIcon->LoadFromFile(CGUI_ICON_MESSAGEBOX_WARNING); - else if (uiFlags & MB_ICON_ERROR) - m_pIcon->LoadFromFile(CGUI_ICON_MESSAGEBOX_ERROR); - - // Create caption label - m_pLabelCaption = pGUI->CreateLabel(m_pWindow, szCaption); - m_pLabelCaption->SetPosition(CVector2D(MESSAGEBOX_ICON_SIZE + MESSAGEBOX_SPACER * 2, MESSAGEBOX_SPACER)); - m_pLabelCaption->SetSize(CVector2D(MESSAGEBOX_WIDTH - MESSAGEBOX_ICON_SIZE - MESSAGEBOX_SPACER * 3, MESSAGEBOX_HEIGHT - MESSAGEBOX_SPACER * 2)); - m_pLabelCaption->SetHorizontalAlign(CGUI_ALIGN_LEFT_WORDWRAP); - m_pLabelCaption->SetVerticalAlign(CGUI_ALIGN_VERTICALCENTER); - m_pLabelCaption->MoveToBack(); - m_pLabelCaption->SetZOrderingEnabled(false); - - // Create buttons - if (uiFlags & MB_BUTTON_OK) - { - m_pButton = pGUI->CreateButton(m_pWindow, _("OK")); - } - else if (uiFlags & MB_BUTTON_CANCEL) - { - m_pButton = pGUI->CreateButton(m_pWindow, _("Cancel")); - } - else if (uiFlags & MB_BUTTON_YES) - { - m_pButton = pGUI->CreateButton(m_pWindow, _("Yes")); - } - - if (m_pButton) - { - m_pButton->SetPosition(CVector2D((MESSAGEBOX_WIDTH - 84) / 2, MESSAGEBOX_HEIGHT * 0.76f)); - m_pButton->SetSize(CVector2D(84.0f, 24.0f)); - m_pButton->SetZOrderingEnabled(false); - - SetClickHandler(GUI_CALLBACK(&CGUIMessageBox_Impl::OnResponseHandler, this)); - } - - // Set the KeyDown handler - m_pWindow->SetEnterKeyHandler(GUI_CALLBACK(&CGUIMessageBox_Impl::OnResponseHandler, this)); - - // And finally set the focus to our window - m_pWindow->Activate(); -} - -CGUIMessageBox_Impl::~CGUIMessageBox_Impl() -{ - if (m_pButton) - delete m_pButton; - - if (m_pLabelCaption) - delete m_pLabelCaption; - - if (m_pIcon) - delete m_pIcon; - - if (m_pWindow) - delete m_pWindow; -} - -void CGUIMessageBox_Impl::SetClickHandler(GUI_CALLBACK ResponseHandler) -{ - m_pButton->SetClickHandler(ResponseHandler); -} - -void CGUIMessageBox_Impl::SetAutoDestroy(bool bAutoDestroy) -{ - m_bAutoDestroy = bAutoDestroy; -} - -bool CGUIMessageBox_Impl::GetAutoDestroy() -{ - return m_bAutoDestroy; -} - -void CGUIMessageBox_Impl::SetVisible(bool bVisible) -{ - m_pWindow->SetVisible(true); -} - -bool CGUIMessageBox_Impl::IsVisible() -{ - return m_pWindow->IsVisible(); -} - -bool CGUIMessageBox_Impl::OnResponseHandler(CGUIElement* pElement) -{ - // Hide our main form - m_pWindow->SetVisible(false); - - // Delete this class - if (m_bAutoDestroy) - { - delete this; - return true; - } - - return true; -} - -CGUIWindow* CGUIMessageBox_Impl::GetWindow() -{ - return m_pWindow; -} diff --git a/Client/gui_new/CGUIMessageBox_Impl.h b/Client/gui_new/CGUIMessageBox_Impl.h deleted file mode 100644 index a904d41940..0000000000 --- a/Client/gui_new/CGUIMessageBox_Impl.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIMessageBox_Impl.h - * PURPOSE: Message box class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIButton_Impl.h" -#include "CGUILabel_Impl.h" -#include "CGUIStaticImage_Impl.h" -#include "CGUIWindow_Impl.h" - -namespace GUINew { - class CGUIMessageBox_Impl; -} - -class GUINew::CGUIMessageBox_Impl : public CGUIMessageBox -{ -public: - CGUIMessageBox_Impl(class CGUI_Impl* pGUI, const char* szTitle, const char* szCaption, unsigned int uiFlags); - ~CGUIMessageBox_Impl(); - - void SetAutoDestroy(bool bAutoDestroy); - bool GetAutoDestroy(); - - void SetVisible(bool bVisible); - bool IsVisible(); - - void SetClickHandler(GUI_CALLBACK Callback); - - ::CGUIWindow* GetWindow(); - -private: - bool OnResponseHandler(CGUIElement* pElement); - - CGUIWindow* m_pWindow; - CGUIStaticImage* m_pIcon; - CGUILabel* m_pLabelCaption; - CGUIButton* m_pButton; - - bool m_bAutoDestroy; -}; diff --git a/Client/gui_new/CGUIProgressBar_Impl.cpp b/Client/gui_new/CGUIProgressBar_Impl.cpp deleted file mode 100644 index 10cee692dc..0000000000 --- a/Client/gui_new/CGUIProgressBar_Impl.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIProgressBar_Impl.cpp - * PURPOSE: Progress bar widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUILABEL_NAME "ProgressBar" - -using namespace GUINew; - -CGUIProgressBar_Impl::CGUIProgressBar_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUILABEL_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - AddEvents(); - - reinterpret_cast(m_pWindow)->setProgress(0); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIProgressBar_Impl::~CGUIProgressBar_Impl() -{ - DestroyElement(); -} - -void CGUIProgressBar_Impl::SetProgress(float fProgress) -{ - reinterpret_cast(m_pWindow)->setProgress(fProgress); -} - -float CGUIProgressBar_Impl::GetProgress() -{ - return reinterpret_cast(m_pWindow)->getProgress(); -} diff --git a/Client/gui_new/CGUIProgressBar_Impl.h b/Client/gui_new/CGUIProgressBar_Impl.h deleted file mode 100644 index f50e74c1a4..0000000000 --- a/Client/gui_new/CGUIProgressBar_Impl.h +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIProgressBar_Impl.h - * PURPOSE: Progress bar widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIProgressBar_Impl; -} - -class GUINew::CGUIProgressBar_Impl : public CGUIProgressBar, public CGUIElement_Impl -{ -public: - CGUIProgressBar_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL); - ~CGUIProgressBar_Impl(); - - void SetProgress(float fProgress); - float GetProgress(); - - eCGUIType GetType() { return CGUI_PROGRESSBAR; }; - - #include "CGUIElement_Inc.h" - -private: -}; diff --git a/Client/gui_new/CGUIRadioButton_Impl.cpp b/Client/gui_new/CGUIRadioButton_Impl.cpp deleted file mode 100644 index 88a8089368..0000000000 --- a/Client/gui_new/CGUIRadioButton_Impl.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIRadioButton_Impl.cpp - * PURPOSE: Radio button widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUIRADIOBUTTON_NAME "RadioButton" - -using namespace GUINew; - -CGUIRadioButton_Impl::CGUIRadioButton_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIRADIOBUTTON_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - m_pWindow->setText(szCaption); - - m_pWindow->setSize(pGUI->CreateAbsoluteSize(128.0f, 16.0f)); - m_pWindow->setVisible(true); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Register our events - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIRadioButton_Impl::~CGUIRadioButton_Impl() -{ - DestroyElement(); -} - -void CGUIRadioButton_Impl::SetSelected(bool bChecked) -{ - reinterpret_cast(m_pWindow)->setSelected(bChecked); -} - -bool CGUIRadioButton_Impl::GetSelected() -{ - return reinterpret_cast(m_pWindow)->isSelected(); -} diff --git a/Client/gui_new/CGUIRadioButton_Impl.h b/Client/gui_new/CGUIRadioButton_Impl.h deleted file mode 100644 index 378ca628b6..0000000000 --- a/Client/gui_new/CGUIRadioButton_Impl.h +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIRadioButton_Impl.h - * PURPOSE: Radio button widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIRadioButton_Impl; -} - -class GUINew::CGUIRadioButton_Impl : public CGUIRadioButton, public CGUIElement_Impl -{ -public: - CGUIRadioButton_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szCaption = ""); - ~CGUIRadioButton_Impl(); - - void SetSelected(bool bChecked); - bool GetSelected(); - - eCGUIType GetType() { return CGUI_RADIOBUTTON; }; - - #include "CGUIElement_Inc.h" - -private: -}; diff --git a/Client/gui_new/CGUIScrollBar_Impl.cpp b/Client/gui_new/CGUIScrollBar_Impl.cpp deleted file mode 100644 index af9ee01897..0000000000 --- a/Client/gui_new/CGUIScrollBar_Impl.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIScrollBar_Impl.cpp - * PURPOSE: Scroll bar widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUISCROLLBAR_HORIZONTAL_NAME "HorizontalScrollbar" -#define CGUISCROLLBAR_VERTICAL_NAME "VerticalScrollbar" - -using namespace GUINew; - -CGUIScrollBar_Impl::CGUIScrollBar_Impl(CGUI_Impl* pGUI, bool bHorizontal, CGUIElement* pParent) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(bHorizontal ? pGUI->GetElementPrefix() + "/" + CGUISCROLLBAR_HORIZONTAL_NAME : pGUI->GetElementPrefix() + "/" + CGUISCROLLBAR_VERTICAL_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Register our events - m_pWindow->subscribeEvent(CEGUI::Scrollbar::EventScrollPositionChanged, CEGUI::Event::Subscriber(&CGUIScrollBar_Impl::Event_OnScroll, this)); - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIScrollBar_Impl::~CGUIScrollBar_Impl() -{ - DestroyElement(); -} - -void CGUIScrollBar_Impl::SetScrollPosition(float fPosition) -{ - reinterpret_cast(m_pWindow)->setScrollPosition(fPosition); -} - -float CGUIScrollBar_Impl::GetScrollPosition() -{ - return reinterpret_cast(m_pWindow)->getScrollPosition(); -} - -void CGUIScrollBar_Impl::SetOnScrollHandler(const GUI_CALLBACK& Callback) -{ - m_OnScroll = Callback; -} - -bool CGUIScrollBar_Impl::Event_OnScroll(const CEGUI::EventArgs& e) -{ - if (m_OnScroll) - m_OnScroll(reinterpret_cast(this)); - return true; -} diff --git a/Client/gui_new/CGUIScrollBar_Impl.h b/Client/gui_new/CGUIScrollBar_Impl.h deleted file mode 100644 index a312b3aba0..0000000000 --- a/Client/gui_new/CGUIScrollBar_Impl.h +++ /dev/null @@ -1,40 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIScrollBar_Impl.h - * PURPOSE: Scroll bar widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIScrollBar_Impl; -} - -class GUINew::CGUIScrollBar_Impl : public CGUIScrollBar, public CGUIElement_Impl -{ -public: - CGUIScrollBar_Impl(class CGUI_Impl* pGUI, bool bHorizontal, CGUIElement* pParent = NULL); - ~CGUIScrollBar_Impl(); - - void SetOnScrollHandler(const GUI_CALLBACK& Callback); - - void SetScrollPosition(float fPosition); - float GetScrollPosition(); - - eCGUIType GetType() { return CGUI_SCROLLBAR; }; - - #include "CGUIElement_Inc.h" - -private: - bool Event_OnScroll(const CEGUI::EventArgs& e); - - GUI_CALLBACK m_OnScroll; -}; diff --git a/Client/gui_new/CGUIScrollPane_Impl.cpp b/Client/gui_new/CGUIScrollPane_Impl.cpp deleted file mode 100644 index 86954a8626..0000000000 --- a/Client/gui_new/CGUIScrollPane_Impl.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIScrollPane_Impl.cpp - * PURPOSE: Scroll pane widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUISCROLLPANE_NAME "ScrollablePane" - -using namespace GUINew; - -CGUIScrollPane_Impl::CGUIScrollPane_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) -{ - m_pManager = pGUI; - - // Initialize - m_pGUI = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUISCROLLPANE_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0))); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the m_pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } - SetHorizontalScrollStepSize(100.0f); - SetVerticalScrollStepSize(100.0f); -} - -CGUIScrollPane_Impl::~CGUIScrollPane_Impl() -{ - DestroyElement(); -} - -void CGUIScrollPane_Impl::SetHorizontalScrollBar(bool bEnabled) -{ - reinterpret_cast(m_pWindow)->setAlwaysShowHorizontalScrollbar(bEnabled); -} - -void CGUIScrollPane_Impl::SetVerticalScrollBar(bool bEnabled) -{ - reinterpret_cast(m_pWindow)->setAlwaysShowVerticalScrollbar(bEnabled); -} - -void CGUIScrollPane_Impl::SetHorizontalScrollPosition(float fPosition) -{ - try - { - CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - float fFullWidth = pScrollPane->getContentPane()->getWidth().d_offset; - float fViewWidth = pScrollPane->getWidth().d_offset; - - pScrollPane->setHorizontalScrollPosition(fPosition * ((fFullWidth - fViewWidth) / fFullWidth)); - } - catch (CEGUI::Exception) - { - } -} - -void CGUIScrollPane_Impl::SetVerticalScrollPosition(float fPosition) -{ - try - { - CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - float fFullHeight = pScrollPane->getContentPane()->getHeight().d_offset; - float fViewHeight = pScrollPane->getHeight().d_offset; - - pScrollPane->setVerticalScrollPosition(fPosition * ((fFullHeight - fViewHeight) / fFullHeight)); - } - catch (CEGUI::Exception) - { - } -} - -float CGUIScrollPane_Impl::GetHorizontalScrollPosition() -{ - try - { - CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - - float fFullWidth = pScrollPane->getContentPane()->getWidth().d_offset; - float fViewWidth = pScrollPane->getWidth().d_offset; - - // Prevent division by zero - if (fFullWidth == fViewWidth) - return 0.0f; - - return (pScrollPane->getHorizontalScrollPosition() / ((fFullWidth - fViewWidth) / fFullWidth)); - } - catch (CEGUI::Exception) - { - return 0; - } -} - -float CGUIScrollPane_Impl::GetVerticalScrollPosition() -{ - try - { - CEGUI::ScrollablePane* pScrollPane = reinterpret_cast(m_pWindow); - - float fFullHeight = pScrollPane->getContentPane()->getHeight().d_offset; - float fViewHeight = pScrollPane->getHeight().d_offset; - - // Prevent division by zero - if (fFullHeight == fViewHeight) - return 0.0f; - - return (pScrollPane->getVerticalScrollPosition() / ((fFullHeight - fViewHeight) / fFullHeight)); - } - catch (CEGUI::Exception) - { - return 0; - } -} - -void CGUIScrollPane_Impl::SetHorizontalScrollStepSize(float fPosition) -{ - try - { - reinterpret_cast(m_pWindow)->setHorizontalStepSize(fPosition); - } - catch (CEGUI::Exception) - { - } -} - -void CGUIScrollPane_Impl::SetVerticalScrollStepSize(float fPosition) -{ - try - { - reinterpret_cast(m_pWindow)->setVerticalStepSize(fPosition); - } - catch (CEGUI::Exception) - { - } -} - -float CGUIScrollPane_Impl::GetHorizontalScrollStepSize() -{ - try - { - return reinterpret_cast(m_pWindow)->getHorizontalStepSize(); - } - catch (CEGUI::Exception) - { - return 0; - } -} - -float CGUIScrollPane_Impl::GetVerticalScrollStepSize() -{ - try - { - return reinterpret_cast(m_pWindow)->getVerticalStepSize(); - } - catch (CEGUI::Exception) - { - return 0; - } -} diff --git a/Client/gui_new/CGUIScrollPane_Impl.h b/Client/gui_new/CGUIScrollPane_Impl.h deleted file mode 100644 index dc85e44b4a..0000000000 --- a/Client/gui_new/CGUIScrollPane_Impl.h +++ /dev/null @@ -1,48 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIScrollPane_Impl.h - * PURPOSE: Scroll pane widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIScrollPane_Impl; -} - -class GUINew::CGUIScrollPane_Impl : public CGUIScrollPane, public CGUIElement_Impl, public CGUITabList -{ -public: - CGUIScrollPane_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL); - ~CGUIScrollPane_Impl(); - - void SetHorizontalScrollBar(bool bEnabled); - void SetVerticalScrollBar(bool bEnabled); - - void SetHorizontalScrollPosition(float fPosition); - float GetHorizontalScrollPosition(); - - void SetVerticalScrollPosition(float fPosition); - float GetVerticalScrollPosition(); - - void SetHorizontalScrollStepSize(float fPosition); - float GetHorizontalScrollStepSize(); - - void SetVerticalScrollStepSize(float fPosition); - float GetVerticalScrollStepSize(); - - eCGUIType GetType() { return CGUI_SCROLLPANE; }; - - #include "CGUIElement_Inc.h" - -private: - class CGUI_Impl* m_pGUI; -}; diff --git a/Client/gui_new/CGUIStaticImage_Impl.cpp b/Client/gui_new/CGUIStaticImage_Impl.cpp deleted file mode 100644 index 9a646c96d4..0000000000 --- a/Client/gui_new/CGUIStaticImage_Impl.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIStaticImage_Impl.cpp - * PURPOSE: Static image widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" -#include "CEGUI/RendererModules/Direct3D9/Renderer.h" - -#define CGUISTATICIMAGE_NAME "StaticImage" - -using namespace GUINew; - -CGUIStaticImage_Impl::CGUIStaticImage_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) -{ - // Initialize - m_pImagesetManager = pGUI->GetImageManager(); - m_pImage = NULL; - m_pTexture = NULL; - m_pGUI = pGUI; - m_pManager = pGUI; - - // Get an unique identifier for CEGUI - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the control and set default properties - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUISTATICIMAGE_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.0f, 0), CEGUI::UDim(1.0f, 0), CEGUI::UDim(1.0f, 0))); - m_pWindow->setProperty("BackgroundEnabled", "False"); - - // Make sure frame is disabled - SetFrameEnabled(false); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIStaticImage_Impl::~CGUIStaticImage_Impl() -{ - // Clear the image - Clear(); - - DestroyElement(); -} - -bool CGUIStaticImage_Impl::LoadFromFile(const char* szFilename, const char* szResourceGroup) -{ - // Ensure we don't already have an image - Clear(); - - // Check if the image already exists and load it - if (m_pImagesetManager->isDefined(szFilename)) - m_pImage = dynamic_cast(&m_pImagesetManager->get(szFilename)); - else - { - // Define a new image in the ImageManager - try - { - m_pImagesetManager->addBitmapImageFromFile(szFilename, szFilename, szResourceGroup); - } - catch (CEGUI::Exception e) - { - printf("why?"); - } - - // Failed to create image - if (!m_pImagesetManager->isDefined(szFilename)) - return false; - - // Get the image from the image manager and cast to BasicImage - m_pImage = dynamic_cast(&m_pImagesetManager->get(szFilename)); - } - - // Set image to window - m_pWindow->setProperty("Image", szFilename); - - return true; -} - -bool CGUIStaticImage_Impl::LoadFromTexture(CGUITexture* pTexture) -{ - // Ensure we don't already have an image - Clear(); - - if (m_pTexture && pTexture != m_pTexture) - { - delete m_pTexture; - m_pTexture = NULL; - } - - m_pTexture = (CGUITexture_Impl*)pTexture; - - // Get CEGUI texture - CEGUI::Texture* pCEGUITexture = m_pTexture->GetTexture(); - - // Get an unique identifier for CEGUI for the image - char szUnique[CGUI_CHAR_SIZE]; - m_pGUI->GetUniqueName(szUnique); - - // Define a new image in the ImageManager - m_pImage = dynamic_cast(&m_pImagesetManager->create("BitmapImage", szUnique)); - - // Set the texture of the created image - m_pImage->setTexture(pCEGUITexture); - - // Set image to window - m_pWindow->setProperty("Image", szUnique); - - // Success - return true; -} - -void CGUIStaticImage_Impl::Clear() -{ - if (!m_pImage) - return; - - //m_pImagesetManager->destroy(m_pImage->getName()); -} - -bool CGUIStaticImage_Impl::GetNativeSize(CVector2D& vecSize) -{ - if (!m_pTexture && !m_pImage) - return false; - - const CEGUI::Sizef* size = m_pTexture ? &m_pTexture->GetTexture()->getSize() : &m_pImage->getRenderedSize(); - - vecSize.fX = size->d_width; - vecSize.fY = size->d_height; - - return true; -} - -void CGUIStaticImage_Impl::SetFrameEnabled(bool bFrameEnabled) -{ - m_pWindow->setProperty("FrameEnabled", bFrameEnabled ? "True" : "False"); -} - -bool CGUIStaticImage_Impl::IsFrameEnabled() -{ - return m_pWindow->getProperty("FrameEnabled") == "True" ? true : false; -} - -CEGUI::Image* CGUIStaticImage_Impl::GetDirectImage() -{ - return m_pImage; -} - -/* Unused? */ -void CGUIStaticImage_Impl::Render() -{ - return m_pWindow->draw(); -} diff --git a/Client/gui_new/CGUIStaticImage_Impl.h b/Client/gui_new/CGUIStaticImage_Impl.h deleted file mode 100644 index 6341368c89..0000000000 --- a/Client/gui_new/CGUIStaticImage_Impl.h +++ /dev/null @@ -1,52 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIStaticImage_Impl.h - * PURPOSE: Static image widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUITexture_Impl.h" - -class CGUITexture; -class GUINew::CGUITexture_Impl; - -namespace GUINew{ - class CGUIStaticImage_Impl; -} - - -class GUINew::CGUIStaticImage_Impl : public CGUIStaticImage, public CGUIElement_Impl, public CGUITabList -{ -public: - CGUIStaticImage_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL); - ~CGUIStaticImage_Impl(); - - bool LoadFromFile(const char* szFilename, const char* szResourceGroup = "mta"); - bool LoadFromTexture(CGUITexture* pTexture); - bool GetNativeSize(CVector2D& vecSize); - void Clear(); - - void SetFrameEnabled(bool bFrameEnabled); - bool IsFrameEnabled(); - - CEGUI::Image* GetDirectImage(); - - void Render(); - - eCGUIType GetType() { return CGUI_STATICIMAGE; } - -private: - CGUI_Impl* m_pGUI; - CGUITexture_Impl* m_pTexture; - CEGUI::BitmapImage* m_pImage; - CEGUI::ImageManager* m_pImagesetManager; - - #include "CGUIElement_Inc.h" -}; diff --git a/Client/gui_new/CGUITabList.cpp b/Client/gui_new/CGUITabList.cpp deleted file mode 100644 index 21187c0eff..0000000000 --- a/Client/gui_new/CGUITabList.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITabList.cpp - * PURPOSE: Tab-able elements list class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -using namespace GUINew; - -void CGUITabList::SelectNext(CGUITabListItem* pBase) -{ - // Loop through all elements which can be activated - bool bFound = false; - for (CGUITabIterator iter = m_Items.begin(); iter != m_Items.end(); ++iter) - { - CGUITabListItem* pItem = *iter; - - if (pItem == pBase) - { - bFound = true; - } - else if (bFound && pItem->IsEnabled()) - { - // we found an element that wants to get selected - pItem->ActivateOnTab(); - return; - } - } - - // Contine to search an element from the beginning - for (CGUITabIterator iter = m_Items.begin(); iter != m_Items.end(); ++iter) - { - CGUITabListItem* pItem = *iter; - - if (pItem == pBase) - { - // just where we started, so we don't have to do anything - return; - } - else if (pItem->IsEnabled()) - { - // finally found something different than the current element - pItem->ActivateOnTab(); - return; - } - } -} diff --git a/Client/gui_new/CGUITabList.h b/Client/gui_new/CGUITabList.h deleted file mode 100644 index ef6ee2a3dc..0000000000 --- a/Client/gui_new/CGUITabList.h +++ /dev/null @@ -1,32 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITabList.h - * PURPOSE: Tab-able Elements list class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include - -namespace GUINew{ - typedef std::list::const_iterator CGUITabIterator; - class CGUITabList; -} - -class GUINew::CGUITabList -{ -public: - CGUITabList(){}; - ~CGUITabList(){}; - - void AddItem(CGUITabListItem* pItem) { m_Items.push_back(pItem); }; - void RemoveItem(CGUITabListItem* pItem) { m_Items.remove(pItem); }; - - void SelectNext(CGUITabListItem* pBase); - -private: - std::list m_Items; -}; diff --git a/Client/gui_new/CGUITabListItem.h b/Client/gui_new/CGUITabListItem.h deleted file mode 100644 index ac50543218..0000000000 --- a/Client/gui_new/CGUITabListItem.h +++ /dev/null @@ -1,23 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITabListItem.h - * PURPOSE: Tab-able Element Interface - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ -#pragma once - -#include - -namespace GUINew{ - class CGUITabListItem; -} - -class GUINew::CGUITabListItem : public CGUIElement -{ -public: - virtual bool ActivateOnTab() = 0; -}; diff --git a/Client/gui_new/CGUITabPanel_Impl.cpp b/Client/gui_new/CGUITabPanel_Impl.cpp deleted file mode 100644 index 9df8f747f5..0000000000 --- a/Client/gui_new/CGUITabPanel_Impl.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITabPanel_Impl.cpp - * PURPOSE: Tab panel widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUITABPANEL_NAME "TabControl" - -using namespace GUINew; - -CGUITabPanel_Impl::CGUITabPanel_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) -{ - m_pManager = pGUI; - - // Initialize - m_pGUI = pGUI; - - // Get an unique identifier for CEGUI (gah, there's gotta be an another way) - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUITABPANEL_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0), CEGUI::UDim(0.9f, 0))); - - dynamic_cast(m_pWindow)->setTabTextPadding(CEGUI::UDim(0, 10.0f)); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - m_pWindow->subscribeEvent(CEGUI::TabControl::EventSelectionChanged, CEGUI::Event::Subscriber(&CGUITabPanel_Impl::Event_OnSelectionChanged, this)); - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the m_pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUITabPanel_Impl::~CGUITabPanel_Impl() -{ - DestroyElement(); -} - -CGUITab* CGUITabPanel_Impl::CreateTab(const char* szCaption) -{ - return new CGUITab_Impl(m_pGUI, this, szCaption); -} - -void CGUITabPanel_Impl::DeleteTab(CGUITab* pTab) -{ - CEGUI::TabControl* TabControl = reinterpret_cast(m_pWindow); - CGUITab_Impl* pTabImpl = reinterpret_cast(pTab); - - TabControl->removeTab(pTabImpl->GetWindow()->getName()); - return; -} - -CGUITab* CGUITabPanel_Impl::GetSelectedTab() -{ - CEGUI::TabControl* pControl = reinterpret_cast(m_pWindow); - - if (pControl->getTabCount() > 0) - { - CEGUI::Window* pTab = pControl->getTabContentsAtIndex(pControl->getSelectedTabIndex()); - - try - { - return reinterpret_cast(pTab->getUserData()); - } - catch (CEGUI::Exception) - { - return NULL; - } - } - return NULL; -} - -void CGUITabPanel_Impl::SetSelectedTab(CGUITab* pTab) -{ - CGUITab_Impl* pTabImpl = reinterpret_cast(pTab); - try - { - reinterpret_cast(m_pWindow)->setSelectedTab(pTabImpl->GetWindow()->getName()); - } - catch (CEGUI::Exception) - { - }; -} - -void CGUITabPanel_Impl::SetSelectedIndex(unsigned int uiIndex) -{ - try - { - reinterpret_cast(m_pWindow)->setSelectedTabAtIndex(uiIndex); - } - catch (CEGUI::Exception) - { - }; -} - -unsigned int CGUITabPanel_Impl::GetSelectedIndex() -{ - unsigned int uiIndex = 0; - try - { - uiIndex = reinterpret_cast(m_pWindow)->getSelectedTabIndex(); - } - catch (CEGUI::Exception) - { - }; - return uiIndex; -} - -unsigned int CGUITabPanel_Impl::GetTabCount() -{ - unsigned int uiIndex = 0; - try - { - uiIndex = reinterpret_cast(m_pWindow)->getTabCount(); - } - catch (CEGUI::Exception) - { - }; - return uiIndex; -} - -bool CGUITabPanel_Impl::IsTabSelected(CGUITab* pTab) -{ - return reinterpret_cast(m_pWindow)->isTabContentsSelected(reinterpret_cast(pTab)->GetWindow()); -} - -void CGUITabPanel_Impl::SetSelectionHandler(GUI_CALLBACK Callback) -{ - m_OnSelectionChanged = Callback; -} - -bool CGUITabPanel_Impl::Event_OnSelectionChanged(const CEGUI::EventArgs& e) -{ - if (m_OnSelectionChanged) - m_OnSelectionChanged(reinterpret_cast(GetSelectedTab())); - return true; -} diff --git a/Client/gui_new/CGUITabPanel_Impl.h b/Client/gui_new/CGUITabPanel_Impl.h deleted file mode 100644 index 9163a14901..0000000000 --- a/Client/gui_new/CGUITabPanel_Impl.h +++ /dev/null @@ -1,57 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITabPanel_Impl.h - * PURPOSE: Tab panel widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" -#include "CGUITab_Impl.h" - -#define MAX_TABS 64 - -namespace GUINew{ - class CGUITabPanel_Impl; -} - -class GUINew::CGUITabPanel_Impl : public CGUITabPanel, public CGUIElement_Impl -{ - friend class CGUITab_Impl; - -public: - CGUITabPanel_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL); - ~CGUITabPanel_Impl(); - - CGUITab* CreateTab(const char* szCaption); - void DeleteTab(CGUITab* pTab); - - CGUITab* GetSelectedTab(); - void SetSelectedTab(CGUITab* pTab); - - void SetSelectedIndex(unsigned int uiIndex); - unsigned int GetSelectedIndex(); - - unsigned int GetTabCount(); - - bool IsTabSelected(CGUITab* pTab); - - eCGUIType GetType() { return CGUI_TABPANEL; }; - - void SetSelectionHandler(GUI_CALLBACK Callback); - - #include "CGUIElement_Inc.h" - -private: - class CGUI_Impl* m_pGUI; - - GUI_CALLBACK m_OnSelectionChanged; - - bool Event_OnSelectionChanged(const CEGUI::EventArgs& e); -}; diff --git a/Client/gui_new/CGUITab_Impl.cpp b/Client/gui_new/CGUITab_Impl.cpp deleted file mode 100644 index 1e212238ad..0000000000 --- a/Client/gui_new/CGUITab_Impl.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITab_Impl.cpp - * PURPOSE: Tab widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -using namespace GUINew; - -CGUITab_Impl::CGUITab_Impl(CGUI_Impl* pGUI, CGUIElement_Impl* pParent, const char* szCaption) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - m_pWindow = pGUI->GetWindowManager()->createWindow("DefaultWindow", szUnique); - m_pWindow->setDestroyedByParent(false); - - m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - AddEvents(); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - - // Adjust the tab button (pParent should be a TabControl!) - reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow)->setTabHeight(CEGUI::UDim(0, 24.0f)); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUITab_Impl::~CGUITab_Impl() -{ - CGUIElement_Impl* pParent = static_cast(m_pParent); - CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - pControl->removeTab(this->GetWindow()->getName()); - - DestroyElement(); -} - -void CGUITab_Impl::SetCaption(const char* szCaption) -{ - m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); -} - -void CGUITab_Impl::SetVisible(bool bVisible) -{ - CGUIElement_Impl* pParent = static_cast(m_pParent); - CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - m_pWindow->setVisible(bVisible); - //pControl->requestChildWindowLayout(); -} - -bool CGUITab_Impl::IsVisible() -{ - CGUIElement_Impl* pParent = static_cast(m_pParent); - CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - return m_pWindow->isVisible(); -} - -void CGUITab_Impl::SetEnabled(bool bEnabled) -{ - CGUIElement_Impl* pParent = static_cast(m_pParent); - CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - m_pWindow->setEnabled(bEnabled); -} - -bool CGUITab_Impl::IsEnabled() -{ - CGUIElement_Impl* pParent = static_cast(m_pParent); - CEGUI::TabControl* pControl = reinterpret_cast(((CGUITabPanel_Impl*)pParent)->m_pWindow); - return !m_pWindow->isDisabled(); -} diff --git a/Client/gui_new/CGUITab_Impl.h b/Client/gui_new/CGUITab_Impl.h deleted file mode 100644 index d30755f392..0000000000 --- a/Client/gui_new/CGUITab_Impl.h +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITab_Impl.h - * PURPOSE: Tab widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUITab_Impl; -} - -class GUINew::CGUITab_Impl : public CGUITab, public CGUIElement_Impl, public CGUITabList -{ -public: - CGUITab_Impl(class CGUI_Impl* pManager, CGUIElement_Impl* pParent, const char* szCaption); - ~CGUITab_Impl(); - - void SetCaption(const char* szCaption); - - eCGUIType GetType() { return CGUI_TAB; }; - -#define SETVISIBLE_HACK -#define SETENABLED_HACK - #include "CGUIElement_Inc.h" -#undef SETENABLED_HACK -#undef SETVISIBLE_HACK - - void SetVisible(bool bVisible); - bool IsVisible(); - void SetEnabled(bool bEnabled); - bool IsEnabled(); -}; diff --git a/Client/gui_new/CGUITexture_Impl.cpp b/Client/gui_new/CGUITexture_Impl.cpp deleted file mode 100644 index fc7c33caf9..0000000000 --- a/Client/gui_new/CGUITexture_Impl.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITexture_Impl.cpp - * PURPOSE: Texture handling class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -using namespace GUINew; - -CGUITexture_Impl::CGUITexture_Impl(CGUI_Impl* pGUI) -{ - // Save the renderer - m_pRenderer = &pGUI->GetRenderer(); - m_pGUI = pGUI; - - // Get an unique identifier for CEGUI for the texture - char szUnique[CGUI_CHAR_SIZE]; - m_pGUI->GetUniqueName(szUnique); - - // Create the texture - m_pTexture = &m_pRenderer->createTexture(szUnique); -} - -CGUITexture_Impl::~CGUITexture_Impl() -{ - if (m_pTexture) - m_pRenderer->destroyTexture(*m_pTexture); -} - -bool CGUITexture_Impl::LoadFromFile(const char* szFilename, const char* szResourceGroup) -{ - // Try to load it - try - { - m_pTexture->loadFromFile(szFilename, szResourceGroup); - } - catch (CEGUI::FileIOException) - { - return false; - } - return true; -} - -void CGUITexture_Impl::LoadFromMemory(const void* pBuffer, unsigned int uiWidth, unsigned int uiHeight) -{ - m_pTexture->loadFromMemory(pBuffer, CEGUI::Sizef(uiWidth, uiHeight), CEGUI::Texture::PixelFormat::Rgba); -} - -void CGUITexture_Impl::Clear() -{ - // Destroy the previous texture and recreate it (empty) - m_pRenderer->destroyTexture(*m_pTexture); - - // Get an unique identifier for CEGUI for the texture - char szUnique[CGUI_CHAR_SIZE]; - m_pGUI->GetUniqueName(szUnique); - m_pTexture = &m_pRenderer->createTexture(szUnique); -} - -CEGUI::Texture* CGUITexture_Impl::GetTexture() -{ - return m_pTexture; -} - -void CGUITexture_Impl::SetTexture(CEGUI::Texture* pTexture) -{ - m_pTexture = pTexture; -} - -LPDIRECT3DTEXTURE9 CGUITexture_Impl::GetD3DTexture() -{ - return reinterpret_cast(m_pTexture)->getDirect3D9Texture(); -} - -void CGUITexture_Impl::CreateTexture(unsigned int width, unsigned int height) -{ - //return reinterpret_cast(m_pTexture)->createRenderTarget(width, height); -} diff --git a/Client/gui_new/CGUITexture_Impl.h b/Client/gui_new/CGUITexture_Impl.h deleted file mode 100644 index d4dbcf924a..0000000000 --- a/Client/gui_new/CGUITexture_Impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUITexture_Impl.h - * PURPOSE: Texture handling class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include - -namespace CEGUI -{ - class Texture; - class Renderer; -} // namespace CEGUI - -namespace GUINew{ - class CGUITexture_Impl; -} - -class GUINew::CGUITexture_Impl : public CGUITexture -{ -public: - CGUITexture_Impl(class CGUI_Impl* pGUI); - ~CGUITexture_Impl(); - - bool LoadFromFile(const char* szFilename, const char* szResourceGroup = "mta"); - void LoadFromMemory(const void* pBuffer, unsigned int uiWidth, unsigned int uiHeight); - void Clear(); - - CEGUI::Texture* GetTexture(); - void SetTexture(CEGUI::Texture* pTexture); - LPDIRECT3DTEXTURE9 GetD3DTexture(); - - void CreateTexture(unsigned int width, unsigned int height); - -private: - class CGUI_Impl* m_pGUI; - CEGUI::Direct3D9Renderer* m_pRenderer; - CEGUI::Texture* m_pTexture; -}; diff --git a/Client/gui_new/CGUIWebBrowser_Impl.cpp b/Client/gui_new/CGUIWebBrowser_Impl.cpp deleted file mode 100644 index 3ee518ddca..0000000000 --- a/Client/gui_new/CGUIWebBrowser_Impl.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIWebBrowser_Impl.cpp - * PURPOSE: WebBrowser widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ -#include "StdInc.h" -#include - -using namespace GUINew; - -CGUIWebBrowser_Impl::CGUIWebBrowser_Impl(CGUI_Impl* pGUI, CGUIElement* pParent) -{ - // Initialize - m_pImage = nullptr; - m_pGUI = pGUI; - m_pWebView = nullptr; - - // Save the renderer - m_pRenderer = &m_pGUI->GetRenderer(); - - // Get an unique identifier for CEGUI - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the control and set default properties - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIWEBBROWSER_NAME, szUnique); - m_pWindow->setDestroyedByParent(false); - m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.0f, 0), CEGUI::UDim(0.0f, 0), CEGUI::UDim(1.0f, 0), CEGUI::UDim(1.0f, 0))); - m_pWindow->setProperty("BackgroundEnabled", "false"); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - AddEvents(); - - // Apply browser events - m_pWindow->subscribeEvent(CEGUI::Window::EventMouseButtonDown, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseButtonDown, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventDoubleClick, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseDoubleClick, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventMouseButtonUp, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseButtonUp, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventCursorMove, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseMove, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventScroll, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_MouseWheel, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventActivated, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_Activated, this)); - m_pWindow->subscribeEvent(CEGUI::Window::EventDeactivated, CEGUI::Event::Subscriber(&CGUIWebBrowser_Impl::Event_Deactivated, this)); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(nullptr); - } -} - -CGUIWebBrowser_Impl::~CGUIWebBrowser_Impl() -{ - Clear(); - - DestroyElement(); -} - -void CGUIWebBrowser_Impl::Clear() -{ - // Kill the images - if (m_pImage) - { - delete m_pImage; - m_pImage = nullptr; - - m_pRenderer->destroyTexture(m_pTexture->getName()); - m_pTexture = nullptr; - } -} - -void CGUIWebBrowser_Impl::LoadFromWebView(::CWebViewInterface* pWebView) -{ - m_pWebView = pWebView; - - if (m_pImage) - Clear(); - - //CGUIWebBrowserTexture* pCEGUITexture = new CGUIWebBrowserTexture(&m_pGUI->GetRenderer(), m_pWebView, *m_pTexture); - - // Get an unique identifier for CEGUI for the imageset - char szUnique[CGUI_CHAR_SIZE]; - m_pGUI->GetUniqueName(szUnique); - - m_pTexture = &m_pRenderer->createTexture(szUnique, pWebView->GetTexture()); - - // Set the BasicImage texture - m_pImage->setTexture(m_pTexture); - - // Create an imageset - //if (!m_pImageset) - //{ - // while (m_pImagesetManager->isImagesetPresent(szUnique)) - // m_pGUI->GetUniqueName(szUnique); - // m_pImageset = m_pImagesetManager->createImageset(szUnique, pCEGUITexture, true); - //} - - // Get an unique identifier for CEGUI for the image - m_pGUI->GetUniqueName(szUnique); - - // Define an image and get its pointer - //m_pImageset->defineImage(szUnique, CEGUI::Point(0, 0), CEGUI::Size(pCEGUITexture->getWidth(), pCEGUITexture->getHeight()), CEGUI::Point(0, 0)); - //m_pImage = const_cast( - // &m_pImageset->getImage(szUnique)); // const_cast here is a huge hack, but is okay here since all images generated here are unique - - // Set the image just loaded as the image to be drawn for the widget - //reinterpret_cast(m_pWindow)->setImage(m_pImage); -} - -void CGUIWebBrowser_Impl::SetFrameEnabled(bool bFrameEnabled) -{ - reinterpret_cast(m_pWindow)->setFrameEnabled(bFrameEnabled); -} - -bool CGUIWebBrowser_Impl::IsFrameEnabled() -{ - return reinterpret_cast(m_pWindow)->isFrameEnabled(); -} - -CEGUI::Image* CGUIWebBrowser_Impl::GetDirectImage() -{ - return m_pImage; -} - -void CGUIWebBrowser_Impl::Render() -{ - return m_pWindow->draw(); -} - -bool CGUIWebBrowser_Impl::HasInputFocus() -{ - return m_pWebView->HasInputFocus(); -} - -void CGUIWebBrowser_Impl::SetSize(const CVector2D& vecSize, bool bRelative) -{ - // Call base class function - CGUIElement_Impl::SetSize(vecSize, bRelative); - auto absSize = CGUIElement_Impl::GetSize(false); - - CEGUI::Rectf imageSize = CEGUI::Rectf(glm::vec2(0.0f, 0.0f), CEGUI::Sizef(absSize.fX, absSize.fY)); - - // Update image area - if (m_pImage) - m_pImage->setImageArea(imageSize); - - // Resize underlying web view as well - if (m_pWebView) - m_pWebView->Resize(absSize); -} - -bool CGUIWebBrowser_Impl::Event_MouseButtonDown(const CEGUI::EventArgs& e) -{ - const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - - if (args.d_button == CEGUI::MouseButton::Left) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT, 1); - else if (args.d_button == CEGUI::MouseButton::Middle) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE, 1); - else if (args.d_button == CEGUI::MouseButton::Right) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT, 1); - - return true; -} - -bool CGUIWebBrowser_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& e) -{ - const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - - if (args.d_button == CEGUI::MouseButton::Left) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT, 2); - else if (args.d_button == CEGUI::MouseButton::Middle) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE, 2); - else if (args.d_button == CEGUI::MouseButton::Right) - m_pWebView->InjectMouseDown(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT, 2); - - return true; -} - -bool CGUIWebBrowser_Impl::Event_MouseButtonUp(const CEGUI::EventArgs& e) -{ - const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - - if (args.d_button == CEGUI::MouseButton::Left) - m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_LEFT); - else if (args.d_button == CEGUI::MouseButton::Middle) - m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_MIDDLE); - else if (args.d_button == CEGUI::MouseButton::Right) - m_pWebView->InjectMouseUp(eWebBrowserMouseButton::BROWSER_MOUSEBUTTON_RIGHT); - - return true; -} - -bool CGUIWebBrowser_Impl::Event_MouseMove(const CEGUI::EventArgs& e) -{ - const CEGUI::MouseButtonEventArgs& args = reinterpret_cast(e); - CEGUI::UVector2 position = m_pWindow->getPosition(); - - m_pWebView->InjectMouseMove((int)(args.d_globalPos.x - position.d_x.d_offset), (int)(args.d_globalPos.y - position.d_y.d_offset)); - return true; -} - -bool CGUIWebBrowser_Impl::Event_MouseWheel(const CEGUI::EventArgs& e) -{ - const CEGUI::ScrollEventArgs& args = reinterpret_cast(e); - - m_pWebView->InjectMouseWheel((int)(args.d_delta * 40), 0); - return true; -} - -bool CGUIWebBrowser_Impl::Event_Activated(const CEGUI::EventArgs& e) -{ - m_pWebView->Focus(true); - return true; -} - -bool CGUIWebBrowser_Impl::Event_Deactivated(const CEGUI::EventArgs& e) -{ - m_pWebView->Focus(false); - return true; -} - -//CGUIWebBrowserTexture::CGUIWebBrowserTexture(CEGUI::Renderer* pOwner, CWebViewInterface* pWebView) : CEGUI::Direct3D9Texture(pOwner), m_pWebView(pWebView) -//{ -//} -// -//ushort CGUIWebBrowserTexture::getWidth() const -//{ -// return static_cast(m_pWebView->GetSize().fX); -//} -// -//ushort CGUIWebBrowserTexture::getHeight() const -//{ -// return static_cast(m_pWebView->GetSize().fY); -//} -// -//LPDIRECT3DTEXTURE9 CGUIWebBrowserTexture::getD3DTexture() const -//{ -// return m_pWebView->GetTexture(); -//} diff --git a/Client/gui_new/CGUIWebBrowser_Impl.h b/Client/gui_new/CGUIWebBrowser_Impl.h deleted file mode 100644 index b2b7bc2d0e..0000000000 --- a/Client/gui_new/CGUIWebBrowser_Impl.h +++ /dev/null @@ -1,91 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIWebBrowser_Impl.h - * PURPOSE: WebBrowser CGUI class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ -#pragma once - -#include -#include "CGUITexture_Impl.h" - -// Use StaticImage here as we'd have to add the same definition twice to the Falagard definition file otherwise -#define CGUIWEBBROWSER_NAME "TaharezLook/StaticImage" - -class CGUITexture; -class GUINew::CGUITexture_Impl; -class GUINew::CGUI_Impl; -class CWebViewInterface; - -namespace GUINew -{ - class CGUIWebBrowser_Impl; -} - -class GUINew::CGUIWebBrowser_Impl : public CGUIWebBrowser, public CGUIElement_Impl -{ -public: - CGUIWebBrowser_Impl(CGUI_Impl* pGUI, CGUIElement* pParent = nullptr); - ~CGUIWebBrowser_Impl(); - void Clear(); - - void LoadFromWebView(::CWebViewInterface* pWebView); - - void SetFrameEnabled(bool bFrameEnabled); - bool IsFrameEnabled(); - - CEGUI::Image* GetDirectImage(); - void Render(); - - virtual eCGUIType GetType() override { return CGUI_WEBBROWSER; } - - bool HasInputFocus(); - - virtual void SetSize(const CVector2D& vecSize, bool bRelative = false) override; - -protected: - bool Event_MouseButtonDown(const CEGUI::EventArgs& e); - bool Event_MouseButtonUp(const CEGUI::EventArgs& e); - bool Event_MouseDoubleClick(const CEGUI::EventArgs& e); - bool Event_MouseWheel(const CEGUI::EventArgs& e); - bool Event_MouseMove(const CEGUI::EventArgs& e); - bool Event_Activated(const CEGUI::EventArgs& e); - bool Event_Deactivated(const CEGUI::EventArgs& e); - -private: - CGUI_Impl* m_pGUI; - CEGUI::BitmapImage* m_pImage; - CEGUI::Texture* m_pTexture; - CEGUI::Direct3D9Renderer* m_pRenderer; - - ::CWebViewInterface* m_pWebView; - -#define EXCLUDE_SET_SIZE // WTF? TODO: Refactor this -#include "CGUIElement_Inc.h" -#undef EXCLUDE_SET_SIZE -}; - -// The purpose of this class is to provide an externally managed DirectX texture -// class CGUIWebBrowserTexture : public CEGUI::Direct3D9Texture -//{ -// public: -// CGUIWebBrowserTexture(CEGUI::Renderer* pOwner, CWebViewInterface* pWebView); -// -// virtual ushort getWidth() const; -// virtual ushort getHeight() const; -// -// // Override with empty function (--> eliminate the functinions from DirectX9Texture) -// virtual void loadFromFile(const CEGUI::String& filename, const CEGUI::String& resourceGroup) override{}; -// virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight) override{}; -// -// virtual LPDIRECT3DTEXTURE9 getD3DTexture() const override; -// virtual void preD3DReset(){}; -// virtual void postD3DReset(){}; -// -// private: -// CWebViewInterface* m_pWebView; -//}; diff --git a/Client/gui_new/CGUIWindow_Impl.cpp b/Client/gui_new/CGUIWindow_Impl.cpp deleted file mode 100644 index 029ff06244..0000000000 --- a/Client/gui_new/CGUIWindow_Impl.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIWindow_Impl.cpp - * PURPOSE: Window widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" - -#define CGUIWINDOW_NAME "FrameWindow" - -using namespace GUINew; - -CGUIWindow_Impl::CGUIWindow_Impl(CGUI_Impl* pGUI, CGUIElement* pParent, const char* szCaption, const SString& strLayoutFile) -{ - m_pManager = pGUI; - - // Get an unique identifier for CEGUI - char szUnique[CGUI_CHAR_SIZE]; - pGUI->GetUniqueName(szUnique); - - // Create the window and set default settings - - if (!strLayoutFile.empty()) - { - // Load from XML file - m_pWindow = pGUI->GetWindowManager()->loadLayoutFromFile(strLayoutFile); - } - - if (!m_pWindow) - { - // Create new here - m_pWindow = pGUI->GetWindowManager()->createWindow(pGUI->GetElementPrefix() + "/" + CGUIWINDOW_NAME, szUnique); - m_pWindow->setArea(CEGUI::URect(CEGUI::UDim(0.10f, 0), CEGUI::UDim(0.10f, 0), CEGUI::UDim(0.60f, 0), CEGUI::UDim(0.90f, 0))); - m_pWindow->setAlpha(0.8f); - - // Give the window a caption - m_pWindow->setText(CGUI_Impl::GetUTFString(szCaption)); - } - - m_pWindow->setDestroyedByParent(false); - - // Store the pointer to this CGUI element in the CEGUI element - m_pWindow->setUserData(reinterpret_cast(this)); - - // Set fixed minimum size to 96x48 - //m_pWindow->setMetricsMode(CEGUI::Absolute); - m_pWindow->setMinSize(CEGUI::USize(CEGUI::UDim(0, 96.0f), CEGUI::UDim(0, 48.0f))); - - // Don't enable the close button by default - reinterpret_cast(m_pWindow)->setCloseButtonEnabled(false); - - // Some window specific style options - reinterpret_cast(m_pWindow)->getTitlebar()->setFont("default-bold-small"); - - // Register our events - m_pWindow->subscribeEvent(CEGUI::FrameWindow::EventCloseClicked, &CGUIWindow_Impl::Event_OnCloseClick, this); - AddEvents(); - - // Disable rolling up, because we don't need it and it causes a freeze - reinterpret_cast(m_pWindow)->setRollupEnabled(false); - - // If a parent is specified, add it to it's children list, if not, add it as a child to the pManager - if (pParent) - { - SetParent(pParent); - } - else - { - pGUI->AddChild(this); - SetParent(NULL); - } -} - -CGUIWindow_Impl::~CGUIWindow_Impl() -{ - DestroyElement(); -} - -void CGUIWindow_Impl::SetMovable(bool bMovable) -{ - reinterpret_cast(m_pWindow)->setDragMovingEnabled(bMovable); -} - -bool CGUIWindow_Impl::IsMovable() -{ - return reinterpret_cast(m_pWindow)->isDragMovingEnabled(); -} - -void CGUIWindow_Impl::SetSizingEnabled(bool bResizeEnabled) -{ - reinterpret_cast(m_pWindow)->setSizingEnabled(bResizeEnabled); -} - -bool CGUIWindow_Impl::IsSizingEnabled() -{ - return reinterpret_cast(m_pWindow)->isSizingEnabled(); -} - -void CGUIWindow_Impl::SetFrameEnabled(bool bFrameEnabled) -{ - m_pWindow->setProperty("FrameEnabled", bFrameEnabled ? "True" : "False"); -} - -bool CGUIWindow_Impl::IsFrameEnabled() -{ - return m_pWindow->getProperty("FrameEnabled") == "True" ? true : false; -} - -void CGUIWindow_Impl::SetCloseButtonEnabled(bool bCloseButtonEnabled) -{ - reinterpret_cast(m_pWindow)->setCloseButtonEnabled(bCloseButtonEnabled); -} - -bool CGUIWindow_Impl::IsCloseButtonEnabled() -{ - return reinterpret_cast(m_pWindow)->isCloseButtonEnabled(); -} - -void CGUIWindow_Impl::SetTitlebarEnabled(bool bTitlebarEnabled) -{ - reinterpret_cast(m_pWindow)->setTitleBarEnabled(bTitlebarEnabled); -} - -bool CGUIWindow_Impl::IsTitlebarEnabled() -{ - return reinterpret_cast(m_pWindow)->isTitleBarEnabled(); -} - -void CGUIWindow_Impl::SetCloseClickHandler(GUI_CALLBACK Callback) -{ - m_OnCloseClick = Callback; -} - -bool CGUIWindow_Impl::Event_OnCloseClick(const CEGUI::EventArgs& e) -{ - if (m_OnCloseClick) - m_OnCloseClick(reinterpret_cast(this)); - return true; -} diff --git a/Client/gui_new/CGUIWindow_Impl.h b/Client/gui_new/CGUIWindow_Impl.h deleted file mode 100644 index 45f5dd6f48..0000000000 --- a/Client/gui_new/CGUIWindow_Impl.h +++ /dev/null @@ -1,48 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUIWindow_Impl.h - * PURPOSE: Window widget class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include "CGUIElement_Impl.h" - -namespace GUINew{ - class CGUIWindow_Impl; -} - -class GUINew::CGUIWindow_Impl : public CGUIWindow, public CGUIElement_Impl, public CGUITabList -{ -public: - CGUIWindow_Impl(class CGUI_Impl* pGUI, CGUIElement* pParent = NULL, const char* szCaption = "", const SString& strLayoutFile = ""); - ~CGUIWindow_Impl(); - - void SetMovable(bool bMovable); - bool IsMovable(); - void SetSizingEnabled(bool bResizeEnabled); - bool IsSizingEnabled(); - void SetFrameEnabled(bool bFrameEnabled); - bool IsFrameEnabled(); - void SetCloseButtonEnabled(bool bCloseButtonEnabled); - bool IsCloseButtonEnabled(); - void SetTitlebarEnabled(bool bTitlebarEnabled); - bool IsTitlebarEnabled(); - - void SetCloseClickHandler(GUI_CALLBACK Callback); - - eCGUIType GetType() { return CGUI_WINDOW; }; - - #include "CGUIElement_Inc.h" - -protected: - bool Event_OnCloseClick(const CEGUI::EventArgs& e); - - GUI_CALLBACK m_OnCloseClick; -}; diff --git a/Client/gui_new/CGUI_Impl.cpp b/Client/gui_new/CGUI_Impl.cpp deleted file mode 100644 index b1e6acd153..0000000000 --- a/Client/gui_new/CGUI_Impl.cpp +++ /dev/null @@ -1,1739 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUI_Impl.cpp - * PURPOSE: Graphical User Interface module class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" -#include "CEGUI/Exceptions.h" - -using std::list; - -#define CGUI_MTA_DEFAULT_FONT "tahoma.ttf" // %WINDIR%/font/<...> -#define CGUI_MTA_DEFAULT_FONT_BOLD "tahomabd.ttf" // %WINDIR%/font/<...> -#define CGUI_MTA_CLEAR_FONT "verdana.ttf" // %WINDIR%/font/<...> - -#define CGUI_MTA_DEFAULT_REG "Tahoma (TrueType)" -#define CGUI_MTA_DEFAULT_REG_BOLD "Tahoma Bold (TrueType)" -#define CGUI_MTA_CLEAR_REG "Verdana (TrueType)" - -#define CGUI_MTA_SUBSTITUTE_FONT "unifont-5.1.20080907.ttf" // GTA/MTA/<...> -#define CGUI_MTA_SANS_FONT "sans.ttf" // GTA/MTA/<...> -#define CGUI_SA_HEADER_FONT "saheader.ttf" // GTA/MTA/<...> -#define CGUI_SA_GOTHIC_FONT "sagothic.ttf" // GTA/MTA/<...> -#define CGUI_SA_HEADER_SIZE 26 -#define CGUI_SA_GOTHIC_SIZE 47 -#define CGUI_MTA_SANS_FONT_SIZE 9 - -const char* CEGUI_DEFAULT_SKIN_NAME = "GWEN"; -const char* CEGUI_ELEMENT_PREFIX = "GWEN"; // e.g CGUI/Button -const char* CEGUI_IMAGESET_PREFIX = "GWEN"; // e.g CGUI-Images/MouseArrow - -using namespace GUINew; - -CGUI_Impl::CGUI_Impl(IDirect3DDevice9* pDevice) - : m_HasSchemeLoaded(false), - m_fCurrentServerCursorAlpha(1.0f), - m_pRenderer(&CEGUI::Direct3D9Renderer::bootstrapSystem(pDevice, 299990, CalcMTASAPath("MTA").data())) -{ - m_RenderOkTimer.SetMaxIncrement(100); - - // Init - m_pDevice = pDevice; - - m_Channel = INPUT_CORE; - - // Store the pointers for the CEGUI system - m_pSystem = CEGUI::System::getSingletonPtr(); - - // Get pointers to various stuff from CEGUI singletons - m_pFontManager = CEGUI::FontManager::getSingletonPtr(); - m_pImageSetManager = CEGUI::ImageManager::getSingletonPtr(); - m_pSchemeManager = CEGUI::SchemeManager::getSingletonPtr(); - m_pWindowManager = CEGUI::WindowManager::getSingletonPtr(); - m_pWindowFactoryManager = CEGUI::WindowFactoryManager::getSingletonPtr(); - - auto renderMaterial = &m_pRenderer->createRenderMaterial(CEGUI::DefaultShaderType::Solid); - m_pGeometryBuffer = &m_pRenderer->createGeometryBufferColoured(*renderMaterial); - - m_pResourceProvider = m_pSystem->getResourceProvider(); - m_pDefaultResourceProvider = static_cast(m_pSystem->getResourceProvider()); - - m_pDefaultResourceProvider->setResourceGroupDirectory("absolute", ""); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_cgui", CalcMTASAPath("MTA/cgui-0.8.7").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta", CalcMTASAPath("MTA").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_images", CalcMTASAPath("MTA/cgui/images").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_basedir", GetMTASABaseDir().data()); - - // CEGUI layout group directories - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_schemes", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/schemes").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_imagesets", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/imagesets").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_fonts", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/fonts").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_layouts", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/layouts").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_looknfeels", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/looknfeel").data()); - m_pDefaultResourceProvider->setResourceGroupDirectory("mta_xml_schemas", CalcMTASAPath("MTA/cgui-0.8.7/datafiles/xml_schemas").data()); - - // Set the group directories - CEGUI::Scheme::setDefaultResourceGroup("mta_schemes"); - CEGUI::ImageManager::setImagesetDefaultResourceGroup("mta_imagesets"); - CEGUI::WindowManager::setDefaultResourceGroup("mta_layouts"); - CEGUI::Font::setDefaultResourceGroup("mta_fonts"); - CEGUI::WidgetLookManager::setDefaultResourceGroup("mta_looknfeels"); - - // Set XML parser defaults - m_pXMLParser = m_pSystem->getXMLParser(); - - auto resolution = GetResolution(); - CEGUI::TextureTarget* renderTextureTarget = m_pSystem->getRenderer()->createTextureTarget(false); - renderTextureTarget->declareRenderSize(CEGUI::Sizef(resolution.fX, resolution.fY)); - m_pDefaultGUIContext = &m_pSystem->createGUIContext(static_cast(*renderTextureTarget)); - - if (m_pXMLParser->isPropertyPresent("SchemaDefaultResourceGroup")) - m_pXMLParser->setProperty("SchemaDefaultResourceGroup", "mta_xml_schemas"); - - // Declare our custom CEGUI element types in the WindowFactoryManager (like ImageListboxItem) - // m_pWindowFactoryManager->addFactory(&CEGUI::getImageListboxItemFactory()); - // m_pWindowFactoryManager->addFalagardWindowMapping("CGUI/ImageListboxItem", "CEGUI/ItemEntry", "CGUI/ImageListboxItem", "Falagard/ItemEntry"); - - // Set logging to Informative for debug and Standard for release -#if defined(_DEBUG) || defined(DEBUG) - CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::LoggingLevel::Informative); -#else - CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Standard); -#endif - - // Load our fonts - SString strFontsPath = PathJoin(GetSystemWindowsPath(), "fonts"); - - try - { - m_pUniFont = (CGUIFont_Impl*)CreateFnt("unifont", CGUI_MTA_SUBSTITUTE_FONT, 9, 0, false, false); - } - catch (CEGUI::InvalidRequestException e) - { - SString strMessage = (const char*)e.getMessage().c_str(); - BrowseToSolution("create-fonts", EXIT_GAME_FIRST | ASK_GO_ONLINE, SString("Error loading fonts!\n\n%s", *strMessage)); - } - - // Window fonts first - m_pDefaultFont = (CGUIFont_Impl*)CreateFntFromWinFont("default-normal", CGUI_MTA_DEFAULT_REG, CGUI_MTA_DEFAULT_FONT, 9, 0); - m_pSmallFont = (CGUIFont_Impl*)CreateFntFromWinFont("default-small", CGUI_MTA_DEFAULT_REG, CGUI_MTA_DEFAULT_FONT, 7, 0); - m_pBoldFont = (CGUIFont_Impl*)CreateFntFromWinFont("default-bold-small", CGUI_MTA_DEFAULT_REG_BOLD, CGUI_MTA_DEFAULT_FONT_BOLD, 8, 0); - m_pClearFont = (CGUIFont_Impl*)CreateFntFromWinFont("clear-normal", CGUI_MTA_CLEAR_REG, CGUI_MTA_CLEAR_FONT, 9); - - try - { - m_pSAHeaderFont = (CGUIFont_Impl*)CreateFnt("sa-header", CGUI_SA_HEADER_FONT, CGUI_SA_HEADER_SIZE, 0, true, false); - m_pSAGothicFont = (CGUIFont_Impl*)CreateFnt("sa-gothic", CGUI_SA_GOTHIC_FONT, CGUI_SA_GOTHIC_SIZE, 0, true, false); - m_pSansFont = (CGUIFont_Impl*)CreateFnt("sans", CGUI_MTA_SANS_FONT, CGUI_MTA_SANS_FONT_SIZE, 0, false, false); - } - catch (CEGUI::InvalidRequestException e) - { - SString strMessage = (const char*)e.getMessage().c_str(); - BrowseToSolution("create-fonts", EXIT_GAME_FIRST | ASK_GO_ONLINE, SString("Error loading fonts!\n\n%s", *strMessage)); - } -} - -void CGUI_Impl::destroy() -{ - m_pSystem->destroy(); -} - -SString CGUI_Impl::GetDefaultSkinName() -{ - return CEGUI_DEFAULT_SKIN_NAME; -} - -SString CGUI_Impl::GetElementPrefix() -{ - return CEGUI_ELEMENT_PREFIX; -} - -SString CGUI_Impl::GetImagesetPrefix() -{ - return CEGUI_IMAGESET_PREFIX; -} - -void CGUI_Impl::SetSkin(const char* szName) -{ - if (m_HasSchemeLoaded) - { - CEGUI::GlobalEventSet::getSingletonPtr()->removeAllEvents(); - m_pSchemeManager->destroy(m_CurrentScheme->getName().c_str()); - } - - std::string schemeFileName = szName; - schemeFileName += ".scheme"; - - m_CurrentScheme = &m_pSchemeManager->createFromFile(schemeFileName.c_str(), "mta_schemes"); - - m_HasSchemeLoaded = true; - - m_pDefaultGUIContext->setDefaultCursorImage(GetImagesetPrefix() + "/Scroller.ButtonV.Normal.Top"); - // m_pSystem->getSingleton().getDefaultGUIContext().setDefaultTooltipType(GetElementPrefix() + "/Tooltip"); - - // Destroy any windows we already have - m_pWindowManager->destroyAllWindows(); - - // Create dummy GUI root - m_pTop = m_pWindowManager->createWindow("DefaultWindow", "guiroot"); - m_pDefaultGUIContext->setRootWindow(m_pTop); - - // Disable single click timeouts - m_pDefaultGUIContext->setMouseButtonMultiClickTimeout(100000000.0f); - - // Set our default font - m_pDefaultGUIContext->setDefaultFont(m_pDefaultFont->GetFont()); - - // Grab our default cursor - m_pCursor = m_pDefaultGUIContext->getDefaultCursorImage(); - - // Used to create unique names for widget instances - m_ulPreviousUnique = 0; - - SubscribeToMouseEvents(); - - // Disallow input routing to the GUI unless edit box has focus - m_eInputMode = eInputMode::INPUTMODE_NO_BINDS_ON_EDIT; - - // The transfer box is not visible by default - m_bTransferBoxVisible = false; -} - -void CGUI_Impl::SetBidiEnabled(bool bEnabled) -{ - // m_pSystem->SetBidiEnabled(bEnabled); -} - -void CGUI_Impl::SubscribeToMouseEvents() -{ - // Mouse events - CEGUI::GlobalEventSet* pEvents = CEGUI::GlobalEventSet::getSingletonPtr(); - - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCharacterKey, CEGUI::Event::Subscriber(&CGUI_Impl::Event_CharacterKey, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventKeyDown, CEGUI::Event::Subscriber(&CGUI_Impl::Event_KeyDown, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventClick, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseClick, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventDoubleClick, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseDoubleClick, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseButtonDown, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseButtonDown, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMouseButtonUp, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseButtonUp, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventScroll, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseWheel, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCursorMove, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseMove, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCursorEntersArea, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseEnter, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventCursorLeavesArea, CEGUI::Event::Subscriber(&CGUI_Impl::Event_MouseLeave, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventMoved, CEGUI::Event::Subscriber(&CGUI_Impl::Event_Moved, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventSized, CEGUI::Event::Subscriber(&CGUI_Impl::Event_Sized, this)); - // pEvents->subscribeEvent("Window/" + CEGUI::Window::EventRedrawRequested, CEGUI::Event::Subscriber(&CGUI_Impl::Event_RedrawRequested, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventActivated, CEGUI::Event::Subscriber(&CGUI_Impl::Event_FocusGained, this)); - pEvents->subscribeEvent("Window/" + CEGUI::Window::EventDeactivated, CEGUI::Event::Subscriber(&CGUI_Impl::Event_FocusLost, this)); -} - -CVector2D CGUI_Impl::GetResolution() -{ - CEGUI::Sizef pResolution = m_pRenderer->getDisplaySize(); - return CVector2D(pResolution.d_width, pResolution.d_height); -} - -void CGUI_Impl::SetResolution(float fWidth, float fHeight) -{ - m_pRenderer->setDisplaySize(CEGUI::Sizef(fWidth, fHeight)); -} - -void CGUI_Impl::Draw() -{ - // Redraw the changed elements - if (!m_RedrawQueue.empty()) - { - list::const_iterator iter = m_RedrawQueue.begin(); - for (; iter != m_RedrawQueue.end(); iter++) - { - (*iter)->ForceRedraw(); - } - m_RedrawQueue.clear(); - } - - m_pSystem->renderAllGUIContexts(); - - // I don't think this is required anymore? There's most likely a better way to catch rendering issues now - // if (!m_pSystem->renderAllGUIContexts()) - //{ - // if (m_RenderOkTimer.Get() > 4000) - // { - // // 4 seconds and over 40 failed calls means we have a problem - // BrowseToSolution("gui-render", EXIT_GAME_FIRST, "Some sort of DirectX problem has occurred"); - // } - //} - // else - // m_RenderOkTimer.Reset(); -} - -void CGUI_Impl::Invalidate() -{ - m_pRenderer->preD3DReset(); -} - -void CGUI_Impl::Restore() -{ - try - { - m_pRenderer->postD3DReset(); - } - catch (CEGUI::RendererException& exception) - { - MessageBox(0, (const char*)exception.getMessage().c_str(), "CEGUI Exception", MB_OK | MB_ICONERROR | MB_TOPMOST); - TerminateProcess(GetCurrentProcess(), 1); - } -} - -void CGUI_Impl::ProcessMouseInput(CGUIMouseInput eMouseInput, unsigned long ulX, unsigned long ulY, CGUIMouseButton eMouseButton) -{ - switch (eMouseInput) - { - case CGUI_MI_MOUSEMOVE: - m_pDefaultGUIContext->injectMouseMove(static_cast(ulX), static_cast(ulY)); - break; - - case CGUI_MI_MOUSEPOS: - m_pDefaultGUIContext->injectMousePosition(static_cast(ulX), static_cast(ulY)); - break; - - case CGUI_MI_MOUSEDOWN: - m_pDefaultGUIContext->injectMouseButtonDown(static_cast(eMouseButton)); - break; - - case CGUI_MI_MOUSEUP: - m_pDefaultGUIContext->injectMouseButtonUp(static_cast(eMouseButton)); - break; - - case CGUI_MI_MOUSEWHEEL: - m_pDefaultGUIContext->injectMouseWheelChange((signed long)ulX > 0 ? +1 : -1); - break; - } -} - -void CGUI_Impl::ProcessKeyboardInput(unsigned long ulKey, bool bIsDown) -{ - if (bIsDown) - { - m_pDefaultGUIContext->injectKeyDown(CEGUI::Key::Scan(ulKey)); - } - else - { - m_pDefaultGUIContext->injectKeyUp(CEGUI::Key::Scan(ulKey)); - } -} - -bool CGUI_Impl::GetGUIInputEnabled() -{ - switch (m_eInputMode) - { - case INPUTMODE_ALLOW_BINDS: - return false; - break; - case INPUTMODE_NO_BINDS: - return true; - break; - case INPUTMODE_NO_BINDS_ON_EDIT: - { - CEGUI::Window* pActiveWindow = m_pDefaultGUIContext->getActiveWindow(); - - if (!pActiveWindow || pActiveWindow == m_pTop || !pActiveWindow->isVisible()) - { - return false; - } - if (pActiveWindow->getType() == GetElementPrefix() + "/Editbox") - { - CEGUI::Editbox* pEditBox = reinterpret_cast(pActiveWindow); - return (!pEditBox->isReadOnly() && pEditBox->hasInputFocus()); - } - else if (pActiveWindow->getType() == GetElementPrefix() + "/MultiLineEditbox") - { - CEGUI::MultiLineEditbox* pMultiLineEditBox = reinterpret_cast(pActiveWindow); - return (!pMultiLineEditBox->isReadOnly() && pMultiLineEditBox->hasInputFocus()); - } - else if (pActiveWindow->getType() == GetElementPrefix() + "/" + CGUIWEBBROWSER_NAME) - { - auto pElement = reinterpret_cast(pActiveWindow->getUserData()); - if (pElement->GetType() == CGUI_WEBBROWSER) - { - auto pWebBrowser = reinterpret_cast(pElement); - return pWebBrowser->HasInputFocus(); - } - } - return false; - } - break; - default: - return false; - } -} - -void CGUI_Impl::SetGUIInputMode(eInputMode a_eMode) -{ - m_eInputMode = a_eMode; -} - -eInputMode CGUI_Impl::GetGUIInputMode() -{ - return m_eInputMode; -} - -CEGUI::String CGUI_Impl::GetUTFString(const char* szInput) -{ - CEGUI::String strUTF = szInput; // Convert into a CEGUI String - return strUTF; -} - -CEGUI::String CGUI_Impl::GetUTFString(const std::string& strInput) -{ - CEGUI::String strUTF = strInput.c_str(); // Convert into a CEGUI String - return strUTF; -} - -void CGUI_Impl::ProcessCharacter(unsigned long ulCharacter) -{ - m_pSystem->getGUIContexts()[0]->injectChar(ulCharacter); -} - -CGUIMessageBox* CGUI_Impl::CreateMessageBox(const char* szTitle, const char* szMessage, unsigned int uiFlags) -{ - return new CGUIMessageBox_Impl(this, szTitle, szMessage, uiFlags); -} - -CGUIButton* CGUI_Impl::_CreateButton(CGUIElement_Impl* pParent, const char* szCaption) -{ - return new CGUIButton_Impl(this, pParent, szCaption); -} - -CGUICheckBox* CGUI_Impl::_CreateCheckBox(CGUIElement_Impl* pParent, const char* szCaption, bool bChecked) -{ - return new CGUICheckBox_Impl(this, pParent, szCaption, bChecked); -} - -CGUIRadioButton* CGUI_Impl::_CreateRadioButton(CGUIElement_Impl* pParent, const char* szCaption) -{ - return new CGUIRadioButton_Impl(this, pParent, szCaption); -} - -CGUIEdit* CGUI_Impl::_CreateEdit(CGUIElement_Impl* pParent, const char* szText) -{ - return new CGUIEdit_Impl(this, pParent, szText); -} - -CGUIFont* CGUI_Impl::CreateFnt(const char* szFontName, const char* szFontFile, unsigned int uSize, unsigned int uFlags, bool bAutoScale, bool isWinFont) -{ - return new CGUIFont_Impl(this, szFontName, szFontFile, uSize, uFlags, bAutoScale, isWinFont); -} - -CGUIFont* CGUI_Impl::CreateFntFromWinFont(const char* szFontName, const char* szFontWinReg, const char* szFontWinFile, unsigned int uSize, unsigned int uFlags, - bool bAutoScale) -{ - SString strFontWinRegName = GetSystemRegistryValue((uint)HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", szFontWinReg); - SString strWinFontsPath = PathJoin(GetSystemWindowsPath(), "fonts"); - - // Compile a list of places to look - std::vector lookList; - lookList.push_back(PathJoin("cgui", szFontWinFile)); - if (strFontWinRegName.Contains(":") || strFontWinRegName.BeginsWith("\\") || strFontWinRegName.BeginsWith("/")) - lookList.push_back(strFontWinRegName); - lookList.push_back(PathJoin(strWinFontsPath, strFontWinRegName)); - lookList.push_back(PathJoin(strWinFontsPath, szFontWinFile)); - - // Try each place - CGUIFont* pResult = NULL; - for (uint i = 0; i < lookList.size(); i++) - { - if (FileExists(lookList[i])) - { - try - { - pResult = (CGUIFont_Impl*)CreateFnt(szFontName, lookList[i], uSize, uFlags, bAutoScale, (i != 0)); - } - catch (CEGUI::Exception e) - { - } - } - - if (pResult) - break; - } - if (!pResult) - { - BrowseToSolution("create-fonts", EXIT_GAME_FIRST | ASK_GO_ONLINE, SString("Error loading font!\n\n(%s)", szFontWinFile)); - } - - return pResult; -} - -CGUIGridList* CGUI_Impl::_CreateGridList(CGUIElement_Impl* pParent, bool bFrame) -{ - return new CGUIGridList_Impl(this, pParent, bFrame); -} - -CGUILabel* CGUI_Impl::_CreateLabel(CGUIElement_Impl* pParent, const char* szCaption) -{ - return new CGUILabel_Impl(this, pParent, szCaption); -} - -CGUIProgressBar* CGUI_Impl::_CreateProgressBar(CGUIElement_Impl* pParent) -{ - return new CGUIProgressBar_Impl(this, pParent); -} - -CGUIMemo* CGUI_Impl::_CreateMemo(CGUIElement_Impl* pParent, const char* szText) -{ - return new CGUIMemo_Impl(this, pParent, szText); -} - -CGUIStaticImage* CGUI_Impl::_CreateStaticImage(CGUIElement_Impl* pParent) -{ - return new CGUIStaticImage_Impl(this, pParent); -} - -CGUITabPanel* CGUI_Impl::_CreateTabPanel(CGUIElement_Impl* pParent) -{ - return new CGUITabPanel_Impl(this, pParent); -} - -CGUIScrollPane* CGUI_Impl::_CreateScrollPane(CGUIElement_Impl* pParent) -{ - return new CGUIScrollPane_Impl(this, pParent); -} - -CGUIScrollBar* CGUI_Impl::_CreateScrollBar(bool bHorizontal, CGUIElement_Impl* pParent) -{ - return new CGUIScrollBar_Impl(this, bHorizontal, pParent); -} - -CGUIComboBox* CGUI_Impl::_CreateComboBox(CGUIElement_Impl* pParent, const char* szCaption) -{ - return new CGUIComboBox_Impl(this, pParent, szCaption); -} - -CGUIWebBrowser* CGUI_Impl::_CreateWebBrowser(CGUIElement_Impl* pParent) -{ - return new CGUIWebBrowser_Impl(this, pParent); -} - -CGUITexture* CGUI_Impl::CreateTexture() -{ - return new CGUITexture_Impl(this); -} - -CGUIWindow* CGUI_Impl::CreateWnd(CGUIElement* pParent, const char* szCaption) -{ - return new CGUIWindow_Impl(this, pParent, szCaption); -} - -void CGUI_Impl::SetCursorEnabled(bool bEnabled) -{ - m_pDefaultGUIContext->setCursorVisible(bEnabled); -} - -bool CGUI_Impl::IsCursorEnabled() -{ - return m_pDefaultGUIContext->isCursorVisible(); -} - -void CGUI_Impl::SetCursorAlpha(float fAlpha, bool bOnlyCurrentServer) -{ - // m_pMouseCursor->setAlpha(fAlpha) - - if (bOnlyCurrentServer) - SetCurrentServerCursorAlpha(fAlpha); -} - -void CGUI_Impl::SetCurrentServerCursorAlpha(float fAlpha) -{ - m_fCurrentServerCursorAlpha = fAlpha; -} - -float CGUI_Impl::GetCurrentServerCursorAlpha() -{ - return m_fCurrentServerCursorAlpha; -} - -eCursorType CGUI_Impl::GetCursorType() -{ - auto image = m_pDefaultGUIContext->getCursorImage(); - - if (image == nullptr) - return CURSORTYPE_NONE; - - auto imageName = image->getName(); - - if (!imageName.compare("MouseArrow")) - return CURSORTYPE_DEFAULT; - else if (!imageName.compare("NSSizingCursorImage")) - return CURSORTYPE_SIZING_NS; - else if (!imageName.compare("EWSizingCursorImage")) - return CURSORTYPE_SIZING_EW; - else if (!imageName.compare("NWSESizingCursorImage")) - return CURSORTYPE_SIZING_NWSE; - else if (!imageName.compare("NESWSizingCursorImage")) - return CURSORTYPE_SIZING_NESW; - else if (!imageName.compare("MouseEsWeCursor")) - return CURSORTYPE_SIZING_ESWE; - else if (!imageName.compare("MouseMoveCursor")) - return CURSORTYPE_MOVE; - else - return CURSORTYPE_DEFAULT; -} - -void CGUI_Impl::AddChild(CGUIElement_Impl* pChild) -{ - m_pTop->addChild(pChild->GetWindow()); -} - -CGUIWindow* CGUI_Impl::LoadLayout(CGUIElement* pParent, const SString& strFilename) -{ - try - { - return new CGUIWindow_Impl(this, pParent, "szCaption", strFilename); - } - catch (...) - { - return NULL; - } -} - -bool CGUI_Impl::LoadImageset(const SString& strFilename) -{ - try - { - m_pImageSetManager->loadImageset(strFilename); - } - catch (CEGUI::Exception e) - { - return false; - } - - return true; -} - -CEGUI::FontManager* CGUI_Impl::GetFontManager() -{ - return m_pFontManager; -} - -CEGUI::ImageManager* CGUI_Impl::GetImageManager() -{ - return m_pImageSetManager; -} - -CEGUI::System* CGUI_Impl::GetGUISystem() -{ - return m_pSystem; -} - -CEGUI::Direct3D9Renderer& CGUI_Impl::GetRenderer() -{ - return *m_pRenderer; -} - -CEGUI::SchemeManager* CGUI_Impl::GetSchemeManager() -{ - return m_pSchemeManager; -} - -CEGUI::WindowManager* CGUI_Impl::GetWindowManager() -{ - return m_pWindowManager; -} - -void CGUI_Impl::GetUniqueName(char* pBuf) -{ - snprintf(pBuf, CGUI_CHAR_SIZE, "%x", m_ulPreviousUnique); - m_ulPreviousUnique++; -} - -bool CGUI_Impl::Event_CharacterKey(const CEGUI::EventArgs& Args) -{ - if (m_CharacterKeyHandlers[m_Channel]) - { - const CEGUI::KeyEventArgs& e = reinterpret_cast(Args); - CGUIKeyEventArgs NewArgs; - - // copy the variables - NewArgs.scancode = (CGUIKeys::Scan)e.d_key; - NewArgs.modifiers = e.d_modifiers.getMask(); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); - NewArgs.pWindow = pElement; - - m_CharacterKeyHandlers[m_Channel](NewArgs); - } - return true; -} - -CGUIFont* CGUI_Impl::GetDefaultFont() -{ - return m_pDefaultFont; -} - -CGUIFont* CGUI_Impl::GetSmallFont() -{ - return m_pSmallFont; -} - -CGUIFont* CGUI_Impl::GetBoldFont() -{ - return m_pBoldFont; -} - -CGUIFont* CGUI_Impl::GetClearFont() -{ - return m_pClearFont; -} - -CGUIFont* CGUI_Impl::GetSAHeaderFont() -{ - return m_pSAHeaderFont; -} - -CGUIFont* CGUI_Impl::GetSAGothicFont() -{ - return m_pSAGothicFont; -} - -CGUIFont* CGUI_Impl::GetSansFont() -{ - return m_pSansFont; -} - -float CGUI_Impl::GetTextExtent(const char* szText, const char* szFont) -{ - return m_pFontManager->get(szFont).getTextExtent(CGUI_Impl::GetUTFString(szText)); -} - -float CGUI_Impl::GetMaxTextExtent(SString strFont, SString arg, ...) -{ - float fMaxTextExtent = NULL; - va_list arguments; - for (va_start(arguments, arg); arg != ""; arg = va_arg(arguments, SString)) - { - float fExtent = m_pFontManager->get(strFont).getTextExtent(CGUI_Impl::GetUTFString(arg)); - if (fExtent > fMaxTextExtent) - fMaxTextExtent = fExtent; - } - va_end(arguments); - return fMaxTextExtent; -} - -bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args) -{ - // Cast it to a set of keyboard arguments - const CEGUI::KeyEventArgs& KeyboardArgs = reinterpret_cast(Args); - - // Call the callback if present - if (m_KeyDownHandlers[m_Channel]) - { - const CEGUI::KeyEventArgs& e = reinterpret_cast(Args); - CGUIKeyEventArgs NewArgs; - - // copy the variables - NewArgs.scancode = (CGUIKeys::Scan)e.d_key; - NewArgs.modifiers = e.d_modifiers.getMask(); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); - NewArgs.pWindow = pElement; - - m_KeyDownHandlers[m_Channel](NewArgs); - } - - switch (KeyboardArgs.d_key) - { - // Cut/Copy keys - case CEGUI::Key::Scan::X: - case CEGUI::Key::Scan::C: - { - if (KeyboardArgs.d_modifiers.hasAll(CEGUI::ModifierKeys::Ctrl())) - { - // Data to copy - CEGUI::String strTemp; - - // Edit boxes - CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); - if (Wnd->getType() == GetElementPrefix() + "/Editbox") - { - // Turn our event window into an editbox - CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); - - // Don't allow cutting/copying if the editbox is masked - if (!WndEdit->isTextMaskingEnabled()) - { - // Get the text from the editbox - size_t sizeSelectionStart = WndEdit->getSelectionStart(); - size_t sizeSelectionLength = WndEdit->getSelectionLength(); - strTemp = WndEdit->getText().substr(sizeSelectionStart, sizeSelectionLength); - - // If the user cut, remove the text too - if (KeyboardArgs.d_key == CEGUI::Key::Scan::X) - { - // Read only? - if (!WndEdit->isReadOnly()) - { - // Remove the text from the source - CEGUI::String strTemp2 = WndEdit->getText(); - strTemp2.replace(sizeSelectionStart, sizeSelectionLength, "", 0); - WndEdit->setText(strTemp2); - } - } - } - } - - // Multiline editboxes - if (Wnd->getType() == GetElementPrefix() + "/MultiLineEditbox") - { - // Turn our event window into an editbox - CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); - - // Get the text from the editbox - size_t sizeSelectionStart = WndEdit->getSelectionStart(); - size_t sizeSelectionLength = WndEdit->getSelectionLength(); - strTemp = WndEdit->getText().substr(sizeSelectionStart, sizeSelectionLength); - - // If the user cut, remove the text too - if (KeyboardArgs.d_key == CEGUI::Key::Scan::X) - { - // Read only? - if (!WndEdit->isReadOnly()) - { - // Remove the text from the source - CEGUI::String strTemp2 = WndEdit->getText(); - strTemp2.replace(sizeSelectionStart, sizeSelectionLength, "", 0); - WndEdit->setText(strTemp2); - } - } - } - - // If we got something to copy - if (strTemp.length() > 0) - { - // Convert it to Unicode - std::wstring strUTF = MbUTF8ToUTF16((const char*)strTemp.c_str()); - - // Open and empty the clipboard - OpenClipboard(NULL); - EmptyClipboard(); - - // Allocate the clipboard buffer and copy the data - HGLOBAL hBuf = GlobalAlloc(GMEM_DDESHARE, strUTF.length() * sizeof(wchar_t) + sizeof(wchar_t)); - wchar_t* buf = reinterpret_cast(GlobalLock(hBuf)); - wcscpy(buf, strUTF.c_str()); - GlobalUnlock(hBuf); - - // Copy the data into the clipboard - SetClipboardData(CF_UNICODETEXT, hBuf); - - // Close the clipboard - CloseClipboard(); - } - } - - break; - } - - // Paste keys - case CEGUI::Key::Scan::V: - { - if (KeyboardArgs.d_modifiers.hasAll(CEGUI::ModifierKeys::Ctrl())) - { - CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); - if (Wnd->getType() == GetElementPrefix() + "/Editbox" || Wnd->getType() == GetElementPrefix() + "/MultiLineEditbox") - { - // Open the clipboard - OpenClipboard(NULL); - - // Get the clipboard's data and put it into a char array - const wchar_t* ClipboardBuffer = reinterpret_cast(GetClipboardData(CF_UNICODETEXT)); - - // Check to make sure we have valid data. - if (ClipboardBuffer) - { - size_t iSelectionStart, iSelectionLength, iMaxLength, iCaratIndex; - CEGUI::String strEditText; - bool bReplaceNewLines = true; - bool bIsBoxFull = false; - - if (Wnd->getType() == GetElementPrefix() + "/Editbox") - { - // Turn our event window into an editbox - CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); - // Don't paste if we're read only - if (WndEdit->isReadOnly()) - { - CloseClipboard(); - return true; - } - strEditText = WndEdit->getText(); - iSelectionStart = WndEdit->getSelectionStart(); - iSelectionLength = WndEdit->getSelectionLength(); - iMaxLength = WndEdit->getMaxTextLength(); - iCaratIndex = WndEdit->getCaretIndex(); - } - else - { - CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); - // Don't paste if we're read only - if (WndEdit->isReadOnly()) - { - CloseClipboard(); - return true; - } - - strEditText = WndEdit->getText(); - iSelectionStart = WndEdit->getSelectionStart(); - iSelectionLength = WndEdit->getSelectionLength(); - iMaxLength = WndEdit->getMaxTextLength(); - iCaratIndex = WndEdit->getCaretIndex(); - bReplaceNewLines = false; - - // Plus one character, because there is always an extra '\n' in - // MultiLineEditbox's text data and it causes MaxLength limit to - // be exceeded during pasting the text - iMaxLength += 1; - } - - std::wstring strClipboardText = ClipboardBuffer; - size_t iNewlineIndex; - - // Remove the newlines inserting spaces instead - if (bReplaceNewLines) - { - do - { - iNewlineIndex = strClipboardText.find('\n'); - if (iNewlineIndex != SString::npos) - { - if (iNewlineIndex > 0 && strClipboardText[iNewlineIndex - 1] == '\r') - { - // \r\n - strClipboardText[iNewlineIndex - 1] = ' '; - strClipboardText.replace(iNewlineIndex, strClipboardText.length() - iNewlineIndex, strClipboardText.c_str(), - iNewlineIndex + 1, strClipboardText.length() - iNewlineIndex - 1); - } - else - { - strClipboardText[iNewlineIndex] = ' '; - } - } - } while (iNewlineIndex != SString::npos); - } - - // Put the editbox's data into a string and insert the data if it has not reached it's maximum text length - std::wstring tmp = MbUTF8ToUTF16((const char*)strEditText.c_str()); - if ((strClipboardText.length() + tmp.length() - iSelectionLength) <= iMaxLength) - { - // Are there characters selected? - size_t sizeCaratIndex = 0; - if (iSelectionLength > 0) - { - // Replace what's selected with the pasted buffer and set the new carat index - tmp.replace(iSelectionStart, iSelectionLength, strClipboardText.c_str(), strClipboardText.length()); - sizeCaratIndex = iSelectionStart + strClipboardText.length(); - } - else - { - // If not, insert the clipboard buffer where we were and set the new carat index - tmp.insert(iSelectionStart, strClipboardText.c_str(), strClipboardText.length()); - sizeCaratIndex = iCaratIndex + strClipboardText.length(); - } - - // Set the new text and move the carat at the end of what we pasted - CEGUI::String strText(UTF16ToMbUTF8(tmp).c_str()); - strEditText = strText; - iCaratIndex = sizeCaratIndex; - } - else - { - bIsBoxFull = true; - } - if (bIsBoxFull) - { - // Fire an event if the editbox is full - if (Wnd->getType() == GetElementPrefix() + "/Editbox") - { - CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); - CEGUI::WindowEventArgs args(WndEdit); - WndEdit->fireEvent(CEGUI::Editbox::EventEditboxFull, args); - } - else - { - CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); - CEGUI::WindowEventArgs args(WndEdit); - WndEdit->fireEvent(CEGUI::Editbox::EventEditboxFull, args); - } - } - else - { - if (Wnd->getType() == GetElementPrefix() + "/Editbox") - { - CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); - WndEdit->setText(strEditText); - WndEdit->setCaretIndex(iCaratIndex); - } - else - { - CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); - WndEdit->setText(strEditText); - WndEdit->setCaretIndex(iCaratIndex); - } - } - } - - // Close the clipboard - CloseClipboard(); - } - } - - break; - } - - // Select all key - case CEGUI::Key::Scan::A: - { - if (KeyboardArgs.d_modifiers.hasAll(CEGUI::ModifierKeys::Ctrl())) - { - // Edit boxes - CEGUI::Window* Wnd = reinterpret_cast(KeyboardArgs.window); - if (Wnd->getType() == GetElementPrefix() + "/Editbox") - { - // Turn our event window into an editbox - CEGUI::Editbox* WndEdit = reinterpret_cast(Wnd); - WndEdit->setSelection(0, WndEdit->getText().size()); - } - else if (Wnd->getType() == GetElementPrefix() + "/MultiLineEditbox") - { - // Turn our event window into a multiline editbox - CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast(Wnd); - WndEdit->setSelection(0, WndEdit->getText().size()); - } - } - - break; - } - } - - return true; -} - -void CGUI_Impl::SetDefaultGuiWorkingDirectory(const SString& strDir) -{ - // assert(m_GuiWorkingDirectoryStack.empty()); - // m_GuiWorkingDirectoryStack.push_back(PathConform(strDir + "\\")); - // ApplyGuiWorkingDirectory(); -} - -void CGUI_Impl::PushGuiWorkingDirectory(const SString& strDir) -{ - // m_GuiWorkingDirectoryStack.push_back(PathConform(strDir + "\\")); - // ApplyGuiWorkingDirectory(); -} - -void CGUI_Impl::PopGuiWorkingDirectory(const SString& strDirCheck) -{ - // if (m_GuiWorkingDirectoryStack.size() < 2) - //{ - // OutputDebugLine(SString("CGUI_Impl::PopWorkingDirectory - Stack empty. Expected '%s'", *strDirCheck)); - // } - // else - //{ - // if (!strDirCheck.empty()) - // { - // const SString& strWas = m_GuiWorkingDirectoryStack.back(); - // if (strDirCheck != strWas) - // { - // OutputDebugLine(SString("CGUI_Impl::PopWorkingDirectory - Mismatch. Got '%s', expected '%s'", *strWas, *strDirCheck)); - // } - // } - // m_GuiWorkingDirectoryStack.pop_back(); - // } - // ApplyGuiWorkingDirectory(); -} - -void CGUI_Impl::ApplyGuiWorkingDirectory() -{ - // CEGUI::System::getSingleton().SetGuiWorkingDirectory(m_GuiWorkingDirectoryStack.back()); -} - -const SString& CGUI_Impl::GetGuiWorkingDirectory() const -{ - dassert(!m_GuiWorkingDirectoryStack.empty()); - return m_GuiWorkingDirectoryStack.back(); -} - -bool CGUI_Impl::Event_MouseClick(const CEGUI::EventArgs& Args) -{ - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - - // Call global and object handlers - if (pElement) - pElement->Event_OnClick(Args); - - if (m_MouseClickHandlers[m_Channel]) - { - CGUIMouseEventArgs NewArgs; - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - NewArgs.pWindow = pElement; - - m_MouseClickHandlers[m_Channel](NewArgs); - } - return true; -} - -bool CGUI_Impl::Event_MouseDoubleClick(const CEGUI::EventArgs& Args) -{ - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - - // Call global and object handlers - if (pElement) - pElement->Event_OnDoubleClick(); - - if (m_MouseDoubleClickHandlers[m_Channel]) - { - CGUIMouseEventArgs NewArgs; - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - NewArgs.pWindow = pElement; - - m_MouseDoubleClickHandlers[m_Channel](NewArgs); - } - return true; -} - -bool CGUI_Impl::Event_MouseButtonDown(const CEGUI::EventArgs& Args) -{ - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - - // Call global and object handlers - if (pElement) - pElement->Event_OnMouseButtonDown(); - else - { - // If there's no element, we're probably dealing with the root element - CEGUI::Window* pActiveWindow = m_pDefaultGUIContext->getActiveWindow(); - if (m_pTop == wnd && pActiveWindow) - { - // Deactivate active window to trigger onClientGUIBlur - pActiveWindow->deactivate(); - } - } - - if (m_MouseButtonDownHandlers[m_Channel]) - { - CGUIMouseEventArgs NewArgs; - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - NewArgs.pWindow = pElement; - - m_MouseButtonDownHandlers[m_Channel](NewArgs); - } - - return true; -} - -bool CGUI_Impl::Event_MouseButtonUp(const CEGUI::EventArgs& Args) -{ - if (m_MouseButtonUpHandlers[m_Channel]) - { - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - NewArgs.pWindow = pElement; - - m_MouseButtonUpHandlers[m_Channel](NewArgs); - } - return true; -} - -bool CGUI_Impl::Event_MouseWheel(const CEGUI::EventArgs& Args) -{ - if (m_MouseWheelHandlers[m_Channel]) - { - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - NewArgs.pWindow = pElement; - - m_MouseWheelHandlers[m_Channel](NewArgs); - } - return true; -} - -bool CGUI_Impl::Event_MouseMove(const CEGUI::EventArgs& Args) -{ - if (m_MouseMoveHandlers[m_Channel]) - { - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // copy the variables - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - NewArgs.pWindow = pElement; - - m_MouseMoveHandlers[m_Channel](NewArgs); - } - return true; -} - -bool CGUI_Impl::Event_MouseEnter(const CEGUI::EventArgs& Args) -{ - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast(wnd->getUserData()); - - // Call global and object handlers - if (pElement) - pElement->Event_OnMouseEnter(); - - if (m_MouseEnterHandlers[m_Channel]) - { - CGUIMouseEventArgs NewArgs; - - // copy the variables - NewArgs.pWindow = pElement; - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - - CEGUI::Window* switchedWindow = m_pDefaultGUIContext->getWindowContainingCursor(); - - if (switchedWindow) - { - CEGUI::Window* Master = GetMasterWindow(switchedWindow); - // If the source and target windows are the same, don't bother triggering this - if (Master == wnd) - return true; - NewArgs.pSwitchedWindow = reinterpret_cast(Master->getUserData()); - } - else - NewArgs.pSwitchedWindow = NULL; - - m_MouseEnterHandlers[m_Channel](NewArgs); - } - - return true; -} - -bool CGUI_Impl::Event_MouseLeave(const CEGUI::EventArgs& Args) -{ - const CEGUI::MouseButtonEventArgs& e = reinterpret_cast(Args); - CGUIMouseEventArgs NewArgs; - - // get the approriate cegui window - CEGUI::Window* wnd = e.window; - - // if its a title- or scrollbar, get the appropriate parent - wnd = GetMasterWindow(wnd); - - // get the CGUIElement - // ChrML: Need to nullcheck wnd again or it crashes if the window is destroyed - // while it is dragged. - CGUIElement* pElement = NULL; - if (wnd) - { - pElement = reinterpret_cast(wnd->getUserData()); - if (pElement) - pElement->Event_OnMouseLeave(); - } - - if (m_MouseLeaveHandlers[m_Channel]) - { - CGUIMouseEventArgs NewArgs; - - // copy the variables - NewArgs.pWindow = pElement; - NewArgs.button = static_cast(e.d_button); - NewArgs.position = CGUIPosition(e.d_globalPos.x, e.d_globalPos.y); - NewArgs.modifiers = e.d_modifiers.getMask(); - - CEGUI::Window* switchedWindow = m_pDefaultGUIContext->getWindowContainingCursor(); - - if (switchedWindow) - { - CEGUI::Window* Master = GetMasterWindow(switchedWindow); - // If the source and target windows are the same, don't bother triggering this - if (Master == wnd) - return true; - NewArgs.pSwitchedWindow = reinterpret_cast(Master->getUserData()); - } - else - NewArgs.pSwitchedWindow = NULL; - - m_MouseLeaveHandlers[m_Channel](NewArgs); - } - - return true; -} - -bool CGUI_Impl::Event_Moved(const CEGUI::EventArgs& Args) -{ - if (m_MovedHandlers[m_Channel]) - { - const CEGUI::WindowEventArgs& e = reinterpret_cast(Args); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); - - m_MovedHandlers[m_Channel](pElement); - } - return true; -} - -bool CGUI_Impl::Event_Sized(const CEGUI::EventArgs& Args) -{ - if (m_SizedHandlers[m_Channel]) - { - const CEGUI::WindowEventArgs& e = reinterpret_cast(Args); - - // get the CGUIElement - CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); - - m_SizedHandlers[m_Channel](pElement); - } - return true; -} - -bool CGUI_Impl::Event_RedrawRequested(const CEGUI::EventArgs& Args) -{ - const CEGUI::WindowEventArgs& e = reinterpret_cast(Args); - - CGUIElement* pElement = reinterpret_cast((e.window)->getUserData()); - if (pElement) - AddToRedrawQueue(pElement); - else - e.window->invalidate(true); - - return true; -} - -bool CGUI_Impl::Event_FocusGained(const CEGUI::EventArgs& Args) -{ - if (m_FocusGainedHandlers[m_Channel]) - { - const CEGUI::ActivationEventArgs& e = reinterpret_cast(Args); - - CGUIFocusEventArgs NewArgs; - - // get the newly actived CGUIElement - NewArgs.pActivatedWindow = reinterpret_cast((e.window)->getUserData()); - - // get the newly deactivated CGUIElement - NewArgs.pDeactivatedWindow = NULL; - if (e.otherWindow) - { - NewArgs.pDeactivatedWindow = reinterpret_cast((e.otherWindow)->getUserData()); - } - - m_FocusGainedHandlers[m_Channel](NewArgs); - } - return true; -} - -bool CGUI_Impl::Event_FocusLost(const CEGUI::EventArgs& Args) -{ - if (m_FocusLostHandlers[m_Channel]) - { - const CEGUI::ActivationEventArgs& e = reinterpret_cast(Args); - - CGUIFocusEventArgs NewArgs; - - // get the newly deactived CGUIElement - NewArgs.pDeactivatedWindow = reinterpret_cast((e.window)->getUserData()); - - // get the newly activated CGUIElement - NewArgs.pActivatedWindow = NULL; - if (e.otherWindow) - { - NewArgs.pActivatedWindow = reinterpret_cast((e.otherWindow)->getUserData()); - } - - m_FocusLostHandlers[m_Channel](NewArgs); - } - return true; -} - -void CGUI_Impl::AddToRedrawQueue(CGUIElement* pWindow) -{ - // Manage the redraw queue, if we redraw the parent of the window passed, - // we should not add it to the redraw queue, and if the children are queued, - // remove them. - list::const_iterator iter = m_RedrawQueue.begin(); - for (; iter != m_RedrawQueue.end(); iter++) - { - if (pWindow->GetParent() == *iter) - { - return; - } - else if ((*iter)->GetParent() == pWindow) - { - m_RedrawQueue.remove(*iter); - if (m_RedrawQueue.empty()) - return; - iter = m_RedrawQueue.begin(); - } - else if (*iter == pWindow) - { - return; - } - } - m_RedrawQueue.push_back(pWindow); -} - -void CGUI_Impl::RemoveFromRedrawQueue(CGUIElement* pWindow) -{ - m_RedrawQueue.remove(pWindow); -} - -CGUIButton* CGUI_Impl::CreateButton(CGUIElement* pParent, const char* szCaption) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateButton(wnd, szCaption); -} - -CGUIButton* CGUI_Impl::CreateButton(CGUITab* pParent, const char* szCaption) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateButton(wnd, szCaption); -} - -CGUICheckBox* CGUI_Impl::CreateCheckBox(CGUIElement* pParent, const char* szCaption, bool bChecked) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateCheckBox(wnd, szCaption, bChecked); -} - -CGUICheckBox* CGUI_Impl::CreateCheckBox(CGUITab* pParent, const char* szCaption, bool bChecked) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateCheckBox(wnd, szCaption, bChecked); -} - -CGUIRadioButton* CGUI_Impl::CreateRadioButton(CGUIElement* pParent, const char* szCaption) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateRadioButton(wnd, szCaption); -} - -CGUIRadioButton* CGUI_Impl::CreateRadioButton(CGUITab* pParent, const char* szCaption) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateRadioButton(wnd, szCaption); -} - -CGUIEdit* CGUI_Impl::CreateEdit(CGUIElement* pParent, const char* szText) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateEdit(wnd, szText); -} - -CGUIEdit* CGUI_Impl::CreateEdit(CGUITab* pParent, const char* szText) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateEdit(wnd, szText); -} - -CGUIGridList* CGUI_Impl::CreateGridList(CGUIElement* pParent, bool bFrame) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateGridList(wnd, bFrame); -} - -CGUIGridList* CGUI_Impl::CreateGridList(CGUITab* pParent, bool bFrame) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateGridList(wnd, bFrame); -} - -CGUILabel* CGUI_Impl::CreateLabel(CGUIElement* pParent, const char* szCaption) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateLabel(wnd, szCaption); -} - -CGUILabel* CGUI_Impl::CreateLabel(CGUITab* pParent, const char* szCaption) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateLabel(wnd, szCaption); -} - -CGUILabel* CGUI_Impl::CreateLabel(const char* szCaption) -{ - return _CreateLabel(NULL, szCaption); -} - -CGUIProgressBar* CGUI_Impl::CreateProgressBar(CGUIElement* pParent) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateProgressBar(wnd); -} - -CGUIProgressBar* CGUI_Impl::CreateProgressBar(CGUITab* pParent) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateProgressBar(wnd); -} - -CGUIMemo* CGUI_Impl::CreateMemo(CGUIElement* pParent, const char* szText) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateMemo(wnd, szText); -} - -CGUIMemo* CGUI_Impl::CreateMemo(CGUITab* pParent, const char* szText) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateMemo(wnd, szText); -} - -CGUIStaticImage* CGUI_Impl::CreateStaticImage(CGUIElement* pParent) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateStaticImage(wnd); -} - -CGUIStaticImage* CGUI_Impl::CreateStaticImage(CGUITab* pParent) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateStaticImage(wnd); -} - -CGUIStaticImage* CGUI_Impl::CreateStaticImage(CGUIGridList* pParent) -{ - CGUIGridList_Impl* wnd = reinterpret_cast(pParent); - return _CreateStaticImage(wnd); -} - -CGUIStaticImage* CGUI_Impl::CreateStaticImage() -{ - return _CreateStaticImage(NULL); -} - -CGUITabPanel* CGUI_Impl::CreateTabPanel(CGUIElement* pParent) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateTabPanel(wnd); -} - -CGUITabPanel* CGUI_Impl::CreateTabPanel(CGUITab* pParent) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateTabPanel(wnd); -} - -CGUITabPanel* CGUI_Impl::CreateTabPanel() -{ - return _CreateTabPanel(NULL); -} - -CGUIScrollPane* CGUI_Impl::CreateScrollPane() -{ - return _CreateScrollPane(NULL); -} - -CGUIScrollPane* CGUI_Impl::CreateScrollPane(CGUIElement* pParent) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateScrollPane(wnd); -} - -CGUIScrollPane* CGUI_Impl::CreateScrollPane(CGUITab* pParent) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateScrollPane(wnd); -} - -CGUIScrollBar* CGUI_Impl::CreateScrollBar(bool bHorizontal, CGUIElement* pParent) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateScrollBar(bHorizontal, wnd); -} - -CGUIScrollBar* CGUI_Impl::CreateScrollBar(bool bHorizontal, CGUITab* pParent) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateScrollBar(bHorizontal, wnd); -} - -CGUIComboBox* CGUI_Impl::CreateComboBox(CGUIElement* pParent, const char* szCaption) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateComboBox(wnd, szCaption); -} - -CGUIComboBox* CGUI_Impl::CreateComboBox(CGUIComboBox* pParent, const char* szCaption) -{ - CGUIComboBox_Impl* wnd = reinterpret_cast(pParent); - return _CreateComboBox(wnd, szCaption); -} - -CGUIWebBrowser* CGUI_Impl::CreateWebBrowser(CGUIElement* pParent) -{ - CGUIWindow_Impl* wnd = reinterpret_cast(pParent); - return _CreateWebBrowser(wnd); -} - -CGUIWebBrowser* CGUI_Impl::CreateWebBrowser(CGUITab* pParent) -{ - CGUITab_Impl* wnd = reinterpret_cast(pParent); - return _CreateWebBrowser(wnd); -} - -void CGUI_Impl::CleanDeadPool() -{ - if (m_pWindowManager) - m_pWindowManager->cleanDeadPool(); -} - -void CGUI_Impl::ClearInputHandlers(eInputChannel channel) -{ - CHECK_CHANNEL(channel); - m_CharacterKeyHandlers[channel] = GUI_CALLBACK_KEY(); - m_KeyDownHandlers[channel] = GUI_CALLBACK_KEY(); - m_MouseClickHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseDoubleClickHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseButtonDownHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseButtonUpHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseMoveHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseEnterHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseLeaveHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MouseWheelHandlers[channel] = GUI_CALLBACK_MOUSE(); - m_MovedHandlers[channel] = GUI_CALLBACK(); - m_SizedHandlers[channel] = GUI_CALLBACK(); - m_FocusGainedHandlers[channel] = GUI_CALLBACK_FOCUS(); - m_FocusLostHandlers[channel] = GUI_CALLBACK_FOCUS(); -} - -CEGUI::Window* CGUI_Impl::GetMasterWindow(CEGUI::Window* wnd) -{ - // A titlebar should always return the parent (i.e. the frame window) - if (wnd->getType() == GetElementPrefix() + "/" + CEGUI::Titlebar::EventNamespace) - { - if (wnd->getParent()) - return wnd->getParent(); - return wnd; - } - - // if there's no CEGUI userdata, we deduce that it's not an MTA gui element - if (!wnd->getUserData()) - { - CEGUI::Window* parent = wnd->getParent(); - // It was created by CEGUI, probably as a child widget. - // So keep propogating upwards until we find an MTA element - while (parent) - { - if (parent->getUserData()) - return parent; - parent = parent->getParent(); - } - } - return wnd; -} - -CEGUI::USize CGUI_Impl::CreateAbsoluteSize(float width, float height) -{ - return CEGUI::USize(CEGUI::UDim(0, width), CEGUI::UDim(0, height)); -} - -CEGUI::USize CGUI_Impl::CreateRelativeSize(float width, float height) -{ - return CEGUI::USize(CEGUI::UDim(width, 0), CEGUI::UDim(height, 0)); -} - -CEGUI::GeometryBuffer* CGUI_Impl::GetGeometryBuffer() -{ - return m_pGeometryBuffer; -} - -void CGUI_Impl::ClearSystemKeys() -{ -} diff --git a/Client/gui_new/CGUI_Impl.h b/Client/gui_new/CGUI_Impl.h deleted file mode 100644 index 1f2a2fa8e5..0000000000 --- a/Client/gui_new/CGUI_Impl.h +++ /dev/null @@ -1,359 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/CGUI_Impl.h - * PURPOSE: Graphical User Interface module class - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#pragma once - -#include -#include -#include - -#define CGUI_CHAR_SIZE 6 - -namespace GUINew -{ - class CGUI_Impl; - class CGUIElement_Impl; - class CGUIFont_Impl; -} // namespace GUINew - -struct IDirect3DDevice9; - -namespace CEGUI -{ - class FontManager; - class ImagesetManager; - class Renderer; - class SchemeManager; - class WindowManager; - class Image; - class Texture; - class EventArgs; - class GUISheet; - // typedef GUISheet DefaultWindow; -} // namespace CEGUI - -class GUINew::CGUI_Impl : public CGUI, public CGUITabList -{ -public: - CGUI_Impl(IDirect3DDevice9* pDevice); - void destroy(); - - void SetSkin(const char* szName); - void SetBidiEnabled(bool bEnabled); - - void Draw(); - void Invalidate(); - void Restore(); - - void ProcessMouseInput(CGUIMouseInput eMouseInput, unsigned long ulX = 0, unsigned long ulY = 0, CGUIMouseButton eMouseButton = NoButton); - void ProcessKeyboardInput(unsigned long ulKey, bool bIsDown); - void ProcessCharacter(unsigned long ulCharacter); - - // - bool GetGUIInputEnabled(); - void SetGUIInputMode(eInputMode a_eMode); - eInputMode GetGUIInputMode(); - static CEGUI::String GetUTFString(const char* szInput); - static CEGUI::String GetUTFString(const std::string& strInput); - // static CEGUI::String GetUTFString(const CEGUI::String& strInput); // Not defined - - SString GetDefaultSkinName(); - SString GetElementPrefix(); - SString GetImagesetPrefix(); - - // - CGUIMessageBox* CreateMessageBox(const char* szTitle, const char* szMessage, unsigned int uiFlags); - - CGUIButton* CreateButton(CGUIElement* pParent = NULL, const char* szCaption = ""); - CGUIButton* CreateButton(CGUITab* pParent = NULL, const char* szCaption = ""); - - CGUICheckBox* CreateCheckBox(CGUIElement* pParent = NULL, const char* szCaption = "", bool bChecked = false); - CGUICheckBox* CreateCheckBox(CGUITab* pParent = NULL, const char* szCaption = "", bool bChecked = false); - - CGUIRadioButton* CreateRadioButton(CGUIElement* pParent = NULL, const char* szCaption = ""); - CGUIRadioButton* CreateRadioButton(CGUITab* pParent = NULL, const char* szCaption = ""); - - CGUIEdit* CreateEdit(CGUIElement* pParent = NULL, const char* szText = ""); - CGUIEdit* CreateEdit(CGUITab* pParent = NULL, const char* szText = ""); - - CGUIGridList* CreateGridList(CGUIElement* pParent = NULL, bool bFrame = true); - CGUIGridList* CreateGridList(CGUITab* pParent = NULL, bool bFrame = true); - - CGUILabel* CreateLabel(CGUIElement* pParent, const char* szCaption = ""); - CGUILabel* CreateLabel(CGUITab* pParent, const char* szCaption = ""); - CGUILabel* CreateLabel(const char* szCaption = ""); - - CGUIProgressBar* CreateProgressBar(CGUIElement* pParent); - CGUIProgressBar* CreateProgressBar(CGUITab* pParent); - - CGUIMemo* CreateMemo(CGUIElement* pParent = NULL, const char* szText = ""); - CGUIMemo* CreateMemo(CGUITab* pParent = NULL, const char* szText = ""); - - CGUIStaticImage* CreateStaticImage(CGUIElement* pParent); - CGUIStaticImage* CreateStaticImage(CGUITab* pParent); - CGUIStaticImage* CreateStaticImage(CGUIGridList* pParent); - CGUIStaticImage* CreateStaticImage(); - - CGUITabPanel* CreateTabPanel(CGUIElement* pParent); - CGUITabPanel* CreateTabPanel(CGUITab* pParent); - CGUITabPanel* CreateTabPanel(); - - CGUIScrollPane* CreateScrollPane(CGUIElement* pParent); - CGUIScrollPane* CreateScrollPane(CGUITab* pParent); - CGUIScrollPane* CreateScrollPane(); - - CGUIScrollBar* CreateScrollBar(bool bHorizontal, CGUIElement* pParent = NULL); - CGUIScrollBar* CreateScrollBar(bool bHorizontal, CGUITab* pParent = NULL); - - CGUIComboBox* CreateComboBox(CGUIElement* pParent = NULL, const char* szCaption = ""); - CGUIComboBox* CreateComboBox(CGUIComboBox* pParent = NULL, const char* szCaption = ""); - - CGUIWebBrowser* CreateWebBrowser(CGUIElement* pParent = nullptr); - CGUIWebBrowser* CreateWebBrowser(CGUITab* pParent = nullptr); - - CGUIWindow* CreateWnd(CGUIElement* pParent = NULL, const char* szCaption = ""); - // - - CGUITexture* CreateTexture(); - - CGUIFont* CreateFnt(const char* szFontName, const char* szFontFile, unsigned int uSize = 8, unsigned int uFlags = 0, bool bAutoScale = false, - bool isWinFont = false); - - void SetCursorEnabled(bool bEnabled); - bool IsCursorEnabled(); - void SetCursorAlpha(float fAlpha, bool bOnlyCurrentServer = false); - void SetCurrentServerCursorAlpha(float fAlpha); - float GetCurrentServerCursorAlpha(); - eCursorType GetCursorType(); - - void AddChild(CGUIElement_Impl* pChild); - CEGUI::FontManager* GetFontManager(); - CEGUI::ImageManager* GetImageManager(); - CEGUI::Direct3D9Renderer& GetRenderer(); - CEGUI::System* GetGUISystem(); - CEGUI::SchemeManager* GetSchemeManager(); - CEGUI::WindowManager* GetWindowManager(); - void GetUniqueName(char* pBuf); - CEGUI::Window* GetMasterWindow(CEGUI::Window* Window); - - CEGUI::GeometryBuffer* GetGeometryBuffer(); - - CEGUI::USize CreateAbsoluteSize(float width, float height); - CEGUI::USize CreateRelativeSize(float width, float height); - - CVector2D GetResolution(); - void SetResolution(float fWidth, float fHeight); - - CGUIFont* GetDefaultFont(); - CGUIFont* GetSmallFont(); - CGUIFont* GetBoldFont(); - CGUIFont* GetClearFont(); - CGUIFont* GetSAHeaderFont(); - CGUIFont* GetSAGothicFont(); - CGUIFont* GetSansFont(); - bool IsFontPresent(const char* szFont) { return m_pFontManager->isDefined(szFont); } - - float GetTextExtent(const char* szText, const char* szFont = "default-normal"); - float GetMaxTextExtent(SString strFont, SString arg, ...); - - const SString& GetGuiWorkingDirectory() const; - void SetDefaultGuiWorkingDirectory(const SString& strDir); - void PushGuiWorkingDirectory(const SString& strDir); - void PopGuiWorkingDirectory(const SString& strDirCheck = ""); - - void SetCharacterKeyHandler(eInputChannel channel, const GUI_CALLBACK_KEY& Callback) - { - CHECK_CHANNEL(channel); - m_CharacterKeyHandlers[channel] = Callback; - } - void SetKeyDownHandler(eInputChannel channel, const GUI_CALLBACK_KEY& Callback) - { - CHECK_CHANNEL(channel); - m_KeyDownHandlers[channel] = Callback; - } - void SetMouseClickHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseClickHandlers[channel] = Callback; - } - void SetMouseDoubleClickHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseDoubleClickHandlers[channel] = Callback; - } - void SetMouseButtonDownHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseButtonDownHandlers[channel] = Callback; - } - void SetMouseButtonUpHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseButtonUpHandlers[channel] = Callback; - } - void SetMouseMoveHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseMoveHandlers[channel] = Callback; - } - void SetMouseEnterHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseEnterHandlers[channel] = Callback; - } - void SetMouseLeaveHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseLeaveHandlers[channel] = Callback; - } - void SetMouseWheelHandler(eInputChannel channel, const GUI_CALLBACK_MOUSE& Callback) - { - CHECK_CHANNEL(channel); - m_MouseWheelHandlers[channel] = Callback; - } - void SetMovedHandler(eInputChannel channel, const GUI_CALLBACK& Callback) - { - CHECK_CHANNEL(channel); - m_MovedHandlers[channel] = Callback; - } - void SetSizedHandler(eInputChannel channel, const GUI_CALLBACK& Callback) - { - CHECK_CHANNEL(channel); - m_SizedHandlers[channel] = Callback; - } - void SetFocusGainedHandler(eInputChannel channel, const GUI_CALLBACK_FOCUS& Callback) - { - CHECK_CHANNEL(channel); - m_FocusGainedHandlers[channel] = Callback; - } - void SetFocusLostHandler(eInputChannel channel, const GUI_CALLBACK_FOCUS& Callback) - { - CHECK_CHANNEL(channel); - m_FocusLostHandlers[channel] = Callback; - } - - void SelectInputHandlers(eInputChannel channel) - { - CHECK_CHANNEL(channel); - m_Channel = channel; - } - void ClearInputHandlers(eInputChannel channel); - void ClearSystemKeys(); - - bool IsTransferBoxVisible() { return m_bTransferBoxVisible; }; - void SetTransferBoxVisible(bool bVisible) { m_bTransferBoxVisible = bVisible; }; - - bool Event_CharacterKey(const CEGUI::EventArgs& e); - bool Event_KeyDown(const CEGUI::EventArgs& e); - bool Event_MouseClick(const CEGUI::EventArgs& e); - bool Event_MouseDoubleClick(const CEGUI::EventArgs& e); - bool Event_MouseButtonDown(const CEGUI::EventArgs& e); - bool Event_MouseButtonUp(const CEGUI::EventArgs& e); - bool Event_MouseWheel(const CEGUI::EventArgs& e); - bool Event_MouseMove(const CEGUI::EventArgs& e); - bool Event_MouseEnter(const CEGUI::EventArgs& e); - bool Event_MouseLeave(const CEGUI::EventArgs& e); - bool Event_Moved(const CEGUI::EventArgs& e); - bool Event_Sized(const CEGUI::EventArgs& e); - bool Event_RedrawRequested(const CEGUI::EventArgs& e); - bool Event_FocusGained(const CEGUI::EventArgs& e); - bool Event_FocusLost(const CEGUI::EventArgs& e); - - void AddToRedrawQueue(CGUIElement* pWindow); - void RemoveFromRedrawQueue(CGUIElement* pWindow); - - void CleanDeadPool(); - CGUIWindow* LoadLayout(CGUIElement* pParent, const SString& strFilename); - bool LoadImageset(const SString& strFilename); - -private: - CGUIButton* _CreateButton(CGUIElement_Impl* pParent = NULL, const char* szCaption = ""); - CGUICheckBox* _CreateCheckBox(CGUIElement_Impl* pParent = NULL, const char* szCaption = "", bool bChecked = false); - CGUIRadioButton* _CreateRadioButton(CGUIElement_Impl* pParent = NULL, const char* szCaption = ""); - CGUIEdit* _CreateEdit(CGUIElement_Impl* pParent = NULL, const char* szText = ""); - CGUIGridList* _CreateGridList(CGUIElement_Impl* pParent = NULL, bool bFrame = true); - CGUILabel* _CreateLabel(CGUIElement_Impl* pParent = NULL, const char* szCaption = ""); - CGUIProgressBar* _CreateProgressBar(CGUIElement_Impl* pParent = NULL); - CGUIMemo* _CreateMemo(CGUIElement_Impl* pParent = NULL, const char* szText = ""); - CGUIStaticImage* _CreateStaticImage(CGUIElement_Impl* pParent = NULL); - CGUITabPanel* _CreateTabPanel(CGUIElement_Impl* pParent = NULL); - CGUIScrollPane* _CreateScrollPane(CGUIElement_Impl* pParent = NULL); - CGUIScrollBar* _CreateScrollBar(bool bHorizontal, CGUIElement_Impl* pParent = NULL); - CGUIComboBox* _CreateComboBox(CGUIElement_Impl* pParent = NULL, const char* szCaption = ""); - CGUIWebBrowser* _CreateWebBrowser(CGUIElement_Impl* pParent = nullptr); - - void SubscribeToMouseEvents(); - CGUIFont* CreateFntFromWinFont(const char* szFontName, const char* szFontWinReg, const char* szFontWinFile, unsigned int uSize = 8, unsigned int uFlags = 0, - bool bAutoScale = false); - void ApplyGuiWorkingDirectory(); - - IDirect3DDevice9* m_pDevice; - - CEGUI::Direct3D9Renderer* m_pRenderer; - CEGUI::System* m_pSystem; - CEGUI::FontManager* m_pFontManager; - CEGUI::ImageManager* m_pImageSetManager; - CEGUI::SchemeManager* m_pSchemeManager; - CEGUI::WindowManager* m_pWindowManager; - CEGUI::WindowFactoryManager* m_pWindowFactoryManager; - - CEGUI::XMLParser* m_pXMLParser; - - CEGUI::ResourceProvider* m_pResourceProvider; - CEGUI::DefaultResourceProvider* m_pDefaultResourceProvider; - - CEGUI::GeometryBuffer* m_pGeometryBuffer; - CEGUI::GUIContext* m_pDefaultGUIContext; - - CEGUI::Window* m_pTop; - const CEGUI::Image* m_pCursor; - float m_fCurrentServerCursorAlpha; - - CGUIFont_Impl* m_pDefaultFont; - CGUIFont_Impl* m_pSmallFont; - CGUIFont_Impl* m_pBoldFont; - CGUIFont_Impl* m_pClearFont; - CGUIFont_Impl* m_pSAHeaderFont; - CGUIFont_Impl* m_pSAGothicFont; - CGUIFont_Impl* m_pSansFont; - CGUIFont_Impl* m_pUniFont; - - std::list m_RedrawQueue; - - unsigned long m_ulPreviousUnique; - - eInputMode m_eInputMode; - - GUI_CALLBACK_KEY m_CharacterKeyHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_KEY m_KeyDownHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseClickHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseDoubleClickHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseButtonDownHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseButtonUpHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseMoveHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseEnterHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseLeaveHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_MOUSE m_MouseWheelHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK m_MovedHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK m_SizedHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_FOCUS m_FocusGainedHandlers[INPUT_CHANNEL_COUNT]; - GUI_CALLBACK_FOCUS m_FocusLostHandlers[INPUT_CHANNEL_COUNT]; - - eInputChannel m_Channel; - - std::list m_GuiWorkingDirectoryStack; - - bool m_bTransferBoxVisible; - - bool m_HasSchemeLoaded; - CEGUI::Scheme* m_CurrentScheme; - CElapsedTime m_RenderOkTimer; -}; diff --git a/Client/gui_new/Main.cpp b/Client/gui_new/Main.cpp deleted file mode 100644 index 604f8f3552..0000000000 --- a/Client/gui_new/Main.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/***************************************************************************** - * - * PROJECT: Multi Theft Auto v1.0 - * LICENSE: See LICENSE in the top level directory - * FILE: gui/Main.cpp - * PURPOSE: Graphical User Interface entry - * - * Multi Theft Auto is available from http://www.multitheftauto.com/ - * - *****************************************************************************/ - -#include "StdInc.h" -#define ALLOC_STATS_MODULE_NAME "cgui_new" -#include "SharedUtil.hpp" - -using namespace GUINew; - -CGUI_Impl* g_pGUI = NULL; - -int WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, PVOID pvNothing) -{ - // Eventually destroy our GUI upon detach - if (dwReason == DLL_PROCESS_DETACH && g_pGUI) - { - delete g_pGUI; - } - - return TRUE; -} - -MTAEXPORT CGUI* InitNewGUIInterface(IDirect3DDevice9* pDevice) -{ - // Create our GUI interface if not already done - if (!g_pGUI) - { - g_pGUI = new CGUI_Impl(pDevice); - } - - // Return it - return g_pGUI; -} diff --git a/Client/gui_new/StdInc.cpp b/Client/gui_new/StdInc.cpp deleted file mode 100644 index 2594336e53..0000000000 --- a/Client/gui_new/StdInc.cpp +++ /dev/null @@ -1,2 +0,0 @@ -// StdInc.h -#include "StdInc.h" diff --git a/Client/gui_new/StdInc.h b/Client/gui_new/StdInc.h deleted file mode 100644 index 7ffcf2758e..0000000000 --- a/Client/gui_new/StdInc.h +++ /dev/null @@ -1,38 +0,0 @@ - -#include -#include -#define MTA_CLIENT -#define SHARED_UTIL_WITH_FAST_HASH_MAP -#include "SharedUtil.h" -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "CGUITabListItem.h" -#include "CGUITabList.h" -#include "CGUI_Impl.h" -#include "CGUIButton_Impl.h" -#include "CGUICheckBox_Impl.h" -#include "CGUIEdit_Impl.h" -#include "CGUIFont_Impl.h" -#include "CGUIGridList_Impl.h" -#include "CGUILabel_Impl.h" -#include "CGUIListItem_Impl.h" -#include "CGUIMemo_Impl.h" -#include "CGUIProgressBar_Impl.h" -#include "CGUIRadioButton_Impl.h" -#include "CGUIMessageBox_Impl.h" -#include "CGUIStaticImage_Impl.h" -#include "CGUIScrollBar_Impl.h" -#include "CGUIScrollPane_Impl.h" -#include "CGUITabPanel_Impl.h" -#include "CGUITexture_Impl.h" -#include "CGUIWebBrowser_Impl.h" -#include "CGUIWindow_Impl.h" -#include "CGUIComboBox_Impl.h" diff --git a/Client/gui_new/premake5.lua b/Client/gui_new/premake5.lua deleted file mode 100644 index 44f04f280c..0000000000 --- a/Client/gui_new/premake5.lua +++ /dev/null @@ -1,63 +0,0 @@ -project "GUI New" - language "C++" - kind "SharedLib" - targetname "cgui_new" - targetdir(buildpath("mta")) - - filter "system:windows" - includedirs { "../../vendor/sparsehash/src/windows" } - - filter {} - includedirs { - "../../Shared/sdk", - "../sdk", - "../../vendor/cegui-0.8.7/include", - "../../vendor/cegui-0.8.7/dependencies/glm-0.9.4.5", - "../../vendor/cegui-0.8.7/dependencies/pcre-8.12", - "../../vendor/sparsehash/src/", - "../../vendor/freetype/include", - } - - pchheader "StdInc.h" - pchsource "StdInc.cpp" - - defines { - "_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING" - } - - links { - "CEGUI-0.8.7", - "CEGUICoreWindowRendererSet", - "CEGUISILLYImageCodec", - "CEGUIDirect3D9Renderer", - "CEGUITinyXML2Parser", - "glm-0.9.4.5", - "pcre-8.12", - "d3dx9.lib", - "d3d9.lib", - "dxerr.lib" - } - - vpaths { - ["Headers/*"] = "**.h", - ["Sources/*"] = "**.cpp", - ["*"] = "premake5.lua" - } - - files { - "premake5.lua", - "*.h", - "*.cpp" - } - - filter "architecture:x64" - flags { "ExcludeFromBuild" } - - filter "system:not windows" - flags { "ExcludeFromBuild" } - - filter {"system:windows"} - buildoptions { "-Zm180" } - - filter {"configurations:Debug"} - links { "dbghelp" } diff --git a/Client/mods/deathmatch/logic/CLocalServer.cpp b/Client/mods/deathmatch/logic/CLocalServer.cpp index baedb60c11..6440620dee 100644 --- a/Client/mods/deathmatch/logic/CLocalServer.cpp +++ b/Client/mods/deathmatch/logic/CLocalServer.cpp @@ -142,7 +142,7 @@ CLocalServer::~CLocalServer() bool CLocalServer::OnAddButtonClick(CGUIElement* pElement) { - CGUIListItem* pItem = m_pResourcesAll->GetSelectedItem(); + CGUIGridListItem* pItem = m_pResourcesAll->GetSelectedItem(); if (pItem) { m_pResourcesCur->SetItemText(m_pResourcesCur->AddRow(), m_hResourcesCur, &pItem->GetText().c_str()[3]); @@ -153,7 +153,7 @@ bool CLocalServer::OnAddButtonClick(CGUIElement* pElement) bool CLocalServer::OnDelButtonClick(CGUIElement* pElement) { - CGUIListItem* pItem = m_pResourcesCur->GetSelectedItem(); + CGUIGridListItem* pItem = m_pResourcesCur->GetSelectedItem(); if (pItem) { m_pResourcesAll->SetItemText(m_pResourcesAll->AddRow(), m_hResourcesAll, &pItem->GetText().c_str()[3]); diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 1c8d34379d..6b9fe41e37 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -5520,7 +5520,7 @@ int CStaticFunctionDefinitions::GUIComboBoxAddItem(CClientEntity& Entity, const if (IS_CGUIELEMENT_COMBOBOX(&GUIElement)) { // Add a new item. - CGUIListItem* item = static_cast(GUIElement.GetCGUIElement())->AddItem(szText); + CGUIStandardItem* item = static_cast(GUIElement.GetCGUIElement())->AddItem(szText); // Return it's id + 1 so indexes start at 1. return static_cast(GUIElement.GetCGUIElement())->GetItemIndex(item); } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp index a3b7e35545..b824197248 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaGUIDefs.cpp @@ -2591,7 +2591,7 @@ int CLuaGUIDefs::GUIGridListGetSelectedItems(lua_State* luaVM) if (!argStream.HasErrors()) { CGUIGridList* pList = static_cast(guiGridlist->GetCGUIElement()); - CGUIListItem* pItem = NULL; + CGUIGridListItem* pItem = NULL; lua_newtable(luaVM); diff --git a/Client/sdk/gui/CGUI.h b/Client/sdk/gui/CGUI.h index 080219fff3..95481760cc 100644 --- a/Client/sdk/gui/CGUI.h +++ b/Client/sdk/gui/CGUI.h @@ -38,6 +38,7 @@ class CGUI; #include "CGUITabPanel.h" #include "CGUIComboBox.h" #include "CGUITypes.h" +#include "CGUIStandardItem.h" // Path defines for CGUI #define CGUI_ICON_MESSAGEBOX_INFO "cgui\\images\\info.png" diff --git a/Client/sdk/gui/CGUIComboBox.h b/Client/sdk/gui/CGUIComboBox.h index fd38e1d66f..69b12538a7 100644 --- a/Client/sdk/gui/CGUIComboBox.h +++ b/Client/sdk/gui/CGUIComboBox.h @@ -14,27 +14,29 @@ #include "CGUIElement.h" #include "CGUICallback.h" +class CGUIStandardItem; + class CGUIComboBox : public CGUIElement { public: virtual ~CGUIComboBox(){}; - virtual void SetReadOnly(bool bRead) = 0; - virtual CGUIListItem* AddItem(const char* szText) = 0; - virtual CGUIListItem* AddItem(CGUIStaticImage* pImage) = 0; - virtual bool RemoveItem(int index) = 0; - virtual CGUIListItem* GetItemByIndex(int index) = 0; - virtual CGUIListItem* GetSelectedItem() = 0; - virtual int GetSelectedItemIndex() = 0; - virtual size_t GetItemCount() = 0; - virtual const char* GetItemText(int index) = 0; - virtual bool SetItemText(int index, const char* szText) = 0; - virtual bool SetSelectedItemByIndex(int index) = 0; - virtual int GetItemIndex(CGUIListItem* pItem) = 0; - virtual void Clear() = 0; - virtual void SetSelectionHandler(GUI_CALLBACK Callback) = 0; - virtual void SetDropListRemoveHandler(GUI_CALLBACK Callback) = 0; - virtual void ShowDropList() = 0; - virtual void HideDropList() = 0; - virtual bool IsOpen() = 0; + virtual void SetReadOnly(bool bRead) = 0; + virtual CGUIStandardItem* AddItem(const char* szText) = 0; + virtual CGUIStandardItem* AddItem(CGUIStaticImage* pImage) = 0; + virtual bool RemoveItem(int index) = 0; + virtual CGUIStandardItem* GetItemByIndex(int index) = 0; + virtual CGUIStandardItem* GetSelectedItem() = 0; + virtual int GetSelectedItemIndex() = 0; + virtual size_t GetItemCount() = 0; + virtual const char* GetItemText(int index) = 0; + virtual bool SetItemText(int index, const char* szText) = 0; + virtual bool SetSelectedItemByIndex(int index) = 0; + virtual int GetItemIndex(CGUIStandardItem* pItem) = 0; + virtual void Clear() = 0; + virtual void SetSelectionHandler(GUI_CALLBACK Callback) = 0; + virtual void SetDropListRemoveHandler(GUI_CALLBACK Callback) = 0; + virtual void ShowDropList() = 0; + virtual void HideDropList() = 0; + virtual bool IsOpen() = 0; }; diff --git a/Client/sdk/gui/CGUIElement.h b/Client/sdk/gui/CGUIElement.h index 252c84de99..f7de9aa177 100644 --- a/Client/sdk/gui/CGUIElement.h +++ b/Client/sdk/gui/CGUIElement.h @@ -122,6 +122,12 @@ class CGUIElement virtual CGUIPropertyIter GetPropertiesBegin() = 0; virtual CGUIPropertyIter GetPropertiesEnd() = 0; + virtual void SetCursorPassThroughEnabled(bool enabled) = 0; + virtual bool IsCursorPassThroughEnabled() = 0; + + virtual void SetDistributeCapturedInputs(bool enabled) = 0; + virtual bool DistributesCapturedInputs() = 0; + virtual void SetMovedHandler(GUI_CALLBACK Callback) = 0; virtual void SetSizedHandler(GUI_CALLBACK Callback) = 0; virtual void SetClickHandler(GUI_CALLBACK Callback) = 0; diff --git a/Client/sdk/gui/CGUIGridList.h b/Client/sdk/gui/CGUIGridList.h index 418a12bbc7..e70c3d85f6 100644 --- a/Client/sdk/gui/CGUIGridList.h +++ b/Client/sdk/gui/CGUIGridList.h @@ -13,8 +13,9 @@ #include "CGUIElement.h" #include "CGUIStaticImage.h" -#include "CGUIListItem.h" +#include "CGUIGridListItem.h" #include "CGUICallback.h" +#include namespace SelectionModes { @@ -63,20 +64,20 @@ class CGUIGridList : public CGUIElement virtual void SetSelectionMode(SelectionMode mode) = 0; virtual SelectionMode GetSelectionMode() = 0; - virtual void ForceUpdate() = 0; - virtual int AddRow(bool bFast = false, std::vector >* m_items = NULL) = 0; - virtual void RemoveRow(int iRow) = 0; - virtual int InsertRowAfter(int iRow, std::vector >* m_items = NULL) = 0; - virtual void Clear() = 0; - virtual CGUIListItem* GetItem(int iRow, int hColumn) = 0; - virtual const char* GetItemText(int iRow, int hColumn) = 0; - virtual int SetItemText(int iRow, int hColumn, const char* szText, bool bNumber = false, bool bSection = false, bool bFast = false, - const char* szSortText = NULL) = 0; - virtual void SetItemData(int iRow, int hColumn, void* pData, CGUICallback deleteDataCallback = NULL) = 0; - virtual void SetItemData(int iRow, int hColumn, const char* pszData) = 0; - virtual void* GetItemData(int iRow, int hColumn) = 0; - virtual void SetItemColor(int iRow, int hColumn, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) = 0; - virtual bool GetItemColor(int iRow, int hColumn, unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) = 0; + virtual void ForceUpdate() = 0; + virtual int AddRow(bool bFast = false, std::vector >* m_items = NULL) = 0; + virtual void RemoveRow(int iRow) = 0; + virtual int InsertRowAfter(int iRow, std::vector >* m_items = NULL) = 0; + virtual void Clear() = 0; + virtual CGUIGridListItem* GetItem(int iRow, int hColumn) = 0; + virtual const char* GetItemText(int iRow, int hColumn) = 0; + virtual int SetItemText(int iRow, int hColumn, const char* szText, bool bNumber = false, bool bSection = false, bool bFast = false, + const char* szSortText = NULL) = 0; + virtual void SetItemData(int iRow, int hColumn, void* pData, CGUICallback deleteDataCallback = NULL) = 0; + virtual void SetItemData(int iRow, int hColumn, const char* pszData) = 0; + virtual void* GetItemData(int iRow, int hColumn) = 0; + virtual void SetItemColor(int iRow, int hColumn, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) = 0; + virtual bool GetItemColor(int iRow, int hColumn, unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) = 0; virtual void SetHorizontalScrollBar(bool bEnabled) = 0; virtual void SetVerticalScrollBar(bool bEnabled) = 0; @@ -89,17 +90,17 @@ class CGUIGridList : public CGUIElement virtual void SetHorizontalScrollPosition(float fPosition) = 0; virtual void SetVerticalScrollPosition(float fPosition) = 0; - virtual int GetColumnIndex(int hColumn) = 0; - virtual int GetItemColumnIndex(CGUIListItem* pItem) = 0; - virtual int GetItemRowIndex(CGUIListItem* pItem) = 0; - virtual void GetVisibleRowRange(int& iFirst, int& iLast) = 0; - virtual int GetSelectedCount() = 0; - virtual CGUIListItem* GetSelectedItem() = 0; - virtual CGUIListItem* GetNextSelectedItem(CGUIListItem* pItem) = 0; - virtual int GetSelectedItemRow() = 0; - virtual int GetSelectedItemColumn() = 0; - virtual int GetRowCount() = 0; - virtual int GetColumnCount() = 0; + virtual int GetColumnIndex(int hColumn) = 0; + virtual int GetItemColumnIndex(CGUIGridListItem* pItem) = 0; + virtual int GetItemRowIndex(CGUIGridListItem* pItem) = 0; + virtual void GetVisibleRowRange(int& iFirst, int& iLast) = 0; + virtual int GetSelectedCount() = 0; + virtual CGUIGridListItem* GetSelectedItem() = 0; + virtual CGUIGridListItem* GetNextSelectedItem(CGUIGridListItem* pItem) = 0; + virtual int GetSelectedItemRow() = 0; + virtual int GetSelectedItemColumn() = 0; + virtual int GetRowCount() = 0; + virtual int GetColumnCount() = 0; virtual void Sort(unsigned int uiColumn, SortDirection direction) = 0; virtual void GetSort(unsigned int& uiColumn, SortDirection& direction) = 0; diff --git a/Client/sdk/gui/CGUIListItem.h b/Client/sdk/gui/CGUIGridListItem.h similarity index 85% rename from Client/sdk/gui/CGUIListItem.h rename to Client/sdk/gui/CGUIGridListItem.h index cd62e5fd88..a2e2df1c74 100644 --- a/Client/sdk/gui/CGUIListItem.h +++ b/Client/sdk/gui/CGUIGridListItem.h @@ -2,7 +2,7 @@ * * PROJECT: Multi Theft Auto v1.0 * LICENSE: See LICENSE in the top level directory - * FILE: sdk/gui/CGUIListItem.h + * FILE: sdk/gui/CGUIGridListItem.h * PURPOSE: List widget item interface * * Multi Theft Auto is available from http://www.multitheftauto.com/ @@ -14,10 +14,15 @@ #include "CGUIStaticImage.h" #include -class CGUIListItem +namespace CEGUI +{ + class ListboxItem; +} + +class CGUIGridListItem { public: - virtual ~CGUIListItem(){}; + virtual ~CGUIGridListItem(){}; virtual std::string GetText() const = 0; virtual void SetText(const char* pszText, const char* pszSortText = NULL) = 0; @@ -30,9 +35,8 @@ class CGUIListItem virtual void SetFont(const char* szFontName) = 0; virtual void SetImage(CGUIStaticImage* Image) = 0; - virtual bool GetSelectedState() = 0; - virtual void SetSelectedState(bool bState) = 0; - virtual bool GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) = 0; virtual void SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) = 0; + + virtual CEGUI::ListboxItem* GetListItem() = 0; }; diff --git a/Client/sdk/gui/CGUIStandardItem.h b/Client/sdk/gui/CGUIStandardItem.h new file mode 100644 index 0000000000..a6fc989374 --- /dev/null +++ b/Client/sdk/gui/CGUIStandardItem.h @@ -0,0 +1,42 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: sdk/gui/CGUIStandardItem.h + * PURPOSE: List widget item interface + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +#include "CGUIStaticImage.h" +#include + +namespace CEGUI +{ + class StandardItem; +} + +class CGUIStandardItem +{ +public: + virtual ~CGUIStandardItem(){}; + + virtual std::string GetText() const = 0; + virtual void SetText(const char* pszText, const char* pszSortText = NULL) = 0; + + virtual void* GetData() const = 0; + virtual void SetData(void* pData, CGUICallback deleteDataCallback = NULL) = 0; + virtual void SetData(const char* pszData) = 0; + + virtual void SetDisabled(bool bDisabled) = 0; + virtual void SetFont(const char* szFontName) = 0; + virtual void SetImage(CGUIStaticImage* Image) = 0; + + virtual bool GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue, unsigned char& ucAlpha) = 0; + virtual void SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char ucAlpha) = 0; + + virtual CEGUI::StandardItem* GetListItem() = 0; +}; diff --git a/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/imagesets/GWEN.imageset b/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/imagesets/GWEN.imageset index 5b71ad7c16..ec8e1eb35f 100644 --- a/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/imagesets/GWEN.imageset +++ b/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/imagesets/GWEN.imageset @@ -70,12 +70,12 @@ - - - - - - + + + + + + @@ -167,14 +167,14 @@ - - - - - - - - + + + + + + + + diff --git a/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/looknfeel/GWEN.looknfeel b/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/looknfeel/GWEN.looknfeel index 2ccbfa258b..26589bfb45 100644 --- a/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/looknfeel/GWEN.looknfeel +++ b/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/looknfeel/GWEN.looknfeel @@ -2351,7 +2351,7 @@ - + @@ -2443,23 +2443,23 @@ - + - + - + - + - + @@ -2467,14 +2467,14 @@ - + - + - + @@ -2487,10 +2487,10 @@ - + - + @@ -2499,7 +2499,7 @@ - + @@ -2507,10 +2507,10 @@ - + - + @@ -2574,15 +2574,15 @@ - - - - - - - - - + + + + + + + + + @@ -2926,7 +2926,7 @@ - + @@ -3606,7 +3606,7 @@ - + @@ -3622,7 +3622,7 @@ - + @@ -3640,7 +3640,7 @@ - + @@ -3658,7 +3658,7 @@ - + @@ -3743,15 +3743,15 @@ - - - - - - - - - + + + + + + + + + @@ -4994,7 +4994,7 @@ - + diff --git a/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/schemes/GWEN.scheme b/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/schemes/GWEN.scheme index c24e4cf1a9..b8550923e0 100644 --- a/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/schemes/GWEN.scheme +++ b/Shared/data/MTA San Andreas/MTA/cgui-0.8.7/datafiles/schemes/GWEN.scheme @@ -21,9 +21,9 @@ - + - + diff --git a/premake5.lua b/premake5.lua index 402645965b..2fdb3efb98 100644 --- a/premake5.lua +++ b/premake5.lua @@ -146,7 +146,6 @@ workspace "MTASA" include "Client/game_sa" include "Client/sdk" include "Client/gui" - include "Client/gui_new" include "Client/launch" include "Client/loader" include "Client/loader-proxy" @@ -154,11 +153,6 @@ workspace "MTASA" include "Client/mods/deathmatch" group "Client/CEGUI" - include "vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer" - include "vendor/cegui-0.4.0-custom/WidgetSets/Falagard" - include "vendor/cegui-0.4.0-custom" - - group "Client/CEGUI-0.8.7" include "vendor/cegui-0.8.7" include "vendor/cegui-0.8.7/src/CommonDialogs" include "vendor/cegui-0.8.7/src/WindowRendererSets" diff --git a/vendor/cegui-0.4.0-custom/AUTHORS b/vendor/cegui-0.4.0-custom/AUTHORS deleted file mode 100644 index 692287df9d..0000000000 --- a/vendor/cegui-0.4.0-custom/AUTHORS +++ /dev/null @@ -1,98 +0,0 @@ -Crazy Eddie's GUI System Mk-2 -http://www.cegui.org.uk - -Copyright ©2004 - 2005 CEGUI Team & Contributing Authors - - -The following is a list of primary authors and contributors for Crazy Eddie's -GUI System Mk-2. - - -CEGUI Team ---------- -James O'Sullivan (_mental_) -Tomas Lindquist Olsen (lindquist) -Paul D Turner (crayzed / CrazyEddie) -Patrick Kooman (scriptkid) -Paul Schifferer (Exsortis) - - -Main Contributors ------------------ -The following have made large, important, or on-going contributions to the -system (these people may have made additional contributions than those -specifically mentioned)... - -Lars Rinde: -- Original TaharezLook graphics design. - -'Blakharaz': -- Initial XmlHandlerHelper class and general cleanup of original XML parsing -code. - -Jeff Leigh: -- Original CEGUI::ColourManipulator class (now re-factored into CEGUI::colour -class) and related fixes. - -Gerald Lindsly: -- Event system re-implementation. - -Jose A Milan: -- Refactoring of XML handling classes to remove public dependency on Xerces-C++. -- Initial updates to Ogre renderer to support Ogre 1.0. - -Magnus Osterlind: -- Direct3D 9 GUI renderer module. - -Steve Streeting: -- TabControl widget base classes & related 'TaharezLook' classes. - -Mark Strom: -- OpenGL GUI renderer module. - -Thomas Suter: -- Irrlicht GUI renderer module. - - -Other Contributors ------------------- -The following have contributed patches, bug reports, and other such valuable -things... - -Geoff Carlton -Clay Culver -Paul Downey -Jeff Doyle -Jan Eickmann -Erik Hjortsberg -Rafal Jastrzebski -Chris Kang -Peter Newman -Chris Osborn -Shane Parker -James Turner -Chris Weaver -Christopher Wedman -armaduck -genva -Te'ja - - -Special Thanks --------------- -Shawn Carroll - For his tutorial series. -Chris McGuirk - For his C#.Net port. -Shane Parker - For giving permission to use his "Vanilla GUI" imagery. - -Everyone on the GameDev.Net forums who looked at earlier versions of the system -and gave constructive criticism. - -Everyone on the Ogre forums who encouraged the development of this Mk-2 version -of the system. - - -Have I Missed You? ------------------- -If you feel that I have missed you from some section of this list, then please -contact me (crayzed@users.sourceforge.net) and let me know who you are and what -you did, and I'll correct the mistake as soon as possible. diff --git a/vendor/cegui-0.4.0-custom/COPYING b/vendor/cegui-0.4.0-custom/COPYING deleted file mode 100644 index cbee875ba6..0000000000 --- a/vendor/cegui-0.4.0-custom/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/vendor/cegui-0.4.0-custom/ChangeLog b/vendor/cegui-0.4.0-custom/ChangeLog deleted file mode 100644 index 3de4e0a294..0000000000 --- a/vendor/cegui-0.4.0-custom/ChangeLog +++ /dev/null @@ -1,272 +0,0 @@ -Crazy Eddie's GUI System Mk-2 -http://www.cegui.org.uk - -Copyright 2004 - 2005 CEGUI Team & Contributing Authors - - -The following is a high-level view of changes made to the system between releases. - -Release 0.4.1 -============= -Added: Samples support for Mac OS X Build. -Added: Window renaming functionality. -Added: Logging of error when trying to unload a non-existant scheme. -Added: "Lost device" handlers for OpenGLRenderer (grab/restoreTextures). - -Modified: Updates to Xcode project to account for differing build paths and some link issues. -Modified: Updated version numbers, CPU tuning setting, deployment build paths and library build style for MacOS X builds. -Modified: Changed default settings for doxygen documentation - is now more minimal and thefore more readable. -Modified: Simplified required setup to use Ogre CEGUI Renderer with the samples (now just requires access to Ogre modules and a plugins.cfg). - -Bug Fix: Endianness issues in OpenGL renderer on Mac. (patch #1309172) -Bug Fix: Typo in Falagard bundle plist (Mac) that prevented loading. (patch #1309172) -Bug Fix: Resolved some behavioural mis-match issues with TabControl; removeChildWindow can now be used as expected to remove content. -Bug Fix: Changing the default mouse cursor in the System object did not result in an immediate change when appropriate. -Bug Fix: Cleanup properly if layout loading fails when loading a sub-layout (imported layout). -Bug Fix: 'Vanilla' skin showed rendering artefacts when scaled. -Bug Fix: Lots of missing API docs. -Bug Fix: 'static const' <-> 'const static' issue in renderers (mainly affected parsing by binding generators). -Bug Fix: Win32 type issue in MSVC++ 8. -Bug Fix: Issue in sample framework with MSVC++ using Unicode character mode. -Bug Fix: FrameWindow does a re-layout of children when text changes to allow using a FontDim to set the titlebar dimensions. -Bug Fix: Issues when writing xml for Window / MCL properties (patch #1353395) -Bug Fix: Fixed various issues related to window type aliasing not working as expected in all cases. -Bug Fix: CEGUI::String stream output operator was not exported under MSVC++. -Bug Fix: Fixed a bug in String class -Bug Fix: 'click' based mouse events would be sent to the wrong window in various circumstances. -Bug Fix: The class name string compared in MultiLineEditbox::testClassName_impl has the wrong casing. Added additional check using correct casing. -Bug Fix: Menubar in skin schemes was using PopupMenu WidgetLook -Bug Fix: Closing a popup not attached to a MenuItem was still using parent as a MenuItem even after discoving this was not the case. -Bug Fix: WindowsLook imageset had incorrect sizes for Editbox frame edges. -Bug Fix: Font::getRequiredTexture size would get it wrong sometimes. -Bug Fix: Full initialiser lists added for Font constructors (solves some potential issues with uninitialised class data). - - -Release 0.4.0 -============= -Addition of "Falagard" XML skinning system. Details as follows: -- RenderCache system for Window - vastly reduces the need to perform total redraws when only one widget changes. -- Core falagard support classes enabling xml skin data to be loaded and the results used for Window initialisation and rendering. -- CEGUIFalagardBase module implementing core skinned widget behaviours. -- LookNFeel (XML skin) loading via scheme files. -- FalagardMapping scheme element to allow creation of 'new' widget types within a scheme file. -- Full skinning system .pdf documentation 'mini-book'. -- XML based version of TaharezLook - as an example and to allow easy migration to the new system. -- XML based version of WindowsLook - as an example and to allow easy migration to the new system. -- "Vanilla GUI" - a simple XML based skin. Special thanks to Shane Parker for permission to use his imagery. - -Added: 'Unified' co-ordinate system allowing specification of relative and absolute components simultaneously. -Added: Window alignment options allowing child windows to be positioned offset from centre, right, and bottom points as well as the usual left and top. -Added: Ability to create an imageset directly from an image file. -Added: Added line number to error message for Xerces XML parsing errors. -Added: Initial support for output of XML data for all core system data types (fonts, imagesets, window layouts, xml skins). -Added: Renderer independant version of the original Ogre/CEGUI preview application "Demo4" in Samples. -Added: Renderer independant version of the original Ogre/CEGUI preview application "Demo6" in Samples. -Added: Renderer independant version of the original Ogre/CEGUI preview application "Demo7" in Samples. -Added: Renderer independant version of the original Ogre/CEGUI preview application "Demo8" in Samples. -Added: Support to Window class for a collection of named user-data strings. -Added: Modal window feature. -Added: Missing Lua bindings for some System based Tooltip stuff. -Added: Missing Lua bindings for Menusystem widgets. -Added: Lua module 'toKeyEventArgs' helper -Added: An attempt at protecting the code from min/max preprocessor macros; as defined in MS Windows headers. -Added: Logging of CEGUI version number. -Added: The 'look' modules now have the ability to register all available widget types; saves listing them all in a scheme! -Added: Support to the Lua module for FontFlags to allow direct loading of TTF fonts from script without using .font files. -Added: Base Window class virtual method 'performChildWindowLayout'. Replacing many widget's own 'layoutChildComponents' methods. -Added: Facility for the system to auto-generate window names - for use in cases where the user is too idle to think up names for themselves ;) - -Modified: Relaxation of many ordering restrictions within validated XML data files. -Modified: Samples framework has had some minor improvments, and can now exit properly! -Modified: Various improvments and additional options for linux configure. -Modified: Lua scripting module renamed to CEGUILua (Win32 systems). -Modified: Switched AC_DISABLE_STATIC & AM_PROG_LIBTOOL around due to a warning. -Modified: Disabled building of static libraries under Linux. -Modified: Window::initialise method now called by WindowManager when it creates a window, rather than having each factory do this itself. -Modified: Major cleanup of the main file for the 'look' modules. -Modified: Changed CEGUIBASE_API to CEGUIEXPORT throughout the code. This is in preparation for some Linux ABI improvements. -Modified: Various widget classes disregarded the alpha component of set colours; the alpha component of user specified colours is now respected. -Modified: Updated the WindowsLook caret-cursor to greatly improve visibility! -Modified: Made child window index positions stable. -Modified: Fixed hacky z-order change implementations. - -Bug Fix: Issue on some distros caused by use of AC_FUNC_MALLOC macro in configure.ac -Bug Fix: Issues with samples framework not compiling when none of the renderer modules are available. -Bug Fix: linux makefiles updated so 'make dist' works properly again. -Bug Fix: Various fixes made to the MSVC++ 7.0 solution and projects. -Bug Fix: Unified the tests for linux platform to always check for definition of: __linux__ -Bug Fix: Xerces based XML parser was not throwing exceptions, causing no useful logging to occur. -Bug Fix: Some tool-tip API docs were incorrect. -Bug Fix: Window::onEnabled & Window::onDisabled were not called when a window state changed via inherited state from an ancestor window. -Bug Fix: Font class modified to force auto-hinting use for rendering glyphs. -Bug Fix: Font class modified to properly render glyphs in mono mode (AA off) -Bug Fix: Fixed some uint/ColourRect/String CEGUILua issues. -Bug Fix: TinyXMLParser::parseXMLFile implementation was not reentrant, causing issues with nested loading of XML files (specifically static/bitmapped fonts). -Bug Fix: MultiLineEditbox would throw std::out_of_range sometimes when setting the text via setText(). - - -Release 0.3.0 -============= -Total refactoring of XML parsing system. Details as follows: -- Removed XMLHandlerHelper files. -- Added XMLParser/XMLHandler abstract classes. -- Added XMLAttributes class -- Added optional embedded version of TinyXML - including efficiency fix (patch #1180435). -- Added optional TinyXML based implementation of XMLParser. -- Added optional Xerces-C++ based implementation of XMLParser. -- Added overloaded System constructors allowing a custom XML parser to be used. - -Added: Menu widget set (currently available for WindowsLook module only). -Added: Generic drag/drop support widgets. -Added: Write-only "ColumnHeader" property to MultiColumnList allowing specification of columns within XML layouts. -Added: Read-only "RowCount" property to MultiColumnList to return the number of rows in the list. -Added: Support for IDs to MultiColumnList rows, allowing easier access to rows (since index values can change). -Added: Lua based ScriptModule (including optional embedded lua and toloua++) for Win32 and Linux users. -Added: resourceGroup parameter to executeScriptFile methods. -Added: Scripted event handler support extensions plus typo fixes. Special thanks to lindquist. -Added: Samples support framework (Win32 and Linux) -Added: 'FirstWindow' sample. (Win32 and Linux) -Added: OpenGLRenderer::setDisplaySize member function to enable display size changes to be notified. -Added: Config file setting to allow specification of logging level. -Added: Option to make the 'rise on click' default behaviour optional. Based on idea from patch #1124682. -Added: Alt keys as a system key. Patch #1170194. -Added: Irrlicht renderer for Linux users. -Added: Justified text formatting options (patch #1160562 from ChrisKang) -Added: typedef to define DefaultWindow (allowing use of new name in code rather than old DefaultGUISheet class) -Added: Image::getSourceTextureArea method. -Added: argb_t to represent ARGB colour values instead of ulong. -Added: Implementation of 'dead pool' for deferred deletion of Window objects (allows Window destruction from within own event handlers) -Added: New option to Window to state whether 'captured' inputs are distributed to child windows. (Fixes various behavioural bugs) - -Modified: Changed ResourceProvider system to support 'unloadRawDataContainer' method, to resolve various memory related issues (Patch #1176745) -Modified: Xerces schema loading to try to get the schema file from the same directory as the xml file being loaded when the default path fails. -Modified: Changed logger from using gmtime to localtime. -Modified: Changed CEGUIBASE_API to CEGUIEXPORT throughout the code. This is in preparation for some Linux ABI improvements. -Modified: Changed FrameWindow titlebar imagery rendering under WindowsLook to look better when titlebar is larger than 'normal'. -Modified: MSVC build to fix alot of compile warnings when including CEGUI from outside the project. -Modified: occurances of 'const static' with 'static const' (via a patch from Clay) -Modified: Logging system so logging begins earlier in system creation. -Modified: EventSet::fireEvent so that global event is fired before the local instance event. (Request #1144062). -Modified: FontManager now automatically sets the first Font created as the default. -Modified: Updated Irrlicht renderer components to take resourceGroup parameter. - -Bug Fix: testClassName const correctness. -Bug Fix: Made System::handleDisplaySizeChange notify imageset manager and fontmanager of change. -Bug Fix: OpenGL types causing issues on MacOS X Tiger (patch #1200625) -Bug Fix: Added /usr/X11R6/include as a include search path for OSX -Bug Fix: Empty lines issue with word-wrapped text formatting (patch #1175118) -Bug Fix: Win32 fix (fabs -> fabsf to avoid double-to-float warning treated as error) -Bug Fix: MultiColumnList::setItem was setting owner on new item without checking new item was valid. -Bug Fix: MultiColumnList::setItem checking 'isAutoDeleted' on new item (which could also be null), instead of old item. -Bug Fix: Vertical scrollbar access properties were broken. -Bug Fix: Anti-alias setting for fonts. -Bug Fix: Issues where Logger was needed before it was created. -Bug Fix: Horizontal scrollbar would sometimes have wrong length. -Bug Fix: Issues with STLport where functions are not correctly in the std (_STL) namespace. -Bug Fix: Debug guard controlling Insane level logging was around the wrong way. - - -Release 0.2.1 -============= -Added: Spinner widget. -Added: ScrollablePane widget. -Added: Tooltip widget. -Added: RPM spec file. - -Modified: In the Xcode build, changed framework name to CEGUI instead of CEGUIBase (for Ogre's CEGUI renderer). -Modified: Promoted custom image properties for PushButton from 'look' modules into base class. - -Bug Fix: Some delete/delete[] issues for String class fixed, moved all String delete usages into .cpp file. -Bug Fix: Modification to ensure stable index values for tab buttons and tab content. -Bug Fix: Spacing between non-autoscaled bitmapped font glyphs was incorrect. -Bug Fix: FrameWindow title bar and close button were still clipped when clippedByParent was false. -Bug Fix: Text extents calculations were incorrect under certain cicumstances. -Bug Fix: Added a work around for over-optimisation bug in MulticolumnList under VC++. -Bug Fix: WindowsLook titlebar was not using correct set caption colour. -Bug Fix: OpenGL configure options did not function correctly. -Bug Fix: In System constructors the logfile parameter was missing a const specifier. -Bug Fix: Direct3D renderers had missing cull mode state setting. -Bug Fix: SimpleTimer::elapsed was returning incorrect values. -Bug Fix: Removed incorrect usage of Win32 dll import/export construct from enums. -Bug Fix: List box items (ListboxTextItem) suffered from a cumulative alignment issue. -Bug Fix: Fixed a type conversion warning in CEGUIFont for MSVC++. -Bug Fix: Baseline and Linespacing calculations for bitmapped / static fonts was incorrect. -Bug Fix: 'make dist' fixed on linux. - - -Release 0.2.0 -============= -Added: Support for resource provider resource groups to loading & parsing methods. -Added: MouseButtonDown event auto-repeat feature. -Added: System::getSystemKeys method to return current system keys value. -Added: New setting in Window to receive muliple mouse down events instead of double/triple clicks. -Added: Ability to define split direction of triangles used for quads -Added: Font::getFontHeight method to return pixel height of largest glyph. -Added: Error logging for when freetype fails to load a glyph. -Added: Various new methods to TabCrontrol base class. -Added: Callback support when setting properties loaded from XML layout files. -Added: Checking and inspection of default values for Properties system. -Added: Global events system. -Added: Vertical VU-Meter style progress bar to Taharez Look. -Added: Extensions to font system which give support for scaling the text output. -Added: Support for MSVC++ 6.0 native STL implementation. -Added: Font::getPointSize() method to return point size of a dynamic font. -Added: Mechanism for Direct3D renderers to detect display size changes and fire EventDisplaySizeChanged. -Added: Lost device recovery for both Direct3D renderer modules. -Added: SchemeManager::unloadAllSchemes method. -Added: Initial system for time based updates / window automation. -Added: CEGUI::System constructor overload to allow custom ResourceProvider to be specified when also using a ScriptModule. -Added: OpenGL renderer. -Added: uint32 and uint16 datatypes. - -Modified: Layout loading code to properly throw CEGUI errors out of xercesc parser. -Modified: Fixed font support under AMD64. -Modified: Changed all const strings in the base library to be of type CEGUI::String instead of UTF-8 buffers. -Modified: Removed public dependency on xerces-c (still required for base library itself though). -Modified: Replaced dependency boost::regex with embedded copy of pcre. -Modified: Replaced dependency boost::timer with SimpleTimer class. -Modified: TabCobtrol widget now uses '__auto_' naming scheme for generated child widgets. -Modified: Global update of website, contact, and copyright information. - -Bug Fix: moveToBack was operating upon and adding target window to its own child list instead of its parents. -Bug Fix: Editbox changed to allow text to be altered in onTextChanged/EventTextChanged without causing carat position to become invalid. -Bug Fix: Font updated to use correct values for Linespacing and Baseline. -Bug Fix: Added various missing includes. -Bug Fix: Minor adjustment to layout in TLComboEditbox to fix text clipping issue. -Bug Fix: Text alignment within gui elements. -Bug Fix: Drag-Sizing for segments would be incorrect if they had negative relative 'left' positions. -Bug Fix: Some component widget layouts were getting incorrect sizes. -Bug Fix: Fixed minor imagery alignment issue for Taharez frame window imagery. -Bug Fix: Child windows would sometimes 'jump' slightly upon initial activation of a parent window. -Bug Fix: System::setGUISheet updated to trigger re-calculation of relative co-ordinates when a new window is attached as root. -Bug Fix: removed use of void* in properties system to ensure correct casting behaviour. -Bug Fix: All imagery aligned to whole pixels resolving twinkling and blurring issues. -Bug Fix: Constructor overload and support methods to allow successful use of 'pure' D3D devices. -Bug Fix: Made sure events were added to the EventSet in Window before making any calls that may fire an event. -Bug Fix: Various other minor tweaks & fixes. - -OgreGUIRenderer moved from CEGUI codebase into Ogre codebase (with the following initial changes): -Modified: Switched HBU_DYNAMIC_WRITE_ONLY for HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE in Ogre renderer to improve performance under D3D. -Modified: OGRE renderer to work under AMD64. -Modified: Ogre renderer to compile against OGRE 1.0 (Ogre >= 1.0.0 is now required) -Bug Fix: Missing shading type and rasterisation mode settings in Ogre renderer added. - - -Release 0.1.1 -============= -Updated TODO file to reflect features already implemented in this branch. -Bug Fix: Missing shading type and rasterisation mode settings in Ogre renderer -Bug Fix: Removed erroneous use of D3DLOCK_DISCARD flag in D3D8 renderer (texture.cpp) -Bug Fix: Dates in the log were using incorrect value for the month. -Bug Fix: Added missing stdio.h include in CEGUIWindow.cpp. -Bug Fix: Font attribute "AntiAlias" was incorrectly documented as "AntiAliased". -Bug Fix: d_resourceProvider member in Renderer base class was not being initialised -Bug Fix: corrected version information in configure.ac. -Bug Fix: Resolved assert issues related to the Ogre debug memory manager. -Bug Fix: Y Spacing calculation on certain ttf fonts was incorrect. -Bug Fix: Added missing _STLP_DEBUG defines in the MSVC++ 7.0 projects. - - -Release 0.1.0 -============= -Initial release. diff --git a/vendor/cegui-0.4.0-custom/FTL.TXT b/vendor/cegui-0.4.0-custom/FTL.TXT deleted file mode 100644 index 459bda3263..0000000000 --- a/vendor/cegui-0.4.0-custom/FTL.TXT +++ /dev/null @@ -1,174 +0,0 @@ - The FreeType Project LICENSE - ---------------------------- - - 2002-Apr-11 - - Copyright 1996-2002 by - David Turner, Robert Wilhelm, and Werner Lemberg - - - -Introduction -============ - - The FreeType Project is distributed in several archive packages; - some of them may contain, in addition to the FreeType font engine, - various tools and contributions which rely on, or relate to, the - FreeType Project. - - This license applies to all files found in such packages, and - which do not fall under their own explicit license. The license - affects thus the FreeType font engine, the test programs, - documentation and makefiles, at the very least. - - This license was inspired by the BSD, Artistic, and IJG - (Independent JPEG Group) licenses, which all encourage inclusion - and use of free software in commercial and freeware products - alike. As a consequence, its main points are that: - - o We don't promise that this software works. However, we will be - interested in any kind of bug reports. (`as is' distribution) - - o You can use this software for whatever you want, in parts or - full form, without having to pay us. (`royalty-free' usage) - - o You may not pretend that you wrote this software. If you use - it, or only parts of it, in a program, you must acknowledge - somewhere in your documentation that you have used the - FreeType code. (`credits') - - We specifically permit and encourage the inclusion of this - software, with or without modifications, in commercial products. - We disclaim all warranties covering The FreeType Project and - assume no liability related to The FreeType Project. - - - Finally, many people asked us for a preferred form for a - credit/disclaimer to use in compliance with this license. We thus - encourage you to use the following text: - - """ - Portions of this software are copyright © 1996-2002 The FreeType - Project (www.freetype.org). All rights reserved. - """ - - -Legal Terms -=========== - -0. Definitions --------------- - - Throughout this license, the terms `package', `FreeType Project', - and `FreeType archive' refer to the set of files originally - distributed by the authors (David Turner, Robert Wilhelm, and - Werner Lemberg) as the `FreeType Project', be they named as alpha, - beta or final release. - - `You' refers to the licensee, or person using the project, where - `using' is a generic term including compiling the project's source - code as well as linking it to form a `program' or `executable'. - This program is referred to as `a program using the FreeType - engine'. - - This license applies to all files distributed in the original - FreeType Project, including all source code, binaries and - documentation, unless otherwise stated in the file in its - original, unmodified form as distributed in the original archive. - If you are unsure whether or not a particular file is covered by - this license, you must contact us to verify this. - - The FreeType Project is copyright (C) 1996-2000 by David Turner, - Robert Wilhelm, and Werner Lemberg. All rights reserved except as - specified below. - -1. No Warranty --------------- - - THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO - USE, OF THE FREETYPE PROJECT. - -2. Redistribution ------------------ - - This license grants a worldwide, royalty-free, perpetual and - irrevocable right and license to use, execute, perform, compile, - display, copy, create derivative works of, distribute and - sublicense the FreeType Project (in both source and object code - forms) and derivative works thereof for any purpose; and to - authorize others to exercise some or all of the rights granted - herein, subject to the following conditions: - - o Redistribution of source code must retain this license file - (`FTL.TXT') unaltered; any additions, deletions or changes to - the original files must be clearly indicated in accompanying - documentation. The copyright notices of the unaltered, - original files must be preserved in all copies of source - files. - - o Redistribution in binary form must provide a disclaimer that - states that the software is based in part of the work of the - FreeType Team, in the distribution documentation. We also - encourage you to put an URL to the FreeType web page in your - documentation, though this isn't mandatory. - - These conditions apply to any software derived from or based on - the FreeType Project, not just the unmodified files. If you use - our work, you must acknowledge us. However, no fee need be paid - to us. - -3. Advertising --------------- - - Neither the FreeType authors and contributors nor you shall use - the name of the other for commercial, advertising, or promotional - purposes without specific prior written permission. - - We suggest, but do not require, that you use one or more of the - following phrases to refer to this software in your documentation - or advertising materials: `FreeType Project', `FreeType Engine', - `FreeType library', or `FreeType Distribution'. - - As you have not signed this license, you are not required to - accept it. However, as the FreeType Project is copyrighted - material, only this license, or another one contracted with the - authors, grants you the right to use, distribute, and modify it. - Therefore, by using, distributing, or modifying the FreeType - Project, you indicate that you understand and accept all the terms - of this license. - -4. Contacts ------------ - - There are two mailing lists related to FreeType: - - o freetype@freetype.org - - Discusses general use and applications of FreeType, as well as - future and wanted additions to the library and distribution. - If you are looking for support, start in this list if you - haven't found anything to help you in the documentation. - - o devel@freetype.org - - Discusses bugs, as well as engine internals, design issues, - specific licenses, porting, etc. - - o http://www.freetype.org - - Holds the current FreeType web page, which will allow you to - download our latest development version and read online - documentation. - - You can also contact us individually at: - - David Turner - Robert Wilhelm - Werner Lemberg - - ---- end of FTL.TXT --- diff --git a/vendor/cegui-0.4.0-custom/Freetype2 License.txt b/vendor/cegui-0.4.0-custom/Freetype2 License.txt deleted file mode 100644 index 102a03d651..0000000000 --- a/vendor/cegui-0.4.0-custom/Freetype2 License.txt +++ /dev/null @@ -1,28 +0,0 @@ - -The FreeType 2 font engine is copyrighted work and cannot be used -legally without a software license. In order to make this project -usable to a vast majority of developers, we distribute it under two -mutually exclusive open-source licenses. - -This means that *you* must choose *one* of the two licenses described -below, then obey all its terms and conditions when using FreeType 2 in -any of your projects or products. - - - The FreeType License, found in the file `FTL.TXT', which is similar - to the original BSD license *with* an advertising clause that forces - you to explicitly cite the FreeType project in your product's - documentation. All details are in the license file. This license - is suited to products which don't use the GNU General Public - License. - - - The GNU General Public License version 2, found in `GPL.TXT' (any - later version can be used also), for programs which already use the - GPL. Note that the FTL is incompatible with the GPL due to its - advertisement clause. - -The contributed PCF driver comes with a license similar to that of the X -Window System. It is compatible to the above two licenses (see file -src/pcf/readme). - - ---- end of LICENSE.TXT --- diff --git a/vendor/cegui-0.4.0-custom/GLUT-README.txt b/vendor/cegui-0.4.0-custom/GLUT-README.txt deleted file mode 100644 index d0792294aa..0000000000 --- a/vendor/cegui-0.4.0-custom/GLUT-README.txt +++ /dev/null @@ -1,613 +0,0 @@ - - - GLUT for Win32 README - --------------------- - - -VERSION/INFO: - - This is GLUT for Win32 version 3.7.6 as of Nov 8th 2001. - See the COPYRIGHT section for distribution and copyright notices. - Send all bug reports and questions for this version of GLUT to - Nate Robins [nate@pobox.com]. - - For more information about GLUT for Win32, see the web page: - www.pobox.com/~nate/glut.html or subscribe to the GLUT for Win32 - mailing list by sending e-mail to majordomo@perp.com with - "subscribe glut" in the body of the message. - - For general information about GLUT, see the GLUT web page: - http://reality.sgi.com/opengl/glut3/glut3.html and be sure to - check the GLUT FAQ first for any questions that you may have: - http://reality.sgi.com/opengl/glut3/glut-faq.html - - -COMPILING/INSTALLATION: - - o Precompiled versions of the DLL and import library can be - found on the GLUT for Win32 web page mentioned above. - - o Microsoft Developer Studio 6 workspace and project files have - been included in the source code distribution. - - To build the glut dll: - First, open Microsoft Developer Studio. - Then, select File -> Open Workspace and find the glut.dsw file - in the file dialog and double-click on it. - Finally, select Build -> Build glut32.dll. - When the build is finished, it will copy: - glut32.dll to %WinDir%\System, - glut32.lib to $(MSDevDir)\..\..\VC98\lib, and - glut.h to $(MSDevDir)\..\..\VC98\include\GL. - - Additional workspace files have been included in the progs, test - and lib directories to build the progs, tests and libs respectively. - - -BORLAND NOTES: - - From what I understand, Borland supplies a utility that - converts Microsoft Visual C++ .libs into Borland compatible - files. Therefore, the best method for Borland users is - probably to get the precompiled versions of the library and - convert the library. To create an import library for Borland - from the DLLs, use the following command (from a command prompt): - IMPLIB glut32.lib glut32.dll - If IMPLIB crashes when called this way, try - IMPLIB glut32.lib glut32.def - using the glut32.def file in this distribution. - - -FORTRAN NOTES: - - Bill Mitchell [william.mitchell@nist.gov] has put considerable - effort into getting GLUT to work with different compilers for - Fortran 90. He indicates that you should copy the f90glut.h - file to your $(MSDevDir)\..\..\VC98\include\GL directory. - Then, just build GLUT as usual. The Fortran 90 interface, f90gl, - can be obtained at http://math.nist.gov/f90gl and contains - installation instructions and usage examples. - - -MISC NOTES: - - o Overlay support is not implemented, nor are there any plans to - implement it in the near future. - - o To customize the windows icon, you can use the resource name - GLUT_ICON. For example, create an icon named "glut.ico", and - create a file called glut.rc that contains the following: - GLUT_ICON ICON glut.ico - then compile the glut.rc file with the following: - rc /r glut - and link the resulting glut.res file into your executable - (just like you would an object file). - Alternatively, you can simply add the glut.rc file to your - project if you are using Microsoft Developer Studio. - - -IMPLEMENTATION DEPENDENT DIFFERENCES: - - There are a few differences between the Win32 version of GLUT - and the X11 version of GLUT. Those are outlined here. Note - that MOST of these differences are allowed by the GLUT - specification. Bugs and unsupported features are outlined in - the UNSUPPORTED/BUGS section. - - o glutInit: - The following command line options have no meaning (and are - ignored) in GLUT for Win32: - -display, -indirect, -direct, -sync. - - o glutInitWindowPosition, glutPositionWindow: - Win32 has two different coordinate systems for windows. - One is in terms of client space and the other is the whole - window space (including the decorations). If you - glutPositionWindow(0, 0), GLUT for Win32 will place the - window CLIENT area at 0, 0. This will cause the window - decorations (title bar and left edge) to be OFF-SCREEN, but - it gives the user the most flexibility in positioning. - HOWEVER, if the user specifies glutInitWindowPosition(0, 0), - the window is placed relative to window space at 0, 0. - This will cause the window to be opened in the upper left - corner with all the decorations showing. This behaviour is - acceptable under the current GLUT specification. - - o glutSetIconTitle, glutSetWindowTitle: - There is no separation between Icon title and Window title - in Win32. Therefore, setting an icon title in Win32 has - no effect. - - o glutSetCursor: - As indicated in the GLUT specification, cursors may be - different on different platforms. This is the case in GLUT - for Win32. For the most part, the cursors will match the - meaning, but not necessarily the shape. Notable exceptions - are the GLUT_CURSOR_INFO & GLUT_CURSOR_SPRAY which use the - crosshair cursor and the GLUT_CURSOR_CYCLE which uses the - 'no' or 'destroy' cursor in Win32. - - o glutVisibilityFunc: - Win32 seems to be unable to determine if a window is fully - obscured. Therefore, the visibility of a GLUT window is - only reflected by its Iconic, Hidden or Shown state. That - is, even if a window is fully obscured, in GLUT for Win32, - it is still "visible". - - o glutEntryFunc: - Window Focus is handled differently in Win32 and X. - Specifically, the "window manager" in Win32 uses a "click to - focus" policy. That is, in order for a window to receive - focus, a mouse button must be clicked in it. Likewise, in - order for a window to loose focus, a mouse button must be - clicked outside the window (or in another window). - Therefore, the Enter and Leave notification provided by GLUT - may behave differently in the Win32 and in X11 versions. - There is a viable workaround for this. A program called - "Tweak UI" is provided by Microsoft which can be used to - change the focus policy in Win32 to "focus follows mouse". - It is available from the Microsoft Web Pages: - http://www.microsoft.com/windows/software/PowerToy.htm - - o glutCopyColormap: - GLUT for Win32 always copies the colormap. There is never - any sharing of colormaps. This is probably okay, since - Win32 merges the logical palette and the physical palette - anyway, so even if there are two windows with totally - different colors in their colormaps, Win32 will find a - (hopefully) good match between them. - - o glutIdleFunc + menus: - The glut idle function will NOT be called when a menu is - active. This causes all animation to stop when a menu is - active (in general, this is probably okay). Timer - functions will still fire, however. If the timer callback - draws into the rendering context, the drawing will not show - up until after the menu has finished, though. - - -UNSUPPORTED/BUGS: - - o glutAttachMenu: - Win32 only likes to work with left and right mouse buttons. - Especially so with popup menus. Therefore, when attaching - the menu to the middle mouse button, the LEFT mouse button - must be used to select from the menu. - - o glutSpaceball*, glutButtonBox*, glutTablet*, glutDials*: - None of the special input devices are supported at this - time. - - o When resizing or moving a GLUT for Win32 window, no updating - is performed. This causes the window to leave "tracks" on - the screen when getting bigger or when previously obscured - parts are being revealed. I put in a bit of a kludgy - workaround for those that absolutely can't have the weird - lines. The reshape callback is called multiple times for - reshapes. Therefore, in the reshape callback, some drawing - can be done. It should probably be limited to a color buffer - clear. - - o The video resizing capabilities of GLUT 3.3+ for X11 is - currently unimplemented (this is probably ok, since it - really isn't part of the spec until 4.0). I doubt that - this will ever be part of GLUT for Win32, since there is no - hardware to support it. A hack could simply change the - resolution of the desktop. - - -CHANGES/FIXES: - - (Nov 8, '01) - x Released 3.7.6 - - (Nov 8, '01) - x Changed fullscreen mode from TOPMOST back to simply TOP, since - (it turns out) many people use windows atop a GLUT window. - - (Nov 8, '01) - x Added code to prevent CPU spiking when no idle function is - registered. Otherwise, if an idle function is registered, spike - CPU so that the idle function gets all the attention it needs and - if this is a problem on the program side, the user can stick a - sleep() in their idle function. I believe that this strikes the - best balance betweeen GLUT being fast, and also being "nice" to - other processes. Thanks to James Wright for reporting this bug. - - (Nov 8, '01) - x Fixed bug in motion callback handler which wasn't setting the - current window, so multiple window apps (e.g., any GLUI app) - wouldn't get the callback correctly. - - (Oct 4, '01) - x Fixed bug in glutEnterGameMode() that caused new windows to not - be in "fullscreen" mode, so they got window decorations. - - (Oct 4, '01) - x Fixed bug in glutEnterGameMode() that caused new windows to not - be in "fullscreen" mode, so they got window decorations. - - (Oct 3, '01) - x Fixed bug in getVisualInfoFromString(): visuals not reloaded on - display mode change. Reload visuals each time they are queried. - This fixes a problem with Win32 because the list of availabe Visuals - (Pixelformats) changes after a change in displaymode. The problem - occurs when switching to gamemode and back. Thanks to Michael - Wimmer for pointing this out & providing the fix. - - (Oct 3, '01) - x Fixed bug in XGetVisualInfo(): pixelformats enumerated incorrectly. - Passing 0 as a pixelformat index to DescribePixelFormat gives - unpredictible results (e.g., this fails on the Voodoo opengl32.dll - and always reports 0 as the last available pixelformat index). - Thanks to Michael Wimmer for pointing this out & providing the fix. - - (Oct 3, '01) - x Fixed bug in glXGetConfig(): pixelformats enumerated incorrectly. The - test was OpenGL support OR draw to window, but should be AND. Thanks - to Michael Wimmer for pointing this out & providing the fix. - - (Sep 28, '01) - x Fixed glutChangeToSubMenu()/glutChangeToMenuEntry() bug where if you - went back and forth between a submenu and a plain entry, the submenu - wouldn't be updated properly. - - (Sep 28, '01) - x glutSetIconTitle() is now a nop. - - (Sep 28, '01) - x glutFullScreen() now sets the window as TOPMOST, therefore, the - window will always be on top (this essentially disables alt-tabbing). - - (Sep 28, '01) - x The key repeat ignore flag is now honored correctly. - - (Sep 28, '01) - x Key presses are now reported more accurately and fully, in - particular, modified up events (i.e., SHIFT-2) are now reported - correctly. - - (Sep 28, '01) - x Subwindows nested arbitrarily deep get their keyboard callbacks - correctly now. - - (Sep 28, '01) - x Major rewrite of the window procedure code to clean it up and make - way for other bug fixes. - - (Sep 23, '01) - x Fixed noof example program to use RAND_MAX instead of assumed - max of 2147483647.0. (Now it looks _much_ better!) - - (Sep 22, '01) - x Fixed sunlight example program. globe.raw data file was corrupt, - added a new one. - - (Sep 22, '01) - x Fixed zcomposite example program to print message if overlay - support is not found (instead of crashing). - - (Jan 22, '01) - x Fixed malloc(0) bug in Win32 version of XGetVisualInfo. Thanks - to Kekoa Proudfoot for bringing this to my attention. - - (Dec 12, '00) - x Added data files for the advanced & advanced97 programs. - - (Dec 12, '00) - x Added Developer Studio 6 project and workspace files for pretty - much everything (the stuff left out was usually unix specific). - - (Dec 7, '00) - x Fixed several compilation problems & corrupt files. Thanks to - Alexander Stohr for bringing these to my attention and providing - detailed fixes. - - (Dec 6, '00) - x Fixed compiler support for lcc. Thanks to Gordon for bringing - this to my attention and debugging fixes. - - (Nov 8, '00) - x Fixed submenu problem (sometimes the menu callback was not - called for valid items). Thanks to Michael Keeley. - - (Oct 16, '00) - x Corrected corrupt duck.iv file. Thanks to Jon Willeke for finding - this problem. - - (Sept 27, '00) - x Fixed bug in processWorkList that could cause a hang. Thanks to - Bill Volz & Daniel Azuma. - - (Sept 26, '00) - x Added mui DLL project file (thanks to DMWeldy@ugsolutions.com). - - (Sept 9, '00) - x Fixed Delete key bug (crash when no keyboard callback was - registered, but a special key callback was). Thanks to - Kent Bowling (kent_bowling@hotmail.com) for finding this bug. - - (May 18, '00) - x Fixed subwindow keyboard callbacks. - - (May 22, '97) - o Menus don't work under Windows 95 - x Fixed! Added a unique identifier to each menu item, and a - search function to grab a menu item given the unique identifier. - - (May 21, '97) - o A few minor bug fixes here and there. - x Thanks to Bruce Silberman and Chris Vale for their help with - this. We now have a DLL! - - (Apr 25, '97) - o DLL version of the library is coming (as soon as I figure out - how to do it -- if you know, let me know). - x Thanks to Bruce Silberman and Chris Vale for their help with - this. We now have a DLL! - - (Apr 24, '97) - x Added returns to KEY_DOWN etc messages so that the F10 key - doesn't toggle the system menu anymore. - - (Apr 7, '97) - o Palette is incorrect for modes other than TrueColor. - x Fixed this by forcing a default palette in modes that aren't - Truecolor in order to 'simulate' it. The applications - program shouldn't have to do this IMHO, but I guess we - can't argue with Microsoft (well, we can, but what good - will it do?). - - (Apr 2, '97) - x Added glut.ide file for Borland users. - - (Apr 2, '97) - x Fixed a bug in the WM_QUERYNEWPALETTE message. Wasn't - checking for a null colormap, then de-ref'd it. Oops. - - (Mar 13, '97) - o glutTimerFunc: - Currently, GLUT for Win32 programs busy waits when there is - an outstanding timer event (i.e., there is no select() - call). I haven't found this to be a problem, but I plan to - fix it just because I can't bear the thought of a busy wait. - x Added a timer event and a wait in the main loop. This fixes - the CPU spike. - - (Mar 11, '97) - x Fixed subwindow visibility. The visibility callback of - subwindows wasn't being called, now it is. - - (Mar 11, '97) - o glutGetHDC, glutGetHWND: - In order to support additional dialog boxes, wgl fonts, and - a host of other Win32 dependent structures, two functions - have been added that operate on the current window in GLUT. - The first (glutGetHDC) returns a handle to the current - windows device context. The second (glutGetHWND) returns - handle to the current window. - x Took these out to preserve GLUT portability. - - (Mar 11, '97) - x Fixed the glutWarpPointer() coordinates. Were relative to - the screen, now relative to window (client area) origin - (which is what they're supposed to be). - - (Mar 11, '97) - o glutCreateMenu, glutIdleFunc: - Menu's are modal in Win32. That is, they don't allow any - messages to be processed while they are up. Therefore, if - an idle function exists, it will not be called while - processing a menu. - x Fixed! I've put in a timer function that fires every - millisecond while a menu is up. The timer function handles - idle and timer events only (which should be the only - functions that are firing when a menu is up anyway). - - (Mar 7 '97) - x Fixed minor bugs tracked down by the example programs. - - (Mar 6, '97) - x Merged 3.3 GLUT for X11 into 3.2 GLUT for Win32. New code - structure allows for EASY merging! - - o In Win32, the parent gets the right to set the cursor of - any of its children. Therefore, a child windows cursor - will 'blink' between its cursor and its parent. - x Fixed this by checking whether the cursor is in a child - window or not. - - (Feb 28 '97) - o On initial bringup apps are getting 2 display callbacks. - x Fixed by the Fev 28 re-write. - - o Some multiple window (not subwindow) functionality is messed up. - See the sphere.exe program. - x Fixed by the Feb 28 re-write. - - o GLUT for Win32 supports color index mode ONLY in a paletted - display mode (i.e., 256 or 16 color mode). - x Fixed this in the re-write. If you can get a color index - visual (pixel format) you can use color index mode. - - (Feb 28 '97) - o Quite a few bugs (and incompatibilities) were being caused - by the structure that I used in the previous port of GLUT. - Therefore I decided that it would be best to "get back to - the roots". I re-implemented most of glut trying to stick - with the structure layed out by Mark. The result is a much - more stable version that passes ALL (!) (except overlay) - the tests provided by Mark. In addition, this new - structure will allow future enhancements by Mark to be - integrated much more quickly into the Win32 version. Also, - I'm now ordering the bugs in reverse, so that the most - recently fixed appear at the top of the list. - - (9/8/96) - o Changed the glutGetModifiers code to produce an error if not - called in the core input callbacks. - - (9/11/96) - o If the alt key is pressed with more than one other modifier key - it acts as if it is stuck -- it stays selected until pressed - and released again. - x Fixed. - - (9/12/96) - o When a submenu is attached to a menu, sometimes a GPF occurs. - Fixed. Needed to set the submenu before referencing it's members. - - o Kenny: Also, one little problem, I attached the menu to the - right-button, but when the left-button is pressed I detach - it to give the right-button new meaning; if I pop-up the menu and I - don't want to select anything, like most users, I click off of the - menu to make it disappear. When I do this, I get a GLUT error and - the program terminates because I am altering the menu attachment - from within the button press while the menu is active. - x Fixed. Needed to finish the menu when the user presses the button, - not just when a button is released. - - o GLUT for Win32 emulates a middle mouse button by checking if - both mouse buttons are down. This causes a lot of problems with - the menu and other multiple mouse button things. - x Fixed. No more middle mouse button emulation. Perhaps it would - be a good idea to emulate the middle mouse button (if not present) - with a key? - - (9/15/96) - o Added code to accept a user defined icon. If no icon is provided, - a default icon is loaded. - - (9/19/96) - o Shane: Command line options seem to be screwed up. (9/13) - x Fixed. The geometry command line was broken, and so was the - gldebug command line. - - o Fixed a bug in the default glut reshape. It was looking for the - parent of the current window and GPF'ing if there wasn't a parent. - Put in a check for a parent, and if none is there, use the - child. - - o Idle function sucks up all processor cycles. (9/8/96) - x I don't know if this is avoidable. If you have a tight rendering - loop, it may be that the processor time is going to be sucked up - no matter what. You can add a sleep() to the end of your render - loop if you would like to yeild to other processes and you don't - care too much about the speed of your rendering loop. If you have - Hardware that supports OpenGL (like a 3Dpro card, or GLint card) - then this should be less of a problem, since it won't be rendering - in software. (9/11/96) - - o If a window is fully obscured by another window, the visibility - callback is NOT called. As far as I can tell, this is a limitation - of the Win32 api, but a workaround is being searched for. (9/8/96) - x Limitation of the Win32 API - - o Fixed the entry functions. They only work if the keyboard focus - changes. Therefore, in most Win32 systems, the mouse must be - pressed outside of the window to get a GLUT_LEFT message and - then pressed inside the window for a GLUT_ENTERED message. - - o Alt modifier key doesn't work with keyboard callback. (9/8/96) - x Probably okay, because the glut spec says that these keys can - be intercepted by the system (which the alt key is...) (9/11/96) - - (11/17/96) - o glutRemoveMenuItem() not working properly. - x Thanks to Gary (grc@maple.civeng.rutgers.edu) for the fix to - this one. - - o Timer functions are messed up. - x Thanks to Joseph Galbraith for the fix to this one. - - (12/9/96) - o One (minor) difference came up between the X version of glut - and the nt one which you should know about. It is not a new - problem, and it concerns co-ords returned to the pointer - callbacks. (glutMotionFunc, glutMouseFunc) - Under X, you get co-ords in the range 0 +/- 2^15, under NT - you get 0..2^16. This is only really a problem when moving - above or to the left of the window. - eg dragging one pixel ABOVE the window will give :- - under x11 : y = -1 - under nt : y = 2^16 -1 - x Put in fix provided by Shane Clauson. - - (12/17/96) - o Idle functions not working properly for multiple windows. - x Fixed this by posting an idle message to every window in the - window list when idle. - - (12/18/96) - o glutSetCursor() was misbehaving (lthomas@cco.caltech.edu). - x Win32 requires that the hCursor member of the window class - be set to NULL when the class is registered or whenever the - mouse is moved, the original cursor is replaced (go - figure!). Now sets the cursor whenever a WM_MOUSEMOVE message - is received, because the WM_SETCURSOR event resets the cursor - even when in the decoration area. - - o Geometry is not being handled quite right. The numbers don't - take into account the window decorations. That is, if I say - make a window 100x100, then the WHOLE window (not just the - client area) is 100x100. Therefore, the client (opengl) area - is smaller than 100x100. (9/8/96) - x Fixed. Added code to subtract the decoration size on glutGet() - and add the decoration size on glutReshapeWindow(). - - o Multiple glutPostRedisplay() calls are NOT being combined. - To get round the "coalesce" problem on glutPostRedisplay, - the easiest solution is to roll-your-own coalesce by - keeping a global "dirty" flag in the app (eg replace all - calls to glutPostRedisplay with image_dirty=TRUE;), and to - handle image_dirty with a single glutPostRedisplay in the - idle callback when required. (erk - but increases - performance for my particular app (a rendering engine on - the end of a pipleine with a stream of graphics updates) by - a couple of orders of magnitude ! ) (9/8/96) - x Added code to coalesce redisplays. Every idle cycle, a - check is made to see which windows need redisplay, if they - need it, a redisplay is posted. The glutPostRedisplay() - call is just a stub that sets a flag. - - -THANKS: - - Special thanks to the following people for extensive testing, - suggestions, fixes and help: - - Alexander Stohr - Shane Clauson - Kenny Hoff - Richard Readings - Paul McQuesten - Philip Winston - JaeWoo Ahn - Joseph Galbraith - Paula Higgins - Sam Fortin - Chris Vale - Bill Mitchell - - and of course, the original author of GLUT: - Mark Kilgard. - - and many others... - - -COPYRIGHT: - -The OpenGL Utility Toolkit distribution for Win32 (Windows NT & -Windows 95) contains source code modified from the original source -code for GLUT version 3.3 which was developed by Mark J. Kilgard. The -original source code for GLUT is Copyright 1997 by Mark J. Kilgard. -GLUT for Win32 is Copyright 1997 by Nate Robins and is not in the -public domain, but it is freely distributable without licensing fees. -It is provided without guarantee or warrantee expressed or implied. -It was ported with the permission of Mark J. Kilgard by Nate Robins. - -THIS SOURCE CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OR MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - -OpenGL (R) is a registered trademark of Silicon Graphics, Inc. diff --git a/vendor/cegui-0.4.0-custom/PCRE-LICENSE b/vendor/cegui-0.4.0-custom/PCRE-LICENSE deleted file mode 100644 index dc6974d391..0000000000 --- a/vendor/cegui-0.4.0-custom/PCRE-LICENSE +++ /dev/null @@ -1,45 +0,0 @@ -PCRE LICENCE ------------- - -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - -Release 5 of PCRE is distributed under the terms of the "BSD" licence, as -specified below. The documentation for PCRE, supplied in the "doc" -directory, is distributed under the same terms as the software itself. - -Written by: Philip Hazel - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2004 University of Cambridge -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -End diff --git a/vendor/cegui-0.4.0-custom/README b/vendor/cegui-0.4.0-custom/README deleted file mode 100644 index 0730febb88..0000000000 --- a/vendor/cegui-0.4.0-custom/README +++ /dev/null @@ -1,69 +0,0 @@ -Crazy Eddie's GUI System Mk-2 -http://www.cegui.org.uk - -Copyright ©2004 - 2005 CEGUI Team & Contributing Authors - -This sofware contains an embedded version of PCRE by Philip Hazel. -PCRE is Copyright (c) 1997-2004 University of Cambridge, All rights reserved. -Please see PCRE-LICENSE for additional licensing information. - -This sofware can be compiled to optionally contain an embedded version of -TinyXML. Please the file TinyXML-License for additional licensing information. - -This software uses the Freetype2 library to provide most of the font loading and -rendering support. Freetype2 is a free, high-quality, and portable font engine; -see http://www.freetype.org for more information. - -This software can be compiled to optionally contain embedded copies of Lua and -tolua++. Please see the files luaCOPYRIGHT and tolua++README in the directory -./ScriptingModules/CEGUILua/lua_and_tolua++/ for additional licensing that may -apply to the use of these libraries. - -This is Crazy Eddie's GUI System Mk-2; a free library providing windowing and -widgets for graphics APIs and engines where such functionality is not natively -available or is severely lacking. The library is written in C++, is object -orientated, and is primarily targeted at games developers who should be spending -their time creating great games, not building GUI sub-systems... - -Note: In various documentation and online, the system is additionally referred -to as both CEGUI (which is the main namespace name), and cegui_mk2 (which is the -CVS module name of the Mk2 version of the system). - - -Documentation -============= -See also the following files: -COPYING - Contains the license terms for using the library. -AUTHORS - Contains a list of authors and contributors. - -The main start point for system documentation is the Readme.html file (still -TODO). API documentation built from the source by Doxygen -(http://www.doxygen.org) is available, and can be found online at -http://www.cegui.org.uk/api_reference/. For the very latest -information and help, visit the project home page at -http://www.cegui.org.uk. - - -Supported Systems -================= -Crazy Eddie's GUI System Mk-2 is currently known to compile and run on the -following systems: - -Various flavors of Linux using gcc. -Microsoft Windows running VC++6 (sp6), VC++7.0, or VC++7.1. -Apple Mac OS X running Xcode. - -It is very possible that the system will compile and run on other systems and -compilers, though the above systems have been tested. - - -Requirements -============ -As well as one of the above supported systems, Crazy Eddie's GUI System Mk-2 -also requires the use of some third party external libraries. These libraries -are as follows: - -Freetype2 (http://www.freetype.org) -Optionally: Xerces-C++ XML parser (http://xml.apache.org/xerces-c) - -Have Fun! diff --git a/vendor/cegui-0.4.0-custom/TODO b/vendor/cegui-0.4.0-custom/TODO deleted file mode 100644 index 80ce220ba9..0000000000 --- a/vendor/cegui-0.4.0-custom/TODO +++ /dev/null @@ -1,19 +0,0 @@ -Crazy Eddie's GUI System Mk-2 -http://www.cegui.org.uk - -Copyright ©2004 - 2005 CEGUI Team & Contributing Authors - - -The following is an incomplete list of the remaining jobs to be done on Crazy -Eddie's GUI System Mk-2: - -- More samples using samples framework. -- More tutorials. -- Update OgreRenderer to report true max texture size. -- Add clipboard (cut, copy, paste) support. -- Add undo support to editbox widgets. -- Add tree view widget. -- Add static text with minimal markup support. -- Add animation support. - -+ Lots of other things that I have forgotten to put on this list. diff --git a/vendor/cegui-0.4.0-custom/TinyXML-License b/vendor/cegui-0.4.0-custom/TinyXML-License deleted file mode 100644 index 9c6317d9a0..0000000000 --- a/vendor/cegui-0.4.0-custom/TinyXML-License +++ /dev/null @@ -1,21 +0,0 @@ -TinyXml is released under the zlib license: - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. - diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalButton.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalButton.h deleted file mode 100644 index db02baf25d..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalButton.h +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************ - filename: FalButton.h - created: Wed Jun 22 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalButton_h_ -#define _FalButton_h_ - -#include "FalModule.h" -#include "elements/CEGUIPushButton.h" -#include "CEGUIWindowFactory.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Button class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States (missing states will default to 'Normal'): - - Normal - Rendering for when the button is neither pushed or has the mouse hovering over it. - - Hover - Rendering for then the button has the mouse hovering over it. - - Pushed - Rendering for when the button is pushed. - - Disabled - Rendering for when the button is disabled. - */ - class FALAGARDBASE_API FalagardButton : public PushButton - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardButton(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardButton(); - - // overridden from ButtonBase. - void drawSelf(float z); - - // implementation of abstract methods in ButtonBase - void drawNormal(float z); - void drawHover(float z); - void drawPushed(float z); - void drawDisabled(float z); - - protected: - void doButtonRender(const String& state); - }; - - /*! - \brief - WindowFactory for FalagardButton type Window objects. - */ - class FALAGARDBASE_API FalagardButtonFactory : public WindowFactory - { - public: - FalagardButtonFactory(void) : WindowFactory(FalagardButton::WidgetTypeName) { } - ~FalagardButtonFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalButton_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCheckbox.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCheckbox.h deleted file mode 100644 index 166e33710e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCheckbox.h +++ /dev/null @@ -1,96 +0,0 @@ -/************************************************************************ - filename: FalCheckbox.h - created: Thu Jun 23 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalCheckbox_h_ -#define _FalCheckbox_h_ - -#include "FalModule.h" -#include "elements/CEGUICheckbox.h" -#include "CEGUIWindowFactory.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Checkbox class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States (missing states will default to 'Normal' or 'SelectedNormal' if selected) - - Normal - Rendering for when the checkbox is neither pushed or has the mouse hovering over it. - - Hover - Rendering for then the checkbox has the mouse hovering over it. - - Pushed - Rendering for when the checkbox is pushed. - - Disabled - Rendering for when the checkbox is disabled. - - SelectedNormal - Rendering for when the checkbox is selected and is neither pushed or has the mouse hovering over it. - - SelectedHover - Rendering for then the checkbox is selected and has the mouse hovering over it. - - SelectedPushed - Rendering for when the checkbox is selected and is pushed. - - SelectedDisabled - Rendering for when the checkbox is selected and is disabled. - */ - class FALAGARDBASE_API FalagardCheckbox : public Checkbox - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardCheckbox(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardCheckbox(); - - // overridden from ButtonBase. - void drawSelf(float z); - - // implementation of abstract methods in ButtonBase - void drawNormal(float z); - void drawHover(float z); - void drawPushed(float z); - void drawDisabled(float z); - - protected: - void doButtonRender(const String& state); - }; - - /*! - \brief - WindowFactory for FalagardCheckbox type Window objects. - */ - class FALAGARDBASE_API FalagardCheckboxFactory : public WindowFactory - { - public: - FalagardCheckboxFactory(void) : WindowFactory(FalagardCheckbox::WidgetTypeName) { } - ~FalagardCheckboxFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalCheckbox_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalComboDropList.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalComboDropList.h deleted file mode 100644 index 4a50c754e1..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalComboDropList.h +++ /dev/null @@ -1,95 +0,0 @@ -/************************************************************************ - filename: FalComboDropList.h - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalComboDropList_h_ -#define _FalComboDropList_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIComboDropList.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - ComboDropList class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Normal - - Disabled - - Named Areas: - - ItemRenderingArea - - ItemRenderingAreaHScroll - - ItemRenderingAreaVScroll - - ItemRenderingAreaHVScroll - - Child Widgets: - Scrollbar based widget with name suffix "__auto_vscrollbar__" - Scrollbar based widget with name suffix "__auto_hscrollbar__" - */ - class FALAGARDBASE_API FalagardComboDropList : public ComboDropList - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardComboDropList(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardComboDropList(); - - protected: - // overridden from ComboDropList base class. - Rect getListRenderArea(void) const; - Scrollbar* createVertScrollbar(const String& name) const; - Scrollbar* createHorzScrollbar(const String& name) const; - void cacheListboxBaseImagery(); - }; - - /*! - \brief - WindowFactory for FalagardComboDropList type Window objects. - */ - class FALAGARDBASE_API FalagardComboDropListFactory : public WindowFactory - { - public: - FalagardComboDropListFactory(void) : WindowFactory(FalagardComboDropList::WidgetTypeName) { } - ~FalagardComboDropListFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalComboDropList_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCombobox.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCombobox.h deleted file mode 100644 index 973df49a4a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalCombobox.h +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************ - filename: FalCombobox.h - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalCombobox_h_ -#define _FalCombobox_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUICombobox.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Combobox class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Normal - - Disabled - - Child Widgets: - PushButton based widget with name suffix "__auto_button__" - Editbox based widget with name suffix "__auto_editbox__" - ComboDropList based widget with name suffix "__auto_droplist__" - - - */ - class FALAGARDBASE_API FalagardCombobox : public Combobox - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardCombobox(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardCombobox(); - - protected: - // overridden from Combobox base class. - void populateRenderCache(); - Editbox* createEditbox(const String& name) const; - PushButton* createPushButton(const String& name) const; - ComboDropList* createDropList(const String& name) const; - }; - - /*! - \brief - WindowFactory for FalagardCombobox type Window objects. - */ - class FALAGARDBASE_API FalagardComboboxFactory : public WindowFactory - { - public: - FalagardComboboxFactory(void) : WindowFactory(FalagardCombobox::WidgetTypeName) { } - ~FalagardComboboxFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalCombobox_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalEditbox.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalEditbox.h deleted file mode 100644 index 59c2fdcc29..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalEditbox.h +++ /dev/null @@ -1,95 +0,0 @@ -/************************************************************************ - filename: FalEditbox.h - created: Sat Jun 25 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalEditbox_h_ -#define _FalEditbox_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIEditbox.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Editbox class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - Rendering for when the editbox is in enabled and is in read-write mode. - - ReadOnly - Rendering for when the editbox is in enabled and is in read-only mode. - - Disabled - Rendering for when the editbox is disabled. - - ActiveSelection - additional state rendered for text selection (the imagery in this section is rendered within the selection area.) - - InactiveSelection - additional state rendered for text selection (the imagery in this section is rendered within the selection area.) - - NamedAreas: - TextArea - area where text, selection, and carat imagery will appear. - - Imagery Sections: - - Carat - */ - class FALAGARDBASE_API FalagardEditbox : public Editbox - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardEditbox(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardEditbox(); - - protected: - // overridden from Editbox base class. - void populateRenderCache(); - size_t getTextIndexFromPosition(const Point& pt) const; - - // rendering internal vars - float d_lastTextOffset; //!< x rendering offset used last time we drew the widget. - }; - - /*! - \brief - WindowFactory for FalagardEditbox type Window objects. - */ - class FALAGARDBASE_API FalagardEditboxFactory : public WindowFactory - { - public: - FalagardEditboxFactory(void) : WindowFactory(FalagardEditbox::WidgetTypeName) { } - ~FalagardEditboxFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalEditbox_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalFrameWindow.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalFrameWindow.h deleted file mode 100644 index dce447497e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalFrameWindow.h +++ /dev/null @@ -1,103 +0,0 @@ -/************************************************************************ - filename: FalFrameWindow.h - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalFrameWindow_h_ -#define _FalFrameWindow_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIFrameWindow.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - FrameWindow class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - ActiveWithTitleWithFrame - - InactiveWithTitleWithFrame - - DisabledWithTitleWithFrame - - ActiveWithTitleNoFrame - - InactiveWithTitleNoFrame - - DisabledWithTitleNoFrame - - ActiveNoTitleWithFrame - - InactiveNoTitleWithFrame - - DisabledNoTitleWithFrame - - ActiveNoTitleNoFrame - - InactiveNoTitleNoFrame - - DisabledNoTitleNoFrame - - Named Areas: - - ClientWithTitleWithFrame - - ClientWithTitleNoFrame - - ClientNoTitleWithFrame - - ClientNoTitleNoFrame - */ - class FALAGARDBASE_API FalagardFrameWindow : public FrameWindow - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardFrameWindow(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardFrameWindow(); - - // overridden from Window base class. - Rect getUnclippedInnerRect(void) const; - - protected: - // overridden from FrameWindow base class. - void populateRenderCache(); - Titlebar* createTitlebar(const String& name) const; - PushButton* createCloseButton(const String& name) const; - }; - - /*! - \brief - WindowFactory for FalagardFrameWindow type Window objects. - */ - class FALAGARDBASE_API FalagardFrameWindowFactory : public WindowFactory - { - public: - FalagardFrameWindowFactory(void) : WindowFactory(FalagardFrameWindow::WidgetTypeName) { } - ~FalagardFrameWindowFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalFrameWindow_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeader.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeader.h deleted file mode 100644 index 3a79032cca..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeader.h +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************************************ - filename: FalListHeader.h - created: Wed Jul 6 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalListHeader_h_ -#define _FalListHeader_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIListHeader.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "FalListHeaderProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - ListHeader class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - Property Initialisers: - SegmentWidgetType - type of widget to create for segments. - - Imagery States: - - Enabled - basic rendering for enabled state. - - Disabled - basic rendering for disabled state. - */ - class FALAGARDBASE_API FalagardListHeader : public ListHeader - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardListHeader(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardListHeader(); - - const String& getSegmentWidgetType() const; - void setSegmentWidgetType(const String& type); - - protected: - // overridden from ListHeader base class. - void populateRenderCache(); - ListHeaderSegment* createNewSegment(const String& name) const; - void destroyListSegment(ListHeaderSegment* segment) const; - - // properties - static FalagardListHeaderProperties::SegmentWidgetType d_segmentWidgetTypeProperty; - - // data fields - String d_segmentWidgetType; - }; - - /*! - \brief - WindowFactory for FalagardListHeader type Window objects. - */ - class FALAGARDBASE_API FalagardListHeaderFactory : public WindowFactory - { - public: - FalagardListHeaderFactory(void) : WindowFactory(FalagardListHeader::WidgetTypeName) { } - ~FalagardListHeaderFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalListHeader_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderProperties.h deleted file mode 100644 index f6e49382a6..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderProperties.h +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************ - filename: FalListHeaderProperties.h - created: Wed Jul 6 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalListHeaderProperties_h_ -#define _FalListHeaderProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Properties for the Falagard ListHeader -*/ -namespace FalagardListHeaderProperties -{ -/*! -\brief - Property to access the segment sizing cursor image - - \par Usage: - - Name: SegmentWidgetType - - Format: "[widgetTypeName]". - -*/ -class SegmentWidgetType : public Property -{ -public: - SegmentWidgetType() : Property( - "SegmentWidgetType", - "Property to get/set the widget type used when creating header segments. Value should be \"[widgetTypeName]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} -} // End of CEGUI namespace section - - -#endif // end of guard _FalListHeaderProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegment.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegment.h deleted file mode 100644 index afc4769f75..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegment.h +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************************************ - filename: FalListHeaderSegment.h - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalListHeaderSegment_h_ -#define _FalListHeaderSegment_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIListHeaderSegment.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "FalListHeaderSegmentProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - ListHeaderSegment class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Disabled - - Normal - - Hover - - SplitterHover - - DragGhost - - AscendingSortIcon - - DescendingSortDown - - GhostAscendingSortIcon - - GhostDescendingSortDown - */ - class FALAGARDBASE_API FalagardListHeaderSegment : public ListHeaderSegment - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardListHeaderSegment(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardListHeaderSegment(); - - const Image* getSizingCursorImage() const; - void setSizingCursorImage(const Image* image); - void setSizingCursorImage(const String& imageset, const String& image); - - const Image* getMovingCursorImage() const; - void setMovingCursorImage(const Image* image); - void setMovingCursorImage(const String& imageset, const String& image); - - protected: - // overridden from ListHeaderSegment base class. - void populateRenderCache(); - - // properties - static FalagardListHeaderSegmentProperties::SizingCursorImage d_sizingCursorProperty; - static FalagardListHeaderSegmentProperties::MovingCursorImage d_movingCursorProperty; - }; - - /*! - \brief - WindowFactory for FalagardListHeaderSegment type Window objects. - */ - class FALAGARDBASE_API FalagardListHeaderSegmentFactory : public WindowFactory - { - public: - FalagardListHeaderSegmentFactory(void) : WindowFactory(FalagardListHeaderSegment::WidgetTypeName) { } - ~FalagardListHeaderSegmentFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalListHeaderSegment_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegmentProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegmentProperties.h deleted file mode 100644 index 2e1485ad18..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListHeaderSegmentProperties.h +++ /dev/null @@ -1,87 +0,0 @@ -/************************************************************************ - filename: FalListHeaderSegmentProperties.h - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalListHeaderSegmentProperties_h_ -#define _FalListHeaderSegmentProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Properties for the Falagard ListHeaderSegment -*/ -namespace FalagardListHeaderSegmentProperties -{ -/*! -\brief - Property to access the segment sizing cursor image - - \par Usage: - - Name: SizingCursorImage - - Format: "set: image:". - -*/ -class SizingCursorImage : public Property -{ -public: - SizingCursorImage() : Property( - "SizingCursorImage", - "Property to get/set the sizing cursor image for the List Header Segment. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the segment moving cursor image - - \par Usage: - - Name: MovingCursorImage - - Format: "set: image:". - -*/ -class MovingCursorImage : public Property -{ -public: - MovingCursorImage() : Property( - "MovingCursorImage", - "Property to get/set the moving cursor image for the List Header Segment. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} - -} // End of CEGUI namespace section - - -#endif // end of guard _FalListHeaderSegmentProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListbox.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListbox.h deleted file mode 100644 index 7b92247180..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalListbox.h +++ /dev/null @@ -1,95 +0,0 @@ -/************************************************************************ - filename: FalListbox.h - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalListbox_h_ -#define _FalListbox_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIListbox.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Listbox class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - - ItemRenderingArea - - ItemRenderingAreaHScroll - - ItemRenderingAreaVScroll - - ItemRenderingAreaHVScroll - - Child Widgets: - Scrollbar based widget with name suffix "__auto_vscrollbar__" - Scrollbar based widget with name suffix "__auto_hscrollbar__" - */ - class FALAGARDBASE_API FalagardListbox : public Listbox - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardListbox(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardListbox(); - - protected: - // overridden from Listbox base class. - Rect getListRenderArea(void) const; - Scrollbar* createVertScrollbar(const String& name) const; - Scrollbar* createHorzScrollbar(const String& name) const; - void cacheListboxBaseImagery(); - }; - - /*! - \brief - WindowFactory for FalagardListbox type Window objects. - */ - class FALAGARDBASE_API FalagardListboxFactory : public WindowFactory - { - public: - FalagardListboxFactory(void) : WindowFactory(FalagardListbox::WidgetTypeName) { } - ~FalagardListboxFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalListbox_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuBar.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuBar.h deleted file mode 100644 index 87fcf644b7..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuBar.h +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************ - filename: FalMenubar.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalMenubar_h_ -#define _FalMenubar_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIMenubar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Menubar class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - ItemRenderArea - */ - class FALAGARDBASE_API FalagardMenubar : public Menubar - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardMenubar(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardMenubar(); - - protected: - // overridden from Menubar base class. - void populateRenderCache(); - void sizeToContent_impl(void); - Rect getItemRenderArea(void) const; - }; - - /*! - \brief - WindowFactory for FalagardMenubar type Window objects. - */ - class FALAGARDBASE_API FalagardMenubarFactory : public WindowFactory - { - public: - FalagardMenubarFactory(void) : WindowFactory(FalagardMenubar::WidgetTypeName) { } - ~FalagardMenubarFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - -#endif // end of guard _FalMenubar_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuItem.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuItem.h deleted file mode 100644 index 5fd1562538..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMenuItem.h +++ /dev/null @@ -1,90 +0,0 @@ -/************************************************************************ - filename: FalMenuItem.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalMenuItem_h_ -#define _FalMenuItem_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIMenuItem.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - MenuItem class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - EnabledNormal - - EnabledHover - - EnabledPushed - - EnabledPopupOpen - - DisabledNormal - - DisabledHover - - DisabledPushed - - DisabledPopupOpen - - PopupClosedIcon - Additional state drawn when item has a pop-up attached (in closed state) - - PopupOpenIcon - Additional state drawn when item has a pop-up attached (in open state) - */ - class FALAGARDBASE_API FalagardMenuItem : public MenuItem - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardMenuItem(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardMenuItem(); - - protected: - // overridden from MenuItem base class. - void populateRenderCache(); - }; - - /*! - \brief - WindowFactory for FalagardMenuItem type Window objects. - */ - class FALAGARDBASE_API FalagardMenuItemFactory : public WindowFactory - { - public: - FalagardMenuItemFactory(void) : WindowFactory(FalagardMenuItem::WidgetTypeName) { } - ~FalagardMenuItemFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalMenuItem_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalModule.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalModule.h deleted file mode 100644 index 09bb7e6454..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalModule.h +++ /dev/null @@ -1,56 +0,0 @@ -/************************************************************************ - filename: FalModule.h - created: Wed Jun 22 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalModule_h_ -#define _FalModule_h_ - -#include "CEGUIString.h" - -/************************************************************************* - Import / Export control macros -*************************************************************************/ -#if defined( __WIN32__ ) || defined( _WIN32 ) -# ifdef FALAGARDBASE_EXPORTS -# define FALAGARDBASE_API __declspec(dllexport) -# else -# define FALAGARDBASE_API __declspec(dllimport) -# endif -#else -# define FALAGARDBASE_API -#endif - -// Statically linked, so blank it out -#undef FALAGARDBASE_API -#define FALAGARDBASE_API - -// forward refs -class CEGUI::WindowFactory; - -/************************************************************************* - Prototypes -*************************************************************************/ -extern "C" FALAGARDBASE_API void registerFactory(const CEGUI::String& type_name); -FALAGARDBASE_API CEGUI::uint registerAllFactoriesF(void); -// implementation helper function -void doSafeFactoryRegistration(CEGUI::WindowFactory* factory); -#endif // end of guard _FalModule_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiColumnList.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiColumnList.h deleted file mode 100644 index 3c22c8595f..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiColumnList.h +++ /dev/null @@ -1,98 +0,0 @@ -/************************************************************************ - filename: FalMultiColumnList.h - created: Wed Jul 6 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalMultiColumnList_h_ -#define _FalMultiColumnList_h_ - -#include "FalModule.h" -#include "elements/CEGUIMultiColumnList.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowFactory.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - MultiColumnList class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - - ItemRenderingArea - area where items will be drawn when no scrollbars are visible. - - ItemRenderingAreaHScroll - area where items will be drawn when the horizontal scrollbar is visible. - - ItemRenderingAreaVScroll - area where items will be drawn when the vertical scrollbar is visible. - - ItemRenderingAreaHVScroll - area where items will be drawn when both scrollbars are visible. - - Child Widgets: - Scrollbar based widget with name suffix "__auto_vscrollbar__" - Scrollbar based widget with name suffix "__auto_hscrollbar__" - ListHeader based widget with name suffix "__auto_listheader__" - */ - class FALAGARDBASE_API FalagardMultiColumnList : public MultiColumnList - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardMultiColumnList(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardMultiColumnList(); - - protected: - // overridden from MultiColumnList base class. - Rect getListRenderArea(void) const; - ListHeader* createListHeader(const String& name) const; - Scrollbar* createVertScrollbar(const String& name) const; - Scrollbar* createHorzScrollbar(const String& name) const; - void cacheListboxBaseImagery(); - }; - - /*! - \brief - WindowFactory for FalagardMultiColumnList type Window objects. - */ - class FALAGARDBASE_API FalagardMultiColumnListFactory : public WindowFactory - { - public: - FalagardMultiColumnListFactory(void) : WindowFactory(FalagardMultiColumnList::WidgetTypeName) { } - ~FalagardMultiColumnListFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalMultiColumnList_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditbox.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditbox.h deleted file mode 100644 index 113bbd4fb1..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditbox.h +++ /dev/null @@ -1,117 +0,0 @@ -/************************************************************************ - filename: FalMultiLineEditbox.h - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalMultiLineEditbox_h_ -#define _FalMultiLineEditbox_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIMultiLineEditbox.h" -#include "FalMultiLineEditboxProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - MultiLineEditbox class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - Rendering for when the editbox is in enabled and is in read-write mode. - - ReadOnly - Rendering for when the editbox is in enabled and is in read-only mode. - - Disabled - Rendering for when the editbox is disabled. - - NamedAreas: - TextArea - area where text, selection, and carat imagery will appear. - TextAreaHScroll - TextArea when only horizontal scrollbar is visible. - TextAreaVScroll - TextArea when only vertical scrollbar is visible. - TextAreaHVScroll - TextArea when both horizontal and vertical scrollbar is visible. - - Imagery Sections: - - Carat - - Child Widgets: - Scrollbar based widget with name suffix "__auto_vscrollbar__" - Scrollbar based widget with name suffix "__auto_hscrollbar__" - - */ - class FALAGARDBASE_API FalagardMultiLineEditbox : public MultiLineEditbox - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardMultiLineEditbox(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardMultiLineEditbox(); - - const Image* getSelectionBrushImage() const; - void setSelectionBrushImage(const Image* image); - - protected: - // overridden from MultiLineEditbox base class. - Scrollbar* createVertScrollbar(const String& name) const; - Scrollbar* createHorzScrollbar(const String& name) const; - void cacheEditboxBaseImagery(); - void cacheCaratImagery(const Rect& textArea); - Rect getTextRenderArea(void) const; - - // properties - static FalagardMultiLineEditboxProperties::SelectionBrushImage d_selectionBrushProperty; - }; - - /*! - \brief - WindowFactory for FalagardMultiLineEditbox type Window objects. - */ - class FALAGARDBASE_API FalagardMultiLineEditboxFactory : public WindowFactory - { - public: - FalagardMultiLineEditboxFactory(void) : WindowFactory(FalagardMultiLineEditbox::WidgetTypeName) { } - ~FalagardMultiLineEditboxFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalMultiLineEditbox_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditboxProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditboxProperties.h deleted file mode 100644 index 61d78fa18c..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalMultiLineEditboxProperties.h +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************ - filename: FalMultiLineEditboxProperties.h - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalMultiLineEditboxProperties_h_ -#define _FalMultiLineEditboxProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Properties for the Falagard MultiLineEditbox -*/ -namespace FalagardMultiLineEditboxProperties -{ - /*! - \brief - Property to access the selection brush image - - \par Usage: - - Name: SelectionBrushImage - - Format: "set: image:". - - */ - class SelectionBrushImage : public Property - { - public: - SelectionBrushImage() : Property( - "SelectionBrushImage", - "Property to get/set the selection brush image for the editbox. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} - -} // End of CEGUI namespace section - -#endif // end of guard _FalMultiLineEditboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalPopupMenu.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalPopupMenu.h deleted file mode 100644 index ce8f340964..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalPopupMenu.h +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************ - filename: FalPopupMenu.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalPopupMenu_h_ -#define _FalPopupMenu_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIPopupMenu.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - PopupMenu class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - ItemRenderArea - */ - class FALAGARDBASE_API FalagardPopupMenu : public PopupMenu - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardPopupMenu(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardPopupMenu(); - - protected: - // overridden from PopupMenu base class. - void populateRenderCache(); - void sizeToContent_impl(void); - Rect getItemRenderArea(void) const; - }; - - /*! - \brief - WindowFactory for FalagardPopupMenu type Window objects. - */ - class FALAGARDBASE_API FalagardPopupMenuFactory : public WindowFactory - { - public: - FalagardPopupMenuFactory(void) : WindowFactory(FalagardPopupMenu::WidgetTypeName) { } - ~FalagardPopupMenuFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - -#endif // end of guard _FalPopupMenu_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBar.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBar.h deleted file mode 100644 index d2e9bd8b62..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBar.h +++ /dev/null @@ -1,111 +0,0 @@ -/************************************************************************ - filename: FalProgressBar.h - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalProgressBar_h_ -#define _FalProgressBar_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIProgressBar.h" -#include "FalProgressBarProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - ProgressBar class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - EnabledProgress - - DisabledProgress - - Named Areas: - - ProgressArea - */ - class FALAGARDBASE_API FalagardProgressBar : public ProgressBar - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardProgressBar(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardProgressBar(); - - bool isVertical() const; - bool isReversed() const; - - void setVertical(bool setting); - void setReversed(bool setting); - - protected: - // overridden from ProgressBar base class. - void populateRenderCache(); - - // settings to make this class universal. - bool d_vertical; //!< True if progress bar operates on the vertical plane. - bool d_reversed; //!< True if progress grows in the opposite direction to usual (i.e. to the left / downwards). - - // property objects - static FalagardProgressBarProperties::VerticalProgress d_verticalProperty; - static FalagardProgressBarProperties::ReversedProgress d_reversedProperty; - }; - - /*! - \brief - WindowFactory for FalagardProgressBar type Window objects. - */ - class FALAGARDBASE_API FalagardProgressBarFactory : public WindowFactory - { - public: - FalagardProgressBarFactory(void) : WindowFactory(FalagardProgressBar::WidgetTypeName) { } - ~FalagardProgressBarFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalProgressBar_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBarProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBarProperties.h deleted file mode 100644 index 55fc348b47..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalProgressBarProperties.h +++ /dev/null @@ -1,94 +0,0 @@ -/************************************************************************ - filename: FalProgressBarProperties.h - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalProgressBarProperties_h_ -#define _FalProgressBarProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Namespace containing the specialised properties interface for the Progress Bar under Falagard class -*/ -namespace FalagardProgressBarProperties -{ - /*! - \brief - Property to access the setting that controls whether the progress bar is horizontal or vertical. - - \par Usage: - - Name: VerticalProgress - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the progress bar's operates in the vertical direction. - - "False" to indicate the progress bar's operates in the horizontal direction. - */ - class VerticalProgress : public Property - { - public: - VerticalProgress() : Property( - "VerticalProgress", - "Property to get/set whether the ProgressBar operates in the vertical direction. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the setting that controls the direction that progress 'grows' towards - - \par Usage: - - Name: ReversedProgress - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the progress grows towards the left or bottom edge. - - "False" to indicate the progress grows towards the right or top edge. - */ - class ReversedProgress : public Property - { - public: - ReversedProgress() : Property( - "ReversedProgress", - "Property to get/set whether the ProgressBar operates in reversed direction. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} - -} // End of CEGUI namespace section - - -#endif // end of guard _FalProgressBarProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalRadioButton.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalRadioButton.h deleted file mode 100644 index 6efa626c1a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalRadioButton.h +++ /dev/null @@ -1,96 +0,0 @@ -/************************************************************************ - filename: FalRadioButton.h - created: Thu Jun 23 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalRadioButton_h_ -#define _FalRadioButton_h_ - -#include "FalModule.h" -#include "elements/CEGUIRadioButton.h" -#include "CEGUIWindowFactory.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Radio button class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States (missing states will default to 'Normal' or 'SelectedNormal' if selected) - - Normal - Rendering for when the radio button is neither pushed or has the mouse hovering over it. - - Hover - Rendering for then the radio button has the mouse hovering over it. - - Pushed - Rendering for when the radio button is pushed. - - Disabled - Rendering for when the radio button is disabled. - - SelectedNormal - Rendering for when the radio button is selected and is neither pushed or has the mouse hovering over it. - - SelectedHover - Rendering for then the radio button is selected and has the mouse hovering over it. - - SelectedPushed - Rendering for when the radio button is selected and is pushed. - - SelectedDisabled - Rendering for when the radio button is selected and is disabled. - */ - class FALAGARDBASE_API FalagardRadioButton : public RadioButton - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardRadioButton(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardRadioButton(); - - // overridden from ButtonBase. - void drawSelf(float z); - - // implementation of abstract methods in ButtonBase - void drawNormal(float z); - void drawHover(float z); - void drawPushed(float z); - void drawDisabled(float z); - - protected: - void doButtonRender(const String& state); - }; - - /*! - \brief - WindowFactory for FalagardRadioButton type Window objects. - */ - class FALAGARDBASE_API FalagardRadioButtonFactory : public WindowFactory - { - public: - FalagardRadioButtonFactory(void) : WindowFactory(FalagardRadioButton::WidgetTypeName) { } - ~FalagardRadioButtonFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalRadioButton_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollablePane.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollablePane.h deleted file mode 100644 index 78d253538b..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollablePane.h +++ /dev/null @@ -1,95 +0,0 @@ -/************************************************************************ - filename: FalScrollablePane.h - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalScrollablePane_h_ -#define _FalScrollablePane_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIScrollablePane.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - ScrollablePane class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - - ViewableArea - area where content will be drawn when no scrollbars are visible. - - ViewableAreaHScroll - area where content will be drawn when the horizontal scrollbar is visible. - - ViewableAreaVScroll - area where content will be drawn when the vertical scrollbar is visible. - - ViewableAreaHVScroll - area where content will be drawn when both scrollbars are visible. - - Child Widgets: - Scrollbar based widget with name suffix "__auto_vscrollbar__" - Scrollbar based widget with name suffix "__auto_hscrollbar__" - - */ - class FALAGARDBASE_API FalagardScrollablePane : public ScrollablePane - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardScrollablePane(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardScrollablePane(); - - protected: - // overridden from ScrollablePane base class. - void populateRenderCache(); - Scrollbar* createVerticalScrollbar(const String& name) const; - Scrollbar* createHorizontalScrollbar(const String& name) const; - Rect getViewableArea(void) const; - }; - - /*! - \brief - WindowFactory for FalagardScrollablePane type Window objects. - */ - class FALAGARDBASE_API FalagardScrollablePaneFactory : public WindowFactory - { - public: - FalagardScrollablePaneFactory(void) : WindowFactory(FalagardScrollablePane::WidgetTypeName) { } - ~FalagardScrollablePaneFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - -#endif diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbar.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbar.h deleted file mode 100644 index ed53328e0a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbar.h +++ /dev/null @@ -1,116 +0,0 @@ -/************************************************************************ - filename: FalScrollbar.h - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalScrollbar_h_ -#define _FalScrollbar_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIScrollbar.h" -#include "FalScrollbarProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Scrollbar class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - - ThumbTrackArea - - Child Widgets: - Thumb based widget with name suffix "__auto_thumb__" - PushButton based widget with name suffix "__auto_incbtn__" - PushButton based widget with name suffix "__auto_decbtn__" - */ - class FALAGARDBASE_API FalagardScrollbar : public Scrollbar - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardScrollbar(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardScrollbar(); - - bool isVertical() const; - void setVertical(bool setting); - - protected: - // data members - bool d_vertical; //!< True if slider operates in vertical direction. - - // overridden from Scrollbar base class. - void populateRenderCache(); - Thumb* createThumb(const String& name) const; - PushButton* createIncreaseButton(const String& name) const; - PushButton* createDecreaseButton(const String& name) const; - void performChildWindowLayout(); - void updateThumb(void); - float getValueFromThumb(void) const; - float getAdjustDirectionFromPoint(const Point& pt) const; - - // property objects - static FalagardScrollbarProperties::VerticalScrollbar d_verticalProperty; - }; - - /*! - \brief - WindowFactory for FalagardScrollbar type Window objects. - */ - class FALAGARDBASE_API FalagardScrollbarFactory : public WindowFactory - { - public: - FalagardScrollbarFactory(void) : WindowFactory(FalagardScrollbar::WidgetTypeName) { } - ~FalagardScrollbarFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalScrollbar_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbarProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbarProperties.h deleted file mode 100644 index 2991a3cfc9..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalScrollbarProperties.h +++ /dev/null @@ -1,68 +0,0 @@ -/************************************************************************ - filename: FalScrollbarProperties.h - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalScrollbarProperties_h_ -#define _FalScrollbarProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Namespace containing the specialised properties interface for the Scrollbar under Falagard class -*/ -namespace FalagardScrollbarProperties -{ - /*! - \brief - Property to access the setting that controls whether the scrollbar is horizontal or vertical. - - \par Usage: - - Name: VerticalScrollbar - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the scrollbar operates in the vertical direction. - - "False" to indicate the scrollbar operates in the horizontal direction. - */ - class VerticalScrollbar : public Property - { - public: - VerticalScrollbar() : Property( - "VerticalScrollbar", - "Property to get/set whether the Scrollbar operates in the vertical direction. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} - -} // End of CEGUI namespace section - - -#endif // end of guard _FalScrollbarProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSlider.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSlider.h deleted file mode 100644 index 43ada120c0..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSlider.h +++ /dev/null @@ -1,117 +0,0 @@ -/************************************************************************ - filename: FalSlider.h - created: Sun Jul 3 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalSlider_h_ -#define _FalSlider_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUISlider.h" -#include "FalSliderProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Slider class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - - ThumbTrackArea - - Child Widgets: - Thumb based widget with name suffix "__auto_thumb__" - */ - class FALAGARDBASE_API FalagardSlider : public Slider - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardSlider(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardSlider(); - - bool isVertical() const; - void setVertical(bool setting); - - bool isReversedDirection() const; - void setReversedDirection(bool setting); - - protected: - // data members - bool d_vertical; //!< True if slider operates in vertical direction. - bool d_reversed; //!< true if slider operates in reversed direction to 'normal'. - - // overridden from Slider base class. - void populateRenderCache(); - Thumb* createThumb(const String& name) const; - void performChildWindowLayout(); - void updateThumb(void); - float getValueFromThumb(void) const; - float getAdjustDirectionFromPoint(const Point& pt) const; - - // property objects - static FalagardSliderProperties::VerticalSlider d_verticalProperty; - static FalagardSliderProperties::ReversedDirection d_reversedProperty; - }; - - /*! - \brief - WindowFactory for FalagardSlider type Window objects. - */ - class FALAGARDBASE_API FalagardSliderFactory : public WindowFactory - { - public: - FalagardSliderFactory(void) : WindowFactory(FalagardSlider::WidgetTypeName) { } - ~FalagardSliderFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalSlider_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSliderProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSliderProperties.h deleted file mode 100644 index 3db2f4e8a1..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSliderProperties.h +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************ - filename: FalSliderProperties.h - created: Sun Jul 3 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalSliderProperties_h_ -#define _FalSliderProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Namespace containing the specialised properties interface for the Slider under Falagard class -*/ -namespace FalagardSliderProperties -{ - /*! - \brief - Property to access the setting that controls whether the slider is horizontal or vertical. - - \par Usage: - - Name: VerticalSlider - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the slider operates in the vertical direction. - - "False" to indicate the slider operates in the horizontal direction. - */ - class VerticalSlider : public Property - { - public: - VerticalSlider() : Property( - "VerticalSlider", - "Property to get/set whether the Slider operates in the vertical direction. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the setting that controls the positive direction for the slider - - \par Usage: - - Name: ReversedDirection - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the slider value increases towards the bottom or left edges. - - "False" to indicate the slider value increases towards the top or right edges (default). - */ - class ReversedDirection : public Property - { - public: - ReversedDirection() : Property( - "ReversedDirection", - "Property to get/set whether the Slider operates in reversed direction. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; -} - -} // End of CEGUI namespace section - - -#endif // end of guard _FalSliderProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSpinner.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSpinner.h deleted file mode 100644 index 2b7af56d1c..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSpinner.h +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************************************ - filename: FalSpinner.h - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalSpinner_h_ -#define _FalSpinner_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUISpinner.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Spinner class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Normal - - Disabled - - Child Widgets: - Editbox based widget with name suffix "__auto_editbox__" - PushButton based widget with name suffix "__auto_incbtn__" - PushButton based widget with name suffix "__auto_decbtn__" - */ - class FALAGARDBASE_API FalagardSpinner : public Spinner - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardSpinner(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardSpinner(); - - protected: - // overridden from Spinner base class. - void populateRenderCache(); - PushButton* createIncreaseButton(const String& name) const; - PushButton* createDecreaseButton(const String& name) const; - Editbox* createEditbox(const String& name) const; - - }; - - /*! - \brief - WindowFactory for FalagardSpinner type Window objects. - */ - class FALAGARDBASE_API FalagardSpinnerFactory : public WindowFactory - { - public: - FalagardSpinnerFactory(void) : WindowFactory(FalagardSpinner::WidgetTypeName) { } - ~FalagardSpinnerFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalSpinner_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticImage.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticImage.h deleted file mode 100644 index 7b40de2009..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticImage.h +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - filename: FalStaticImage.h - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalStaticImage_h_ -#define _FalStaticImage_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIStaticImage.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - StaticImage class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - basic rendering for enabled state. - - Disabled - basic rendering for disabled state. - - EnabledFrame - frame rendering for enabled state - - DisabledFrame - frame rendering for disabled state. - - EnabledBackground - backdrop rendering for enabled state - - DisabledBackground - backdrop rendering for disabled state - - Named Areas: - - WithFrameImageRenderArea - Area to render image into when the frame is enabled. - - NoFrameImageRenderArea - Area to render image into when the frame is disabled. - */ - class FALAGARDBASE_API FalagardStaticImage : public StaticImage - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardStaticImage(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardStaticImage(); - - // overridden from StaticImage base class. - Rect getUnclippedInnerRect(void) const; - - protected: - // overridden from StaticImage base class. - void populateRenderCache(); - }; - - /*! - \brief - WindowFactory for FalagardStaticImage type Window objects. - */ - class FALAGARDBASE_API FalagardStaticImageFactory : public WindowFactory - { - public: - FalagardStaticImageFactory(void) : WindowFactory(FalagardStaticImage::WidgetTypeName) { } - ~FalagardStaticImageFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalStaticImage_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticText.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticText.h deleted file mode 100644 index 847fbe1275..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalStaticText.h +++ /dev/null @@ -1,95 +0,0 @@ -/************************************************************************ - filename: FalStaticText.h - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalStaticText_h_ -#define _FalStaticText_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIStaticText.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - StaticText class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - basic rendering for enabled state. - - Disabled - basic rendering for disabled state. - - EnabledFrame - frame rendering for enabled state - - DisabledFrame - frame rendering for disabled state. - - EnabledBackground - backdrop rendering for enabled state - - DisabledBackground - backdrop rendering for disabled state - - Named Areas (missing areas will default to 'TextRenderArea'): - TextRenderArea - TextRenderAreaHScroll - TextRenderAreaVScroll - TextRenderAreaHVScroll - */ - class FALAGARDBASE_API FalagardStaticText : public StaticText - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardStaticText(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardStaticText(); - - protected: - // overridden from StaticText base class. - void populateRenderCache(); - Scrollbar* createVertScrollbar(const String& name) const; - Scrollbar* createHorzScrollbar(const String& name) const; - Rect getTextRenderArea(void) const; - }; - - /*! - \brief - WindowFactory for FalagardStaticText type Window objects. - */ - class FALAGARDBASE_API FalagardStaticTextFactory : public WindowFactory - { - public: - FalagardStaticTextFactory(void) : WindowFactory(FalagardStaticText::WidgetTypeName) { } - ~FalagardStaticTextFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalStaticText_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSystemButton.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSystemButton.h deleted file mode 100644 index a26eddfded..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalSystemButton.h +++ /dev/null @@ -1,82 +0,0 @@ -/************************************************************************ - filename: FalSystemButton.h - created: Sat Jul 9 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalSystemButton_h_ -#define _FalSystemButton_h_ - -#include "FalModule.h" -#include "FalButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - SystemButton class for the FalagardBase module. This class should be used for 'system' buttons on - a FrameWindow, such as the close button. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States (missing states will default to 'Normal'): - - Normal - Rendering for when the button is neither pushed or has the mouse hovering over it. - - Hover - Rendering for then the button has the mouse hovering over it. - - Pushed - Rendering for when the button is pushed. - - Disabled - Rendering for when the button is disabled. - */ - class FALAGARDBASE_API FalagardSystemButton : public FalagardButton - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardSystemButton(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardSystemButton(); - - Rect getPixelRect(void) const; - }; - - /*! - \brief - WindowFactory for FalagardSystemButton type Window objects. - */ - class FALAGARDBASE_API FalagardSystemButtonFactory : public WindowFactory - { - public: - FalagardSystemButtonFactory(void) : WindowFactory(FalagardSystemButton::WidgetTypeName) { } - ~FalagardSystemButtonFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalSystemSystemButton_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabButton.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabButton.h deleted file mode 100644 index dde0c6b3fc..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabButton.h +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************ - filename: FalTabButton.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalTabButton_h_ -#define _FalTabButton_h_ - -#include "FalModule.h" -#include "elements/CEGUITabButton.h" -#include "CEGUIWindowFactory.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - TabButton class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States (missing states will default to 'Normal'): - - Normal - Rendering for when the tab button is neither selected nor has the mouse hovering over it. - - Hover - Rendering for then the tab button has the mouse hovering over it. - - Selected - Rendering for when the tab button is the button for the selected tab. - - Disabled - Rendering for when the tab button is disabled. - */ - class FALAGARDBASE_API FalagardTabButton : public TabButton - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardTabButton(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardTabButton(); - - // overridden from TabButton base class. - void drawSelf(float z); - - // implementation of abstract methods in TabButton base class. - void drawNormal(float z); - void drawHover(float z); - void drawPushed(float z); - void drawDisabled(float z); - - protected: - void doTabButtonRender(const String& state); - }; - - /*! - \brief - WindowFactory for FalagardTabButton type Window objects. - */ - class FALAGARDBASE_API FalagardTabButtonFactory : public WindowFactory - { - public: - FalagardTabButtonFactory(void) : WindowFactory(FalagardTabButton::WidgetTypeName) { } - ~FalagardTabButtonFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalTabButton_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControl.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControl.h deleted file mode 100644 index 80aa85ff3e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControl.h +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************************************ - filename: FalTabControl.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalTabControl_h_ -#define _FalTabControl_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUITabControl.h" -#include "FalTabControlProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - TabControl class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Child Widgets: - TabPane based widget with name suffix "__auto_TabPane__" - optional: DefaultWindow to contain tab buttons with name suffix "__auto_TabPane__Buttons" - - \note - The current TabControl base class enforces a strict layout, so while imagery can be customised - as desired, the general layout of the component widgets is, at least for the time being, fixed. - */ - class FALAGARDBASE_API FalagardTabControl : public TabControl - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardTabControl(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardTabControl(); - - const String& getTabButtonType() const; - void setTabButtonType(const String& type); - - protected: - // overridden from TabControl base class. - void populateRenderCache(); - TabPane* createTabContentPane(const String& name) const; - TabButton* createTabButton(const String& name) const; - Window* createTabButtonPane(const String& name) const; - - // data fields - String d_tabButtonType; - - // properties - static FalagardTabControlProperties::TabButtonType d_tabButtonTypeProperty; - }; - - /*! - \brief - WindowFactory for FalagardTabControl type Window objects. - */ - class FALAGARDBASE_API FalagardTabControlFactory : public WindowFactory - { - public: - FalagardTabControlFactory(void) : WindowFactory(FalagardTabControl::WidgetTypeName) { } - ~FalagardTabControlFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _FalTabControl_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControlProperties.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControlProperties.h deleted file mode 100644 index d698694f0e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabControlProperties.h +++ /dev/null @@ -1,62 +0,0 @@ -/************************************************************************ - filename: FalTabControlProperties.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalTabControlProperties_h_ -#define _FalTabControlProperties_h_ -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Properties for the Falagard TabControl -*/ -namespace FalagardTabControlProperties -{ -/*! -\brief - Property to access the segment sizing cursor image - - \par Usage: - - Name: TabButtonType - - Format: "[widgetTypeName]". - -*/ -class TabButtonType : public Property -{ -public: - TabButtonType() : Property( - "TabButtonType", - "Property to get/set the widget type used when creating tab buttons. Value should be \"[widgetTypeName]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} -} // End of CEGUI namespace section - -#endif // end of guard _FalTabControlProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabPane.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabPane.h deleted file mode 100644 index 40af4a5634..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTabPane.h +++ /dev/null @@ -1,82 +0,0 @@ -/************************************************************************ - filename: FalTabPane.h - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalTabPane_h_ -#define _FalTabPane_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUITabPane.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - TabPane class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - */ - class FALAGARDBASE_API FalagardTabPane : public TabPane - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardTabPane(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardTabPane(); - - protected: - // overridden from TabPane base class. - void populateRenderCache(); - }; - - /*! - \brief - WindowFactory for FalagardTabPane type Window objects. - */ - class FALAGARDBASE_API FalagardTabPaneFactory : public WindowFactory - { - public: - FalagardTabPaneFactory(void) : WindowFactory(FalagardTabPane::WidgetTypeName) { } - ~FalagardTabPaneFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalTabPane_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalThumb.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalThumb.h deleted file mode 100644 index 2c0bc08cc2..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalThumb.h +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - filename: FalThumb.h - created: Sun Jul 3 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalThumb_h_ -#define _FalThumb_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIThumb.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Thumb class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States (missing states will default to 'Normal'): - - Normal - Rendering for when the thumb is neither pushed or has the mouse hovering over it. - - Hover - Rendering for then the thumb has the mouse hovering over it. - - Pushed - Rendering for when the thumb is pushed. - - Disabled - Rendering for when the thumb is disabled. - */ - class FALAGARDBASE_API FalagardThumb : public Thumb - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardThumb(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardThumb(); - - protected: - // overridden from ButtonBase. - void drawSelf(float z); - - // implementation of abstract methods in Thumb base class - void drawNormal(float z); - void drawHover(float z); - void drawPushed(float z); - void drawDisabled(float z); - - void doThumbRender(const String& state); - - }; - - /*! - \brief - WindowFactory for FalagardThumb type Window objects. - */ - class FALAGARDBASE_API FalagardThumbFactory : public WindowFactory - { - public: - FalagardThumbFactory(void) : WindowFactory(FalagardThumb::WidgetTypeName) { } - ~FalagardThumbFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalThumb_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTitlebar.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTitlebar.h deleted file mode 100644 index 6ac12468c2..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTitlebar.h +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************ - filename: FalTitlebar.h - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalTitlebar_h_ -#define _FalTitlebar_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUITitlebar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Titlebar class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Active - - Inactive - - Disabled - */ - class FALAGARDBASE_API FalagardTitlebar : public Titlebar - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardTitlebar(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardTitlebar(); - - // overridden from Window base class. - Rect getPixelRect(void) const; - - protected: - // overridden from Titlebar base class. - void populateRenderCache(); - }; - - /*! - \brief - WindowFactory for FalagardTitlebar type Window objects. - */ - class FALAGARDBASE_API FalagardTitlebarFactory : public WindowFactory - { - public: - FalagardTitlebarFactory(void) : WindowFactory(FalagardTitlebar::WidgetTypeName) { } - ~FalagardTitlebarFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalTitlebar_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTooltip.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTooltip.h deleted file mode 100644 index 9d57ac698a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/FalTooltip.h +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************************************ - filename: FalTooltip.h - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _FalTooltip_h_ -#define _FalTooltip_h_ - -#include "FalModule.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUITooltip.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Tooltip class for the FalagardBase module. - - This class requires LookNFeel to be assigned. The LookNFeel should provide the following: - - States: - - Enabled - - Disabled - - Named Areas: - TextArea - Typically this would be the same area as the TextComponent you define to receive the tooltip text. This - named area is used when deciding how to dynamically size the Tooltip so that text is not clipped. - */ - class FALAGARDBASE_API FalagardTooltip : public Tooltip - { - public: - static const utf8 WidgetTypeName[]; //!< type name for this widget. - - /*! - \brief - Constructor - */ - FalagardTooltip(const String& type, const String& name); - - /*! - \brief - Destructor - */ - ~FalagardTooltip(); - - protected: - // overridden from Tooltip base class. - void populateRenderCache(); - Size getTextSize() const; - - }; - - /*! - \brief - WindowFactory for FalagardTooltip type Window objects. - */ - class FALAGARDBASE_API FalagardTooltipFactory : public WindowFactory - { - public: - FalagardTooltipFactory(void) : WindowFactory(FalagardTooltip::WidgetTypeName) { } - ~FalagardTooltipFactory(void){} - Window* createWindow(const String& name); - void destroyWindow(Window* window); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _FalTooltip_h_ diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/Makefile.am b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/Makefile.am deleted file mode 100644 index dab9112f37..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -SUBDIRS = . -noinst_HEADERS = FalButton.h \ - FalCheckbox.h \ - FalComboDropList.h \ - FalCombobox.h \ - FalEditbox.h \ - FalFrameWindow.h \ - FalListHeader.h \ - FalListHeaderProperties.h \ - FalListHeaderSegment.h \ - FalListHeaderSegmentProperties.h \ - FalListbox.h \ - FalMenuBar.h \ - FalMenuItem.h \ - FalModule.h \ - FalMultiColumnList.h \ - FalMultiLineEditbox.h \ - FalMultiLineEditboxProperties.h \ - FalPopupMenu.h \ - FalProgressBar.h \ - FalProgressBarProperties.h \ - FalRadioButton.h \ - FalScrollablePane.h \ - FalScrollbar.h \ - FalScrollbarProperties.h \ - FalSlider.h \ - FalSliderProperties.h \ - FalSpinner.h \ - FalStaticImage.h \ - FalStaticText.h \ - FalSystemButton.h \ - FalTabButton.h \ - FalTabControl.h \ - FalTabControlProperties.h \ - FalTabPane.h \ - FalThumb.h \ - FalTitlebar.h \ - FalTooltip.h diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/StdInc.h b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/StdInc.h deleted file mode 100644 index eefd8d4c83..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/include/StdInc.h +++ /dev/null @@ -1,8 +0,0 @@ -// -// StdInc.h -// -// FalagardBase PCH -// - -#include "FalModule.h" -#include "CEGUI.h" diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/premake5.lua b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/premake5.lua deleted file mode 100644 index c08bac699a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/premake5.lua +++ /dev/null @@ -1,35 +0,0 @@ -project "Falagard" - language "C++" - kind "StaticLib" - targetname "Falagard" - - pchheader "StdInc.h" - pchsource "src/StdInc.cpp" - - defines { "FALAGARDBASE_EXPORTS", "_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING" } - - includedirs { - "include", - "../../include" -- CEGUI Includes - } - - vpaths { - ["Headers/*"] = "**.h", - ["Sources"] = "**.cpp", - ["*"] = "premake5.lua" - } - - files { - "premake5.lua", - "src/**.cpp", - "include/**.h", - } - - filter "architecture:not x86" - flags { "ExcludeFromBuild" } - - filter "system:not windows" - flags { "ExcludeFromBuild" } - - filter {"system:windows"} - disablewarnings { "4297" } diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalButton.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalButton.cpp deleted file mode 100644 index 82629abd6e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalButton.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/************************************************************************ - filename: FalButton.cpp - created: Wed Jun 22 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalButton.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardButton::WidgetTypeName[] = "Falagard/Button"; - - FalagardButton::FalagardButton(const String& type, const String& name) : - PushButton(type, name) - { - } - - FalagardButton::~FalagardButton() - { - } - - void FalagardButton::drawSelf(float z) - { - // this is hackish and relies on insider knowlegde of the way that both PushButton (actually ButtonBase) - // and Window implement things; Soon I'll get to updating things so that this can be replaced - // with clean code. - - // do we need to update the cache? - if (d_needsRedraw) - { - // remove old cached imagery - d_renderCache.clearCachedImagery(); - // signal that we'll no loger need a redraw. - d_needsRedraw = false; - // call PushButton drawSelf method which will call one of the state drawing methods overridden in this class. - PushButton::drawSelf(z); - } - - // call Window drawSelf to get it to send the cached imagery to the renderer. - Window::drawSelf(z); - } - - void FalagardButton::drawNormal(float z) - { - doButtonRender("Normal"); - - // Support for legacy custom image setting - if (d_useNormalImage) - { - ColourRect colours(d_normalImage.getColours()); - colours.setAlpha(getEffectiveAlpha()); - d_normalImage.setColours(colours); - d_normalImage.draw(d_renderCache); - } - } - - void FalagardButton::drawHover(float z) - { - doButtonRender("Hover"); - - // Support for legacy custom image setting - if (d_useHoverImage) - { - ColourRect colours(d_hoverImage.getColours()); - colours.setAlpha(getEffectiveAlpha()); - d_hoverImage.setColours(colours); - d_hoverImage.draw(d_renderCache); - } - } - - void FalagardButton::drawPushed(float z) - { - doButtonRender("Pushed"); - - // Support for legacy custom image setting - if (d_usePushedImage) - { - ColourRect colours(d_pushedImage.getColours()); - colours.setAlpha(getEffectiveAlpha()); - d_pushedImage.setColours(colours); - d_pushedImage.draw(d_renderCache); - } - } - - void FalagardButton::drawDisabled(float z) - { - doButtonRender("Disabled"); - - // Support for legacy custom image setting - if (d_useDisabledImage) - { - ColourRect colours(d_disabledImage.getColours()); - colours.setAlpha(getEffectiveAlpha()); - d_disabledImage.setColours(colours); - d_disabledImage.draw(d_renderCache); - } - } - - void FalagardButton::doButtonRender(const String& state) - { - // this is the second part of the hackish code. We're duplicating the first section of code - // from the Window::drawSelf method to decide whether to actually do anything. It is likely - // this will be replaced with cleaner code in the near future... - - // this conditional is just here to respect old legacy settings - if (d_useStandardImagery) - { - const StateImagery* imagery; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the state we were given, though default to Normal state if the - // desired state does not exist - imagery = wlf.isStateImageryPresent(state) ? &wlf.getStateImagery(state) : &wlf.getStateImagery("Normal"); - } - // catch exceptions, but do not exit. - catch (UnknownObjectException) - { - // don't try and draw using missing imagery! - return; - } - - // peform the rendering operation. - // NB: This is not in the above try block since we want UnknownObjectException exceptions to be emitted from - // the rendering code for conditions such as missing Imagesets and/or Images. - imagery->render(*this); - } - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardButtonFactory::createWindow(const String& name) - { - return new FalagardButton(d_type, name); - } - - void FalagardButtonFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCheckbox.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCheckbox.cpp deleted file mode 100644 index b5832ca3c2..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCheckbox.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************************************ - filename: FalCheckbox.cpp - created: Thu Jun 23 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalCheckbox.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardCheckbox::WidgetTypeName[] = "Falagard/Checkbox"; - - FalagardCheckbox::FalagardCheckbox(const String& type, const String& name) : - Checkbox(type, name) - { - } - - FalagardCheckbox::~FalagardCheckbox() - { - } - - void FalagardCheckbox::drawSelf(float z) - { - // this is hackish and relies on insider knowlegde of the way that both Checkbox (actually ButtonBase) - // and Window implement things; Soon I'll get to updating things so that this can be replaced - // with clean code. - - // call Checkbox drawSelf method which will call one of the state drawing methods overridden in this class. - Checkbox::drawSelf(z); - - // call Window drawSelf to get it to send the cached imagery to the renderer. - Window::drawSelf(z); - } - - void FalagardCheckbox::drawNormal(float z) - { - doButtonRender(d_selected ? "SelectedNormal" : "Normal"); - } - - void FalagardCheckbox::drawHover(float z) - { - doButtonRender(d_selected ? "SelectedHover" : "Hover"); - } - - void FalagardCheckbox::drawPushed(float z) - { - doButtonRender(d_selected ? "SelectedPushed" : "Pushed"); - } - - void FalagardCheckbox::drawDisabled(float z) - { - doButtonRender(d_selected ? "SelectedDisabled" : "Disabled"); - } - - void FalagardCheckbox::doButtonRender(const String& state) - { - // this is the second part of the hackish code. We're duplicating the first section of code - // from the Window::drawSelf method to decide whether to actually do anything. It is likely - // this will be replaced with cleaner code in the near future... - - // do we need to update the cache? - if (d_needsRedraw) - { - const StateImagery* imagery; - - // remove old cached imagery - d_renderCache.clearCachedImagery(); - // signal that we'll no loger need a redraw. - d_needsRedraw = false; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the state we were given, though default to Normal states if the - // desired states do not exist - imagery = wlf.isStateImageryPresent(state) ? &wlf.getStateImagery(state) : d_selected ? &wlf.getStateImagery("SelectedNormal") : &wlf.getStateImagery("Normal"); - } - // catch exceptions, but do not exit. - catch (UnknownObjectException) - { - // don't try and draw using missing imagery! - return; - } - - // peform the rendering operation. - // NB: This is not in the above try block since we want UnknownObjectException exceptions to be emitted from - // the rendering code for conditions such as missing Imagesets and/or Images. - imagery->render(*this); - } - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardCheckboxFactory::createWindow(const String& name) - { - return new FalagardCheckbox(d_type, name); - } - - void FalagardCheckboxFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalComboDropList.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalComboDropList.cpp deleted file mode 100644 index fa0c53c7f1..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalComboDropList.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/************************************************************************ - filename: FalComboDropList.cpp - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalComboDropList.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIScrollbar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardComboDropList::WidgetTypeName[] = "Falagard/ComboDropList"; - - - FalagardComboDropList::FalagardComboDropList(const String& type, const String& name) : - ComboDropList(type, name) - { - } - - FalagardComboDropList::~FalagardComboDropList() - { - } - - Rect FalagardComboDropList::getListRenderArea(void) const - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - bool v_visible = d_vertScrollbar->isVisible(true); - bool h_visible = d_horzScrollbar->isVisible(true); - - // if either of the scrollbars are visible, we might want to use another text rendering area - if (v_visible || h_visible) - { - String area_name("ItemRenderingArea"); - - if (h_visible) - { - area_name += "H"; - } - if (v_visible) - { - area_name += "V"; - } - area_name += "Scroll"; - - if (wlf.isNamedAreaDefined(area_name)) - { - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this); - } - } - - // default to plain ItemRenderingArea - return wlf.getNamedArea("ItemRenderingArea").getArea().getPixelRect(*this); - } - - Scrollbar* FalagardComboDropList::createVertScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardComboDropList::createHorzScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardComboDropList::cacheListboxBaseImagery() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardComboDropListFactory::createWindow(const String& name) - { - return new FalagardComboDropList(d_type, name); - } - - void FalagardComboDropListFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCombobox.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCombobox.cpp deleted file mode 100644 index 5acd34e04c..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalCombobox.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************ - filename: FalCombobox.cpp - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalCombobox.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIPushButton.h" -#include "elements/CEGUIEditbox.h" -#include "elements/CEGUIComboDropList.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardCombobox::WidgetTypeName[] = "Falagard/Combobox"; - - FalagardCombobox::FalagardCombobox(const String& type, const String& name) : - Combobox(type, name) - { - } - - FalagardCombobox::~FalagardCombobox() - { - } - - void FalagardCombobox::populateRenderCache() - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the approprite state. - const StateImagery* imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation - imagery->render(*this); - } - - Editbox* FalagardCombobox::createEditbox(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - PushButton* FalagardCombobox::createPushButton(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - ComboDropList* FalagardCombobox::createDropList(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardComboboxFactory::createWindow(const String& name) - { - return new FalagardCombobox(d_type, name); - } - - void FalagardComboboxFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalEditbox.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalEditbox.cpp deleted file mode 100644 index 8395eaa465..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalEditbox.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/************************************************************************ - filename: FalEditbox.cpp - created: Sat Jun 25 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalEditbox.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardEditbox::WidgetTypeName[] = "Falagard/Editbox"; - - FalagardEditbox::FalagardEditbox(const String& type, const String& name) : - Editbox(type, name), - d_lastTextOffset(0) - { - } - - FalagardEditbox::~FalagardEditbox() - { - } - - void FalagardEditbox::populateRenderCache() - { - const StateImagery* imagery; - - // draw container etc - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the approprite state. - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : (isReadOnly() ? "ReadOnly" : "Enabled")); - - // peform the rendering operation for the container. - imagery->render(*this); - - // get destination area for text - const Rect textArea(wlf.getNamedArea("TextArea").getArea().getPixelRect(*this)); - - // - // Required preliminary work for text rendering operations - // - const Font* font = getFont(); - - // no font == no more rendering - if (!font) - return; - - // This will point to the final string to be used for rendering. Useful because it means we - // do not have to have duplicate code or be copying d_text for handling masked/unmasked text. - String* editText; - - // Create a 'masked' version of the string if needed. - String maskedText; - if (isTextMasked()) - { - maskedText.insert(0, d_text.length(), getMaskCodePoint()); - editText = &maskedText; - } - // text not masked to editText will be the windows d_text String. - else - { - editText = &d_text; - } - - // calculate best position to render text to ensure carat is always visible - float textOffset; - float extentToCarat = font->getTextExtent(editText->substr(0, getCaratIndex())); - - // get carat imagery - const ImagerySection& caratImagery = wlf.getImagerySection("Carat"); - // store carat width - float caratWidth = caratImagery.getBoundingRect(*this, textArea).getWidth(); - - // if box is inactive - if (!hasInputFocus()) - { - textOffset = d_lastTextOffset; - } - // if carat is to the left of the box - else if ((d_lastTextOffset + extentToCarat) < 0) - { - textOffset = -extentToCarat; - } - // if carat is off to the right. - else if ((d_lastTextOffset + extentToCarat) >= (textArea.getWidth() - caratWidth)) - { - textOffset = textArea.getWidth() - extentToCarat - caratWidth; - } - // else carat is already within the box - else - { - textOffset = d_lastTextOffset; - } - - ColourRect colours; - float alpha_comp = getEffectiveAlpha(); - - // - // Draw label text - // - // setup initial rect for text formatting - Rect text_part_rect(textArea); - // allow for scroll position - text_part_rect.d_left += textOffset; - // centre text vertically within the defined text area - text_part_rect.d_top += (textArea.getHeight() - font->getLineSpacing()) * 0.5f; - - // draw pre-highlight text - String sect = editText->substr(0, getSelectionStartIndex()); - colours.setColours(d_normalTextColour); - colours.modulateAlpha(alpha_comp); - d_renderCache.cacheText(sect, font, LeftAligned, text_part_rect, 0, colours, &textArea); - - // adjust rect for next section - text_part_rect.d_left += font->getTextExtent(sect); - - // draw highlight text - sect = editText->substr(getSelectionStartIndex(), getSelectionLength()); - colours.setColours(d_selectTextColour); - colours.modulateAlpha(alpha_comp); - d_renderCache.cacheText(sect, font, LeftAligned, text_part_rect, 0, colours, &textArea); - - // adjust rect for next section - text_part_rect.d_left += font->getTextExtent(sect); - - // draw post-highlight text - sect = editText->substr(getSelectionEndIndex()); - colours.setColours(d_normalTextColour); - colours.modulateAlpha(alpha_comp); - d_renderCache.cacheText(sect, font, LeftAligned, text_part_rect, 0, colours, &textArea); - - // remember this for next time. - d_lastTextOffset = textOffset; - - // see if the editbox is active or inactive. - bool active = (!isReadOnly()) && hasInputFocus(); - - // - // Render selection imagery. - // - if (getSelectionLength() != 0) - { - // calculate required start and end offsets of selection imagery. - float selStartOffset = font->getTextExtent(editText->substr(0, getSelectionStartIndex())); - float selEndOffset = font->getTextExtent(editText->substr(0, getSelectionEndIndex())); - - // calculate area for selection imagery. - Rect hlarea(textArea); - hlarea.d_left += textOffset + selStartOffset; - hlarea.d_right = hlarea.d_left + (selEndOffset - selStartOffset); - - // render the selection imagery. - wlf.getStateImagery(active ? "ActiveSelection" : "InactiveSelection").render(*this, hlarea, 0, &textArea); - } - - // - // Render carat - // - if (active) - { - Rect caratRect(textArea); - caratRect.d_left += extentToCarat + textOffset; - - caratImagery.render(*this, caratRect, 0, 0, &textArea); - } - } - - size_t FalagardEditbox::getTextIndexFromPosition(const Point& pt) const - { - // - // calculate final window position to be checked - // - float wndx = screenToWindowX(pt.d_x); - - if (getMetricsMode() == Relative) - { - wndx = relativeToAbsoluteX(wndx); - } - - wndx -= d_lastTextOffset; - - // - // Return the proper index - // - if (isTextMasked()) - { - return getFont()->getCharAtPixel(String(d_text.length(), getMaskCodePoint()), wndx); - } - else - { - return getFont()->getCharAtPixel(d_text, wndx); - } - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardEditboxFactory::createWindow(const String& name) - { - return new FalagardEditbox(d_type, name); - } - - void FalagardEditboxFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalFrameWindow.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalFrameWindow.cpp deleted file mode 100644 index 47f5b43d22..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalFrameWindow.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/************************************************************************ - filename: FalFrameWindow.cpp - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalFrameWindow.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUITitlebar.h" -#include "elements/CEGUIPushButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardFrameWindow::WidgetTypeName[] = "Falagard/FrameWindow"; - - FalagardFrameWindow::FalagardFrameWindow(const String& type, const String& name) : - FrameWindow(type, name) - { - } - - FalagardFrameWindow::~FalagardFrameWindow() - { - } - - void FalagardFrameWindow::populateRenderCache() - { - // do not render anything for the rolled-up state. - if (d_rolledup) - return; - - // build state name - String stateName(isDisabled() ? "Disabled" : (isActive() ? "Active" : "Inactive")); - stateName += d_titlebar->isVisible() ? "WithTitle" : "NoTitle"; - stateName += d_frameEnabled ? "WithFrame" : "NoFrame"; - - const StateImagery* imagery; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(stateName); - } - catch (UnknownObjectException) - { - // log error so we know imagery is missing, and then quit. - return; - } - - // peform the rendering operation. - imagery->render(*this); - } - - Rect FalagardFrameWindow::getUnclippedInnerRect(void) const - { - if (d_rolledup) - return Rect(0,0,0,0); - - // build name of area to fetch - String areaName("Client"); - areaName += d_titlebar->isVisible() ? "WithTitle" : "NoTitle"; - areaName += d_frameEnabled ? "WithFrame" : "NoFrame"; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - return wlf.getNamedArea(areaName).getArea().getPixelRect(*this, getUnclippedPixelRect()); - } - - Titlebar* FalagardFrameWindow::createTitlebar(const String& name) const - { - return static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__")); - } - - PushButton* FalagardFrameWindow::createCloseButton(const String& name) const - { - return static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_closebutton__")); - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardFrameWindowFactory::createWindow(const String& name) - { - return new FalagardFrameWindow(d_type, name); - } - - void FalagardFrameWindowFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeader.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeader.cpp deleted file mode 100644 index e319190d94..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeader.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/************************************************************************ - filename: FalListHeader.cpp - created: Wed Jul 6 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalListHeader.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardListHeader::WidgetTypeName[] = "Falagard/ListHeader"; - - // properties - FalagardListHeaderProperties::SegmentWidgetType FalagardListHeader::d_segmentWidgetTypeProperty; - - - FalagardListHeader::FalagardListHeader(const String& type, const String& name) : - ListHeader(type, name) - { - addProperty(&d_segmentWidgetTypeProperty); - } - - FalagardListHeader::~FalagardListHeader() - { - } - - void FalagardListHeader::populateRenderCache() - { - const StateImagery* imagery; - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // render basic imagery - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - imagery->render(*this); - } - - const String& FalagardListHeader::getSegmentWidgetType() const - { - return d_segmentWidgetType; - } - - void FalagardListHeader::setSegmentWidgetType(const String& type) - { - d_segmentWidgetType = type; - } - - ListHeaderSegment* FalagardListHeader::createNewSegment(const String& name) const - { - // make sure this has been set - if (d_segmentWidgetType.empty()) - { - InvalidRequestException("FalagardListHeader::createNewSegment - Segment widget type has not been set!"); - } - - return static_cast(WindowManager::getSingleton().createWindow(d_segmentWidgetType, name)); - } - - void FalagardListHeader::destroyListSegment(ListHeaderSegment* segment) const - { - // nothing special required here. - WindowManager::getSingleton().destroyWindow(segment); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardListHeaderFactory::createWindow(const String& name) - { - return new FalagardListHeader(d_type, name); - } - - void FalagardListHeaderFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderProperties.cpp deleted file mode 100644 index f9a08dc848..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderProperties.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/************************************************************************ - filename: FalListHeaderProperties.cpp - created: Wed Jul 6 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalListHeaderProperties.h" -#include "FalListHeader.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -namespace FalagardListHeaderProperties -{ -String SegmentWidgetType::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getSegmentWidgetType(); -} - -void SegmentWidgetType::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setSegmentWidgetType(value); -} - -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegment.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegment.cpp deleted file mode 100644 index b068b1bce7..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegment.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/************************************************************************ - filename: FalListHeaderSegment.cpp - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalListHeaderSegment.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardListHeaderSegment::WidgetTypeName[] = "Falagard/ListHeaderSegment"; - - // properties - FalagardListHeaderSegmentProperties::SizingCursorImage FalagardListHeaderSegment::d_sizingCursorProperty; - FalagardListHeaderSegmentProperties::MovingCursorImage FalagardListHeaderSegment::d_movingCursorProperty; - - - FalagardListHeaderSegment::FalagardListHeaderSegment(const String& type, const String& name) : - ListHeaderSegment(type, name) - { - addProperty(&d_sizingCursorProperty); - addProperty(&d_movingCursorProperty); - } - - FalagardListHeaderSegment::~FalagardListHeaderSegment() - { - } - - const Image* FalagardListHeaderSegment::getSizingCursorImage() const - { - return d_sizingMouseCursor; - } - - void FalagardListHeaderSegment::setSizingCursorImage(const Image* image) - { - d_sizingMouseCursor = image; - } - - void FalagardListHeaderSegment::setSizingCursorImage(const String& imageset, const String& image) - { - d_sizingMouseCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); - } - - const Image* FalagardListHeaderSegment::getMovingCursorImage() const - { - return d_movingMouseCursor; - } - - void FalagardListHeaderSegment::setMovingCursorImage(const Image* image) - { - d_movingMouseCursor = image; - } - - void FalagardListHeaderSegment::setMovingCursorImage(const String& imageset, const String& image) - { - d_movingMouseCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); - } - - void FalagardListHeaderSegment::populateRenderCache() - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - - const StateImagery* imagery; - - // get imagery for main state. - if (isDisabled()) - { - imagery = &wlf.getStateImagery("Disabled"); - } - else if ((d_segmentHover != d_segmentPushed) && !d_splitterHover && isClickable()) - { - imagery = &wlf.getStateImagery("Hover"); - } - else if (d_splitterHover) - { - imagery = &wlf.getStateImagery("SplitterHover"); - } - else - { - imagery = &wlf.getStateImagery("Normal"); - } - - // do main rendering - imagery->render(*this); - - // Render sorting icon as needed - if (d_sortDir == Ascending) - { - imagery = &wlf.getStateImagery("AscendingSortIcon"); - imagery->render(*this); - } - else if (d_sortDir == Descending) - { - imagery = &wlf.getStateImagery("DescendingSortIcon"); - imagery->render(*this); - } - - // draw ghost copy if the segment is being dragged. - if (d_dragMoving) - { - Rect targetArea(0, 0, getAbsoluteWidth(), getAbsoluteHeight()); - targetArea.offset(d_dragPosition); - imagery = &wlf.getStateImagery("DragGhost"); - imagery->render(*this, targetArea); - - // Render sorting icon as needed - if (d_sortDir == Ascending) - { - imagery = &wlf.getStateImagery("GhostAscendingSortIcon"); - imagery->render(*this, targetArea); - } - else if (d_sortDir == Descending) - { - imagery = &wlf.getStateImagery("GhostDescendingSortIcon"); - imagery->render(*this, targetArea); - } - } - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardListHeaderSegmentFactory::createWindow(const String& name) - { - return new FalagardListHeaderSegment(d_type, name); - } - - void FalagardListHeaderSegmentFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegmentProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegmentProperties.cpp deleted file mode 100644 index 983dde9417..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListHeaderSegmentProperties.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************ - filename: FalListHeaderSegmentProperties.cpp - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalListHeaderSegmentProperties.h" -#include "FalListHeaderSegment.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -namespace FalagardListHeaderSegmentProperties -{ -String SizingCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getSizingCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(""); -} - -void SizingCursorImage::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setSizingCursorImage(PropertyHelper::stringToImage(value)); -} - -String MovingCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getMovingCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(""); -} - -void MovingCursorImage::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setMovingCursorImage(PropertyHelper::stringToImage(value)); -} - -} -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListbox.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListbox.cpp deleted file mode 100644 index b674c7cb92..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalListbox.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/************************************************************************ - filename: FalListbox.cpp - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalListbox.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIScrollbar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardListbox::WidgetTypeName[] = "Falagard/Listbox"; - - - FalagardListbox::FalagardListbox(const String& type, const String& name) : - Listbox(type, name) - { - } - - FalagardListbox::~FalagardListbox() - { - } - - Rect FalagardListbox::getListRenderArea(void) const - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - bool v_visible = d_vertScrollbar->isVisible(true); - bool h_visible = d_horzScrollbar->isVisible(true); - - // if either of the scrollbars are visible, we might want to use another text rendering area - if (v_visible || h_visible) - { - String area_name("ItemRenderingArea"); - - if (h_visible) - { - area_name += "H"; - } - if (v_visible) - { - area_name += "V"; - } - area_name += "Scroll"; - - if (wlf.isNamedAreaDefined(area_name)) - { - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this); - } - } - - // default to plain ItemRenderingArea - return wlf.getNamedArea("ItemRenderingArea").getArea().getPixelRect(*this); - } - - Scrollbar* FalagardListbox::createVertScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardListbox::createHorzScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardListbox::cacheListboxBaseImagery() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardListboxFactory::createWindow(const String& name) - { - return new FalagardListbox(d_type, name); - } - - void FalagardListboxFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuBar.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuBar.cpp deleted file mode 100644 index 8bdb0923f2..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuBar.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - filename: FalMenubar.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalMenuBar.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardMenubar::WidgetTypeName[] = "Falagard/Menubar"; - - FalagardMenubar::FalagardMenubar(const String& type, const String& name) : - Menubar(type, name) - { - } - - FalagardMenubar::~FalagardMenubar() - { - } - - void FalagardMenubar::populateRenderCache() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - void FalagardMenubar::sizeToContent_impl(void) - { - Rect renderArea(getItemRenderArea()); - Rect wndArea(getAbsoluteRect()); - - // get size of content - Size sz(getContentSize()); - - // calculate the full size with the frame accounted for and resize the window to this - sz.d_width += wndArea.getWidth() - renderArea.getWidth(); - sz.d_height += wndArea.getHeight() - renderArea.getHeight(); - setSize(Absolute,sz); - } - - Rect FalagardMenubar::getItemRenderArea(void) const - { - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - return wlf.getNamedArea("ItemRenderArea").getArea().getPixelRect(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardMenubarFactory::createWindow(const String& name) - { - return new FalagardMenubar(d_type, name); - } - - void FalagardMenubarFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuItem.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuItem.cpp deleted file mode 100644 index 5fcc2705fa..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMenuItem.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/************************************************************************ - filename: FalMenuItem.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalMenuItem.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardMenuItem::WidgetTypeName[] = "Falagard/MenuItem"; - - FalagardMenuItem::FalagardMenuItem(const String& type, const String& name) : - MenuItem(type, name) - { - } - - FalagardMenuItem::~FalagardMenuItem() - { - } - - void FalagardMenuItem::populateRenderCache() - { - // build name of state we're in - String stateName(isDisabled() ? "Disabled" : "Enabled"); - - if (d_opened) - stateName += "PopupOpen"; - else if (d_pushed) - stateName += "Pushed"; - else if (d_hovering) - stateName += "Hover"; - else - stateName += "Normal"; - - const StateImagery* imagery; - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(stateName); - // peform the rendering operation. - imagery->render(*this); - - // only draw popup-open/closed-icon if we have a popup menu, and parent is not a menubar - Window* parent_window = getParent(); - bool not_menubar = (parent_window==NULL) ? true : !parent_window->testClassName("Menubar"); - if (d_popup && not_menubar) - { - // get imagery for popup open/closed state - imagery = &wlf.getStateImagery(d_opened ? "PopupOpenIcon" : "PopupClosedIcon"); - // peform the rendering operation. - imagery->render(*this); - } - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardMenuItemFactory::createWindow(const String& name) - { - return new FalagardMenuItem(d_type, name); - } - - void FalagardMenuItemFactory::destroyWindow(Window* window) - { - delete window; - } - -} diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalModule.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalModule.cpp deleted file mode 100644 index 415986aafa..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalModule.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/************************************************************************ - filename: FalModule.cpp - created: Wed Jun 22 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalModule.h" -#include "CEGUIExceptions.h" -#include "CEGUIWindowFactoryManager.h" -// includes for types we create -#include "FalButton.h" -#include "FalCheckbox.h" -#include "FalComboDropList.h" -#include "FalCombobox.h" -#include "FalEditbox.h" -#include "FalFrameWindow.h" -#include "FalListHeader.h" -#include "FalListHeaderSegment.h" -#include "FalListbox.h" -#include "FalMenuBar.h" -#include "FalMenuItem.h" -#include "FalMultiColumnList.h" -#include "FalMultiLineEditbox.h" -#include "FalPopupMenu.h" -#include "FalProgressBar.h" -#include "FalRadioButton.h" -#include "FalScrollablePane.h" -#include "FalScrollbar.h" -#include "FalSlider.h" -#include "FalSpinner.h" -#include "FalStaticImage.h" -#include "FalStaticText.h" -#include "FalSystemButton.h" -#include "FalTabButton.h" -#include "FalTabControl.h" -#include "FalTabPane.h" -#include "FalThumb.h" -#include "FalTitlebar.h" -#include "FalTooltip.h" - -/************************************************************************* - Static factory objects -*************************************************************************/ -static CEGUI::FalagardButtonFactory s_ButtonFactory; -static CEGUI::FalagardCheckboxFactory s_CheckboxFactory; -static CEGUI::FalagardComboDropListFactory s_ComboDropListFactory; -static CEGUI::FalagardComboboxFactory s_ComboboxFactory; -static CEGUI::FalagardEditboxFactory s_EditboxFactory; -static CEGUI::FalagardFrameWindowFactory s_FrameWindowFactory; -static CEGUI::FalagardListHeaderFactory s_ListHeaderFactory; -static CEGUI::FalagardListHeaderSegmentFactory s_ListHeaderSegmentFactory; -static CEGUI::FalagardListboxFactory s_ListboxFactory; -static CEGUI::FalagardMenubarFactory s_MenubarFactory; -static CEGUI::FalagardMenuItemFactory s_MenuItemFactory; -static CEGUI::FalagardMultiColumnListFactory s_MultiColumnListFactory; -static CEGUI::FalagardMultiLineEditboxFactory s_MultiLineEditboxFactory; -static CEGUI::FalagardPopupMenuFactory s_PopupMenuFactory; -static CEGUI::FalagardProgressBarFactory s_ProgressBarFactory; -static CEGUI::FalagardRadioButtonFactory s_RadioButtonFactory; -static CEGUI::FalagardScrollablePaneFactory s_ScrollablePaneFactory; -static CEGUI::FalagardScrollbarFactory s_ScrollbarFactory; -static CEGUI::FalagardSliderFactory s_SliderFactory; -static CEGUI::FalagardSpinnerFactory s_SpinnerFactory; -static CEGUI::FalagardStaticImageFactory s_StaticImageFactory; -static CEGUI::FalagardStaticTextFactory s_StaticTextFactory; -static CEGUI::FalagardSystemButtonFactory s_SystemButtonFactory; -static CEGUI::FalagardTabButtonFactory s_TabButtonFactory; -static CEGUI::FalagardTabControlFactory s_TabControlFactory; -static CEGUI::FalagardTabPaneFactory s_TabPaneFactory; -static CEGUI::FalagardThumbFactory s_ThumbFactory; -static CEGUI::FalagardTitlebarFactory s_TitlebarFactory; -static CEGUI::FalagardTooltipFactory s_TooltipFactory; - - -using namespace CEGUI; - -struct mapEntry -{ - const CEGUI::utf8* d_name; - CEGUI::WindowFactory* d_factory; -}; - -mapEntry factoriesMap[] = -{ - {FalagardButton::WidgetTypeName, &s_ButtonFactory}, - {FalagardCheckbox::WidgetTypeName, &s_CheckboxFactory}, - {FalagardComboDropList::WidgetTypeName, &s_ComboDropListFactory}, - {FalagardCombobox::WidgetTypeName, &s_ComboboxFactory}, - {FalagardEditbox::WidgetTypeName, &s_EditboxFactory}, - {FalagardFrameWindow::WidgetTypeName, &s_FrameWindowFactory}, - {FalagardListHeader::WidgetTypeName, &s_ListHeaderFactory}, - {FalagardListHeaderSegment::WidgetTypeName, &s_ListHeaderSegmentFactory}, - {FalagardListbox::WidgetTypeName, &s_ListboxFactory}, - {FalagardMenubar::WidgetTypeName, &s_MenubarFactory}, - {FalagardMenuItem::WidgetTypeName, &s_MenuItemFactory}, - {FalagardMultiColumnList::WidgetTypeName, &s_MultiColumnListFactory}, - {FalagardMultiLineEditbox::WidgetTypeName, &s_MultiLineEditboxFactory}, - {FalagardPopupMenu::WidgetTypeName, &s_PopupMenuFactory}, - {FalagardProgressBar::WidgetTypeName, &s_ProgressBarFactory}, - {FalagardRadioButton::WidgetTypeName, &s_RadioButtonFactory}, - {FalagardScrollablePane::WidgetTypeName, &s_ScrollablePaneFactory}, - {FalagardScrollbar::WidgetTypeName, &s_ScrollbarFactory}, - {FalagardSlider::WidgetTypeName, &s_SliderFactory}, - {FalagardSpinner::WidgetTypeName, &s_SpinnerFactory}, - {FalagardStaticImage::WidgetTypeName, &s_StaticImageFactory}, - {FalagardStaticText::WidgetTypeName, &s_StaticTextFactory}, - {FalagardSystemButton::WidgetTypeName, &s_SystemButtonFactory}, - {FalagardTabButton::WidgetTypeName, &s_TabButtonFactory}, - {FalagardTabControl::WidgetTypeName, &s_TabControlFactory}, - {FalagardTabPane::WidgetTypeName, &s_TabPaneFactory}, - {FalagardThumb::WidgetTypeName, &s_ThumbFactory}, - {FalagardTitlebar::WidgetTypeName, &s_TitlebarFactory}, - {FalagardTooltip::WidgetTypeName, &s_TooltipFactory}, - {0,0} -}; - -/************************************************************************* - Plugin access interface -*************************************************************************/ -extern "C" void registerFactory(const CEGUI::String& type_name) -{ - mapEntry* entry = factoriesMap; - - while (entry->d_name) - { - if (entry->d_name == type_name) - { - doSafeFactoryRegistration(entry->d_factory); - return; - } - - ++entry; - } - - throw UnknownObjectException((utf8*)"::registerFactory - The window factory for type '" + type_name + "' is not known in this module."); -} - -CEGUI::uint registerAllFactoriesF(void) -{ - CEGUI::uint count = 0; - mapEntry* entry = factoriesMap; - - while (entry->d_name) - { - doSafeFactoryRegistration(entry->d_factory); - - ++entry; - ++count; - } - - return count; -} - -void doSafeFactoryRegistration(WindowFactory* factory) -{ - assert(factory != 0); - - WindowFactoryManager& wfm = WindowFactoryManager::getSingleton(); - - // is this factory is already registered - if (wfm.isFactoryPresent(factory->getTypeName())) - { - // log the fact that this type already appears to be registered - Logger::getSingleton().logEvent( - "Falagard widget factory '" + factory->getTypeName() + "' appears to be already registered, skipping.", - Informative); - } - // factory not already registered, - else - { - // add this factory to those available - wfm.addFactory(factory); - } -} diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiColumnList.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiColumnList.cpp deleted file mode 100644 index f1c1aa4fa7..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiColumnList.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/************************************************************************ - filename: FalMultiColumnList.cpp - created: Wed Jul 6 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalMultiColumnList.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIScrollbar.h" -#include "elements/CEGUIListHeader.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardMultiColumnList::WidgetTypeName[] = "Falagard/MultiColumnList"; - - - FalagardMultiColumnList::FalagardMultiColumnList(const String& type, const String& name) : - MultiColumnList(type, name) - { - } - - FalagardMultiColumnList::~FalagardMultiColumnList() - { - } - - Rect FalagardMultiColumnList::getListRenderArea(void) const - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - bool v_visible = d_vertScrollbar->isVisible(true); - bool h_visible = d_horzScrollbar->isVisible(true); - - // if either of the scrollbars are visible, we might want to use another item rendering area - if (v_visible || h_visible) - { - String area_name("ItemRenderingArea"); - - if (h_visible) - { - area_name += "H"; - } - if (v_visible) - { - area_name += "V"; - } - area_name += "Scroll"; - - if (wlf.isNamedAreaDefined(area_name)) - { - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this); - } - } - - // default to plain ItemRenderingArea - return wlf.getNamedArea("ItemRenderingArea").getArea().getPixelRect(*this); - } - - ListHeader* FalagardMultiColumnList::createListHeader(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardMultiColumnList::createVertScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardMultiColumnList::createHorzScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardMultiColumnList::cacheListboxBaseImagery() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardMultiColumnListFactory::createWindow(const String& name) - { - return new FalagardMultiColumnList(d_type, name); - } - - void FalagardMultiColumnListFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditbox.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditbox.cpp deleted file mode 100644 index a97f07b569..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditbox.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/************************************************************************ - filename: FalMultiLineEditbox.cpp - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalMultiLineEditbox.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIScrollbar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardMultiLineEditbox::WidgetTypeName[] = "Falagard/MultiLineEditbox"; - FalagardMultiLineEditboxProperties::SelectionBrushImage FalagardMultiLineEditbox::d_selectionBrushProperty; - - - FalagardMultiLineEditbox::FalagardMultiLineEditbox(const String& type, const String& name) : - MultiLineEditbox(type, name) - { - addProperty(&d_selectionBrushProperty); - } - - FalagardMultiLineEditbox::~FalagardMultiLineEditbox() - { - } - - Rect FalagardMultiLineEditbox::getTextRenderArea(void) const - { - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - bool v_visible = d_vertScrollbar->isVisible(true); - bool h_visible = d_horzScrollbar->isVisible(true); - - // if either of the scrollbars are visible, we might want to use another text rendering area - if (v_visible || h_visible) - { - String area_name("TextArea"); - - if (h_visible) - { - area_name += "H"; - } - if (v_visible) - { - area_name += "V"; - } - area_name += "Scroll"; - - if (wlf.isNamedAreaDefined(area_name)) - { - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this); - } - } - - // default to plain TextArea - return wlf.getNamedArea("TextArea").getArea().getPixelRect(*this); - } - - Scrollbar* FalagardMultiLineEditbox::createVertScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardMultiLineEditbox::createHorzScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardMultiLineEditbox::cacheEditboxBaseImagery() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : (isReadOnly() ? "ReadOnly" : "Enabled")); - // peform the rendering operation. - imagery->render(*this); - } - - void FalagardMultiLineEditbox::cacheCaratImagery(const Rect& textArea) - { - const Font* fnt = getFont(); - - // require a font so that we can calculate carat position. - if (fnt) - { - // get line that carat is in - size_t caratLine = getLineNumberFromIndex(d_caratPos); - - // if carat line is valid. - if (caratLine < d_lines.size()) - { - // calculate pixel offsets to where carat should be drawn - size_t caratLineIdx = d_caratPos - d_lines[caratLine].d_startIdx; - float ypos = caratLine * fnt->getLineSpacing(); - float xpos = fnt->getTextExtent(d_text.substr(d_lines[caratLine].d_startIdx, caratLineIdx)); - - // get base offset to target layer for cursor. - Renderer* renderer = System::getSingleton().getRenderer(); - float baseZ = renderer->getZLayer(7) - renderer->getCurrentZ(); - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // get carat imagery - const ImagerySection& caratImagery = wlf.getImagerySection("Carat"); - - // calculate finat destination area for carat - Rect caratArea; - caratArea.d_left = textArea.d_left + xpos; - caratArea.d_top = textArea.d_top + ypos; - caratArea.setWidth(caratImagery.getBoundingRect(*this).getSize().d_width); - caratArea.setHeight(fnt->getLineSpacing()); - caratArea.offset(Point(-d_horzScrollbar->getScrollPosition(), -d_vertScrollbar->getScrollPosition())); - - // cache the carat image for rendering. - caratImagery.render(*this, caratArea, baseZ, 0, &textArea); - } - } - } - - const Image* FalagardMultiLineEditbox::getSelectionBrushImage() const - { - return d_selectionBrush; - } - - void FalagardMultiLineEditbox::setSelectionBrushImage(const Image* image) - { - d_selectionBrush = image; - requestRedraw(); - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardMultiLineEditboxFactory::createWindow(const String& name) - { - return new FalagardMultiLineEditbox(d_type, name); - } - - void FalagardMultiLineEditboxFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditboxProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditboxProperties.cpp deleted file mode 100644 index 7fe12f6df0..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalMultiLineEditboxProperties.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/************************************************************************ - filename: FalMultiLineEditboxProperties.cpp - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalMultiLineEditboxProperties.h" -#include "FalMultiLineEditbox.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -namespace FalagardMultiLineEditboxProperties -{ - String SelectionBrushImage::get(const PropertyReceiver* receiver) const - { - const Image* img = static_cast(receiver)->getSelectionBrushImage(); - return img ? PropertyHelper::imageToString(img) : String(""); - } - - void SelectionBrushImage::set(PropertyReceiver* receiver, const String &value) - { - static_cast(receiver)->setSelectionBrushImage(PropertyHelper::stringToImage(value)); - } - -} -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalPopupMenu.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalPopupMenu.cpp deleted file mode 100644 index 9addd6670c..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalPopupMenu.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - filename: FalPopupMenu.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalPopupMenu.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardPopupMenu::WidgetTypeName[] = "Falagard/PopupMenu"; - - FalagardPopupMenu::FalagardPopupMenu(const String& type, const String& name) : - PopupMenu(type, name) - { - } - - FalagardPopupMenu::~FalagardPopupMenu() - { - } - - void FalagardPopupMenu::populateRenderCache() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - void FalagardPopupMenu::sizeToContent_impl(void) - { - Rect renderArea(getItemRenderArea()); - Rect wndArea(getAbsoluteRect()); - - // get size of content - Size sz(getContentSize()); - - // calculate the full size with the frame accounted for and resize the window to this - sz.d_width += wndArea.getWidth() - renderArea.getWidth(); - sz.d_height += wndArea.getHeight() - renderArea.getHeight(); - setSize(Absolute,sz); - } - - Rect FalagardPopupMenu::getItemRenderArea(void) const - { - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - return wlf.getNamedArea("ItemRenderArea").getArea().getPixelRect(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardPopupMenuFactory::createWindow(const String& name) - { - return new FalagardPopupMenu(d_type, name); - } - - void FalagardPopupMenuFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBar.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBar.cpp deleted file mode 100644 index b722270799..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBar.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/************************************************************************ - filename: FalProgressBar.cpp - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalProgressBar.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardProgressBar::WidgetTypeName[] = "Falagard/ProgressBar"; - FalagardProgressBarProperties::VerticalProgress FalagardProgressBar::d_verticalProperty; - FalagardProgressBarProperties::ReversedProgress FalagardProgressBar::d_reversedProperty; - - - FalagardProgressBar::FalagardProgressBar(const String& type, const String& name) : - ProgressBar(type, name), - d_vertical(false), - d_reversed(false) - { - addProperty(&d_verticalProperty); - addProperty(&d_reversedProperty); - } - - FalagardProgressBar::~FalagardProgressBar() - { - } - - void FalagardProgressBar::populateRenderCache() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - - // get imagery for actual progress rendering - imagery = &wlf.getStateImagery(d_enabled ? "EnabledProgress" : "DisabledProgress"); - - // get target rect for this imagery - Rect progressRect(wlf.getNamedArea("ProgressArea").getArea().getPixelRect(*this)); - - // calculate a clipper according to the current progress. - Rect progressClipper(progressRect); - - if (d_vertical) - { - float height = progressRect.getHeight() * d_progress; - - if (d_reversed) - { - progressRect.setHeight(height); - } - else - { - progressClipper.d_top = progressClipper.d_bottom - height; - } - } - else - { - float width = progressRect.getWidth() * d_progress; - - if (d_reversed) - { - progressClipper.d_left = progressClipper.d_right - width; - } - else - { - progressRect.setWidth(width); - } - } - - // peform the rendering operation. - imagery->render(*this, progressRect, 0, &progressClipper); - } - - bool FalagardProgressBar::isVertical() const - { - return d_vertical; - } - - bool FalagardProgressBar::isReversed() const - { - return d_reversed; - } - - void FalagardProgressBar::setVertical(bool setting) - { - d_vertical = setting; - } - - void FalagardProgressBar::setReversed(bool setting) - { - d_reversed = setting; - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardProgressBarFactory::createWindow(const String& name) - { - return new FalagardProgressBar(d_type, name); - } - - void FalagardProgressBarFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBarProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBarProperties.cpp deleted file mode 100644 index 52840f12f5..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalProgressBarProperties.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/************************************************************************ - filename: FalProgressBarProperties.cpp - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalProgressBarProperties.h" -#include "FalProgressBar.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -namespace FalagardProgressBarProperties -{ - String VerticalProgress::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isVertical()); - } - - void VerticalProgress::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setVertical(PropertyHelper::stringToBool(value)); - } - - String ReversedProgress::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isReversed()); - } - - void ReversedProgress::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setReversed(PropertyHelper::stringToBool(value)); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalRadioButton.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalRadioButton.cpp deleted file mode 100644 index af3039bbbe..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalRadioButton.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************************************ - filename: FalRadioButton.cpp - created: Thu Jun 23 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalRadioButton.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardRadioButton::WidgetTypeName[] = "Falagard/RadioButton"; - - FalagardRadioButton::FalagardRadioButton(const String& type, const String& name) : - RadioButton(type, name) - { - } - - FalagardRadioButton::~FalagardRadioButton() - { - } - - void FalagardRadioButton::drawSelf(float z) - { - // this is hackish and relies on insider knowlegde of the way that both RadioButton (actually ButtonBase) - // and Window implement things; Soon I'll get to updating things so that this can be replaced - // with clean code. - - // call RadioButton drawSelf method which will call one of the state drawing methods overridden in this class. - RadioButton::drawSelf(z); - - // call Window drawSelf to get it to send the cached imagery to the renderer. - Window::drawSelf(z); - } - - void FalagardRadioButton::drawNormal(float z) - { - doButtonRender(d_selected ? "SelectedNormal" : "Normal"); - } - - void FalagardRadioButton::drawHover(float z) - { - doButtonRender(d_selected ? "SelectedHover" : "Hover"); - } - - void FalagardRadioButton::drawPushed(float z) - { - doButtonRender(d_selected ? "SelectedPushed" : "Pushed"); - } - - void FalagardRadioButton::drawDisabled(float z) - { - doButtonRender(d_selected ? "SelectedDisabled" : "Disabled"); - } - - void FalagardRadioButton::doButtonRender(const String& state) - { - // this is the second part of the hackish code. We're duplicating the first section of code - // from the Window::drawSelf method to decide whether to actually do anything. It is likely - // this will be replaced with cleaner code in the near future... - - // do we need to update the cache? - if (d_needsRedraw) - { - const StateImagery* imagery; - - // remove old cached imagery - d_renderCache.clearCachedImagery(); - // signal that we'll no loger need a redraw. - d_needsRedraw = false; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the state we were given, though default to Normal states if the - // desired states do not exist - imagery = wlf.isStateImageryPresent(state) ? &wlf.getStateImagery(state) : d_selected ? &wlf.getStateImagery("SelectedNormal") : &wlf.getStateImagery("Normal"); - } - // catch exceptions, but do not exit. - catch (UnknownObjectException) - { - // don't try and draw using missing imagery! - return; - } - - // peform the rendering operation. - // NB: This is not in the above try block since we want UnknownObjectException exceptions to be emitted from - // the rendering code for conditions such as missing Imagesets and/or Images. - imagery->render(*this); - } - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardRadioButtonFactory::createWindow(const String& name) - { - return new FalagardRadioButton(d_type, name); - } - - void FalagardRadioButtonFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollablePane.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollablePane.cpp deleted file mode 100644 index 1dbd6a3115..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollablePane.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/************************************************************************ - filename: FalScrollablePane.cpp - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalScrollablePane.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIScrollbar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardScrollablePane::WidgetTypeName[] = "Falagard/ScrollablePane"; - - - FalagardScrollablePane::FalagardScrollablePane(const String& type, const String& name) : - ScrollablePane(type, name) - { - } - - FalagardScrollablePane::~FalagardScrollablePane() - { - } - - Rect FalagardScrollablePane::getViewableArea(void) const - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - bool v_visible = d_vertScrollbar->isVisible(true); - bool h_visible = d_horzScrollbar->isVisible(true); - - // if either of the scrollbars are visible, we might want to use another text rendering area - if (v_visible || h_visible) - { - String area_name("ViewableArea"); - - if (h_visible) - { - area_name += "H"; - } - if (v_visible) - { - area_name += "V"; - } - area_name += "Scroll"; - - if (wlf.isNamedAreaDefined(area_name)) - { - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this); - } - } - - // default to plain ViewableArea - return wlf.getNamedArea("ViewableArea").getArea().getPixelRect(*this); - } - - Scrollbar* FalagardScrollablePane::createVerticalScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardScrollablePane::createHorizontalScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardScrollablePane::populateRenderCache() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardScrollablePaneFactory::createWindow(const String& name) - { - return new FalagardScrollablePane(d_type, name); - } - - void FalagardScrollablePaneFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbar.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbar.cpp deleted file mode 100644 index ae5a90c53d..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbar.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/************************************************************************ - filename: FalScrollbar.cpp - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalScrollbar.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIThumb.h" -#include "elements/CEGUIPushButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardScrollbar::WidgetTypeName[] = "Falagard/Scrollbar"; - FalagardScrollbarProperties::VerticalScrollbar FalagardScrollbar::d_verticalProperty; - - - FalagardScrollbar::FalagardScrollbar(const String& type, const String& name) : - Scrollbar(type, name), - d_vertical(false) - { - addProperty(&d_verticalProperty); - } - - FalagardScrollbar::~FalagardScrollbar() - { - } - - void FalagardScrollbar::populateRenderCache() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - Thumb* FalagardScrollbar::createThumb(const String& name) const - { - // return thumb created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - PushButton* FalagardScrollbar::createIncreaseButton(const String& name) const - { - // return button created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - PushButton* FalagardScrollbar::createDecreaseButton(const String& name) const - { - // return button created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardScrollbar::performChildWindowLayout() - { - Scrollbar::performChildWindowLayout(); - updateThumb(); - } - - void FalagardScrollbar::updateThumb(void) - { - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - Rect area(wlf.getNamedArea("ThumbTrackArea").getArea().getPixelRect(*this)); - - Thumb* theThumb = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_thumb__")); - - float posExtent = d_documentSize - d_pageSize; - float slideExtent; - - if (d_vertical) - { - slideExtent = area.getHeight() - theThumb->getAbsoluteHeight(); - theThumb->setVertRange(absoluteToRelativeY_impl(this, area.d_top), absoluteToRelativeY_impl(this, area.d_top + slideExtent)); - theThumb->setPosition(Point(absoluteToRelativeX_impl(this, area.d_left), absoluteToRelativeY_impl(this, area.d_top + (d_position * (slideExtent / posExtent))))); - } - else - { - slideExtent = area.getWidth() - theThumb->getAbsoluteWidth(); - theThumb->setHorzRange(absoluteToRelativeX_impl(this, area.d_left), absoluteToRelativeX_impl(this, area.d_left + slideExtent)); - theThumb->setPosition(Point(absoluteToRelativeX_impl(this, area.d_left + (d_position * (slideExtent / posExtent))), absoluteToRelativeY_impl(this, area.d_top))); - } - } - - float FalagardScrollbar::getValueFromThumb(void) const - { - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - Rect area(wlf.getNamedArea("ThumbTrackArea").getArea().getPixelRect(*this)); - - Thumb* theThumb = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_thumb__")); - float posExtent = d_documentSize - d_pageSize; - - if (d_vertical) - { - float slideExtent = area.getHeight() - theThumb->getAbsoluteHeight(); - return (theThumb->getAbsoluteYPosition() - area.d_top) / (slideExtent / posExtent); - } - else - { - float slideExtent = area.getWidth() - theThumb->getAbsoluteWidth(); - return (theThumb->getAbsoluteXPosition() - area.d_left) / (slideExtent / posExtent); - } - } - - float FalagardScrollbar::getAdjustDirectionFromPoint(const Point& pt) const - { - Rect absrect(WindowManager::getSingleton().getWindow(getName() + "__auto_thumb__")->getUnclippedPixelRect()); - - if ((d_vertical && (pt.d_y > absrect.d_bottom)) || - (!d_vertical && (pt.d_x > absrect.d_right))) - { - return 1; - } - else if ((d_vertical && (pt.d_y < absrect.d_top)) || - (!d_vertical && (pt.d_x < absrect.d_left))) - { - return -1; - } - else - { - return 0; - } - } - - bool FalagardScrollbar::isVertical() const - { - return d_vertical; - } - - void FalagardScrollbar::setVertical(bool setting) - { - d_vertical = setting; - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardScrollbarFactory::createWindow(const String& name) - { - return new FalagardScrollbar(d_type, name); - } - - void FalagardScrollbarFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbarProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbarProperties.cpp deleted file mode 100644 index 3c29ba0c2a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalScrollbarProperties.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/************************************************************************ - filename: FalScrollbarProperties.cpp - created: Mon Jul 4 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalScrollbarProperties.h" -#include "FalScrollbar.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -namespace FalagardScrollbarProperties -{ - String VerticalScrollbar::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isVertical()); - } - - void VerticalScrollbar::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setVertical(PropertyHelper::stringToBool(value)); - } -} -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSlider.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSlider.cpp deleted file mode 100644 index d71284ad1b..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSlider.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/************************************************************************ - filename: FalSlider.cpp - created: Sun Jul 3 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalSlider.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIThumb.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardSlider::WidgetTypeName[] = "Falagard/Slider"; - FalagardSliderProperties::VerticalSlider FalagardSlider::d_verticalProperty; - FalagardSliderProperties::ReversedDirection FalagardSlider::d_reversedProperty; - - - FalagardSlider::FalagardSlider(const String& type, const String& name) : - Slider(type, name), - d_vertical(false), - d_reversed(false) - { - addProperty(&d_verticalProperty); - addProperty(&d_reversedProperty); - } - - FalagardSlider::~FalagardSlider() - { - } - - void FalagardSlider::populateRenderCache() - { - const StateImagery* imagery; - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - Thumb* FalagardSlider::createThumb(const String& name) const - { - // return thumb created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - void FalagardSlider::performChildWindowLayout() - { - Slider::performChildWindowLayout(); - updateThumb(); - } - - void FalagardSlider::updateThumb(void) - { - // get area the thumb is supposed to use as it's area. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - Rect area(wlf.getNamedArea("ThumbTrackArea").getArea().getPixelRect(*this)); - // get accesss to the thumb - Thumb* theThumb = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_thumb__")); - - // get base location for thumb widget - Point thumbPosition(area.d_left, area.d_top); - - // Is this a vertical slider - if (d_vertical) - { - // pixel extent of total available area the thumb moves in - float slideExtent = area.getHeight() - theThumb->getAbsoluteHeight(); - // Set range of motion for the thumb widget - theThumb->setVertRange(absoluteToRelativeY_impl(this, area.d_top), absoluteToRelativeY_impl(this, area.d_top + slideExtent)); - - // calculate vertical positon for thumb - float thumbOffset = d_value * (slideExtent / d_maxValue); - thumbPosition.d_y += d_reversed ? thumbOffset : slideExtent - thumbOffset; - } - // Horizontal slider - else - { - // pixel extent of total available area the thumb moves in - float slideExtent = area.getWidth() - theThumb->getAbsoluteWidth(); - // Set range of motion for the thumb widget - theThumb->setHorzRange(absoluteToRelativeX_impl(this, area.d_left), absoluteToRelativeX_impl(this, area.d_left + slideExtent)); - - // calculate horizontal positon for thumb - float thumbOffset = d_value * (slideExtent / d_maxValue); - thumbPosition.d_x += d_reversed ? slideExtent - thumbOffset : thumbOffset; - } - - // set new position for thumb. - theThumb->setPosition(absoluteToRelative_impl(this, thumbPosition)); - } - - float FalagardSlider::getValueFromThumb(void) const - { - // get area the thumb is supposed to use as it's area. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - Rect area(wlf.getNamedArea("ThumbTrackArea").getArea().getPixelRect(*this)); - // get accesss to the thumb - Thumb* theThumb = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_thumb__")); - - // slider is vertical - if (d_vertical) - { - // pixel extent of total available area the thumb moves in - float slideExtent = area.getHeight() - theThumb->getAbsoluteHeight(); - // calculate value represented by current thumb position - float thumbValue = (theThumb->getAbsoluteYPosition() - area.d_top) / (slideExtent / d_maxValue); - // return final thumb value according to slider settings - return d_reversed ? thumbValue : d_maxValue - thumbValue; - } - // slider is horizontal - else - { - // pixel extent of total available area the thumb moves in - float slideExtent = area.getWidth() - theThumb->getAbsoluteWidth(); - // calculate value represented by current thumb position - float thumbValue = (theThumb->getAbsoluteXPosition() - area.d_left) / (slideExtent / d_maxValue); - // return final thumb value according to slider settings - return d_reversed ? d_maxValue - thumbValue : thumbValue; - } - } - - float FalagardSlider::getAdjustDirectionFromPoint(const Point& pt) const - { - Rect absrect(WindowManager::getSingleton().getWindow(getName() + "__auto_thumb__")->getUnclippedPixelRect()); - - if ((d_vertical && (pt.d_y < absrect.d_top)) || - (!d_vertical && (pt.d_x > absrect.d_right))) - { - return d_reversed ? -1.0f : 1.0f; - } - else if ((d_vertical && (pt.d_y > absrect.d_bottom)) || - (!d_vertical && (pt.d_x < absrect.d_left))) - { - return d_reversed ? 1.0f : -1.0f; - } - else - { - return 0; - } - } - - bool FalagardSlider::isVertical() const - { - return d_vertical; - } - - void FalagardSlider::setVertical(bool setting) - { - d_vertical = setting; - } - - bool FalagardSlider::isReversedDirection() const - { - return d_reversed; - } - - void FalagardSlider::setReversedDirection(bool setting) - { - d_reversed = setting; - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardSliderFactory::createWindow(const String& name) - { - return new FalagardSlider(d_type, name); - } - - void FalagardSliderFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSliderProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSliderProperties.cpp deleted file mode 100644 index e0adc32b05..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSliderProperties.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/************************************************************************ - filename: FalSliderProperties.cpp - created: Sun Jul 3 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalSliderProperties.h" -#include "FalSlider.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -namespace FalagardSliderProperties -{ - String VerticalSlider::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isVertical()); - } - - void VerticalSlider::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setVertical(PropertyHelper::stringToBool(value)); - } - - - String ReversedDirection::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isReversedDirection()); - } - - void ReversedDirection::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setReversedDirection(PropertyHelper::stringToBool(value)); - } - -} -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSpinner.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSpinner.cpp deleted file mode 100644 index d3c13a1ccb..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSpinner.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************************************ - filename: FalSpinner.cpp - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalSpinner.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIPushButton.h" -#include "elements/CEGUIEditbox.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardSpinner::WidgetTypeName[] = "Falagard/Spinner"; - - FalagardSpinner::FalagardSpinner(const String& type, const String& name) : - Spinner(type, name) - { - } - - FalagardSpinner::~FalagardSpinner() - { - } - - void FalagardSpinner::populateRenderCache() - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the approprite state. - const StateImagery* imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation - imagery->render(*this); - } - - PushButton* FalagardSpinner::createIncreaseButton(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - PushButton* FalagardSpinner::createDecreaseButton(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Editbox* FalagardSpinner::createEditbox(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardSpinnerFactory::createWindow(const String& name) - { - return new FalagardSpinner(d_type, name); - } - - void FalagardSpinnerFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticImage.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticImage.cpp deleted file mode 100644 index 972b7febab..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticImage.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************************************ - filename: FalStaticImage.cpp - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalStaticImage.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardStaticImage::WidgetTypeName[] = "Falagard/StaticImage"; - - FalagardStaticImage::FalagardStaticImage(const String& type, const String& name) : - StaticImage(type, name) - { - } - - FalagardStaticImage::~FalagardStaticImage() - { - } - - void FalagardStaticImage::populateRenderCache() - { - const StateImagery* imagery; - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - - bool is_enabled = !isDisabled(); - - // render frame section - if (d_frameEnabled) - { - imagery = &wlf.getStateImagery(is_enabled ? "EnabledFrame" : "DisabledFrame"); - // peform the rendering operation. - imagery->render(*this); - } - - // render background section - if (d_backgroundEnabled) - { - imagery = &wlf.getStateImagery(is_enabled ? "EnabledBackground" : "DisabledBackground"); - // peform the rendering operation. - imagery->render(*this); - } - - // render basic imagery - imagery = &wlf.getStateImagery(is_enabled ? "Enabled" : "Disabled"); - // peform the rendering operation. - imagery->render(*this); - - // call base class - StaticImage::populateRenderCache(); - } - - Rect FalagardStaticImage::getUnclippedInnerRect(void) const - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - - String area_name(isFrameEnabled() ? "WithFrame" : "NoFrame"); - area_name += "ImageRenderArea"; - - if (wlf.isNamedAreaDefined(area_name)) - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this).offset(getUnclippedPixelRect().getPosition()); - else - return StaticImage::getUnclippedInnerRect(); - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardStaticImageFactory::createWindow(const String& name) - { - return new FalagardStaticImage(d_type, name); - } - - void FalagardStaticImageFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticText.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticText.cpp deleted file mode 100644 index 318e917e5e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalStaticText.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************************************ - filename: FalStaticText.cpp - created: Tue Jul 5 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalStaticText.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIScrollbar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardStaticText::WidgetTypeName[] = "Falagard/StaticText"; - - FalagardStaticText::FalagardStaticText(const String& type, const String& name) : - StaticText(type, name) - { - } - - FalagardStaticText::~FalagardStaticText() - { - } - - void FalagardStaticText::populateRenderCache() - { - const StateImagery* imagery; - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - - bool is_enabled = !isDisabled(); - - // render frame section - if (d_frameEnabled) - { - imagery = &wlf.getStateImagery(is_enabled ? "EnabledFrame" : "DisabledFrame"); - // peform the rendering operation. - imagery->render(*this); - } - - // render background section - if (d_backgroundEnabled) - { - imagery = &wlf.getStateImagery(is_enabled ? "EnabledBackground" : "DisabledBackground"); - // peform the rendering operation. - imagery->render(*this); - } - - // render basic imagery - imagery = &wlf.getStateImagery(is_enabled ? "Enabled" : "Disabled"); - // peform the rendering operation. - imagery->render(*this); - - // call base class - StaticText::populateRenderCache(); - } - - Scrollbar* FalagardStaticText::createVertScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Scrollbar* FalagardStaticText::createHorzScrollbar(const String& name) const - { - // return component created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Rect FalagardStaticText::getTextRenderArea(void) const - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - bool v_visible = d_vertScrollbar->isVisible(true); - bool h_visible = d_horzScrollbar->isVisible(true); - - // if either of the scrollbars are visible, we might want to use another text rendering area - if (v_visible || h_visible) - { - String area_name("TextRenderArea"); - - if (h_visible) - { - area_name += "H"; - } - if (v_visible) - { - area_name += "V"; - } - area_name += "Scroll"; - - if (wlf.isNamedAreaDefined(area_name)) - { - return wlf.getNamedArea(area_name).getArea().getPixelRect(*this); - } - } - - // default to plain TextRenderArea - return wlf.getNamedArea("TextRenderArea").getArea().getPixelRect(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardStaticTextFactory::createWindow(const String& name) - { - return new FalagardStaticText(d_type, name); - } - - void FalagardStaticTextFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSystemButton.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSystemButton.cpp deleted file mode 100644 index 050ce3d7ef..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalSystemButton.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/************************************************************************ - filename: FalSystemButton.cpp - created: Sat Jul 9 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalSystemButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardSystemButton::WidgetTypeName[] = "Falagard/SystemButton"; - - FalagardSystemButton::FalagardSystemButton(const String& type, const String& name) : - FalagardButton(type, name) - { - } - - FalagardSystemButton::~FalagardSystemButton() - { - } - - Rect FalagardSystemButton::getPixelRect(void) const - { - // clip to grand-parent as needed - if (d_parent && d_parent->getParent() && isClippedByParent()) - { - return d_parent->getParent()->getInnerRect().getIntersection(getUnclippedPixelRect()); - } - // clip to screen if no grand-parent, or if clipping has been disabled for us. - else - { - return System::getSingleton().getRenderer()->getRect().getIntersection(getUnclippedPixelRect()); - } - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardSystemButtonFactory::createWindow(const String& name) - { - return new FalagardSystemButton(d_type, name); - } - - void FalagardSystemButtonFactory::destroyWindow(Window* window) - { - delete window; - } - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabButton.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabButton.cpp deleted file mode 100644 index 529d002e4e..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabButton.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/************************************************************************ - filename: FalTabTabButton.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalTabButton.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardTabButton::WidgetTypeName[] = "Falagard/TabButton"; - - FalagardTabButton::FalagardTabButton(const String& type, const String& name) : - TabButton(type, name) - { - } - - FalagardTabButton::~FalagardTabButton() - { - } - - void FalagardTabButton::drawSelf(float z) - { - // this is hackish and relies on insider knowlegde of the way that both TabButton (actually TabButtonBase) - // and Window implement things; Soon I'll get to updating things so that this can be replaced - // with clean code. - - // do we need to update the cache? - if (d_needsRedraw) - { - // remove old cached imagery - d_renderCache.clearCachedImagery(); - // signal that we'll no loger need a redraw. - d_needsRedraw = false; - // call TabButton drawSelf method which will call one of the state drawing methods overridden in this class. - TabButton::drawSelf(z); - } - - // call Window drawSelf to get it to send the cached imagery to the renderer. - Window::drawSelf(z); - } - - void FalagardTabButton::drawNormal(float z) - { - doTabButtonRender("Normal"); - } - - void FalagardTabButton::drawHover(float z) - { - doTabButtonRender("Hover"); - } - - void FalagardTabButton::drawPushed(float z) - { - doTabButtonRender("Selected"); - } - - void FalagardTabButton::drawDisabled(float z) - { - doTabButtonRender("Disabled"); - } - - void FalagardTabButton::doTabButtonRender(const String& state) - { - // this is the second part of the hackish code. We're duplicating the first section of code - // from the Window::drawSelf method to decide whether to actually do anything. It is likely - // this will be replaced with cleaner code in the near future... - - const StateImagery* imagery; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the state we were given, though default to Normal state if the - // desired state does not exist - imagery = wlf.isStateImageryPresent(state) ? &wlf.getStateImagery(state) : &wlf.getStateImagery("Normal"); - } - // catch exceptions, but do not exit. - catch (UnknownObjectException) - { - // don't try and draw using missing imagery! - return; - } - - // peform the rendering operation. - // NB: This is not in the above try block since we want UnknownObjectException exceptions to be emitted from - // the rendering code for conditions such as missing Imagesets and/or Images. - imagery->render(*this); - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardTabButtonFactory::createWindow(const String& name) - { - return new FalagardTabButton(d_type, name); - } - - void FalagardTabButtonFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControl.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControl.cpp deleted file mode 100644 index 3864ddc4fe..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControl.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/************************************************************************ - filename: FalTabControl.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalTabControl.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUITabButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardTabControl::WidgetTypeName[] = "Falagard/TabControl"; - FalagardTabControlProperties::TabButtonType FalagardTabControl::d_tabButtonTypeProperty; - - - FalagardTabControl::FalagardTabControl(const String& type, const String& name) : - TabControl(type, name) - { - addProperty(&d_tabButtonTypeProperty); - } - - FalagardTabControl::~FalagardTabControl() - { - } - - void FalagardTabControl::populateRenderCache() - { - const StateImagery* imagery; - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // render basic imagery - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - imagery->render(*this); - } - - TabPane* FalagardTabControl::createTabContentPane(const String& name) const - { - // return wiget created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - - Window* FalagardTabControl::createTabButtonPane(const String& name) const - { - try - { - // return wiget created by look'n'feel assignment. - return static_cast(WindowManager::getSingleton().getWindow(name)); - } - // use default if none provided by LookNFeel - catch (UnknownObjectException) - { - return TabControl::createTabButtonPane(name); - } - } - - TabButton* FalagardTabControl::createTabButton(const String& name) const - { - if (d_tabButtonType.empty()) - { - throw InvalidRequestException("FalagardTabControl::createTabButton - d_tabButtonType has not been set!"); - } - - return static_cast(WindowManager::getSingleton().createWindow(d_tabButtonType, name)); - } - - const String& FalagardTabControl::getTabButtonType() const - { - return d_tabButtonType; - } - - void FalagardTabControl::setTabButtonType(const String& type) - { - d_tabButtonType = type; - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardTabControlFactory::createWindow(const String& name) - { - return new FalagardTabControl(d_type, name); - } - - void FalagardTabControlFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControlProperties.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControlProperties.cpp deleted file mode 100644 index 8f1816a97a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabControlProperties.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/************************************************************************ - filename: FalTabControlProperties.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalTabControlProperties.h" -#include "FalTabControl.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -namespace FalagardTabControlProperties -{ -String TabButtonType::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getTabButtonType(); -} - -void TabButtonType::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setTabButtonType(value); -} - -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabPane.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabPane.cpp deleted file mode 100644 index a3f49e0f4a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTabPane.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************ - filename: FalTabPane.cpp - created: Fri Jul 8 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalTabPane.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardTabPane::WidgetTypeName[] = "Falagard/TabPane"; - - FalagardTabPane::FalagardTabPane(const String& type, const String& name) : - TabPane(type, name) - { - } - - FalagardTabPane::~FalagardTabPane() - { - } - - void FalagardTabPane::populateRenderCache() - { - const StateImagery* imagery; - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // render basic imagery - imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - imagery->render(*this); - } - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardTabPaneFactory::createWindow(const String& name) - { - return new FalagardTabPane(d_type, name); - } - - void FalagardTabPaneFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalThumb.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalThumb.cpp deleted file mode 100644 index 38aefbbdc1..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalThumb.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/************************************************************************ - filename: FalThumb.cpp - created: Sun Jul 3 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalThumb.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardThumb::WidgetTypeName[] = "Falagard/Thumb"; - - - FalagardThumb::FalagardThumb(const String& type, const String& name) : - Thumb(type, name) - { - } - - FalagardThumb::~FalagardThumb() - { - } - - void FalagardThumb::drawSelf(float z) - { - // this is hackish and relies on insider knowlegde of the way that both Thumb (actually ButtonBase) - // and Window implement things; Soon I'll get to updating things so that this can be replaced - // with clean code. - - // call Thumb drawSelf method which will call one of the state drawing methods overridden in this class. - Thumb::drawSelf(z); - - // call Window drawSelf to get it to send the cached imagery to the renderer. - Window::drawSelf(z); - } - - void FalagardThumb::drawNormal(float z) - { - doThumbRender("Normal"); - } - - void FalagardThumb::drawHover(float z) - { - doThumbRender("Hover"); - } - - void FalagardThumb::drawPushed(float z) - { - doThumbRender("Pushed"); - } - - void FalagardThumb::drawDisabled(float z) - { - doThumbRender("Disabled"); - } - - void FalagardThumb::doThumbRender(const String& state) - { - // this is the second part of the hackish code. We're duplicating the first section of code - // from the Window::drawSelf method to decide whether to actually do anything. It is likely - // this will be replaced with cleaner code in the near future... - - // do we need to update the cache? - if (d_needsRedraw) - { - // remove old cached imagery - d_renderCache.clearCachedImagery(); - // signal that we'll no loger need a redraw. - d_needsRedraw = false; - - // this conditional is just here to respect old legacy settings - if (d_useStandardImagery) - { - const StateImagery* imagery; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for the state we were given, though default to Normal state if the - // desired state does not exist - imagery = wlf.isStateImageryPresent(state) ? &wlf.getStateImagery(state) : &wlf.getStateImagery("Normal"); - } - // catch exceptions, but do not exit. - catch (UnknownObjectException) - { - // don't try and draw using missing imagery! - return; - } - - // peform the rendering operation. - // NB: This is not in the above try block since we want UnknownObjectException exceptions to be emitted from - // the rendering code for conditions such as missing Imagesets and/or Images. - imagery->render(*this); - } - } - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardThumbFactory::createWindow(const String& name) - { - return new FalagardThumb(d_type, name); - } - - void FalagardThumbFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTitlebar.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTitlebar.cpp deleted file mode 100644 index 5486030cfc..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTitlebar.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************************************ - filename: FalTitlebar.cpp - created: Sat Jul 2 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalTitlebar.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardTitlebar::WidgetTypeName[] = "Falagard/Titlebar"; - - FalagardTitlebar::FalagardTitlebar(const String& type, const String& name) : - Titlebar(type, name) - { - } - - FalagardTitlebar::~FalagardTitlebar() - { - } - - void FalagardTitlebar::populateRenderCache() - { - const StateImagery* imagery; - - try - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - if (!isDisabled()) - imagery = &wlf.getStateImagery((d_parent && d_parent->isActive()) ? "Active" : "Inactive"); - else - imagery = &wlf.getStateImagery("Disabled"); - } - catch (UnknownObjectException) - { - // log error so we know imagery is missing, and then quit. - return; - } - - // peform the rendering operation. - imagery->render(*this); - } - - Rect FalagardTitlebar::getPixelRect(void) const - { - // clip to grand-parent as needed - if (d_parent && d_parent->getParent() && isClippedByParent()) - { - return d_parent->getParent()->getInnerRect().getIntersection(getUnclippedPixelRect()); - } - // clip to screen if no grand-parent, or if clipping has been disabled for us. - else - { - return System::getSingleton().getRenderer()->getRect().getIntersection(getUnclippedPixelRect()); - } - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardTitlebarFactory::createWindow(const String& name) - { - return new FalagardTitlebar(d_type, name); - } - - void FalagardTitlebarFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTooltip.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTooltip.cpp deleted file mode 100644 index f07c0a1b97..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/FalTooltip.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************ - filename: FalTooltip.cpp - created: Thu Jul 7 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "FalTooltip.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - const utf8 FalagardTooltip::WidgetTypeName[] = "Falagard/Tooltip"; - - FalagardTooltip::FalagardTooltip(const String& type, const String& name) : - Tooltip(type, name) - { - } - - FalagardTooltip::~FalagardTooltip() - { - } - - void FalagardTooltip::populateRenderCache() - { - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // try and get imagery for our current state - const StateImagery* imagery = &wlf.getStateImagery(isDisabled() ? "Disabled" : "Enabled"); - // peform the rendering operation. - imagery->render(*this); - } - - Size FalagardTooltip::getTextSize() const - { - Size sz(Tooltip::getTextSize()); - - // get WidgetLookFeel for the assigned look. - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - - Rect textArea(wlf.getNamedArea("TextArea").getArea().getPixelRect(*this)); - Rect wndArea(getAbsoluteRect()); - - sz.d_width += wndArea.getWidth() - textArea.getWidth(); - sz.d_height += wndArea.getHeight() - textArea.getHeight(); - return sz; - } - - - ////////////////////////////////////////////////////////////////////////// - /************************************************************************* - - Factory Methods - - *************************************************************************/ - ////////////////////////////////////////////////////////////////////////// - Window* FalagardTooltipFactory::createWindow(const String& name) - { - return new FalagardTooltip(d_type, name); - } - - void FalagardTooltipFactory::destroyWindow(Window* window) - { - delete window; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/Makefile.am b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/Makefile.am deleted file mode 100644 index 9db0059b1f..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -INCLUDES = -I$(top_srcdir)/include \ - -I$(top_srcdir)/WidgetSets/Falagard/include - -lib_LTLIBRARIES=libCEGUIFalagardBase.la - -libCEGUIFalagardBase_la_SOURCES = FalButton.cpp \ - FalCheckbox.cpp \ - FalComboDropList.cpp \ - FalCombobox.cpp \ - FalEditbox.cpp \ - FalFrameWindow.cpp \ - FalListHeader.cpp \ - FalListHeaderProperties.cpp \ - FalListHeaderSegment.cpp \ - FalListHeaderSegmentProperties.cpp \ - FalListbox.cpp \ - FalMenuBar.cpp \ - FalMenuItem.cpp \ - FalModule.cpp \ - FalMultiColumnList.cpp \ - FalMultiLineEditbox.cpp \ - FalMultiLineEditboxProperties.cpp \ - FalPopupMenu.cpp \ - FalProgressBar.cpp \ - FalProgressBarProperties.cpp \ - FalRadioButton.cpp \ - FalScrollablePane.cpp \ - FalScrollbar.cpp \ - FalScrollbarProperties.cpp \ - FalSlider.cpp \ - FalSliderProperties.cpp \ - FalSpinner.cpp \ - FalStaticImage.cpp \ - FalStaticText.cpp \ - FalSystemButton.cpp \ - FalTabButton.cpp \ - FalTabControl.cpp \ - FalTabControlProperties.cpp \ - FalTabPane.cpp \ - FalThumb.cpp \ - FalTitlebar.cpp \ - FalTooltip.cpp diff --git a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/StdInc.cpp b/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/StdInc.cpp deleted file mode 100644 index f8c4e9691a..0000000000 --- a/vendor/cegui-0.4.0-custom/WidgetSets/Falagard/src/StdInc.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// -// StdInc.cpp -// -// FalagardBase PCH creation -// - -#include "StdInc.h" diff --git a/vendor/cegui-0.4.0-custom/Xerces-c License.txt b/vendor/cegui-0.4.0-custom/Xerces-c License.txt deleted file mode 100644 index 0423e2dd8d..0000000000 --- a/vendor/cegui-0.4.0-custom/Xerces-c License.txt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 1999-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/vendor/cegui-0.4.0-custom/dependencies/include/GL/glut.h b/vendor/cegui-0.4.0-custom/dependencies/include/GL/glut.h deleted file mode 100644 index 0e6ddfbfec..0000000000 --- a/vendor/cegui-0.4.0-custom/dependencies/include/GL/glut.h +++ /dev/null @@ -1,716 +0,0 @@ -#ifndef __glut_h__ -#define __glut_h__ - -/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */ - -/* This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. */ - -#if defined(_WIN32) - -/* GLUT 3.7 now tries to avoid including - to avoid name space pollution, but Win32's - needs APIENTRY and WINGDIAPI defined properly. */ -# if 0 - /* This would put tons of macros and crap in our clean name space. */ -# define WIN32_LEAN_AND_MEAN -# include -# else - /* XXX This is from Win32's */ -# ifndef APIENTRY -# define GLUT_APIENTRY_DEFINED -# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__) -# define APIENTRY __stdcall -# else -# define APIENTRY -# endif -# endif - /* XXX This is from Win32's */ -# ifndef CALLBACK -# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) || defined(__LCC__) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -# endif - /* XXX Hack for lcc compiler. It doesn't support __declspec(dllimport), just __stdcall. */ -# if defined( __LCC__ ) -# undef WINGDIAPI -# define WINGDIAPI __stdcall -# else - /* XXX This is from Win32's and */ -# ifndef WINGDIAPI -# define GLUT_WINGDIAPI_DEFINED -# define WINGDIAPI __declspec(dllimport) -# endif -# endif - /* XXX This is from Win32's */ -# ifndef _WCHAR_T_DEFINED -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -# endif -# endif - -/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA - in your compile preprocessor options. */ -# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA) -# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */ -/* To enable automatic SGI OpenGL for Windows library usage for GLUT, - define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */ -# ifdef GLUT_USE_SGI_OPENGL -# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */ -# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */ -# pragma comment (lib, "glut.lib") /* link with Win32 GLUT for SGI OpenGL lib */ -# else -# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */ -# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */ -# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */ -# endif -# endif - -/* To disable supression of annoying warnings about floats being promoted - to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor - options. */ -# ifndef GLUT_NO_WARNING_DISABLE -# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */ -# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */ -# endif - -/* Win32 has an annoying issue where there are multiple C run-time - libraries (CRTs). If the executable is linked with a different CRT - from the GLUT DLL, the GLUT DLL will not share the same CRT static - data seen by the executable. In particular, atexit callbacks registered - in the executable will not be called if GLUT calls its (different) - exit routine). GLUT is typically built with the - "/MD" option (the CRT with multithreading DLL support), but the Visual - C++ linker default is "/ML" (the single threaded CRT). - - One workaround to this issue is requiring users to always link with - the same CRT as GLUT is compiled with. That requires users supply a - non-standard option. GLUT 3.7 has its own built-in workaround where - the executable's "exit" function pointer is covertly passed to GLUT. - GLUT then calls the executable's exit function pointer to ensure that - any "atexit" calls registered by the application are called if GLUT - needs to exit. - - Note that the __glut*WithExit routines should NEVER be called directly. - To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ - -/* XXX This is from Win32's */ -# if !defined(_MSC_VER) && !defined(__cdecl) - /* Define __cdecl for non-Microsoft compilers. */ -# define __cdecl -# define GLUT_DEFINED___CDECL -# endif -# ifndef _CRTIMP -# ifdef _NTSDK - /* Definition compatible with NT SDK */ -# define _CRTIMP -# else - /* Current definition */ -# ifdef _DLL -# define _CRTIMP __declspec(dllimport) -# else -# define _CRTIMP -# endif -# endif -# define GLUT_DEFINED__CRTIMP -# endif - -/* GLUT API entry point declarations for Win32. */ -# ifdef GLUT_BUILDING_LIB -# define GLUTAPI __declspec(dllexport) -# else -# ifdef _DLL -# define GLUTAPI __declspec(dllimport) -# else -# define GLUTAPI extern -# endif -# endif - -/* GLUT callback calling convention for Win32. */ -# define GLUTCALLBACK __cdecl - -#endif /* _WIN32 */ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(_WIN32) -# ifndef GLUT_BUILDING_LIB -extern _CRTIMP void __cdecl exit(int); -# endif -#else -/* non-Win32 case. */ -/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */ -# define APIENTRY -# define GLUT_APIENTRY_DEFINED -# define CALLBACK -/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */ -# define GLUTAPI extern -# define GLUTCALLBACK -/* Prototype exit for the non-Win32 case (see above). */ -extern void exit(int); -#endif - -/** - GLUT API revision history: - - GLUT_API_VERSION is updated to reflect incompatible GLUT - API changes (interface changes, semantic changes, deletions, - or additions). - - GLUT_API_VERSION=1 First public release of GLUT. 11/29/94 - - GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling, - extension. Supports new input devices like tablet, dial and button - box, and Spaceball. Easy to query OpenGL extensions. - - GLUT_API_VERSION=3 glutMenuStatus added. - - GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer, - glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic - video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc, - glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat, - glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!). -**/ -#ifndef GLUT_API_VERSION /* allow this to be overriden */ -#define GLUT_API_VERSION 3 -#endif - -/** - GLUT implementation revision history: - - GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT - API revisions and implementation revisions (ie, bug fixes). - - GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of - GLUT Xlib-based implementation. 11/29/94 - - GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of - GLUT Xlib-based implementation providing GLUT version 2 - interfaces. - - GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95 - - GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95 - - GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95 - - GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96 - - GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner - and video resize. 1/3/97 - - GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines. - - GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release. - - GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling. - - GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support. - - GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface. - - GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa -**/ -#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */ -#define GLUT_XLIB_IMPLEMENTATION 15 -#endif - -/* Display mode bit masks. */ -#define GLUT_RGB 0 -#define GLUT_RGBA GLUT_RGB -#define GLUT_INDEX 1 -#define GLUT_SINGLE 0 -#define GLUT_DOUBLE 2 -#define GLUT_ACCUM 4 -#define GLUT_ALPHA 8 -#define GLUT_DEPTH 16 -#define GLUT_STENCIL 32 -#if (GLUT_API_VERSION >= 2) -#define GLUT_MULTISAMPLE 128 -#define GLUT_STEREO 256 -#endif -#if (GLUT_API_VERSION >= 3) -#define GLUT_LUMINANCE 512 -#endif - -/* Mouse buttons. */ -#define GLUT_LEFT_BUTTON 0 -#define GLUT_MIDDLE_BUTTON 1 -#define GLUT_RIGHT_BUTTON 2 - -/* Mouse button state. */ -#define GLUT_DOWN 0 -#define GLUT_UP 1 - -#if (GLUT_API_VERSION >= 2) -/* function keys */ -#define GLUT_KEY_F1 1 -#define GLUT_KEY_F2 2 -#define GLUT_KEY_F3 3 -#define GLUT_KEY_F4 4 -#define GLUT_KEY_F5 5 -#define GLUT_KEY_F6 6 -#define GLUT_KEY_F7 7 -#define GLUT_KEY_F8 8 -#define GLUT_KEY_F9 9 -#define GLUT_KEY_F10 10 -#define GLUT_KEY_F11 11 -#define GLUT_KEY_F12 12 -/* directional keys */ -#define GLUT_KEY_LEFT 100 -#define GLUT_KEY_UP 101 -#define GLUT_KEY_RIGHT 102 -#define GLUT_KEY_DOWN 103 -#define GLUT_KEY_PAGE_UP 104 -#define GLUT_KEY_PAGE_DOWN 105 -#define GLUT_KEY_HOME 106 -#define GLUT_KEY_END 107 -#define GLUT_KEY_INSERT 108 -#endif - -/* Entry/exit state. */ -#define GLUT_LEFT 0 -#define GLUT_ENTERED 1 - -/* Menu usage state. */ -#define GLUT_MENU_NOT_IN_USE 0 -#define GLUT_MENU_IN_USE 1 - -/* Visibility state. */ -#define GLUT_NOT_VISIBLE 0 -#define GLUT_VISIBLE 1 - -/* Window status state. */ -#define GLUT_HIDDEN 0 -#define GLUT_FULLY_RETAINED 1 -#define GLUT_PARTIALLY_RETAINED 2 -#define GLUT_FULLY_COVERED 3 - -/* Color index component selection values. */ -#define GLUT_RED 0 -#define GLUT_GREEN 1 -#define GLUT_BLUE 2 - -#if defined(_WIN32) -/* Stroke font constants (use these in GLUT program). */ -#define GLUT_STROKE_ROMAN ((void*)0) -#define GLUT_STROKE_MONO_ROMAN ((void*)1) - -/* Bitmap font constants (use these in GLUT program). */ -#define GLUT_BITMAP_9_BY_15 ((void*)2) -#define GLUT_BITMAP_8_BY_13 ((void*)3) -#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4) -#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5) -#if (GLUT_API_VERSION >= 3) -#define GLUT_BITMAP_HELVETICA_10 ((void*)6) -#define GLUT_BITMAP_HELVETICA_12 ((void*)7) -#define GLUT_BITMAP_HELVETICA_18 ((void*)8) -#endif -#else -/* Stroke font opaque addresses (use constants instead in source code). */ -GLUTAPI void *glutStrokeRoman; -GLUTAPI void *glutStrokeMonoRoman; - -/* Stroke font constants (use these in GLUT program). */ -#define GLUT_STROKE_ROMAN (&glutStrokeRoman) -#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman) - -/* Bitmap font opaque addresses (use constants instead in source code). */ -GLUTAPI void *glutBitmap9By15; -GLUTAPI void *glutBitmap8By13; -GLUTAPI void *glutBitmapTimesRoman10; -GLUTAPI void *glutBitmapTimesRoman24; -GLUTAPI void *glutBitmapHelvetica10; -GLUTAPI void *glutBitmapHelvetica12; -GLUTAPI void *glutBitmapHelvetica18; - -/* Bitmap font constants (use these in GLUT program). */ -#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) -#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13) -#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10) -#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24) -#if (GLUT_API_VERSION >= 3) -#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10) -#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12) -#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18) -#endif -#endif - -/* glutGet parameters. */ -#define GLUT_WINDOW_X ((GLenum) 100) -#define GLUT_WINDOW_Y ((GLenum) 101) -#define GLUT_WINDOW_WIDTH ((GLenum) 102) -#define GLUT_WINDOW_HEIGHT ((GLenum) 103) -#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104) -#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105) -#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106) -#define GLUT_WINDOW_RED_SIZE ((GLenum) 107) -#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108) -#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109) -#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110) -#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111) -#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112) -#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113) -#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114) -#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115) -#define GLUT_WINDOW_RGBA ((GLenum) 116) -#define GLUT_WINDOW_PARENT ((GLenum) 117) -#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118) -#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119) -#if (GLUT_API_VERSION >= 2) -#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120) -#define GLUT_WINDOW_STEREO ((GLenum) 121) -#endif -#if (GLUT_API_VERSION >= 3) -#define GLUT_WINDOW_CURSOR ((GLenum) 122) -#endif -#define GLUT_SCREEN_WIDTH ((GLenum) 200) -#define GLUT_SCREEN_HEIGHT ((GLenum) 201) -#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202) -#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203) -#define GLUT_MENU_NUM_ITEMS ((GLenum) 300) -#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400) -#define GLUT_INIT_WINDOW_X ((GLenum) 500) -#define GLUT_INIT_WINDOW_Y ((GLenum) 501) -#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502) -#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503) -#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504) -#if (GLUT_API_VERSION >= 2) -#define GLUT_ELAPSED_TIME ((GLenum) 700) -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123) -#endif - -#if (GLUT_API_VERSION >= 2) -/* glutDeviceGet parameters. */ -#define GLUT_HAS_KEYBOARD ((GLenum) 600) -#define GLUT_HAS_MOUSE ((GLenum) 601) -#define GLUT_HAS_SPACEBALL ((GLenum) 602) -#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603) -#define GLUT_HAS_TABLET ((GLenum) 604) -#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605) -#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606) -#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607) -#define GLUT_NUM_DIALS ((GLenum) 608) -#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609) -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610) -#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611) -#define GLUT_HAS_JOYSTICK ((GLenum) 612) -#define GLUT_OWNS_JOYSTICK ((GLenum) 613) -#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614) -#define GLUT_JOYSTICK_AXES ((GLenum) 615) -#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616) -#endif - -#if (GLUT_API_VERSION >= 3) -/* glutLayerGet parameters. */ -#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800) -#define GLUT_LAYER_IN_USE ((GLenum) 801) -#define GLUT_HAS_OVERLAY ((GLenum) 802) -#define GLUT_TRANSPARENT_INDEX ((GLenum) 803) -#define GLUT_NORMAL_DAMAGED ((GLenum) 804) -#define GLUT_OVERLAY_DAMAGED ((GLenum) 805) - -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -/* glutVideoResizeGet parameters. */ -#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900) -#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901) -#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902) -#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903) -#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904) -#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905) -#define GLUT_VIDEO_RESIZE_X ((GLenum) 906) -#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907) -#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908) -#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909) -#endif - -/* glutUseLayer parameters. */ -#define GLUT_NORMAL ((GLenum) 0) -#define GLUT_OVERLAY ((GLenum) 1) - -/* glutGetModifiers return mask. */ -#define GLUT_ACTIVE_SHIFT 1 -#define GLUT_ACTIVE_CTRL 2 -#define GLUT_ACTIVE_ALT 4 - -/* glutSetCursor parameters. */ -/* Basic arrows. */ -#define GLUT_CURSOR_RIGHT_ARROW 0 -#define GLUT_CURSOR_LEFT_ARROW 1 -/* Symbolic cursor shapes. */ -#define GLUT_CURSOR_INFO 2 -#define GLUT_CURSOR_DESTROY 3 -#define GLUT_CURSOR_HELP 4 -#define GLUT_CURSOR_CYCLE 5 -#define GLUT_CURSOR_SPRAY 6 -#define GLUT_CURSOR_WAIT 7 -#define GLUT_CURSOR_TEXT 8 -#define GLUT_CURSOR_CROSSHAIR 9 -/* Directional cursors. */ -#define GLUT_CURSOR_UP_DOWN 10 -#define GLUT_CURSOR_LEFT_RIGHT 11 -/* Sizing cursors. */ -#define GLUT_CURSOR_TOP_SIDE 12 -#define GLUT_CURSOR_BOTTOM_SIDE 13 -#define GLUT_CURSOR_LEFT_SIDE 14 -#define GLUT_CURSOR_RIGHT_SIDE 15 -#define GLUT_CURSOR_TOP_LEFT_CORNER 16 -#define GLUT_CURSOR_TOP_RIGHT_CORNER 17 -#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18 -#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19 -/* Inherit from parent window. */ -#define GLUT_CURSOR_INHERIT 100 -/* Blank cursor. */ -#define GLUT_CURSOR_NONE 101 -/* Fullscreen crosshair (if available). */ -#define GLUT_CURSOR_FULL_CROSSHAIR 102 -#endif - -/* GLUT initialization sub-API. */ -GLUTAPI void APIENTRY glutInit(int *argcp, char **argv); -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) -GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); -#ifndef GLUT_BUILDING_LIB -static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } -#define glutInit glutInit_ATEXIT_HACK -#endif -#endif -GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI void APIENTRY glutInitDisplayString(const char *string); -#endif -GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y); -GLUTAPI void APIENTRY glutInitWindowSize(int width, int height); -GLUTAPI void APIENTRY glutMainLoop(void); - -/* GLUT window sub-API. */ -GLUTAPI int APIENTRY glutCreateWindow(const char *title); -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) -GLUTAPI int APIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); -#ifndef GLUT_BUILDING_LIB -static int APIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } -#define glutCreateWindow glutCreateWindow_ATEXIT_HACK -#endif -#endif -GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height); -GLUTAPI void APIENTRY glutDestroyWindow(int win); -GLUTAPI void APIENTRY glutPostRedisplay(void); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) -GLUTAPI void APIENTRY glutPostWindowRedisplay(int win); -#endif -GLUTAPI void APIENTRY glutSwapBuffers(void); -GLUTAPI int APIENTRY glutGetWindow(void); -GLUTAPI void APIENTRY glutSetWindow(int win); -GLUTAPI void APIENTRY glutSetWindowTitle(const char *title); -GLUTAPI void APIENTRY glutSetIconTitle(const char *title); -GLUTAPI void APIENTRY glutPositionWindow(int x, int y); -GLUTAPI void APIENTRY glutReshapeWindow(int width, int height); -GLUTAPI void APIENTRY glutPopWindow(void); -GLUTAPI void APIENTRY glutPushWindow(void); -GLUTAPI void APIENTRY glutIconifyWindow(void); -GLUTAPI void APIENTRY glutShowWindow(void); -GLUTAPI void APIENTRY glutHideWindow(void); -#if (GLUT_API_VERSION >= 3) -GLUTAPI void APIENTRY glutFullScreen(void); -GLUTAPI void APIENTRY glutSetCursor(int cursor); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI void APIENTRY glutWarpPointer(int x, int y); -#endif - -/* GLUT overlay sub-API. */ -GLUTAPI void APIENTRY glutEstablishOverlay(void); -GLUTAPI void APIENTRY glutRemoveOverlay(void); -GLUTAPI void APIENTRY glutUseLayer(GLenum layer); -GLUTAPI void APIENTRY glutPostOverlayRedisplay(void); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11) -GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win); -#endif -GLUTAPI void APIENTRY glutShowOverlay(void); -GLUTAPI void APIENTRY glutHideOverlay(void); -#endif - -/* GLUT menu sub-API. */ -GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int)); -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) -GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int)); -#ifndef GLUT_BUILDING_LIB -static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); } -#define glutCreateMenu glutCreateMenu_ATEXIT_HACK -#endif -#endif -GLUTAPI void APIENTRY glutDestroyMenu(int menu); -GLUTAPI int APIENTRY glutGetMenu(void); -GLUTAPI void APIENTRY glutSetMenu(int menu); -GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value); -GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu); -GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value); -GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu); -GLUTAPI void APIENTRY glutRemoveMenuItem(int item); -GLUTAPI void APIENTRY glutAttachMenu(int button); -GLUTAPI void APIENTRY glutDetachMenu(int button); - -/* GLUT window callback sub-API. */ -GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void)); -GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height)); -GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); -GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); -GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); -GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); -GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state)); -GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state)); -GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void)); -GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value); -GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state)); -#if (GLUT_API_VERSION >= 2) -GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); -GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); -GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z)); -GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state)); -GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state)); -GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value)); -GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y)); -GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y)); -#if (GLUT_API_VERSION >= 3) -GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y)); -GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void)); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state)); -#endif -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y)); -GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y)); -GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval); -#endif -#endif -#endif - -/* GLUT color index sub-API. */ -GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue); -GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component); -GLUTAPI void APIENTRY glutCopyColormap(int win); - -/* GLUT state retrieval sub-API. */ -GLUTAPI int APIENTRY glutGet(GLenum type); -GLUTAPI int APIENTRY glutDeviceGet(GLenum type); -#if (GLUT_API_VERSION >= 2) -/* GLUT extension support sub-API */ -GLUTAPI int APIENTRY glutExtensionSupported(const char *name); -#endif -#if (GLUT_API_VERSION >= 3) -GLUTAPI int APIENTRY glutGetModifiers(void); -GLUTAPI int APIENTRY glutLayerGet(GLenum type); -#endif - -/* GLUT font sub-API */ -GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character); -GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character); -GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character); -GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character); -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string); -GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string); -#endif - -/* GLUT pre-built models sub-API */ -GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks); -GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); -GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); -GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); -GLUTAPI void APIENTRY glutWireCube(GLdouble size); -GLUTAPI void APIENTRY glutSolidCube(GLdouble size); -GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); -GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); -GLUTAPI void APIENTRY glutWireDodecahedron(void); -GLUTAPI void APIENTRY glutSolidDodecahedron(void); -GLUTAPI void APIENTRY glutWireTeapot(GLdouble size); -GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size); -GLUTAPI void APIENTRY glutWireOctahedron(void); -GLUTAPI void APIENTRY glutSolidOctahedron(void); -GLUTAPI void APIENTRY glutWireTetrahedron(void); -GLUTAPI void APIENTRY glutSolidTetrahedron(void); -GLUTAPI void APIENTRY glutWireIcosahedron(void); -GLUTAPI void APIENTRY glutSolidIcosahedron(void); - -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9) -/* GLUT video resize sub-API. */ -GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param); -GLUTAPI void APIENTRY glutSetupVideoResizing(void); -GLUTAPI void APIENTRY glutStopVideoResizing(void); -GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height); -GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height); - -/* GLUT debugging sub-API. */ -GLUTAPI void APIENTRY glutReportErrors(void); -#endif - -#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13) -/* GLUT device control sub-API. */ -/* glutSetKeyRepeat modes. */ -#define GLUT_KEY_REPEAT_OFF 0 -#define GLUT_KEY_REPEAT_ON 1 -#define GLUT_KEY_REPEAT_DEFAULT 2 - -/* Joystick button masks. */ -#define GLUT_JOYSTICK_BUTTON_A 1 -#define GLUT_JOYSTICK_BUTTON_B 2 -#define GLUT_JOYSTICK_BUTTON_C 4 -#define GLUT_JOYSTICK_BUTTON_D 8 - -GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore); -GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode); -GLUTAPI void APIENTRY glutForceJoystickFunc(void); - -/* GLUT game mode sub-API. */ -/* glutGameModeGet. */ -#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0) -#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1) -#define GLUT_GAME_MODE_WIDTH ((GLenum) 2) -#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3) -#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4) -#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5) -#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6) - -GLUTAPI void APIENTRY glutGameModeString(const char *string); -GLUTAPI int APIENTRY glutEnterGameMode(void); -GLUTAPI void APIENTRY glutLeaveGameMode(void); -GLUTAPI int APIENTRY glutGameModeGet(GLenum mode); -#endif - -#ifdef __cplusplus -} - -#endif - -#ifdef GLUT_APIENTRY_DEFINED -# undef GLUT_APIENTRY_DEFINED -# undef APIENTRY -#endif - -#ifdef GLUT_WINGDIAPI_DEFINED -# undef GLUT_WINGDIAPI_DEFINED -# undef WINGDIAPI -#endif - -#ifdef GLUT_DEFINED___CDECL -# undef GLUT_DEFINED___CDECL -# undef __cdecl -#endif - -#ifdef GLUT_DEFINED__CRTIMP -# undef GLUT_DEFINED__CRTIMP -# undef _CRTIMP -#endif - -#endif /* __glut_h__ */ diff --git a/vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/Readme.txt b/vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/Readme.txt deleted file mode 100644 index 3753ab31e5..0000000000 --- a/vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/Readme.txt +++ /dev/null @@ -1 +0,0 @@ -Contents of this directory is not required to compile the main solution. \ No newline at end of file diff --git a/vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/_xercesc contents.7z b/vendor/cegui-0.4.0-custom/dependencies/include/_xercesc/_xercesc contents.7z deleted file mode 100644 index 4298c979fdf3a5bd94b2b8a80f6b219b1f9cc0f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370505 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®kvCT+b(0;DiU_QI~bY&Vh8!64l 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 z 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

GHsn(!rTH7sM^SOZEj27zzR$A> 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�xMx_AeDIUKzw04v)S~gB+OOL(L+0(Mv85wk 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

GCTw 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 diff --git a/vendor/cegui-0.4.0-custom/dependencies/lib/ILUT.lib b/vendor/cegui-0.4.0-custom/dependencies/lib/ILUT.lib deleted file mode 100644 index 48e1363f3503def14da08fc927570c6775499d1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9484 zcmcgx&2JM&6n{y8KnNs+e2{PF1DalF66_>MRck_MVsOAp9980yIPnsU9NTgn#ED)x z^nmyS5K?dS#-TknN2DV4P>xhW9H_*B6Gx=<&F;LJH@o&`9fz*;JUefHGr#$GGw;oK z=-X6r@E~Y4h7o)#?)SR%v#t5X;@k6WY|6$b3F)rE(mpHRX`^qccwDMWqhZ zRvFlZL@FB{S2)TVm{_i4ZCXXf%rxbYoLNG>%xtJMzo|6pUM>|gxlPsxtuSyuW^z}v znZkNLRZO#5@Iu+|Ik3T37b;2BDDKfnW&_b3VUt-B}} z1_7R+d`21W0(guf9CQKY4a!0{)`v2H^*utl7Xo;V5*-3~j?#&~{UOQ+l-nZ!FHypy z08ddc9DzEhha+$ljzJ@IKqquz<=xN&z0e2!a2!rR6P$!*I0dJn1zO<@w82?uhXELb z5DdXEjKCk@&sdkqh= znQL@_z1jfdre;Js`lH-JmCyBj@!wnxxM81uF*aL!0;WS`k@K!Mq4h*DTFKX#)Vfxe zqt&iPxo%I3(d(-y!YRe01*uW%$H^;xs@7ODHb#Zj>OL z=U(Ut?ClX7O`vF4Jy3U}7|99EUDDVc6YXmtO;})1p)nDy5qgXW)g$TxP@{wI^$^G3 z>I0_o=HEo!3~K+A;TdNC^|t;0ZZ`{m(EiKWN80|Rf0%t-BCW8GUnnC}VIN;$-h<4i zn1hOUPF0WD^d&ZC&Ytl%5;&7ve$0OMjD=cL5&9%d@K4Ifl&vYeS#utN`-?I%J;bpM zGM;!^sc=JOo!Etk?4C7OyxpT&gQ^+BVL5#+Msasqhvy~xK2gUy ziilor(T(fvzH006<2%Oq%vhCrRsHO#4cIlBc&UJHON}Ovf)yFP1RYC1 zuH%}Ehgn3SMl>*2r2Hzw3lH@Bs$VK@S436MSeQaM*9hYE4BmjanC$z*8n}FVCGJ}6 zy@TCB*1+V`t7grlY(A`J=m0k8!*xn=@$=D_>DOt_rS2(e;G*EhWf@{^wRpM2Ul@vv zUIN>@k5_4BT=K9;)hoilJU(-EhVjr@tR}ng8NW6!S54y=@$o8W8JBTzKKLk3mEWC2 zVAIan)QSASOp(d*Od(|IU`(!)@`3rn6`}#Wz{WdbxkJf21VwVFdv2Fv;kOetaQV#D zInAZ-Jrota1YKKxHrP!}?h6$nseUE<^s9&1_)X2hnSAz)Ud6=!zfx4yTZWH^>?1CA zxl{v_Pp|rk$+)(vfy-xiAK+ZhUvY|vUV>VnUo11ocxZQL4y)>!^4pn0jO);Lrpx7b xLUA}BB0ksUAdTPQ#x%n&Hs{*01}>kKJi@rtg{GpSm%#SnGlrv#scZ<}^dCCuB8vb3 diff --git a/vendor/cegui-0.4.0-custom/dependencies/lib/glut32.lib b/vendor/cegui-0.4.0-custom/dependencies/lib/glut32.lib deleted file mode 100644 index c25583d44b72d67e32a8bb20bd542bef43d01161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28728 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 aQ@(70_FJ{ta$aHXXZdbfjGh;mE&l_+^;^^c diff --git a/vendor/cegui-0.4.0-custom/dependencies/lib/xerces-c_2.lib b/vendor/cegui-0.4.0-custom/dependencies/lib/xerces-c_2.lib deleted file mode 100644 index cf8cd5c7d5e5f80759e37d542886e1bdb7fe7e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3024874 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 z

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

a}rAiN4o^p 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�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

    EtoWmhsAH1$ z2F*l+84o_Z+zG&nXPIMIirzJLZ4W~`#4r|H;XNOjGQiA~Sx^PngMiER>?@XuTHk81 z_MJ)sl-}m@74+$h4JluYQEJ(xq zqQUX>hBWW`GLc*;jwQ!jMyfyK7p@<2GYCv6!R{8Fw=j2syN%3+3^q zRi}e20(Tf84*r6u8`=dqQr6{;I?{H$={cku_MvYqF6)F|)F)-evoUw0V&+O3zC{pb~KY zu6=sJX?MLw_?%w+DQHgYDsRB;$WkSpN``o^qmPj&^9BBCgJu`AW*9Q;^DW&74SO}T zJ;5y=R(GugF&Pt=suBSZ-}XM-syGWruRj=j^t zq~BK&S_<63uKcpN*VTmuK|c0-C6L2@oE7HOD?2JJfGjF(2(;UZp1P%|LT0Z%brL9G ztP_W_Pbzvo9GUqHS^3JP>x{K{Qtw;FfCe~$X58rOkHH!5a6)KzMQx!-0WjMmj?G0Q z5_|`eJ*8kV_)xAud1w`7917_f?equj6b5vnZ$Z#}N$GgBWQkQLMj*dZgicjDgQFp8uJU*7trJ!D}fehitGC06|UcRH}BPn zA6`8V14kT0%#Xu7s!v}~Td7lrK*9k;9mNnhhsO~$R%5%x#GY;he!-9Qoo{?-BubD9 zWZgX#PjS8KTQfg?sg1XsF1C~z(Bm7E3|(6H9F)r#4WXq^BP@?{WGI6)mIgge*KM21 zKGv!L&$yK;p(qUkd-RIw+hA3bRpQelB6YgfpnWFUfrbo$kf4~+swSroFY5l%LpIkI zc+FB+U{%!4jGj(GDYx7tf(?YL+0`Rt=2uu$QR$~cTYjC!m7y(*OSNXptVZWvn2EZ+ zsrkE^Vq|@cNvWH;nXmmRGFduKc%=24`C5dw7~}CL^JxZ?MnPeC89=NQ^x!x{T_b1nxOf2?>>jb&$ z*WrSMn`EU`RHSTO^>nb1iZ+L7jbNcD9LEw1^FZ+-Mse7zwo*y@J1pdeNh&O(uvwH# zO-b9uS@hLxJ;!<#1WO#J)~=;e)@z~GvPQhwP&33ZoNH*ec^vJ$`qAM_<6y8VoLi;|7hr(J#H61{VVFiMfRAUhI?F~ zrl6Vau>oJ+Pgm1>ER`UfHj{HS@f3|Ar=&UfIJiDl#pj;RCDt2U89Nw1EBej%L1c)K zkfz8W$9d!{!JBaRGZ|(K)ivy$0X8O|hAbpDkcS2rgs}4H? znOukx!AtGWu;lTFcA&8Yx}uH@)mTe2^?yv*g+(p9A`Fh^nQ6UWmCMp7B6W zDsdT2*480;bmfDfjq)i}2sVhjckSPRP9&iG1Aqupo+Q5_Z0N`!O_^4e*b4QPJ*yOP z8eL9TRiF#06{Dw0(PYk`V%8Vwx*SoQ2!>=Ni>=hj6UrGgvF!t5$|s2EGp&8;h$W(0 zpwI%gKW2DUjqISbO-|)ZgjG{I-R*4pgbUr%doEFav)(*T=|LoEA`vpQShv1)Yl6?7 z7rRTn2Kmha{N@r8MG`ov?MVU z(U4|s5fNz=k_ztd$+c>?lgWZgiYZlK1uVr8M&`19Tme38>(=1L2IG-O6nq_+3GTaV zllQn%u)ry_Z_+TnIW87}fwxR(S^2+=zq~;~<6gy?(k}M#TSs46kTE-#9KiE>FdajT z07A50VP(^~qZqLoIBEC#Gv&f;3T&iV#8C+Si6YO9Yv{iMQ;cOacjX$WFJgFbU}4QG zucf>}i_~S0Ybh<9+U3bp%@Hq386b-3RVIn;L~`P;Ha{#0U}6`+ArtMdHi(-m zd)px3OBZuq&}^;QEoNPVjy}dw5?w;cJFA&QgLy@>`7Rz^4vYeTi2bhjPoyH){8`EI z5ENFjh+e2Lh=o{dS};HTvkl}pcY!Yyk%z+E#zm8JCkch9=|NitG8Pn++7h{WtY`8(2?9hCJw$ux`}CbpA7XO( z`G4?6fWPMMr>%@|)fTQ-u^AX9%TM+FzW@oOjFoJ?_VYfdV)W8#Zx&qwK`A3c# z3nNfIlGK5u$tr-usxXTnw*Aw9sr7OpRlv@a=65B8@p7H=osDa&4pi?*T$JJ2` zz~@p#+(5P)^KO$3V20ZCh=t0fphH0AJ^5o)eYgSwLMfDTzMuwjJj0?J-EP5vL2p%% zhMTW|n%l{#`8-4oh)lYh#J(h!_f*Z+Y*g!vH;ZODM>o2~x9QF;dNG)&#isyr$a+70 zJ~~02E`qP>)hc125Rav_)Aywxo;}09*y2hQ1>UliG>&J2fh_o)B+(St%A~Lq z7svQW#$<5~;D`l3gd-N30UYVD4B*JHV+BHTIYZ?lbr#HA4RFO6rH)h>TCj)O_fWiI zvG-GrrTs+g9@>MB@C+S*#aCb~iDe;>M}Y?l+Zg_$DALOIIEj ztGca^@5{FSVr6aJ9$R0)_ZM`5rnjKmSb7Wk0(WqSY<&Sggd-Li131!Q8NiW&TOaL= z`)z$Z4X(<0)W%DO{T!_U_ln;WWd|lzRB`i~`wNjH=if7Kf7172k`yE{UA&u|uOBOI zs|&JFau%F4-!HBO(vT`2@FWmD zvNE1ETpu@$PS5G06JexBq4)J-x#YJSve`w)F1uKB0x*7ENN!t*Eiakb5y9=?Il?6E zEm(cC9SJ_L)xRe@&?}KL9G@!qdV0SnR6&@Z%*7N{2c|J9%b~8)TaI`n;)(M@N5H4a^ zoZ(exGF=*4%z6|UA#zBN;PDgrg+w$bO)G ztL)Z#`9%1FO81QrvC9o&$7S_?H?J>0oSuCcU%bU35G-wUPN~c9C?PV+f%sznJF(lj z^v!(do}wPY#8#?9glK4^8Zr83r!tC?G-*8)KTLRctILJTHg=~*B4929Wx~j`-*C>_ z5Dw$*pUR@@Hbfd(D5q9OQ7TfMpO(8i~*IQJ6z4vA^Yiyu8wyILb}5~ERSZd_hhJ^AS@dY&~;+zZTS#PO+g*R-n+g-I?^SlxS5QtrKm z33=Y3W4aru-k7yuYmCnh%xKg)%hQLiWsn&+aSA!{hHlI%gVO`6UzQs4#~O~y+A3|- z4m@$HMj2!5w%WxQV48LWm)oTpCK3$_Zz|-I*DGp7L5m-0dGBoeP4l!_&!AIaS!I)s zjw5@up?(g?xv>Qov9yE|VLjzL-kP1 z5FGv6f?lqGwv8DE?qu=O?_x$RvvRg+sB-7Zg09-97F^}FF_6i!6gOv$mPd z!-$UGmf+%;)7GL)8Y(JgcrL97+CG=7B|D^KN5n#_NN~!Kwhfp+D^t+P(=rKIa)6}} zPzYd7=UA^<#}B~Jn9T+u01`B%u>7TQ*F}ep)Lrv=>R1skslZyLc8T-Re)q7ZRzKy! z-P||NC5AG|qGuC3j?;&R-s_ojUyN9 zZ3Ktg8pyY9D&0M8*i=5vSH`p;ag z1S-r|;`mp)Un1d!q_RNj>BQGYF@~z`ReuqFr#%Y31Ig6KDprtW6I(kDm2Ytvi<~Vi zKU~zV$G^{5nwo2rsl)&qM?(=6I905 zJQBu0=HhPF+;j$PW^0t;W{YpI&~B>6?KqYRTWK+MphQYA8LpM`c% z7TXecd9W)=5^f+4B}J1)gLt$2hM2Jm7AF*_4Ao8+_xv&oy5plAJXE?PvV50Z?(46M zCuj{V>a^tw*2tB54@Y82vaqQYaDl1XoIBuRo5uqoQ78;WP`<)-A@Dr$dY0Jz*`Pqhg(c9*z*d)xgEZl=W|xen%i2U(Lc2ADg#+(J24;iF@g(+N_Tk&{QmP64JG;I1kUM`(N|Jv6*{9{@VX*fj2&mfalep< zKe3=|JbW9@xUR8HA+639vdYD7q569G9)fl4SnR=u8RnVU7JN-~ zp`9_tHA_?$UFaYusXHbvq1V&ReZwAwy40!6*mwz$!zUM;jH7hfu!naZV>%3(S#NCu%MdxuuL4*&Yf`f zICAvy!#fUu<9|HZ(J@7<{29d|@U2|p6#5Fp{2;_HBR_ifafJ@NWld?VPhCy(@u}5B z+oOVhL*#Wz$)FT9_zZ~(Ux{_)Z;O&Xs_9Ibj)>etwbK9Pk~j3UU>H;1<}Rd#GHX;0 zK%Fo*`(rg`VA2pBj^4Lcuti!1xAxepqn>;>)9}ZEB|DsaJ`Y0ozx$(3na=~TvUPl5 zE+}g~U5?YAa!c6avw%ma4KStEFuScnt%_uGO1%S#+q#x&3U1(zZY z2NOx%OD9Epq>&-t!wyu`*TvzSyO-Xff^pY8J|XdcLk%9oaYCVPN1km*2Ipb+c5}3Sm)aQQWrCSJ%Fe8xUln8|4`}it$ z*kd9pu*P+fMwH@N2_}>VXv$NSuM}#rYizN?sUf78C5UPjQhNW>=-v2q zeErY6$@S~b9$Q5^=7cBrtdIC%?wMuXVC3A?+=m+Z(2aQ6-dcH%5Ouxe3Sne4Mgh^n()<^n_h_;1o$7A1Ljgf#V#}BU2n02wpDS~^EGx%ES!H$w zU4dK>ezD7sigrN*0!MmX$S(5lZI*@yGNxek{;1A&&Gb>K zo0HM`*sflsCdJ2#9lb*$m*@CwY>hylB^o3ipPjoOuUF_h8Azah41PQ3L|fVCd@Ql< z_OFBZRHMxlRX}daaAR9GtFlkazT)>j%RWVsuG6J5wIV1f9e?>_zlOCD->r8SBTxfG93M*Dg2p%m!ulOoZlWpty9;sj0gPufR~f4WpgWo#DLpBF zwCi={tUe;Py&SI+l)aUv7^b9QE;l!mD!8X+o}umzZ6yBnUw3zl$EUmBwiwEQr1;>2 zsN)N-?63+l!CD~}d^Cx2Dm9u0EpXX9wt!Z3{-?yl(kf~|1(KSd55nos1nb=g=k-Vm zEH#vz(|Yz5TC_+9kIzN>WL$^m3fK7UG~&NCu?`@lTI9E?;kbISld_bNw>v3-fccD5 z?{_{e7rS4#yUW>*CW?Dh|9CA=jg!&s==cn%ezoM1pkCqe`g*9pZ~8z{`hrf+f;=df zMyM#4T}Mn5w^(8+PuP`kRcIXb1x%nAj>4o(i!u0p0)HZ56PY0wi+A0<#jfvQxb+OJoAMVn9Q`FgbLWmrsu@xrRHTQb7D^3Pa8kv_ zD_G9B-K{*cc}q7}XvMp}8lz7Flv0JL*6p&_t)Q z!E|&wIF!1c;eI7m^6VQnq@)oOu%S9AILY}(F(63ZqlfU)?C>g?6I-fO=Q3>-Q4p5g zWJJ-2Qy~3Z4md}1xUsjt>4u0 z20Q(f%bS7uVX~28lDQU|zP4BREOkr+!HqhsrUcLY?*LTelWfn3I@d zHk;{7n@@lH14p8_oey56`$NP6Z1IVWmk9k}p8cIFo6RoCkpcGg``>x~9UxPozPUv{>=NSkc z4P?vi={d@ub}(CGvpO=p9JzD<&zFH)CStN{o_-DoILOlSfL{6fA$GAG2F~;$gpIm| zjYk)wv(*e`We9IUdamF+Qro(Zs0`Xl7Q%Iuaf=ZA^=7)-!ukBRm^pb&iVnE&t9v{c z8ISQGk9KPNnRM|#2VfTjAwu11e54u1u&@O%#ji-Wbw;c5n{_>ij=s70CBx= zR#H!eWsz~P{bw6AQdtEk5u3E7^yvwOS=-5Gc8RxgZWgP*zlv{ea8KM=+2fM(euYiP zFF14gFOTDMixLLVXGojS?HRdIzE7WyUv{{1ftudSCr=%{wfB1F+p&Gk<@*B9L>upI z{Fb(1=qfMvv0F?hASb;cZ?VPWgHq+1tts)S4PKd`O%YR-s8s7h(>s)aU9VBO7yDX8 z>5=dsC-?FW<)qE*>v#?~iwgpD*tffi8D336y1{{}8r-^qJYaXzec7V~+odeEWOyhN z{P$3x_I^rXarC@i+#}4lz+-gs2*9>IM;c6QqTQOxIaQZzK6u)&st%hAz5VL$;@H%$ z?$&z6AlNa<=k0E-n*jllChC654?6RM%#vDCSEILK;Mfc^Fu@kWq|9RDKt(s#3%trF zxZsb%O^Nz3@oTdxNQuyas~ZydK~+Bf%+IZ*rq5+Txllg4b=lae%#o`HLt|U^%b_sZ z#kL2+X(`e}VGL23R$>#nEce^rr~(cer(G!ujAIQms_MyaC7tE!d=~nI1Uj~A8IVHuB(TI* zC<8Kd;M&!Ql2f?`Z#L^k%Sa7xBKVVMSkt#-Hhs_?UBCJDABV#9--8fcuS*1p^vxLw(#>n`#&`L& z%p>3ysXY>!S7t7bMF$%96IBbBNkPgG1m)(K*^CCTXfQ+Q~!H>77OnXKO z;Kc9GQ^{H9xw9|$>c}enVv$EN3Y`jHay+XuwAo)Sy#+0o) z&Gn_dG*B>vNUap{(sU0gVI=|{|Bt=%fNtYB9zN|j&FQ@-PU7^~CLl_p5+@=E7C~Y& z0g04T=o5G(VSxaRB1=y1z4zXG@4ffld+)vX_V+h)cYAerumkNvO5W$Z=U5bo``zs9 z?Ck99Oh$6)JO_n<#ACeEN1bPZ#x7^iO|!2AgV!&@TvXXfpmYWJzg4f2^ht!}U02r_ z3w=2qpP-5xO*j@QyBBrc2J9DmORBdOi>2oZ^}v&kW}^U4Xv1hyu~*+z#*BP;TMEj? z#$&R>%Ev$*e1z2KkK=!#SWZ+=Qa*^&isyJ9g(W%yvFn%f3yKk-Agr222X=UELd`Nuwme`2b)=&C0i=70^c$JmLOE51f5=V z8tZO0LLKUSaNGco+?L347t@HpqC^=mddL!wr-w;^QB*ie>G94EHHZQm)%SQpW+|3@ zQKMS#Le%Q`zX{SS+1~;Jkf}%(6TTe6h^D?jc6=lhWX4_VjN>Vn106aHD4eH|-0xYL z%SlXTBA>a(IC)3aN%t!&%;Wq*^f9tu3RiIO&V$)$yXdaEYj~rf$7^dS`eJQ;!{`W? zA?f~jS4+ug`}1LsSC_`XYy0)2m}?-okx3nbc^X@@yu3iLipS$-Ms=<m) zP&}URb2du84ZKir_}BxZVd!dJlWBSA8LoLGBJ@2z8#`L)HtJCP1*256Q2p^}a(A7) zXXby@{}_CpP98ch-o4rXP4E5*{9BdlhR28<_f*mb(u17TuP(e+Ghp?4-nx5}U7-?6+3o{MBF8AvGXY z`z@PA{dZ=Iiz;`AUtp+cF3!zVG-6 z%UF8I(?+#hlX=nMSo)SPIWO--)a;F-R++g06`7Mohr{~B@n~Q2JMq9L`pT?lnRy7L zn)#m!?mp08Ey9g@UknByzFEqTEsX@0(c4{#jHTowq3LQ7i^lZM&;k<>H}gGVIetAze6f!O4g+ z39Ipzp)i;?L%qmFrlAG8BG~E-qFV{+wd#=HHWrqcY<64ev{g7V^y^w+`=@x)K)3A{ z9q4Sa8Zed`;LpN11b+;xxh7r?wLQLjRecGpC*HTE5&?979Y<7_(Wd?TUW61TttJF6 z+Ada3@|($p*-Pp#081Th2tWz~_c(r)kXhnsNBrB%QC0ikYO`l%JQYa{8M+_v`=FA+ z2crBp&pqVS+c2^6d! zz`JO+Wy@@-U>7|F3YXg1#tmAiaixg?yhmwbadK(^&%xu40X$}|h_~Vg@u0yx#ykEP z!0RlRVN${lH!Szz(=6b` zXCYHXHfEmdH9k#^nbsHyuUALLNryKpPw`!v((LthJ$7*@w!~$UEKuMrSQeoOW1>ZZ zy2)^q(M#L$geMh(3r==@(FGy6>>1t@3xNxL^8K0qMZvWIQ2J;K zGHtzk31b?o0t}~DdZxdu;)|VD120|liZ8+bK=_`MN2~6ZcMKk1mBkm4Q6}wg(TFwm z{w^1e?eL1Gm$OF3?fi>z!{o%jIN0AoZcg*!HtK8}$4N_NeeDcQZA{C=w@yMQfz%h1 z)&P$9yvY!Ruwz?8$(Q4;2iUe%J3;T|z<{Xtru62sG#r0Ms|E$_d!&Wq_5yNJqIyjU z&0&0l$UetTjEPEDXhXn6V99}+865cmlODVQ2r?%1#Q{4UtA z1~CBWJ2*Et51pq<^K&be!s7H~CE0n)@na!Y!=;RU?HcMN3VRV9x!I;Dj{z)r)qz@&~xoV+n${PuMAw=3eJ8qg7M z1q%nPL$WtGis|{YSY*x{Ie2rwYeI4d0ZNC-`Y;V+Q}8I+ZbIuuwe{#9}_Til)`OzJTAD=NC z{4uvv{QQE`<6nICYP~*m`Z?lb;?q68ZD)QY_~Zqr&zy3Zp~mFZia$SPXy^(g2@OP&U4V^}OkX4jmpRa?z=bFFj6Z5MBM#!P8$AAUUZ z&z0dP_?!3*{zzQj6Y*uepJjApXsikmcL4qQ%}yJ-^iuIuF@i{T>X3Nfv7sT4bwm8b zdoz66WyDWL@H6m(q3|=?qo3fWqxrbP7WXNCQjy4Lp^2}b3Wupac!EF5a%nv}BZY8wZ5Mxqy7*!7hv5HX zvui~B6@KpH;t#RU9j{b%BzX&Xo>|@7IT~5^A#Y~RoPzfFPTrfHHne;9uy?%YpH@TZ z38*rgT$W)y#;ddOiQ_E`+*KjBZF@Ki;v{V#IR$Jzl3**dw`1xC( z%h=e-A^^4?Zc_o;Je-@xd7N2kP}N_^8L?;_rGlL{*04JG%=YSvwX^O zN%O>98TX+_qg(O}ZH9uGk+P z)J1^YmLhD9y|AqR9&l7P28n~ikN{&v%G5f1y5aY*_6{+RI=%uOgR!`h;dg+uzrFyuH>LBqCAxC(CgRSccMCA1;wF5vonnKMqQI@jRZqQ(!dF? z#ULEd*8VZIA`>#aHis}v7<%8>#_)Sg~%q% z3FDibDfa}z>xG29I>)0F!5M_G0Os}P#{A@-Ik$tq=%q@?hn!2hQ?ZKe1lsF|w8}Y+ zJ7U>_&R$J(gw$>ja)9AbqWF3@2@Wb8vw78Sz?0TAHe9Lg5@tKKzRrWxZWyPfr-`-Q z(@wG7Pw`=7|3)F78csE=TsiF&o7ofx203pmI6CF@$!ehdrglQ3BK(u0C<4VzXo_rw zHTkq->pKdLkZ~2-DK;BY-NV`_@D~_W(^SJgU*Lhgr*uTVx)`dzW&5c>}jB>-m043jP zKfKc&`*4pA{Sg%5bwll$BY4Y-u*Hz%nYx2eo zk-w*hf9F=_@|r5k*9EzZ(E@FYF++g_xSP_gJ1uCs({kHwyrz}6h8Npr+)Ib!x6AP%P3h+Z*z!E=0mGPQnWPS?0R3JYat9L*dxVIt<$R(pZwsR9?b7i@( z{Mltlr^FJIk`sDtchRDeX%!Z+%cvE5&8AL|@7gz;42?U6)VcrekZimQVV!i35>-f> zEuGvp;rb`n-7Ofou{48Rk-#O$u8`??q5q-YNugXBQuCk?@)z-5Mj5UhW_%j6>kM^L zF|J8tWW7BvaWyh()Y>sGCy|d`CVXLNpP-Nw=1wn!d=sv_ zg;O0fN#%I4Vknp-ovSa6eOQcp+>tVry2rSny8I zC~z65-FZ2~5cX0?7;Ke8&Sjx?=M^POR-52DcMw038!9drwchS$aG{(s21}+$Y)hIW zVzUP_gjtEv5$})k*)K>l z&`K^-AGS;=tL^CV$kf{i+o&QETL7zYD9zSSXqYc8MJ#F#h^o3oGI>c27S|R~w;orI zht9}oQfrMH(Rl}%*;Phu2Dnn%DMELt6&Q=Bto7uO838T<73W<~5%5g_mxel1*wCVp zDYQ&wxMbA)ucgSK3YpvTdgEDLK@@%p#=$PsCz2@<-xeu6NzCp&tYYD-6Pt_5vaIvC zbQP-)MzORct2HN!>(fWGLIsI_wp)mQ$u|+?lvTq4znES2H5PbQ3)Q zzAO}RAG|lSl_U^ZFd0K&LK0LC$VEvG`COYaVi^^4A9s;0Eebz6uq=aNkIgQ{X;TSk z+FCSzmjnn^U~xxmwIL5>vdO4(i%vuqmflUMjNx;Ou+U4&@4(1qSBGT^`|asn(dEu> z>P+Q`4x4Oh@kdMHU1No*i$e;WR2Wv2}>@ zDDEGT!C6~YGUj&0R95K&dQiv|g*!f!6dss(K9qjOY-TH3LV4T|N>IqP!`ygKd*26Z zkeJs~Dr)hNBoT~Hwi_0%Kj!2^MUx(?Nn=89qdLgRo#Z&ILJyO2*w!2>3-aL%qU`27 zzE16n6fBsKxiR^+mu(4%Q}jn9__I~4O!+v}dDJ5_4Du0;1Y~SCL-@y!ictl<^fDIG z;OryD=+PP^MrI!27e6M$ARi-NB4+fK+TT4^lP5dpyw(Z+NXD)tvF8-wg*`50!=|V5 zo8!jjl_K_zcSjx{aX1jk_1kDCbeP_db7ewRM|gr3OJ=lWjyu~Qq`00KakZLNyw`^9 zo1xTkmz@sI=At~3CvmxC27paOop(K%CgPg|HeHUWZ2Odc=rZc2N~+_|1ZuDN)R0t> z6{B8M*b<|n%unmZVML>-Sj*Fs1bvl?<&I1)*8d`2opb~23yHBz>=@kL zvKUV!Je6l^bIXR5D?us({H!DiWfP28_S~>IMoI1!u%_g*byzYMKraQg))4!W7fC26-7zsjxtutjOIn?Kfabhdo5$CmAnvKZ z`R7|6g`Q&${YxTRX??3f>{4EuVUUj>Os`=Rqerb@FAG`rxBW|etfO!K*eG^ym^t|6X!GD9ypefLjMHniX-te0Wno^ICXpA@Q5jyog%J*NDn|nI>t3H^nJX{4 zoRlX%3o$}(NU?-%i! z?+ceJV@faI714S(C%mG8{SH1~FBR)GR@;BK9vRqQ?UIaaKI*pRdvy7xSLUSGbJ#Sy z6dncM9(u1Xjkd7ZS|*Hm%FCDny7z^2LDi$=_KvZG+IW@rU&UrlTl(0VK=>%1?L!VWw3Vu`^|_F-&e{%e zf@8sH)T%5PlQQ{Yz>+LnpRgUqc52kEfG>p{Uimev^2mkBz)7q6da$Zr798C}^ezSL!>$A7v#Bdn? zfjF$rAamC`Do6XfCfIFpZ4&5T5c&XE;^i_J`IN-pu57u^pJzmr~=B~&{y&esn+KSwsX?m?*Zxu2 z3BS-{(LB&%ODPu?H%)55>p%m38IaYRPN#>Xe6no9+3%kp7RmI<_kSzA|F87l|0LVi zarKj`ko;@56s&lVij!A7bNr1@IPF4efm4TU#8&N4x8oK!+(GUbsGC^74G3G#=B8t* zE(_IL^>>NqtK9`O=d&}(u3fe)4;82Wz0Vss6yr`iRo6%5+Hm!rx=s5B!O-5&2VmPD z%E$X-L{OXsPoU$L-BjMPN)T)gN_+nlaV(_!cB%llBSBRh{&Vzv(9YsU(hV_1kRKKo zXOb(yJHf*IB_ME*j@KGa>wo?{RxSzbdHvVEBw=Gkp!$dY&8G}K(acGTrcvW+F;&mt z?;1>5UwRd)e83K`*u)AJP7PY($jg3mNvZhOKSI)d?y>A-vn0DP1thi0#N5h%_8@`; zSxZz@bn;(uDk!eqx2V|GI+v4YTRI@CfA^;H#Z{8&mZlil#8kzW|AfS4w+>A^(*=^z z!rS7aZvOtC9#{X9mMuj}8!ruM_cv-6btN8?Eg4d~+o4lV8``~l7%Z`pN`LaQ<&_KD zYbDq8SHnCxB_NylFWK61Eqrd5Jht;Dc=uB^-#wUlSqc4@WU7WDNUbS&_u?`<8R)n$ zedwqBG!>&SrwP8r$*JrBBs`k`$>_^v_22&_Q&aX#Rm7kcK?^R&mV%C=atZS}xh?q^ z5MDkYoQA!b@_q*_J@D6Xr6ZA7DeKr)!X$kW=lPe4l&)jQ*95 zhuPA3a4s*8b*};Mm5+zl>M1rAo4!gwo!!Y~*GGLfldrpSD}eWVuc{&xmMsAqEMzfD zYR`62JF=?<)b+Z%4iWX%x@WfgG6a3tRB_y#^w}>0XrtGew*AUZ3F!^jnT7A2KyZ--M&`v4pj3EYdd8j+SGmoZ<=0PhiiO7H_*kGnJ5vG zV%rOB*U@9s6dTvRhDX#XGL+hNwaB!?gGQxxJv}x{QloONt}n=rIQ80U(P?)EWZMbL zcmod839{>A`X*PV8tCB-jnLb(>2ePR_bE3rLT=ff3r9O;0kALFjT8JLQUW)_-TsuC zYn`Y}u$%P7W=C4D+T1?isI_|~0H0(>Fl;GMw?Xc}m4cnK2BP-B9Rot>3|xnr&hAvR zwdr&!PHSD3FbHd|r5Tqa7|&ud+Uny=F`k`bEUAJ-p1NC%C@b!UkHQ@vD#!CK z0SVkBU#q#T`BZyy^p&ReoRC>~*Cbh`dDv}aZ78U;|2MfYZA`BGsC$OH1!beNA>!9j zN{}o;Ap0pVPhjAsL%C9*ayiD>Qqb9EaS5qPKZOM0f7vA^jWcrSkb4PE6zdhk?fR7Ostb7g_f_cV#!LrKUO-LV7&i-fBZ%+2i!4F^5tMf zS1H>v6)?_M3YF6QTn}yi?;kDsNjln=>3$?(WxR4>OOfQ zCGEHW@7Gkh6tM2VUal0ZXlbaVsXYtkZS9K)+gp$kQLZ+(`o9>)U7M&3q?v%s?G&om zq`ledD?rEh7l;g`Sq_tl09_ySa=VEcNOMN$H3M{fa^j}Myb*F%fR4>i-Mm}~_?zW! zbt7mnH6U#!qICVt{2udR(C0-%{Pr|j?r~zCdf5=WWt|qnPpuq9c!Nst2Hkpn zp$TON+>^jQ@8>X`AbnQb=L1IQ?P;^z&%q4QB_rgPb(uH~To(MBhuoHbR?wGu=K4Q5 zqI&2-7Ly5OX44a=f#;i{*HmUUIdK|zH#6icW#;maiiIU*m+=(h?mmAy#*X2uDb1r9 zqrT5Q1kdrd;^I>gtJggPs%~d~&EItOHR1V8!ic6u?k+HLD;y>xr$^M8%>_QqLis=` zESM)f8L_ixRg4|xG&&M8Wk*~)bc#`&2D(ELUEt{tPHI%eylTWHy;*APgp^okS0jc} z$KC8(FkE{Xwn$9PI;>CZ229HKE-JyW=RVcPVogxA+=k*164TwnQ%Gx;T%p-$pVmXh zwmTSWnahiXE*W242bv8%8WWBYf20-FFsi^^J5Fv*mx#}tSMN+NJWghoGsGs}p;#-< z0cjtOk*CV4V&K`#Dypz}*pav%e?IIiyo>uA?xr(1+ec)MZTfV6#Vx1*>%ZsZ%e1ByFteU)q1z?K#Y8=1&5in zrYy_QV(kv9gYG39LQN5JZ5JiMdolRz)$yPtcyA7&B?(d<&3!_?qYF-}olcGpQZRJP z8h2c&NacM4sxB0;-W=GDQoYN$pDxdd*;D4l!j;?$V-2zUA2+!zd!5UR%~_Hf&u<@a z+|+jWmDG)c2m0*g!g3zAba0~*&OftTI@$J;JAAJ=&|WuU*@wZB0gBB;*lZS zT(h(2R-5aM+9mF4Uy8;ZPwHOvqx#_jixz>K>3TukX?Qf7QFCIjM>sbuLXOE*bs0wZ zF?>qxX~G|IHRogd;MAQmTu!PQLl%5%su#i21NQ&li{R2rhlXZOX-rXa21nIy zrQe`4+xsN4jbFf|G7)-a^XKKexH^pZ3r+EB2B6vO+k~r{w1-%=_(i7JSz&1I8&L7z z7suZq$TppDtMzOo+M0zUGTmOHPlt=n(#ULc)vf!h4y@Dm>cJ41ZZBmpAMo?0a9JD> zIdv}ovN(C*lnqi3=ecKQY-H$$oQ23v0Lr7pc}BX29_$}k!z81+vPP3 z9|#<;5*&V;)>#K?(xp$v3XmUyl5<;duX}mH>1_D!3bX(X+q-(hK2>w;tA%Q(b|l#C z>Y4=Z8&N*ZtAjV{td<&dnYO|Konhy)QM;bkglzNO4qf9;cFe}sz+5P(UDe!YPW2$5`H)&B!aNu3{~n*D>BdNVqWb z{vb$CVqU4a173Gz*c?owWZNKDiRTOgQwj298RH> z703P48{=Hc1jO-a-GSw@J!1alnukW5bp@MT27-~g@T`r^}ddP*t0B0)a`jEhsi{Ur4M?M?2`1Xux`)0 zjL>TaSoq{bg_(C7A!mhG*!+1#bneR_`S*nUM_fpo_2aGC-7C7XsU2&2g@cdyzb$s= zp4C<^j#a18fNc|e2=>F?VVZWgYaP?b_6vwQ*6;OY1O@cT-4UExf=u93_)>aqDVLJE zdGbCzN)Y$3wKEN>+sym*`7B9~%E14CHXRtxoF*W9rcxRBALI~f0&?|_x|{N$fUh!z z4%~5+nBhx}u+JanQJtWbQ8*jPl@T+@KVpdA-r6Y7`M?TbA2q~ocXgz6`eVTxG~AzSs}jiCIs#sr{@k8GQ?TtExJ0@5@Ht!0y^gWvhI}e~;j>4$cpX zO(+|Cw37^|1ZRUfW{W)&sXgvj6?EEn1&y2)P!&PH77}*dGMrz?>$I0vUARx(IR?UQ zcUlfq=Jg{k7?Fy?N_wV_yK+&M?(1p#q64V`$+2gItl48vWlww~U~{XG+}gr4O!=tG z4$-+XqB?ecGr>_i)a|%!dnD9)`7NJhX$tdj${nYAcyJ>{u1%;cN22j7p8cp@pg zts}Ln#A=$bOw{W5gER?lkL5xsm8?}FqcrG;Az`^$Jvveo6}+_#Ucr`T z42yJwq-HFFX8bH9ER>6-(n(18^N0{Klv+-;GtunAMVYC3)9HVU!L{a;Rrp0jD7l~( z=x6N866C-qFI>S7bPp%_+#)EN9Q#!m`(O6t?g4E{U#X0*U!|C{SF5b4<`G)6`BZfIKM`Ya{XIFl zhF3;~O~pFf|EED>YZR$&xR>g1*&92B#I}LNhE6?gX!q`6*b7X!bvILNRAnOAvyh6g zof0vmLhFgO*%%9zWpHYY1$X&bO}3^##4321-c;7Khw3hLTF5myUYsZuPt;0C&ArP; zjBw-xD`B>f0b|R~UK>RML27L*!PL84MCP5WX2HC`oZgWtdqz?x>X+9egMfmy*+BRd zSJ0)?-2m}rCz8-oql$Meuc%9>DLSsk?Nmr^7qFe4Vw3KHjM-VrXSh;|WYKLm>u?z+ zX>V01CS`Kvh@{nOwqTEeg*Y`q*qTGFgI9@2j#gcXn@l@WY!)iUa8(@^%*nE)#R|KL zo%OD!!zSC5yGqxVLh>tXMe*jh)7(RDT7=p-AXVX?bYFSn5XR4P<1;6>wtf>aaTAbi)M3MJqjDqsm zZWd8M0_@S`R>PvlMx9KZkz|4b-13B2Sm|axX!+3wf3(E)u#{)J6Ri8qLndXmo3ZiQ zNpRdE&atObS&-NGlR1rSc~BYVw~RQN9S2V@1{U_J1qV9CoU~jm;Q>(Z8y6nvzsT@(k_x5Zq6W7!DZy?k?>7h4ZeD7fH4K%N&@##en zHA&wA`a7DVXI)FG4`nhqTjj zolUre0?C4l?%GtVx#%_$SLU`ajevV{04f>b!9M)R(yl5O9$6&c z@(u8o=k)!S5Y-88#(F&o!rowOZOQM7xBuFa0U65HFgT@#$PH2aQ*vmPNAdG@Cx36US#s8}kv6 z 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

    LKY#xD#-|!@U`kQ)b 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

    %sAh^=wKM<$E)=FJw9U}puNXOE%G1|SA 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 -#include - -// bring in configuration options -#include "CEGUIConfig.h" - -// add CEGUI version defines -#include "CEGUIVersion.h" - -/************************************************************************* - Dynamic Library import / export control conditional - (Define CEGUIBASE_EXPORTS to export symbols, else they are imported) -*************************************************************************/ -#if defined( __WIN32__ ) || defined( _WIN32 ) -# ifdef CEGUIBASE_EXPORTS -# define CEGUIEXPORT __declspec(dllexport) -# else -# define CEGUIEXPORT __declspec(dllimport) -# endif -# define CEGUIPRIVATE -#else -# define CEGUIEXPORT -# define CEGUIPRIVATE -#endif - -// Statically linked, so blank it out -#undef CEGUIEXPORT -#define CEGUIEXPORT - -// totally kill this warning (debug info truncated to 255 chars etc...) on <= VC6 -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# pragma warning(disable : 4786) -#endif - - -// Detect macros for min / max and undefine (with a warning where possible) -#if defined(max) -# if defined(_MSC_VER) -# pragma message("Macro defintion of max detected - undefining") -# elif defined (__GNUC__) -# warning ("Macro defintion of max detected - undefining") -# endif -# undef max -#endif -#if defined(min) -# if defined(_MSC_VER) -# pragma message("Macro defintion of min detected - undefining") -# elif defined (__GNUC__) -# warning ("Macro defintion of min detected - undefining") -# endif -# undef min -#endif - - -// include this to see if it defines _STLPORT_VERION -# include - -// fix to undefine _STLP_DEBUG if STLport is not actually being used -// (resolves some unresolved externals concerning boost) -#if defined(_STLP_DEBUG) && defined(_MSC_VER) && (_MSC_VER >= 1200) -# if !defined(_STLPORT_VERSION) -# undef _STLP_DEBUG -# endif -#endif - - -// The following defines macros used within CEGUI for std::min/std::max -// usage, and is done as a compatibility measure for VC6 with native STL. -#if defined(_MSC_VER) && (_MSC_VER <= 1200) && !defined(_STLPORT_VERSION) -# define ceguimin std::_cpp_min -# define ceguimax std::_cpp_max -#else -template static inline T ceguimin ( const T& a, const T& b ) { return std::min(a,b); } -template static inline T ceguimax ( const T& a, const T& b ) { return std::max(a,b); } -#endif - - -/************************************************************************* - Documentation for the CEGUI namespace itself -*************************************************************************/ -/*! -\brief - Main namespace for Crazy Eddie's GUI Library - - The CEGUI namespace contains all the classes and other items that comprise the core - of Crazy Eddie's GUI system. -*/ -namespace CEGUI -{ - -/************************************************************************* - Simplification of some 'unsigned' types -*************************************************************************/ -typedef unsigned long ulong; -typedef unsigned short ushort; -typedef unsigned int uint; -typedef unsigned char uchar; - -typedef unsigned int uint32; -typedef unsigned short uint16; -typedef unsigned char uint8; - - -/************************************************************************* - System wide constants -*************************************************************************/ -static const float DefaultNativeHorzRes = 640.0f; //!< Default native horizontal resolution (for fonts and imagesets) -static const float DefaultNativeVertRes = 480.0f; //!< Default native vertical resolution (for fonts and imagesets) - - -/************************************************************************* - Additional typedefs -*************************************************************************/ -typedef std::ostream OutStream; //!< Output stream class. -} // end of CEGUI namespace section - - -/*! -\brief - Macro used to return a float value rounded to the nearest integer. - - This macro is used throughout the library to ensure that elements are - kept at integer pixel positions on the display. - -\param x - Expression to be rounded to nearest whole number - -\return - \a x after having been rounded -*/ -#if defined(CEGUI_ALIGN_ELEMENTS_TO_PIXELS) -# define PixelAligned(x) ( (float)(int)(( x ) + 0.5f) ) -#else -# define PixelAligned(x) ( x ) -#endif - - -/************************************************************************* - Bring in forward references to all GUI base system classes -*************************************************************************/ -#include "CEGUIForwardRefs.h" - - -#endif // end of guard _CEGUIBase_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIColourRect.h b/vendor/cegui-0.4.0-custom/include/CEGUIColourRect.h deleted file mode 100644 index abd814a5cc..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIColourRect.h +++ /dev/null @@ -1,204 +0,0 @@ -/************************************************************************ - filename: CEGUIColourRect.h - created: 8/3/2004 - author: Paul D Turner - - purpose: Defines class representing colours for four corners of a - rectangle -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIColourRect_h_ -#define _CEGUIColourRect_h_ - -#include "CEGUIBase.h" -#include "CEGUIcolour.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class that holds details of colours for the four corners of a rectangle. -*/ -class CEGUIEXPORT ColourRect -{ -public: - /*! - \brief - Default constructor - */ - ColourRect(void); - - - /*! - \brief - Constructor for ColourRect objects (via single colour). Also handles default construction. - */ - ColourRect(const colour& col); - - - /*! - \brief - Constructor for ColourRect objects - */ - ColourRect(const colour& top_left, const colour& top_right, const colour& bottom_left, const colour& bottom_right); - - - /*! - \brief - Set the alpha value to use for all four corners of the ColourRect. - - \param alpha - Alpha value to use. - - \return - Nothing. - */ - void setAlpha(float alpha); - - - /*! - \brief - Set the alpha value to use for the top edge of the ColourRect. - - \param alpha - Alpha value to use. - - \return - Nothing. - */ - void setTopAlpha(float alpha); - - - /*! - \brief - Set the alpha value to use for the bottom edge of the ColourRect. - - \param alpha - Alpha value to use. - - \return - Nothing. - */ - void setBottomAlpha(float alpha); - - - /*! - \brief - Set the alpha value to use for the left edge of the ColourRect. - - \param alpha - Alpha value to use. - - \return - Nothing. - */ - void setLeftAlpha(float alpha); - - - /*! - \brief - Set the alpha value to use for the right edge of the ColourRect. - - \param alpha - Alpha value to use. - - \return - Nothing. - */ - void setRightAlpha(float alpha); - - - /*! - \brief - Determinate the ColourRect is monochromatic or variegated. - - \return - True if all four corners of the ColourRect has same colour, false otherwise. - */ - bool isMonochromatic() const; - - - /*! - \brief - Gets a portion of this ColourRect as a subset ColourRect - - \param left - The left side of this subrectangle (in the range of 0-1 float) - \param right - The right side of this subrectangle (in the range of 0-1 float) - \param top - The top side of this subrectangle (in the range of 0-1 float) - \param bottom - The bottom side of this subrectangle (in the range of 0-1 float) - - \return - A ColourRect from the specified range - */ - ColourRect getSubRectangle( float left, float right, float top, float bottom ) const; - - /*! - \brief - Get the colour at a point in the rectangle - - \param x - The x coordinate of the point - \param y - The y coordinate of the point - - \return - The colour at the specified point. - */ - colour getColourAtPoint( float x, float y ) const; - - - /*! - \brief - Set the colour of all four corners simultaneously. - - \param col - colour that is to be set for all four corners of the ColourRect; - */ - void setColours(const colour& col); - - - /*! - \brief - Module the alpha components of each corner's colour by a constant. - - \param alpha - The constant factor to modulate all alpha colour components by. - */ - void modulateAlpha(float alpha); - - /*! - \brief - Modulate all components of this colour rect with corresponding components from another colour rect. - */ - ColourRect& operator*=(const ColourRect& other); - - - colour d_top_left, d_top_right, d_bottom_left, d_bottom_right; // - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Handler class used to parse the Configuration XML file. -*/ -class Config_xmlHandler : public XMLHandler -{ -public: - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructor for GUILayout_xmlHandler objects - */ - Config_xmlHandler(void) {} - - /*! - \brief - Destructor for GUILayout_xmlHandler objects - */ - virtual ~Config_xmlHandler(void) {} - - /************************************************************************* - SAX2 Handler overrides - *************************************************************************/ - /*! - \brief - document processing (only care about elements, schema validates format) - */ - virtual void elementStart(const String& element, const XMLAttributes& attributes); - - /************************************************************************* - Functions used by our implementation - *************************************************************************/ - /*! - \brief - Return log filename - */ - const String& getLogFilename(void) const {return d_logFilename;} - - - /*! - \brief - Return initial scheme filename to load - */ - const String& getSchemeFilename(void) const {return d_schemeFilename;} - - - /*! - \brief - Return initial layout filename to load and set as the GUI sheet. - */ - const String& getLayoutFilename(void) const {return d_layoutFilename;} - - - /*! - \brief - Return the name of the initialisation script to run - */ - const String& getInitScriptFilename(void) const {return d_initScriptFilename;} - - - /*! - \brief - Return the name of the termination script to run - */ - const String& getTermScriptFilename(void) const {return d_termScriptFilename;} - - - /*! - \brief - Return name of font to use as default. - */ - const String& getDefaultFontName(void) const {return d_defaultFontName;} - - - /*! - \brief - Return name of default resource group. - */ - const String& getDefaultResourceGroup(void) const {return d_defaultResourceGroup;} - - /*! - \brief - Return logging level which was read from the config file. - */ - LoggingLevel getLoggingLevel(void) const {return d_logLevel;} - - -private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const String CEGUIConfigElement; //!< Tag name for CEGUIConfig elements. - static const char ConfigLogfileAttribute[]; //!< Attribute name that stores the filename to use for the log. - static const char ConfigSchemeAttribute[]; //!< Attribute name that stores the filename of a scheme to load. - static const char ConfigLayoutAttribute[]; //!< Attribute name that stores the filename of a layout to load. - static const char ConfigDefaultFontAttribute[]; //!< Attribute name that stores the name of the default font to set (as loaded by scheme) - static const char ConfigInitScriptAttribute[]; //!< Attribute name that stores the filename of an initialisation script to run. - static const char ConfigTerminateScriptAttribute[]; //!< Attribute name that stores the filename of a termination script to run. - static const char ConfigDefaultResourceGroupAttribute[]; //!< Attribute name that stores the default resource group (also used when loading config resources). - static const char ConfigLoggingLevelAttribute[]; //!< Attribute name that stores the logging level to be used. - - /************************************************************************* - Implementation Data - *************************************************************************/ - String d_logFilename; //!< filename for the log. - String d_schemeFilename; //!< filename for the scheme to auto-load. - String d_layoutFilename; //!< filename for the layout to auto-load. - String d_initScriptFilename; //!< filename for the script to run after system init. - String d_termScriptFilename; //!< filename for the script to run before system shutdown. - String d_defaultFontName; //!< Holds name of default font to set. - String d_defaultResourceGroup; //!< Holds default resource group name. - LoggingLevel d_logLevel; //!< Holds the logging level read from the config. -}; - - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIConfig_xmlHandler_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIDataContainer.h b/vendor/cegui-0.4.0-custom/include/CEGUIDataContainer.h deleted file mode 100644 index e0a38d68ad..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIDataContainer.h +++ /dev/null @@ -1,154 +0,0 @@ -/************************************************************************ - filename: CEGUIDataContainer.h - created: 10/8/2004 - author: James '_mental_' O'Sullivan - - purpose: Defines abstract base class for Window objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIDataContainer_h_ -#define _CEGUIDataContainer_h_ - -#include "CEGUIBase.h" - -#include -//#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -template -class CEGUIEXPORT DataContainer -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for DataContainer class - */ - DataContainer() - : mData(0), - mSize(0) - { - } - - /*! - \brief - Destructor for DataContainer class - */ - virtual ~DataContainer(void) - { - release(); - } - - /************************************************************************* - Accessor functions - *************************************************************************/ - /*! - \brief - Set a pointer to the external data. - - \param data - Pointer to a object of type T, where T defined when the template is specialized. - */ - void setData(T* data) { mData = data; } - - /*! - \brief - Return a pointer to the external data - - \return - Pointer to an object of type T, where T defined when the template is specialized. - */ - T* getDataPtr(void) { return mData; } - - /*! - \brief - Set the size of the external data. This maybe zero depending on the type of T. - - \param size - size_t containing the size of the external data - */ - void setSize(size_t size) { mSize = size; } - - /*! - \brief - Get the size of the external data. This maybe zero depending on the type of T. - - \return - size_t containing the size of the external data - */ - size_t getSize(void) const { return mSize; } - - /*! - \brief - Release supplied data. - - */ - virtual void release(void) - { - if(mData) - { - delete mData; - mData = 0; - } - } - /************************************************************************* - Implementation Data - *************************************************************************/ -protected: - T* mData; - size_t mSize; -}; - -// Specialized templates -class RawDataContainer : public DataContainer -{ -public: - RawDataContainer() : DataContainer() - { - } - - ~RawDataContainer() - { - release(); - } - - void release(void) - { - if(mData) - { - delete [] mData; - mData = 0; - } - } -}; - -//typedef DataContainer RawDataContainer; -//typedef DataContainer InputSourceContainer; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIDataContainer_h_ - - diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIDefaultResourceProvider.h b/vendor/cegui-0.4.0-custom/include/CEGUIDefaultResourceProvider.h deleted file mode 100644 index d7bc277bc8..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIDefaultResourceProvider.h +++ /dev/null @@ -1,51 +0,0 @@ -/************************************************************************ - filename: CEGUIDefaultResourceProvider.h - created: 8/7/2004 - author: James '_mental_' O'Sullivan - - purpose: Defines abstract base class for CEGUIData objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIDefaultResourceProvider_h_ -#define _CEGUIDefaultResourceProvider_h_ - -#include "CEGUIBase.h" -#include "CEGUIResourceProvider.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -class CEGUIEXPORT DefaultResourceProvider : public ResourceProvider -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - DefaultResourceProvider() {} - ~DefaultResourceProvider(void) {} - -// void loadInputSourceContainer(const String& filename, InputSourceContainer& output); - void loadRawDataContainer(const String& filename, RawDataContainer& output, const String& resourceGroup); -}; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIDefaultResourceProvider_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIEvent.h b/vendor/cegui-0.4.0-custom/include/CEGUIEvent.h deleted file mode 100644 index 69f82ee856..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIEvent.h +++ /dev/null @@ -1,376 +0,0 @@ -/************************************************************************ - filename: CEGUIEvent.h - created: 15/10/2004 - authors: Paul D Turner (High-level design) - Gerald Lindsly (Coder) - - purpose: Defines interface for Event class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIEvent_h_ -#define _CEGUIEvent_h_ - -#if defined (_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4786) -# pragma warning(disable : 4251) -# if !defined (_MSC_EXTENSIONS) -# pragma warning (disable : 4224) -# endif -#endif - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIEventArgs.h" -#include "CEGUIRefPtr.h" - -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - The base class for the various binders. This provides a consistent - interface for firing functions bound to an event. -*/ -template -class SubscriberInterface { -public: - virtual Ret operator()(Args) const = 0; - virtual ~SubscriberInterface() {} -}; - - -/*! -\brief - This class binds a free function. -*/ -template -class _freeBinder : public SubscriberInterface -{ -public: - virtual Ret operator()(Args args) const - { - return d_f(args); - } - typedef Ret (*SlotFunction)(Args); - _freeBinder(SlotFunction f) : d_f(f) {} -protected: - SlotFunction d_f; -}; - - -/*! -\brief - This class binds a copy of a functor. -*/ -template -class _functorBinder : public SubscriberInterface -{ -public: - virtual Ret operator()(Args args) const - { - return d_f(args); - } - _functorBinder(const Functor& f) : d_f(f) {} -protected: - Functor d_f; -}; - - -/*! -\brief - This class binds a member function along with a target object. -*/ -template -class _memberBinder : public SubscriberInterface -{ - typedef Ret (T::*F)(Args); -public: - virtual Ret operator()(Args args) const - { - return (d_t->*d_f)(args); - } - _memberBinder(F f, T* t) : d_f(f), d_t(t) {} -protected: - F d_f; - T* d_t; -}; - - -/*! -\brief - This template describes the Subscriber class. It is a wrapper - for a pointer to a SubscriberInterface with various constructors - that will by implicit conversion construct the various binders. -*/ -template -class SubscriberTemplate -{ -public: - Ret operator()(Args args) const - { - return (*d_si)(args); // call the bound function - } - - typedef Ret (*SlotFunction)(Args); - - //! construct from a free function - SubscriberTemplate(SlotFunction f) - { - d_si = new _freeBinder(f); - } - - //! construct from a member function and a pointer to the target object. - template - SubscriberTemplate(Ret (T::*f)(Args), T* target) - { - d_si = new _memberBinder(f, target); - } - - //! construct from a generalized functor by copying it - template - SubscriberTemplate(const Functor& f) - { - d_si = new _functorBinder(f); - } - - /*! - \brief - construct from a preconstructed SubscriberInterface. - used for SubscriberRef(). - */ - SubscriberTemplate(SubscriberInterface* si) : d_si(si) {} - - //! copy constructor - SubscriberTemplate(const SubscriberTemplate& copy) : d_si(copy.d_si) {} - - //! 'less than' comparable for insertion in a map - bool operator<(const SubscriberTemplate& rhs) const { return d_si < rhs.d_si; } - - //! release the binding -- called upon disconnection - void release() const - { - delete d_si; - } - -protected: - SubscriberInterface* d_si; -}; - - -/*! -\brief - This class binds a const reference to a generalized functor. - Sometimes it may not be appropriate for the functor to be - cloned. In which case, use SubscriberRef() (which uses this). -*/ -template -class _refBinder : public SubscriberInterface -{ -public: - virtual Ret operator()(Args args) const - { - return d_f(args); - } - _refBinder(const Functor& f) : d_f(f) {} -protected: - const Functor& d_f; -}; - -/*! -\brief - This helper function produces a const reference binding -*/ -template -SubscriberInterface* -SubscriberRef(const Functor& f) -{ - return new _refBinder(f); -} - - -/*! -\brief - Defines an 'event' which can be subscribed to by interested parties. - - An Event can be subscribed by a function, a member function, or a function object. Whichever option - is taken, the function signature needs to be as follows - \par - bool function_name(const EventArgs& args); - \note - An Event object may not be copied. -*/ -class CEGUIEXPORT Event -{ -public: - /*! - \brief - Interface to be implemented by connection objects. - */ - class ConnectionInterface : public Referenced { - public: - virtual bool connected() { return false; } - virtual void disconnect() {} - }; - typedef RefPtr Connection; - - /*! - \brief - A Connection object that automatically disconnects from the event - when the ScropedConnection object goes out of scope (and is deleted). - */ - class ScopedConnection { - public: - ScopedConnection(Connection conn_) : conn(conn_) {} - ~ScopedConnection() { conn->disconnect(); } - Connection conn; - }; - - - typedef SubscriberTemplate Subscriber; - typedef int Group; - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructs a new Event object with the specified name - */ - Event(const String& name); - - /*! - \brief - Destructor for Event objects - */ - virtual ~Event(void); - - - /*! - \brief - Return the name given to this Event object when it was created. - - \return - String object containing the name of the Event object. - */ - const String& getName(void) const {return d_name;} - - - /*! - \brief - Subscribes some function / object to the Event - - \param subscriber - A function, static member function, or function object, with the signature void function_name(const EventArgs& args) - - \return - A Connection pointer which can be used to disconnect (unsubscribe) from the Event, and to check the connection state. - */ - Connection subscribe(Subscriber subscriber) { return subscribe(0, subscriber); } - - - /*! - \brief - Subscribes some function / object to the Event - - \param group - The Event group to subscribe to, subscription groups are called in ascending order, followed by subscriptions with no group. - connections to the same group may be called in any order. - - \param subscriber - A function, static member function, or function object, with the signature void function_name(const EventArgs& args) - - \return - A Connection which can be used to disconnect (unsubscribe) from the Event, and to check the connection state. - */ - Connection subscribe(Group group, Subscriber subscriber); - - - /* - \brief - Fires the event. All event subscribers get called in the appropriate sequence. - - \param args - An object derived from EventArgs to be passed to each event subscriber. - - \return - Nothing. - */ - void operator()(EventArgs& args); - -private: - /************************************************************************* - Copy constructor and assignment are not allowed for events - *************************************************************************/ - Event(const Event& evt) {} - Event& operator=(const Event& evt) {return *this;} - - /* - \brief - removes the subscriber from the event. - - \param subscriber - A pointer to a SubscriberInterface which is to be removed from the event. - - \return - - true, if the subscriber was registered with the event in the specified group and it was removed. - - false, if not. - */ - bool unsubscribe(Subscriber subscriber, Group group=0); - - class GroupSubscriber { - public: - Group group; - Subscriber subscriber; - GroupSubscriber(Group group_, Subscriber subscriber_) - : group(group_), subscriber(subscriber_) {} - }; - - struct ltGroupSubscriber - { - bool operator()(const GroupSubscriber& gs1, const GroupSubscriber& gs2) const - { - return gs1.group < gs2.group || - gs1.group == gs2.group && gs1.subscriber < gs2.subscriber; - } - }; - typedef std::map ConnectionOrdering; - - - /************************************************************************* - Implementation Data - *************************************************************************/ - const String d_name; //!< Name of this event - ConnectionOrdering connectionOrdering; - friend class ConnectionImpl; -}; - - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIEvent_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIEventArgs.h b/vendor/cegui-0.4.0-custom/include/CEGUIEventArgs.h deleted file mode 100644 index e66ba3bb4b..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIEventArgs.h +++ /dev/null @@ -1,66 +0,0 @@ -/************************************************************************ - filename: CEGUIEventArgs.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines base EventArgs class used with event signalling -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIEventArgs_h_ -#define _CEGUIEventArgs_h_ - -#include "CEGUIBase.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class used as the argument to all subscribers Event object. - - The base EventArgs class does not contain any useful information, it is intended - to be specialised for each type of event that can be generated by objects within - the system. The use of this base class allows all event subscribers to have the - same function signature. - - The \a handled field is used to signal whether an event was actually handled or not. While - the event system does not look at this value, code at a higher level can use it to determine - how far to propagate an event. -*/ -class CEGUIEXPORT EventArgs -{ -public: - /************************************************************************* - Construction - *************************************************************************/ - EventArgs(void) : handled(false) {} - virtual ~EventArgs(void) {} - - - /************************************************************************* - Data members - *************************************************************************/ - bool handled; //!< handlers should set this to true if they handled the event, or false otherwise. -}; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIEventArgs_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIEventSet.h b/vendor/cegui-0.4.0-custom/include/CEGUIEventSet.h deleted file mode 100644 index a5d2a40c82..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIEventSet.h +++ /dev/null @@ -1,277 +0,0 @@ -/************************************************************************ - filename: CEGUIEventSet.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines class for a named collection of Event objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIEventSet_h_ -#define _CEGUIEventSet_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIEvent.h" -#include "CEGUIIteratorBase.h" -#include - -#if defined (_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class that collects together a set of Event objects. - - The EventSet used to collect Event objects together, and allow access - to them by a unique name -*/ -class CEGUIEXPORT EventSet -{ -public: - /*! - \brief - Constructor for EventSet objects - */ - EventSet(); - - - /*! - \brief - Destructor for EventSet objects - */ - virtual ~EventSet(void); - - - /*! - \brief - Add a new Event to the EventSet with the given name. - - \param name - String object containing the name to give the new Event. The name must be unique for the EventSet. - - \return - Nothing - - \exception AlreadyExistsException Thrown if an Event already exists named \a name. - */ - void addEvent(const String& name); - - - /*! - \brief - Removes the Event with the given name. All connections to the event are disconnected. - - \param name - String object containing the name of the Event to remove. If no such Event exists, nothing happens. - - \return - Nothing. - */ - void removeEvent(const String& name); - - - /*! - \brief - Remove all Event objects from the EventSet - - \return - Nothing - */ - void removeAllEvents(void); - - - /*! - \brief - Checks to see if an Event with the given name is present in the EventSet. - - \return - true if an Event named \a name was found, or false if the Event was not found - */ - bool isEventPresent(const String& name); - - - /*! - \brief - Subscribes the named Event. - - \param name - String object containing the name of the Event to subscribe to. - - \param subscriber - Function or object that is to be subscribed to the Event. - - \return - Connection object that can be used to check the status of the Event connection and to disconnect (unsubscribe) from the Event. - - \exception UnknownObjectException Thrown if an Event named \a name is not in the EventSet - */ - virtual Event::Connection subscribeEvent(const String& name, Event::Subscriber subscriber); - - - /*! - \brief - Subscribes the specified group of the named Event. - - \param name - String object containing the name of the Event to subscribe to. - - \param group - Group which is to be subscribed to. Subscription groups are called in ascending order. - - \param subscriber - Function or object that is to be subscribed to the Event. - - \return - Connection object that can be used to check the status of the Event connection and to disconnect (unsubscribe) from the Event. - - \exception UnknownObjectException Thrown if an Event named \a name is not in the EventSet - */ - virtual Event::Connection subscribeEvent(const String& name, Event::Group group, Event::Subscriber subscriber); - - - /*! - \brief - Subscribes the named Event to a scripted funtion - - \param name - String object containing the name of the Event to subscribe to. - - \param subscriber_name - String object containing the name of the script funtion that is to be subscribed to the Event. - - \return - Connection object that can be used to check the status of the Event connection and to disconnect (unsubscribe) from the Event. - - \exception UnknownObjectException Thrown if an Event named \a name is not in the EventSet - */ - virtual Event::Connection subscribeScriptedEvent(const String& name, const String& subscriber_name); - - - /*! - \brief - Subscribes the specified group of the named Event to a scripted funtion. - - \param name - String object containing the name of the Event to subscribe to. - - \param group - Group which is to be subscribed to. Subscription groups are called in ascending order. - - \param subscriber_name - String object containing the name of the script funtion that is to be subscribed to the Event. - - \return - Connection object that can be used to check the status of the Event connection and to disconnect (unsubscribe) from the Event. - - \exception UnknownObjectException Thrown if an Event named \a name is not in the EventSet - */ - virtual Event::Connection subscribeScriptedEvent(const String& name, Event::Group group, const String& subscriber_name); - - - /*! - \brief - Fires the named event passing the given EventArgs object. - - \param name - String object holding the name of the Event that is to be fired (triggered) - - \param args - The EventArgs (or derived) object that is to be bassed to each subscriber of the Event. Once all subscribers - have been called the 'handled' field of the event is updated appropriately. - - \param eventNamespace - String object describing the global event namespace prefix for this event. - - \return - Nothing. - - \exception UnknownObjectException Thrown if no Event named \a name was found in the EventSet. - */ - virtual void fireEvent(const String& name, EventArgs& args, const String& eventNamespace = ""); - - - /*! - \brief - Return whether the EventSet is muted or not. - - \return - - true if the EventSet is muted. All requests to fire events will be ignored. - - false if the EventSet is not muted. All requests to fire events are processed as normal. - */ - bool isMuted(void) const; - - - /*! - \brief - Set the mute state for this EventSet. - - \param setting - - true if the EventSet is to be muted (no further event firing requests will be honoured until EventSet is unmuted). - - false if the EventSet is not to be muted and all events should fired as requested. - - \return - Nothing. - */ - void setMutedState(bool setting); - - -protected: - // Do not allow copying, assignment, or any other usage than simple creation. - EventSet(EventSet& e) {} - EventSet& operator=(EventSet& e) {return *this;} - - typedef std::map EventMap; - EventMap d_events; - - bool d_muted; //!< true if events for this EventSet have been muted. - - void maybeAddUncommonEvents( const String& name ) const; - void maybeAddUncommonEvents( const String& name ); - bool d_addedUncommonEvents; -public: - virtual void addUncommonEvents(void) {} - virtual const String& getType(void) const; - - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator EventIterator; - - /*! - \brief - Return a EventSet::EventIterator object to iterate over the available events. - */ - EventIterator getIterator(void) const; -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIEventSet_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIExceptions.h b/vendor/cegui-0.4.0-custom/include/CEGUIExceptions.h deleted file mode 100644 index 102697fe19..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIExceptions.h +++ /dev/null @@ -1,184 +0,0 @@ -/************************************************************************ - filename: CEGUIExceptions.h - created: 20/2/2004 - author: Paul D Turner - - purpose: Defines exceptions used within the system -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIExceptions_h_ -#define _CEGUIExceptions_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Root exception class used within the GUI system. -*/ -class CEGUIEXPORT Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - Exception(const String& message); - virtual ~Exception(void); - - /*! - \brief - Return a reference to the String object describing the reason for the exception being thrown. - - \return - String object containing a message describing the reason for the exception. - */ - const String& getMessage(void) const {return d_message;} - - -protected: - String d_message; -}; - -/*! -\brief - Exception class used when none of the other classes are applicable -*/ -class CEGUIEXPORT GenericException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - GenericException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when a request was made using a name of an unknown object -*/ -class CEGUIEXPORT UnknownObjectException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - UnknownObjectException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when some impossible request was made for the current system state -*/ -class CEGUIEXPORT InvalidRequestException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - InvalidRequestException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when a file handling problem occurs -*/ -class CEGUIEXPORT FileIOException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - FileIOException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when an problem is detected within the Renderer or related objects -*/ -class CEGUIEXPORT RendererException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - RendererException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when an attempt is made to use an object name that is already in use within the system -*/ -class CEGUIEXPORT AlreadyExistsException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - AlreadyExistsException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when a memory handling error is detected -*/ -class CEGUIEXPORT MemoryException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - MemoryException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when some required object or parameter is null -*/ -class CEGUIEXPORT NullObjectException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - NullObjectException(const String& message) : Exception(message) {} -}; - -/*! -\brief - Exception class used when some attempt to delete, remove, or otherwise invalidate some object that is still in use occurs. -*/ -class CEGUIEXPORT ObjectInUseException : public Exception -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - ObjectInUseException(const String& message) : Exception(message) {} -}; - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIExceptions_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIFactoryModule.h b/vendor/cegui-0.4.0-custom/include/CEGUIFactoryModule.h deleted file mode 100644 index 73580d449e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIFactoryModule.h +++ /dev/null @@ -1,140 +0,0 @@ -/************************************************************************ - filename: CEGUIFactoryModule.h - created: 12/4/2004 - author: Paul D Turner - - purpose: Defines interface for object that controls a loadable - module (.dll/.so/ whatever) that contains concrete - window / widget implementations and their factories. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFactoryModule_h_ -#define _CEGUIFactoryModule_h_ - -// Using statically linked factory modules (e.g. falagard), so DYNAMIC_FACTORY_MODULE is not defined -#ifdef DYNAMIC_FACTORY_MODULE -/************************************************************************* - The following is basically taken from DynLib.h, which is part of - the Ogre project (http://www.ogre3d.org/) -*************************************************************************/ -#if defined(__WIN32__) || defined(_WIN32) -# define DYNLIB_HANDLE hInstance -# define DYNLIB_LOAD( a ) LoadLibrary( a ) -# define DYNLIB_GETSYM( a, b ) GetProcAddress( a, b ) -# define DYNLIB_UNLOAD( a ) !FreeLibrary( a ) -# define DYNLIB_ERROR( ) "Unknown Error" - - struct HINSTANCE__; - typedef struct HINSTANCE__* hInstance; - -#elif defined(__linux__) -# define DYNLIB_HANDLE void* -# define DYNLIB_LOAD( a ) dlopen( a, RTLD_LAZY ) -# define DYNLIB_GETSYM( a, b ) dlsym( a, b ) -# define DYNLIB_UNLOAD( a ) dlclose( a ) -# define DYNLIB_ERROR( ) dlerror( ) - -#elif defined(__APPLE_CC__) -# define DYNLIB_HANDLE CFBundleRef -# define DYNLIB_LOAD( a ) mac_loadExeBundle( a ) -# define DYNLIB_GETSYM( a, b ) mac_getBundleSym( a, b ) -# define DYNLIB_UNLOAD( a ) mac_unloadExeBundle( a ) -# define DYNLIB_ERROR( ) mac_errorBundle() -#endif -#endif // DYNAMIC_FACTORY_MODULE - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Class that encapsulates access to a dynamic loadable module containing implementations of Windows, Widgets, and their factories. -*/ -class FactoryModule -{ -public: - /*! - \brief - Construct the FactoryModule object by loading the dynamic loadable module specified. - - \param filename - String object holding the filename of a loadable module. - - \return - Nothing - */ - FactoryModule(const String& filename); - - - /*! - \brief - Destroys the FactoryModule object and unloads any loadable module. - - \return - Nothing - */ - virtual ~FactoryModule(void); - - - /*! - \brief - Register a WindowFactory for \a type Windows. - - \param type - String object holding the name of the Window type a factory is to be registered for. - - \return - Nothing. - */ - void registerFactory(const String& type) const; - - - /*! - \brief - Register all factories available in this module. - - \return - uint value indicating the number of factories registered. - */ - uint registerAllFactories() const; - -private: - /************************************************************************* - Implementation Data - *************************************************************************/ -#ifdef DYNAMIC_FACTORY_MODULE - static const char RegisterFactoryFunctionName[]; - static const char RegisterAllFunctionName[]; - - typedef void (*FactoryRegisterFunction)(const String&); - typedef uint (*RegisterAllFunction)(void); - - FactoryRegisterFunction d_regFunc; //!< Pointer to the function called to register factories. - RegisterAllFunction d_regAllFunc; //!< Pointer to a function called to register all factories in a module. - String d_moduleName; //!< Holds the name of the loaded module. - DYNLIB_HANDLE d_handle; //!< Pointer to a ImplDat derived class that can hold any required implementation data -#endif -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFactoryModule_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIFont.h b/vendor/cegui-0.4.0-custom/include/CEGUIFont.h deleted file mode 100644 index a5f8396d87..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIFont.h +++ /dev/null @@ -1,1083 +0,0 @@ -/************************************************************************ - filename: CEGUIFont.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines interface for the Font class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFont_h_ -#define _CEGUIFont_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIRect.h" -#include "CEGUIVector.h" -#include "CEGUIColourRect.h" - -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Enumerated type that contains the valid flags that can be passed to createFont when creating a new font. -*/ -enum FontFlag -{ - Default, //!< Default / None. - NoAntiAlias //!< Fonts generated from TrueType files should not be anti-aliased. -}; - - -/*! -\brief - Enumerated type that contains valid formatting types that can be specified when rendering text into a Rect area (the formatting Rect). -*/ -enum TextFormatting -{ - LeftAligned, //!< All text is printed on a single line. The left-most character is aligned with the left edge of the formatting Rect. - RightAligned, //!< All text is printed on a single line. The right-most character is aligned with the right edge of the formatting Rect. - Centred, //!< All text is printed on a single line. The text is centred horizontally in the formatting Rect. - Justified, //!< All text is printed on a single line. The left-most and right-most characters are aligned with the edges of the formatting Rect. - WordWrapLeftAligned, //!< Text is broken into multiple lines no wider than the formatting Rect. The left-most character of each line is aligned with the left edge of the formatting Rect. - WordWrapRightAligned, //!< Text is broken into multiple lines no wider than the formatting Rect. The right-most character of each line is aligned with the right edge of the formatting Rect. - WordWrapCentred, //!< Text is broken into multiple lines no wider than the formatting Rect. Each line is centred horizontally in the formatting Rect. - WordWrapJustified //!< Text is broken into multiple lines no wider than the formatting Rect. The left-most and right-most characters of each line are aligned with the edges of the formatting Rect. -}; - -struct GlyphPageInfo -{ - GlyphPageInfo ( void ) : uiLastUsedTime ( 0 ), bWaitingToBeAdded ( false ), - bWaitingToBeDeleted ( false ), bWaitingToBeRedrawn ( false ), glyph_images ( NULL ) {} - uint uiLastUsedTime; - bool bWaitingToBeAdded; - bool bWaitingToBeDeleted; - bool bWaitingToBeRedrawn; - Imageset* glyph_images; -}; - -struct SCharSize -{ - ushort width; - ushort height; - float offsetX; - float horz_advance; -}; - -/*! -\brief - Class that encapsulates text rendering functionality for a typeface - - A Font object is created for each unique typeface required. The Font class provides - methods for loading typefaces from various sources, and then for outputting text via - the Renderer object. -*/ -class CEGUIEXPORT Font -{ - friend class Font_xmlHandler; -public: - /************************************************************************* - Constants - *************************************************************************/ - static const argb_t DefaultColour; //!< Colour value used whenever a colour is not specified. - - - /************************************************************************* - Text drawing methods - *************************************************************************/ - /*! - \brief - Draw text into a specified area of the display. - - \param text - String object containing the text to be drawn. - - \param draw_area - Rect object describing the area of the display where the text is to be rendered. The text is not clipped to this Rect, but is formatted - using this Rect depending upon the option specified in \a fmt. - - \param z - flat value specifying the z co-ordinate for the drawn text. - - \param clip_rect - Rect object describing the clipping area for the drawing. No drawing will occur outside this Rect. - - \param fmt - One of the TextFormatting values specifying the text formatting required. - - \param colours - ColourRect object describing the colours to be applied when drawing the text. NB: The colours specified in here are applied to each glyph, - rather than the text as a whole. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - The number of lines output. NB: This does not consider clipping, so if all text was clipped, this would still return >=1. - */ - size_t drawText(const String& text, const Rect& draw_area, float z, const Rect& clip_rect, TextFormatting fmt, const ColourRect& colours, float x_scale = 1.0f, float y_scale = 1.0f) const; - - - /*! - \brief - Draw text into a specified area of the display using default colours. - - \param text - String object containing the text to be drawn. - - \param draw_area - Rect object describing the area of the display where the text is to be rendered. The text is not clipped to this Rect, but is formatted - using this Rect depending upon the option specified in \a fmt. - - \param z - flat value specifying the z co-ordinate for the drawn text. - - \param clip_rect - Rect object describing the clipping area for the drawing. No drawing will occur outside this Rect. - - \param fmt - One of the TextFormatting values specifying the text formatting required. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - The number of lines output. NB: This does not consider clipping, so if all text was clipped, this would still return >=1. - */ - size_t drawText(const String& text, const Rect& draw_area, float z, const Rect& clip_rect, TextFormatting fmt, float x_scale = 1.0f, float y_scale = 1.0f) const - { return drawText(text, draw_area, z, clip_rect, fmt, ColourRect(DefaultColour, DefaultColour, DefaultColour, DefaultColour), x_scale, y_scale); } - - - /*! - \brief - Draw text into a specified area of the display with default colours and default formatting (LeftAligned). - - \param text - String object containing the text to be drawn. - - \param draw_area - Rect object describing the area of the display where the text is to be rendered. The text is not clipped to this Rect, but is formatted - using this Rect depending upon the option specified in \a fmt. - - \param z - flat value specifying the z co-ordinate for the drawn text. - - \param clip_rect - Rect object describing the clipping area for the drawing. No drawing will occur outside this Rect. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - Nothing. - */ - void drawText(const String& text, const Rect& draw_area, float z, const Rect& clip_rect, float x_scale = 1.0f, float y_scale = 1.0f) const - { drawText(text, draw_area, z, clip_rect, LeftAligned, ColourRect(DefaultColour, DefaultColour, DefaultColour, DefaultColour), x_scale, y_scale); } - - - /*! - \brief - Draw text into a specified area of the display. - - \param text - String object containing the text to be drawn. - - \param draw_area - Rect object describing the area of the display where the text is to be rendered. The text is formatted using this Rect depending - upon the option specified in \a fmt. Additionally, the drawn text is clipped to be within this Rect (applies to non-word wrapped formatting - where the text may otherwise have fallen outside this Rect). - - \param z - flat value specifying the z co-ordinate for the drawn text. - - \param fmt - One of the TextFormatting values specifying the text formatting required. - - \param colours - ColourRect object describing the colours to be applied when drawing the text. NB: The colours specified in here are applied to each glyph, - rather than the text as a whole. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - The number of lines output. NB: This does not consider clipping, so if all text was clipped, this would still return >=1. - */ - size_t drawText(const String& text, const Rect& draw_area, float z, TextFormatting fmt, const ColourRect& colours, float x_scale = 1.0f, float y_scale = 1.0f) const - { return drawText(text, draw_area, z, draw_area, fmt, colours, x_scale, y_scale); } - - - /*! - \brief - Draw text into a specified area of the display with default colours. - - \param text - String object containing the text to be drawn. - - \param draw_area - Rect object describing the area of the display where the text is to be rendered. The text is formatted using this Rect depending - upon the option specified in \a fmt. Additionally, the drawn text is clipped to be within this Rect (applies to non-word wrapped formatting - where the text may otherwise have fallen outside this Rect). - - \param z - flat value specifying the z co-ordinate for the drawn text. - - \param fmt - One of the TextFormatting values specifying the text formatting required. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - The number of lines output. NB: This does not consider clipping, so if all text was clipped, this would still return >=1. - */ - size_t drawText(const String& text, const Rect& draw_area, float z, TextFormatting fmt, float x_scale = 1.0f, float y_scale = 1.0f) const - { return drawText(text, draw_area, z, draw_area, fmt, ColourRect(DefaultColour, DefaultColour, DefaultColour, DefaultColour), x_scale, y_scale); } - - - /*! - \brief - Draw text into a specified area of the display with default colours and default formatting (LeftAligned). - - \param text - String object containing the text to be drawn. - - \param draw_area - Rect object describing the area of the display where the text is to be rendered. The text is formatted using this Rect depending - upon the option specified in \a fmt. Additionally, the drawn text is clipped to be within this Rect (applies to non-word wrapped formatting - where the text may otherwise have fallen outside this Rect). - - \param z - flat value specifying the z co-ordinate for the drawn text. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - Nothing. - */ - void drawText(const String& text, const Rect& draw_area, float z, float x_scale = 1.0f, float y_scale = 1.0f) const - { drawText(text, draw_area, z, draw_area, LeftAligned, ColourRect(DefaultColour, DefaultColour, DefaultColour, DefaultColour), x_scale, y_scale); } - - - /*! - \brief - Draw text at the specified location. - - \param text - String object containing the text to be drawn. - - \param position - Vector3 object describing the location for the text. NB: The position specified here corresponds to the text baseline and not the - top of any glyph. The baseline spacing required can be retrieved by calling getBaseline(). - - \param clip_rect - Rect object describing the clipping area for the drawing. No drawing will occur outside this Rect. - - \param colours - ColourRect object describing the colours to be applied when drawing the text. NB: The colours specified in here are applied to each glyph, - rather than the text as a whole. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - Nothing. - */ - void drawText(const String& text, const Vector3& position, const Rect& clip_rect, const ColourRect& colours, float x_scale = 1.0f, float y_scale = 1.0f) const - { drawText(text, Rect(position.d_x, position.d_y, position.d_x, position.d_y), position.d_z, clip_rect, LeftAligned, colours, x_scale, y_scale); } - - - /*! - \brief - Draw text at the specified location with default colours. - - \param text - String object containing the text to be drawn. - - \param position - Vector3 object describing the location for the text. NB: The position specified here corresponds to the text baseline and not the - top of any glyph. The baseline spacing required can be retrieved by calling getBaseline(). - - \param clip_rect - Rect object describing the clipping area for the drawing. No drawing will occur outside this Rect. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \param y_scale - Scaling factor to be applied to each glyph's y axis, where 1.0f is considered to be 'normal'. - - \return - Nothing. - */ - void drawText(const String& text, const Vector3& position, const Rect& clip_rect, float x_scale = 1.0f, float y_scale = 1.0f) const - { drawText(text, Rect(position.d_x, position.d_y, position.d_x, position.d_y), position.d_z, clip_rect, LeftAligned, ColourRect(DefaultColour, DefaultColour, DefaultColour, DefaultColour), x_scale, y_scale); } - - - /************************************************************************* - Methods to define available glyphs (truetype fonts only) - *************************************************************************/ - /*! - \brief - Define the set of code points to be renderable by the font. - - \note - This function can take some time to execute depending upon the size of the code point set, and the size of the - font being operated upon. - - \param glyph_set - String object describing all the code points that will be renderable by this font - - \return - Nothing - - \exception InvalidRequestException thrown if the font is based on a bitmap rather than a true-type font. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Imageset* addFontGlyphs(const String& glyphset,const String& id); - - void setInitialFontGlyphs(const String& glyphset); - - /*! - \brief - Set the native resolution for this Font - - \param size - Size object describing the new native screen resolution for this Font. - - \return - Nothing - */ - void setNativeResolution(const Size& size); - - - /*! - \brief - Notify the Font of the current (usually new) display resolution. - - \param size - Size object describing the display resolution - - \return - Nothing - */ - void notifyScreenResolution(const Size& size); - - - /*! - \brief - Enable or disable auto-scaling for this Font. - - \param setting - true to enable auto-scaling, false to disable auto-scaling. - - \return - Nothing. - */ - void setAutoScalingEnabled(bool setting); - - - /*! - \brief - Set whether the font is anti-aliased or not. Only relevant for dynamic fonts, this setting is - ignored for bitmapped fonts. - - \param setting - - true if the font should be anti-aliased. - - false if the font should not be anti-aliased. - - \return - Nothing. - */ - void setAntiAliased(bool setting); - - - /************************************************************************* - Informational methods - *************************************************************************/ - /*! - \brief - Return the pixel width of the specified text if rendered with this Font. - - \param text - String object containing the text to return the rendered pixel width for. - - \param x_scale - Scaling factor to be applied to each glyph's x axis when measuring the extent, where 1.0f is considered to be 'normal'. - - \return - Number of pixels that \a text will occupy when rendered with this Font. - */ - float getTextExtent(const String& text, float x_scale = 1.0f) const; - - - /*! - \brief - Return the pixel line spacing value for. - - \param y_scale - Scaling factor to be applied to the line spacing, where 1.0f is considered to be 'normal'. - - \return - Number of pixels between vertical base lines, i.e. The minimum pixel space between two lines of text. - */ - float getLineSpacing(float y_scale = 1.0f) const {return d_lineSpacing * y_scale;} - - - /*! - \brief - return the exact pixel height of the font. - - \param y_scale - Scaling factor to be applied to the height, where 1.0f is considered to be 'normal'. - - \return - float value describing the pixel height of the font without any additional padding. - */ - float getFontHeight(float y_scale = 1.0f) const {return d_lineHeight * y_scale;} - - - /*! - \brief - Return the number of pixels from the top of the highest glyph to the baseline - - \param y_scale - Scaling factor to be applied to the baseline distance, where 1.0f is considered to be 'normal'. - - \return - pixel spacing from top of front glyphs to baseline - */ - float getBaseline(float y_scale = 1.0f) const {return d_max_bearingY * y_scale;} - - - /*! - \brief - Return the index of the closest text character in String \a text that corresponds to pixel location \a pixel if the text were rendered. - - \param text - String object containing the text. - - \param pixel - Specifies the (horizontal) pixel offset to return the character index for. - - \param x_scale - Scaling factor to be applied to each glyph's x axis when measuring the text extent, where 1.0f is considered to be 'normal'. - - \return - Returns a character index into String \a text for the character that would be rendered closest to horizontal pixel offset \a pixel if the - text were to be rendered via this Font. Range of the return is from 0 to text.length(), so may actually return an index past the end of - the string, which indicates \a pixel was beyond the last character. - */ - size_t getCharAtPixel(const String& text, float pixel, float x_scale = 1.0f) const {return getCharAtPixel(text, 0, pixel, x_scale);} - - - /*! - \brief - Return the index of the closest text character in String \a text, starting at character index \a start_char, that corresponds - to pixel location \a pixel if the text were to be rendered. - - \param text - String object containing the text. - - \param start_char - index of the first character to consider. This is the lowest value that will be returned from the call. - - \param pixel - Specifies the (horizontal) pixel offset to return the character index for. - - \param x_scale - Scaling factor to be applied to each glyph's x axis when measuring the text extent, where 1.0f is considered to be 'normal'. - - \return - Returns a character index into String \a text for the character that would be rendered closest to horizontal pixel offset \a pixel if the - text were to be rendered via this Font. Range of the return is from 0 to text.length(), so may actually return an index past the end of - the string, which indicates \a pixel was beyond the last character. - */ - size_t getCharAtPixel(const String& text, size_t start_char, float pixel, float x_scale = 1.0f) const; - - - /*! - \brief - Return the name of this font. - - \return - String object holding the name of this font. - */ - const String& getName(void) const {return d_name;} - - - /*! - \brief - Return the native display size for this Font. This is only relevant if the Font is being auto-scaled. - - \return - Size object describing the native display size for this Font. - */ - Size getNativeResolution(void) const {return Size(d_nativeHorzRes, d_nativeVertRes);} - - - /*! - \brief - Return whether this Font is auto-scaled. - - \return - true if the Font is auto-scaled, false if not. - */ - bool isAutoScaled(void) const {return d_autoScale;} - - - /*! - \brief - Return whether this Font can currently draw the specified code-point - - \param cp - utf32 code point that is the subject of the query. - - \return - true if the font contains a mapping for code point \a cp, false if it does not contain a mapping for \a cp. - */ - bool isCodepointAvailable(utf32 cp) const {return (d_cp_map.find(cp) != d_cp_map.end());} - - - /*! - \brief - Return the number of lines the given text would be formatted to. - - Since text formatting can result in multiple lines of text being output, it can be useful to know - how many lines would be output without actually rendering the text. - - \param text - String object containing the text to be measured. - - \param format_area - Rect object describing the area to be used when formatting the text depending upon the option specified in \a fmt. - - \param fmt - One of the TextFormatting values specifying the text formatting required. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \return - The number of lines produced from the specified formatting - */ - size_t getFormattedLineCount(const String& text, const Rect& format_area, TextFormatting fmt, float x_scale = 1.0f) const; - - - /*! - \brief - Return the horizontal pixel extent given text would be formatted to. - - The value return by this method is basically the extent of the widest line within the formatted text. - - \param text - String object containing the text to be measured. - - \param format_area - Rect object describing the area to be used when formatting the text depending upon the option specified in \a fmt. - - \param fmt - One of the TextFormatting values specifying the text formatting required. - - \param x_scale - Scaling factor to be applied to each glyph's x axis, where 1.0f is considered to be 'normal'. - - \return - The widest pixel extent of the lines produced from the specified formatting. - */ - float getFormattedTextExtent(const String& text, const Rect& format_area, TextFormatting fmt, float x_scale = 1.0f) const; - - - /*! - \brief - Return whether this font is anti-aliased or not. This is only relevant for dynamic fonts created from a TrueType font file. - - \return - - true if the font is anti-aliased. - - false if the font is not anti-aliased. - */ - bool isAntiAliased(void) const; - - - - /*! - \brief - Return a String object that contains the code-points that the font is currently configured to render. - - \return - Reference to a String object. - */ - const String getAvailableGlyphs(void) const; - - // Subsitute font extensions - const std::map < utf32, SCharSize >& getSizesMap ( void ) { return d_sizes_map; }; - const std::map < uint, GlyphPageInfo >& getPageInfoMap ( void ) { return d_GlyphPageInfoMap; }; - bool d_is_subfont; - void setIsSubstituteFont ( bool bIsSubFont ) { d_is_subfont = bIsSubFont; }; - - /*! - \brief - glyph cache functions - */ - void freeGlyphs ( void ); - void freeGlyphPage ( uint uiPage ); - GlyphPageInfo* findGlyphPageInfo ( ulong ulGlyph, bool bScanSubFont = false ); - GlyphPageInfo* addGlyphPageInfo ( ulong ulGlyph ); - void redrawGlyphCache ( ); - void refreshCachedGlyph ( unsigned long ulGlyph ); - GlyphPageInfo* insertGlyphToCache ( unsigned long ulGlyph ); - void refreshStringForGlyphs ( const String& strText ); - void insertStringForGlyphs ( const String& strText ); - void pulse ( void ); - bool needsRebuild ( void ); - void rebuild ( void ); - void onClearRenderList ( void ); - - /*! - \brief - Return the point size of a dynamic (ttf based) font. - - \return - uint value indicating the point size specified when the dynamic font was created. - - \exception InvalidRequestException thrown if the font is a static (bitmap based) font which do not support point sizes. - */ - uint getPointSize(void) const; - - -private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const char FontSchemaName[]; //!< Filename of the XML schema used for validating Font files. - static const uint InterGlyphPadSpace; //!< Pad space between glyphs. - - - /************************************************************************* - Friends so that only FontManager can create and destroy font objects - *************************************************************************/ - friend class FontManager; - - /************************************************************************* - Private forward refs - *************************************************************************/ - struct FontImplData; - - - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructs a new Font object - - \param filename - The filename of the "font definition file" to be used in creating this font. - - \param resourceGroup - Resource group identifier to be passed to the resource provider to load the font - definition file. - - \exception FileIOException thrown if there was some problem accessing or parsing the file \a filename - \exception InvalidRequestException thrown if an invalid filename was provided. - \exception AlreadyExistsException thrown if a Font Imageset clashes with one already defined in the system. - \exception GenericException thrown if something goes wrong while accessing a true-type font referenced in file \a filename. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the requested glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Font(const String& filename, const String& resourceGroup, FontImplData* dat); - - - /*! - \brief - Constructs a new Font object, with 7-bit ASCII glyphs - - \param name - The unique name that will be used to identify this Font. - - \param fontname - filename of the true-type font to be loaded. - - \param resourceGroup - Resource group identifier to pass to the resource provider when loading the true-type - font file. - - \param size - Point size of the new font. - - \param flags - Combination of the FontFlag enumerated values specifying required options for creating this Font. - - \exception AlreadyExistsException thrown if an auto-generated Imageset clashes with one already defined in the system. - \exception GenericException thrown if something goes wrong while accessing the true-type font \a fontname. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the requested glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Font(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, FontImplData* dat, bool bAutoScale, float fNativeResX, float fNativeResY); - - - /*! - \brief - Constructs a new Font object, with the specified set of glyphs - - \param name - The unique name that will be used to identify this Font. - - \param fontname - filename of the true-type font to be loaded. - - \param resourceGroup - Resource group identifier to pass to the resource provider when loading the true-type - font file. - - \param size - Point size of the new font. - - \param flags - Combination of the FontFlag enumerated values specifying required options for creating this Font. - - \param glyph_set - String containing the set of glyphs to have available in this font. - - \exception AlreadyExistsException thrown if an auto-generated Imageset clashes with one already defined in the system. - \exception GenericException thrown if something goes wrong while accessing the true-type font \a fontname. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the requested glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Font(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, const String& glyph_set, FontImplData* dat); - - - /*! - \brief - Constructs a new Font object, with a specified range of glyphs - - \param name - The unique name that will be used to identify this Font. - - \param fontname - filename of the true-type font to be loaded. - - \param resourceGroup - Resource group identifier to pass to the resource provider when loading the true-type - font file. - - \param size - Point size of the new font. - - \param flags - Combination of the FontFlag enumerated values specifying required options for creating this Font. - - \param first_code_point - Specifies the utf32 code point of the first glyph to be available on this font - - \param last_code_point - Specifies the utf32 code point of the last glyph to be available on this font - - \exception AlreadyExistsException thrown if an auto-generated Imageset clashes with one already defined in the system. - \exception GenericException thrown if something goes wrong while accessing the true-type font \a fontname. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the requested glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Font(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, utf32 first_code_point, utf32 last_code_point, FontImplData* dat); - - -public: // For luabind support - /*! - \brief - Destroys a Font object - */ - ~Font(void); - - -private: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Load and complete construction of 'this' via an XML file - - \param filename - String object holding the name of the XML file that holds details about the font to create. - - \param resourceGroup - Resource group identifier to be passed to the resource provider when loading the font - definition file. - - \return - Nothing. - */ - void load(const String& filename, const String& resourceGroup); - - - /*! - \brief - Unloads data associated with the font (font is then useless. this is intended for cleanup). - - \return - Nothing. - */ - void unload(void); - - - /*! - \brief - Return the required texture size required to store imagery for the - glyphs specified in \a glyph_set - - \param glyph_set - String object describing the set of code points who's glyph imagery is to be measured. - - \return - Required pixel size for a square texture large enough to hold glyph imagery for the set of code points in \a glyph_set - */ - uint getRequiredTextureSize(const String& glyph_set); - - - /*! - \brief - Return the required texture size required to store imagery for the - glyphs specified in by the inclusive range [first_code_point, last_code_point] - - \param first_code_point - utf32 code point of the first character in the range to be measured - - \param last_code_point - utf32 code point of the last character in the range to be measured - - \return - Required pixel size for a square texture large enough to hold glyph imagery for the specified range of code points. - */ - uint getRequiredTextureSize(utf32 first_code_point, utf32 last_code_point); - - - /*! - \brief - Paint the set of glyphs required for all code points in \a glyph_set into the buffer \a buffer, - which has a size of \a size pixels (not bytes) square. This also defines an Image for each - glyph in the Imageset for this font, and creates an entry in the code point to Image map. - - \param glyph_set - String object containing the set of code points whos glyphs are to be loaded into the buffer. - - \param size - Width of \a buffer in pixels (not bytes). - - \param buffer - Pointer to a memory buffer large enough to receive the glyph image data. - - \return - Nothing. - */ - void createFontGlyphSet(const String& glyph_set, uint size, argb_t* buffer, Imageset* glyph_images ); - - void* loadGlyph ( unsigned long glyphID, bool bCacheSize = true ); - - bool utilFontGlyphSet(const String& glyph_set, uint size, argb_t* buffer, Imageset* glyph_images ); - - - /*! - \brief - Copy the current glyph data into \a buffer, which has a width of \a buf_width pixels (not bytes). - - \param buffer - Memory buffer large enough to receive the imagery for the currently loaded glyph. - - \param buf_width - Width of \a buffer in pixels (where each pixel is a argb_t). - - \return - Nothing. - */ - void drawGlyphToBuffer(void* glyph, argb_t* buffer, uint buf_width); - - - /*! - \brief - draws wrapped text. returns number of lines output. - */ - size_t drawWrappedText(const String& text, const Rect& draw_area, float z, const Rect& clip_rect, TextFormatting fmt, const ColourRect& colours, float x_scale = 1.0f, float y_scale = 1.0f) const; - - - /*! - \brief - helper function for renderWrappedText to get next word of a string - */ - size_t getNextWord(const String& in_string, size_t start_idx, String& out_string) const; - - - /*! - \brief - Draw a line of text. No formatting is applied. - */ - void drawTextLine(const String& text, const Vector3& position, const Rect& clip_rect, const ColourRect& colours, float x_scale = 1.0f, float y_scale = 1.0f) const; - - - /*! - \brief - Draw a justified line of text. - */ - void drawTextLineJustified(const String& text, const Rect& draw_area, const Vector3& position, const Rect& clip_rect, const ColourRect& colours, float x_scale = 1.0f, float y_scale = 1.0f) const; - - - /*! - \brief - Set the size of the free-type font (via d_face which should already be setup) and render the glyphs in d_glyphset. - */ - void createFontFromFT_Face(uint size, uint horzDpi, uint vertDpi); - - - /*! - \brief - Update the font as required according to the current scaling - */ - void updateFontScaling(void); - - - /*! - \brief - Calculate the vertical spacing fields for a static / bitmap font - */ - void calculateStaticVertSpacing(void); - - /*! - \brief - Function to do real work of constructor. Used to save duplication in the various constructor overloads. - */ - void constructor_impl(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, const String& glyph_set); - - - /*! - \brief - returns extent of widest line of wrapped text. - */ - float getWrappedTextExtent(const String& text, float wrapWidth, float x_scale = 1.0f) const; - - /*! - \brief - Writes an xml representation of this Font to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - - /************************************************************************* - Implementation structs - *************************************************************************/ - /*! - \brief - struct to hold extra details about a glyph (required for proper rendering) - */ - struct glyphDat - { - const Image* d_image; //!< The image which will be rendered. - int d_horz_advance; //!< Amount to advance the pen after rendering this glyph - int d_horz_advance_unscaled; //!< original unscaled advance value (only used with static / bitmap fonts). - }; - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::map CodepointMap; - CodepointMap d_cp_map; //!< Contains mappings from code points to Image objects - - String d_name; //!< Name of this font. - String d_sourceFilename; //!< Holds the name of the file used to create this font (either font file or imagset) - - bool d_freetype; //!< true when the font is a FreeType based font - float d_lineHeight; //!< Exact pixel height of font. - float d_lineSpacing; //!< Spacing between multiple lines. - float d_max_bearingY; //!< Maximum bearingY value (gives required spacing down to baseline). - uint d_maxGlyphHeight; //!< Height of the largest glyph (calculated in getRequiredTextureSize) - - FontImplData* d_impldat; //!< Implementation data - uint d_ptSize; //!< Point size of font. - - // auto-scaling fields - bool d_autoScale; //!< true when auto-scaling is enabled. - float d_horzScaling; //!< current horizontal scaling factor. - float d_vertScaling; //!< current vertical scaling factor. - float d_nativeHorzRes; //!< native horizontal resolution for this Imageset. - float d_nativeVertRes; //!< native vertical resolution for this Imageset. - - bool d_antiAliased; //!< True if the font should be rendered as anti-alaised by freeType. - - // Substitute font - const CodepointMap& getCodepointMap ( void ) { return d_cp_map; }; - - // Glyph cache - String d_imagesetName; - bool d_bAddedGlyphPage; - uint d_uiLastPulseTime; - String d_glyphset_default; - Imageset* d_glyph_images_default; - std::map < uint, GlyphPageInfo > d_GlyphPageInfoMap; - - // Character sizes - std::map < utf32, SCharSize > d_sizes_map; // Character sizes we know about - Used to speed up checking texture size - int d_total_width; // Total width of characters we know about - int d_avg_width; // d_total_width / d_sizes_map.size () -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - - -#endif // end of guard _CEGUIFont_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIFontManager.h b/vendor/cegui-0.4.0-custom/include/CEGUIFontManager.h deleted file mode 100644 index 6db296deb2..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIFontManager.h +++ /dev/null @@ -1,285 +0,0 @@ -/************************************************************************ - filename: CEGUIFontManager.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines interface for the FontManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFontManager_h_ -#define _CEGUIFontManager_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUIIteratorBase.h" -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class providing a shared library of Font objects to the system. - - The FontManager is used to create, access, and destroy Font objects. The idea is that the - FontManager will function as a central repository for Font objects used within the GUI system, - and that those Font objects can be accessed, via a unique name, by any interested party within - the system. -*/ -class CEGUIEXPORT FontManager : public Singleton -{ -public: - /*! - \brief - Constructor for FontManager objects - */ - FontManager(void); - - - /*! - \brief - Destructor for FontManager objects - */ - ~FontManager(void); - - - /*! - \brief - Return singleton FontManager object - - \return - Singleton FontManager object - */ - static FontManager& getSingleton(void); - - - /*! - \brief - Return pointer to singleton FontManager object - - \return - Pointer to singleton FontManager object - */ - static FontManager* getSingletonPtr(void); - - - /*! - \brief - Creates a new font from a font definition file, and returns a pointer to the new Font object. - - \param filename - String object containing the filename of a 'font definition file' what will be used to create the new font - - \param resourceGroup - Resource group identifier to pass to the resource provider when loading the font definition file. - - \return - Pointer the the newly created Font object - - \exception FileIOException thrown if there was some problem accessing or parsing the file \a filename - \exception InvalidRequestException thrown if an invalid filename was provided. - \exception AlreadyExistsException thrown if a Font already exists with the name specified, or if a font Imageset clashes with one already defined in the system. - \exception GenericException thrown if something goes wrong while accessing a true-type font referenced in file \a filename. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the requested glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Font* createFont(const String& filename, const String& resourceGroup = ""); - - - /*! - \brief - Creates a new Font based on a true-type font, and returns a pointer to the new Font object. - - \param name - String object containing a unique name for the new font. - - \param fontname - String object containing the name and path of the true-type font to access. - - \param size - Specifies the glyph size (point-size) for the new font. - - \param flags - Some combination of FontFlag values to be used for the creation of this font. - - \param resourceGroup - Resource group identifier to be passed to the resource provider when loading the font definition file. - - \return - Pointer to the newly created Font object. - - \exception AlreadyExistsException thrown if a Font already exists with the name specified, or if a font Imageset clashes with one already defined in the system. - \exception GenericException thrown if something goes wrong while accessing a true-type font referenced in file \a fontname. - \exception RendererException thrown if the Renderer can't support a texture large enough to hold the requested glyph imagery. - \exception MemoryException thrown if allocation of imagery construction buffer fails. - */ - Font* createFont(const String& name, const String& fontname, uint size, uint flags, bool bAutoScale, float fNativeResX, float fNativeResY, const String& resourceGroup = "" ); - - - /*! - \brief - Destroy's the font with the given name - - \param name - String object containing the name of the font to be destroyed. If the specified font does not exist, nothing happens. - - \return - Nothing - */ - void destroyFont(const String& name); - - - /*! - \brief - Destroys the given Font object - - \param font - Pointer to the Font to be destroyed. If no such Font exists, nothing happens. - - \return - Nothing. - */ - void destroyFont(Font* font); - - - /*! - \brief - Destroys all Font objects registered in the system - - \return - Nothing - */ - void destroyAllFonts(void); - - - /*! - \brief - Checks the existence of a given font. - - \param name - String object holding the name of the Font object to look for. - - \return - true if a Font object named \a name exists in the system, false if no such font exists. - */ - bool isFontPresent(const String& name) const; - - - /*! - \brief - Returns a pointer to the font object with the specified name - - \param name - String object containing the name of the Font object to be returned - - \return - Pointer to the requested Font object - - \exception UnknownObjectException Thrown if no font with the given name exists. - */ - Font* getFont(const String& name) const; - - - /*! - \brief - Notify the FontManager of the current (usually new) display resolution. - - \param size - Size object describing the display resolution - - \return - Nothing - */ - void notifyScreenResolution(const Size& size); - - - /*! - \brief - Writes a full XML font file for the specified Font to the given OutStream. - - \param name - String holding the name of the Font to be written to the stream. - - \param out_stream - OutStream (std::ostream based) object where data is to be sent. - - \return - Nothing. - */ - void writeFontToStream(const String& name, OutStream& out_stream) const; - - /*! - \brief - Sets a substitute font of the given name - - \param name - String holding the name of the Font to be used as the substitute. - - \return - Nothing. - */ - void setSubstituteFont(Font* subfont) { d_subfont = subfont; d_subfont->setIsSubstituteFont(true); }; - Font* getSubstituteFont(void) { return d_subfont; }; - -private: - /************************************************************************* - Implementation Data - *************************************************************************/ - Font* d_subfont; - - typedef std::map FontRegistry; - FontRegistry d_fonts; - - struct FontManagerImplData; - FontManagerImplData* d_implData; - - struct CEGUI::Font::FontImplData; - CEGUI::Font::FontImplData* d_subfntdata; //!< Implementation data - - -public: - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator FontIterator; - - /*! - \brief - Return a FontManager::FontIterator object to iterate over the available Font objects. - */ - FontIterator getIterator(void) const; -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFontManager_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIFontManager_implData.h b/vendor/cegui-0.4.0-custom/include/CEGUIFontManager_implData.h deleted file mode 100644 index 2c42a748e1..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIFontManager_implData.h +++ /dev/null @@ -1,45 +0,0 @@ -/************************************************************************ - filename: CEGUIFontManager_implData.h - created: 23/6/2004 - author: Paul D Turner - - purpose: Implementation data for FontManager to break - dependency on FreeType2 for clients -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFontManager_implData_h_ -#define _CEGUIFontManager_implData_h_ - -#include -#include FT_FREETYPE_H - - -// Start of CEGUI namespace section -namespace CEGUI -{ -struct FontManager::FontManagerImplData -{ - FT_Library d_ftlib; //!< FreeType library; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFontManager_implData_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIFont_implData.h b/vendor/cegui-0.4.0-custom/include/CEGUIFont_implData.h deleted file mode 100644 index 3090d089cb..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIFont_implData.h +++ /dev/null @@ -1,49 +0,0 @@ -/************************************************************************ - filename: CEGUIFont_implData.h - created: 23/6/2004 - author: Paul D Turner - - purpose: Implementation data used within the Font class - Used to break dependency on FreeType2 for clients -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFont_implData_h_ -#define _CEGUIFont_implData_h_ - -#include -#include FT_FREETYPE_H -#include "CEGUIDataContainer.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -struct Font::FontImplData -{ - FontImplData(FT_Library lib) : library(lib) {} - - FT_Library library; - FT_Face fontFace; - RawDataContainer fontData; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFont_implData_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIFont_xmlHandler.h b/vendor/cegui-0.4.0-custom/include/CEGUIFont_xmlHandler.h deleted file mode 100644 index 7762886fdd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIFont_xmlHandler.h +++ /dev/null @@ -1,114 +0,0 @@ -/************************************************************************ -filename: CEGUIFont_xmlHandler.h -created: 21/2/2004 -author: Paul D Turner - -purpose: Defines interface for the Font class -*************************************************************************/ -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFont_xmlHandler_h_ -#define _CEGUIFont_xmlHandler_h_ - -#include "CEGUIFont.h" -#include "CEGUIXMLHandler.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief -Handler class used to parse the Font XML files using SAX2 -*/ -class Font_xmlHandler : public XMLHandler -{ -public: - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructor for Font::xmlHandler objects - - \param font - Pointer to the Font object creating this xmlHandler object - */ - Font_xmlHandler(Font* font) : d_font(font) {} - - /*! - \brief - Destructor for Font::xmlHandler objects - */ - virtual ~Font_xmlHandler(void) {} - - /************************************************************************* - SAX2 Handler overrides - *************************************************************************/ - /*! - \brief - document processing (only care about elements, schema validates format) - */ - virtual void elementStart(const String& element, const XMLAttributes& attributes); - virtual void elementEnd(const String& element); - -private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - // XML related strings - static const String FontElement; //!< Tag name for Font elements. - static const String MappingElement; //!< Tag name for Mapping elements. - static const String FontTypeStatic; //!< Value used for FontTypeAttribute for a static (bitmapped) font. - static const String FontTypeDynamic; //!< Value used for FontTypeAttribute for a dynamic (true-type) font. - static const String GlyphElement; //!< Tag name for Glyph elements. - static const String GlyphRangeElement; //!< Tag name for GlyphRange elements. - static const String GlyphSetElement; //!< Tag name for GlyphSet elements. - static const char FontNameAttribute[]; //!< Attribute name that stores the name of the Font - static const char FontFilenameAttribute[]; //!< Attribute name that stores the filename, this is either an Imageset xml file, or a font file. - static const char FontResourceGroupAttribute[]; //!< Attribute name that stores the resource group identifier used when loading font file. - static const char FontTypeAttribute[]; //!< Attribute name that stores the type of font being defined (either static or dynamic). - static const char FontSizeAttribute[]; //!< Attribute name that stores the point size for a dynamic font. - static const char FontFirstCodepointAttribute[]; //!< Attribute name that stores the first code-point for a dynamic font. - static const char FontLastCodepointAttribute[]; //!< Attribute name that stores the last code-point for a dynamic font. - static const char FontNativeHorzResAttribute[]; //!< Optional attribute that stores 'native' horizontal resolution for the Font. - static const char FontNativeVertResAttribute[]; //!< Optional attribute that stores 'native' vertical resolution for the Font. - static const char FontAutoScaledAttribute[]; //!< Optional attribute that specifies whether the Font should be auto-scaled. - static const char FontAntiAliasedAttribute[]; //!< Optional attribute that specifies whether the TTF based font should be anti-aliased. - static const char MappingCodepointAttribute[]; //!< Attribute name that stores the Unicode code-point for a mapping. - static const char MappingImageAttribute[]; //!< Attribute name that stores the Image name for a mapping. - static const char MappingHorzAdvanceAttribute[]; //!< Attribute name that stores the horizontal advance for a glyph. - static const char GlyphCodepointAttribute[]; //!< Attribute name that stores the U+ codepoint to add to the set. - static const char GlyphRangeStartCodepointAttribute[]; //!< Attribute name that stores the U+ codepoint for the start of a range. - static const char GlyphRangeEndCodepointAttribute[]; //!< Attribute name that stores the U+ codepoint for the end of a range. - static const char GlyphSetGlyphsAttribute[]; //!< Attribute name that stores the UTF8 encoded codepoint set. - - // general constants - static const int AutoGenerateHorzAdvance; //!< Horizontal advance value that tells the parser to auto-calculate some reasonable value. - - /************************************************************************* - Implementation Data - *************************************************************************/ - Font* d_font; //!< Font object that we are helping to build - String d_glyphSet; //!< String holding the set of codepoints to be available. -}; - -} // End of CEGUI namespace section - -#endif diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIForwardRefs.h b/vendor/cegui-0.4.0-custom/include/CEGUIForwardRefs.h deleted file mode 100644 index 8ce55b170f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIForwardRefs.h +++ /dev/null @@ -1,116 +0,0 @@ -/************************************************************************ - filename: CEGUIForwardRefs.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Forward declares all core system classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIForwardRefs_h_ -#define _CEGUIForwardRefs_h_ - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Forward reference declarations of all core GUI system classes -*************************************************************************/ -class String; -class Vector3; -class Size; -class Exception; -class Rect; -class ColourRect; -class colour; -class Texture; -class Renderer; -class Image; -class Imageset; -class ImagesetManager; -class MouseCursor; -class Font; -class FontManager; -class EventArgs; -class Event; -class EventSet; -class Property; -class PropertySet; -class Window; -class WindowFactory; -class WindowManager; -class Scheme; -class SchemeManager; -class System; -class FactoryModule; -class ScriptModule; -class ResourceProvider; -class DefaultResourceProvider; -class PropertyReceiver; -class GlobalEventSet; -class XMLAttributes; -class XMLHandler; -class XMLParser; - -/************************************************************************* - Forward reference declarations for GUI element base classes -*************************************************************************/ -class ButtonBase; -class RadioButton; -class Checkbox; -class PushButton; -class Titlebar; -class FrameWindow; -class Editbox; -class Listbox; -class Combobox; -class ListHeaderSegment; -class ListHeader; -class MultiColumnList; -class ProgressBar; -class Thumb; -class Scrollbar; -class Slider; -class Static; -class StaticText; -class StaticImage; -class ListboxItem; -class ListboxTextItem; -class ListboxNumberItem; -class ListboxImageItem; -class ComboDropList; -class MultiLineEditbox; -class Spinner; -class GUISheet; -class DragContainer; -class ScrollablePane; -class ScrolledContainer; -class Tooltip; -class ItemEntry; -class TextItem; -class MenuItem; -class ItemListBase; -class MenuBase; -class Menubar; -class PopupMenu; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIForwardRefs_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIGUILayout_xmlHandler.h b/vendor/cegui-0.4.0-custom/include/CEGUIGUILayout_xmlHandler.h deleted file mode 100644 index b9cede8dc5..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIGUILayout_xmlHandler.h +++ /dev/null @@ -1,129 +0,0 @@ -/************************************************************************ - filename: CEGUIGUILayout_xmlHandler.h - created: 5/7/2004 - author: Paul D Turner - - purpose: Interface to XML parser for GUILayout files -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIGUILayout_xmlHandler_h_ -#define _CEGUIGUILayout_xmlHandler_h_ - -#include "CEGUIWindowManager.h" -#include "CEGUIWindow.h" -#include "CEGUIXMLHandler.h" - -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Handler class used to parse the GUILayout XML files using SAX2 -*/ -class GUILayout_xmlHandler : public XMLHandler -{ - typedef WindowManager::PropertyCallback PropertyCallback; -public: - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructor for GUILayout_xmlHandler objects - */ - GUILayout_xmlHandler(const String& name_prefix, PropertyCallback* callback = NULL, void* userdata = NULL) : - d_root(NULL), - d_namingPrefix(name_prefix), - d_propertyCallback(callback), - d_userData(userdata) - {} - - /*! - \brief - Destructor for GUILayout_xmlHandler objects - */ - virtual ~GUILayout_xmlHandler(void) {} - - /************************************************************************* - SAX2 Handler overrides - *************************************************************************/ - /*! - \brief - document processing (only care about elements, schema validates format) - */ - virtual void elementStart(const String& element, const XMLAttributes& attributes); - virtual void elementEnd(const String& element); - - /************************************************************************* - Functions used by our implementation - *************************************************************************/ - /*! - \brief - Destroy all windows created so far. - */ - void cleanupLoadedWindows(void); - - - /*! - \brief - Return a pointer to the 'root' window created. - */ - Window* getLayoutRootWindow(void) const; - -private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const String GUILayoutElement; //!< Tag name for GUILayout elements. - static const String WindowElement; //!< Tag name for Window elements. - static const String PropertyElement; //!< Tag name for Property elements. - static const String LayoutImportElement; //!< Tag name for LayoutImport elements. - static const String EventElement; //!< Tag name for Event elements. - static const char WindowTypeAttribute[]; //!< Attribute name that stores the type of Window to create. - static const char WindowNameAttribute[]; //!< Attribute name that stores the name of the window to create. - static const char PropertyNameAttribute[]; //!< Attribute name that stores the name of the property to set. - static const char PropertyValueAttribute[]; //!< Attribute name that stores the value to pass to the property. - static const char LayoutParentAttribute[]; //!< Attribute name that stores the name of the window to attach the layout to. - static const char LayoutImportFilenameAttribute[];//!< Attribute name that stores the file name of the layout to import. - static const char LayoutImportPrefixAttribute[]; //!< Attribute name that stores the prefix to use when loading the imported layout. - static const char LayoutImportResourceGroupAttribute[]; //!< Attribute name that stores the resource group identifier used when loading imported file. - static const char EventNameAttribute[]; //!< Attribute name that stores the event name to be subscribed. - static const char EventFunctionAttribute[]; //!< Attribute name that stores the name of the scripted function to be bound. - - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::vector WindowStack; - Window* d_root; //!< Will point to first window created. - WindowStack d_stack; //!< Stack used to keep track of what we're doing to which window. - String d_layoutParent; //!< Name of the parent window to attach the loaded layout to. - const String& d_namingPrefix; //!< Prefix that is to prepend all names of created windows. - PropertyCallback* d_propertyCallback; //!< Callback for every property loaded - void* d_userData; //!< User data for the property callback -}; - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIGUILayout_xmlHandler_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIGlobalEventSet.h b/vendor/cegui-0.4.0-custom/include/CEGUIGlobalEventSet.h deleted file mode 100644 index ef619aabf1..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIGlobalEventSet.h +++ /dev/null @@ -1,141 +0,0 @@ -/************************************************************************ - filename: CEGUIGlobalEventSet.h - created: 16/1/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http:www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIGlobalEventSet_h_ -#define _CEGUIGlobalEventSet_h_ - -#include "CEGUIEventSet.h" -#include "CEGUISingleton.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - The GlobalEventSet singleton allows you to subscribe to an event for all - instances of a class. The GlobalEventSet effectively supports "late binding" - to events; which means you can subscribe to some event that does not actually - exist (yet). -*/ -class CEGUIEXPORT GlobalEventSet : public EventSet, public Singleton -{ -public: - GlobalEventSet(); - ~GlobalEventSet(); - - - /*! - \brief - Return singleton System object - - \return - Singleton System object - */ - static GlobalEventSet& getSingleton(void); - - - /*! - \brief - Return pointer to singleton System object - - \return - Pointer to singleton System object - */ - static GlobalEventSet* getSingletonPtr(void); - - - /*! - \brief - Subscribes the the named Event. - - \note - If the named event does not exist it is added. - - \param name - String object containing the name of the Event to subscribe to. - - \param subscriber - Function or object that is to be subscribed to the Event. - - \return - Connection object that can be used to check the status of the Event connection and to disconnect (unsubscribe) from the Event. - */ - virtual Event::Connection subscribeEvent(const String& name, Event::Subscriber subscriber); - - - /*! - \brief - Subscribes the the specified group of the named Event. - - /note - If the named event does not exist it is added. - - \param name - String object containing the name of the Event to subscribe to. - - \param group - Group which is to be subscribed to. Subscription groups are called in ascending order. - - \param subscriber - Function or object that is to be subscribed to the Event. - - \return - Connection object that can be used to check the status of the Event connection and to disconnect (unsubscribe) from the Event. - */ - virtual Event::Connection subscribeEvent(const String& name, Event::Group group, Event::Subscriber subscriber); - - - /*! - \brief - Fires the named event passing the given EventArgs object. - - \param name - String object holding the name of the Event that is to be fired (triggered) - - \param args - The EventArgs (or derived) object that is to be bassed to each subscriber of the Event. Once all subscribers - have been called the 'handled' field of the event is updated appropriately. - - \param eventNamespace - String object describing the namespace prefix to use when firing the global event. - - \return - Nothing. - */ - virtual void fireEvent(const String& name, EventArgs& args, const String& eventNamespace = ""); -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIGlobalEventSet_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIImage.h b/vendor/cegui-0.4.0-custom/include/CEGUIImage.h deleted file mode 100644 index 27142ba8d0..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIImage.h +++ /dev/null @@ -1,512 +0,0 @@ -/************************************************************************ - filename: CEGUIImage.h - created: 13/3/2004 - author: Paul D Turner - - purpose: Defines interface for Image class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIImage_h_ -#define _CEGUIImage_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIRect.h" -#include "CEGUIColourRect.h" -#include "CEGUIVector.h" -#include "CEGUISize.h" -#include "CEGUIRenderer.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class that represents a single Image of an Imageset. -*/ -class CEGUIEXPORT Image -{ -public: - /*! - \brief - Return a Size object containing the dimensions of the Image. - - \return - Size object holding the width and height of the Image. - */ - Size getSize(void) const {return Size(d_scaledWidth, d_scaledHeight);} - - - /*! - \brief - Return the pixel width of the image. - - \return - Width of this Image in pixels. - */ - float getWidth(void) const {return d_scaledWidth;} - - - /*! - \brief - Return the pixel height of the image. - - \return - Height of this Image in pixels - */ - float getHeight(void) const {return d_scaledHeight;} - - - /*! - \brief - Return a Point object that contains the offset applied when rendering this Image - - \return - Point object containing the offsets applied when rendering this Image - */ - Point getOffsets(void) const {return d_scaledOffset;} - - - /*! - \brief - Return the X rendering offset - - \return - X rendering offset. This is the number of pixels that the image is offset by when rendering at any given location. - */ - float getOffsetX(void) const {return d_scaledOffset.d_x;} - - - /*! - \brief - Return the Y rendering offset - - \return - Y rendering offset. This is the number of pixels that the image is offset by when rendering at any given location. - */ - float getOffsetY(void) const {return d_scaledOffset.d_y;} - - - /*! - \brief - Return the name of this Image object. - - \return - String object containing the name of this Image - */ - const String& getName(void) const; - - - /*! - \brief - Return the name of the Imageset that contains this Image - - \return - String object containing the name of the Imageset which this Image is a part of. - */ - const String& getImagesetName(void) const; - - /*! - \brief - Return Rect describing the source texture area used by this Image. - - \return - Rect object that describes, in pixels, the area upon the source texture - which is used when rendering this Image. - */ - const Rect& getSourceTextureArea(void) const; - - /*! - \brief - Sets area describing the source texture area used by this Image. - !!! ADDED BY MTA !!! - - \param - area object that describes, in pixels, the area upon the source texture - which is used when rendering this Image. - */ - void setSourceTextureArea(const Rect& area); - - /*! - \brief - Queue the image to be drawn. - - \note - The final position of the Image will be adjusted by the offset values defined for this Image object. If absolute positioning is - essential then these values should be taken into account prior to calling the draw() methods. However, by doing this you take - away the ability of the Imageset designer to adjust the alignment and positioning of Images, therefore your component is far - less useful since it requires code changes to modify image positioning that could have been handled from a data file. - - \param position - Vector3 object containing the location where the Image is to be drawn - - \param size - Size object describing the size that the Image is to be drawn at. - - \param clip_rect - Rect object that defines an on-screen area that the Image will be clipped to when drawing. - - \param top_left_colour - Colour (as 0xAARRGGBB value) to be applied to the top-left corner of the Image. - - \param top_right_colour - Colour (as 0xAARRGGBB value) to be applied to the top-right corner of the Image. - - \param bottom_left_colour - Colour (as 0xAARRGGBB value) to be applied to the bottom-left corner of the Image. - - \param bottom_right_colour - Colour (as 0xAARRGGBB value) to be applied to the bottom-right corner of the Image. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Vector3& position, const Size& size, const Rect& clip_rect, const colour& top_left_colour = 0xFFFFFFFF, const colour& top_right_colour = 0xFFFFFFFF, const colour& bottom_left_colour = 0xFFFFFFFF, const colour& bottom_right_colour = 0xFFFFFFFF, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const - { - draw(Rect(position.d_x, position.d_y, position.d_x + size.d_width, position.d_y + size.d_height), position.d_z, clip_rect, - ColourRect(top_left_colour, top_right_colour, bottom_left_colour, bottom_right_colour), quad_split_mode); - } - - - /*! - \brief - Queue the image to be drawn. - - \note - The final position of the Image will be adjusted by the offset values defined for this Image object. If absolute positioning is - essential then these values should be taken into account prior to calling the draw() methods. However, by doing this you take - away the ability of the Imageset designer to adjust the alignment and positioning of Images, therefore your component is far - less useful since it requires code changes to modify image positioning that could have been handled from a data file. - - \param dest_rect - Rect object defining the area on-screen where the Image is to be drawn. The Image will be scaled to fit the area as required. - - \param z - Z-order position for the image. Positions increase "into the screen", so 0.0f is at the top of the z-order. - - \param clip_rect - Rect object that defines an on-screen area that the Image will be clipped to when drawing. - - \param top_left_colour - Colour (as 0xAARRGGBB value) to be applied to the top-left corner of the Image. - - \param top_right_colour - Colour (as 0xAARRGGBB value) to be applied to the top-right corner of the Image. - - \param bottom_left_colour - Colour (as 0xAARRGGBB value) to be applied to the bottom-left corner of the Image. - - \param bottom_right_colour - Colour (as 0xAARRGGBB value) to be applied to the bottom-right corner of the Image. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Rect& dest_rect, float z, const Rect& clip_rect, const colour& top_left_colour = 0xFFFFFFFF, const colour& top_right_colour = 0xFFFFFFFF, const colour& bottom_left_colour = 0xFFFFFFFF, const colour& bottom_right_colour = 0xFFFFFFFF, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const - { - draw(dest_rect, z, clip_rect, ColourRect(top_left_colour, top_right_colour, bottom_left_colour, bottom_right_colour), quad_split_mode); - } - - - /*! - \brief - Queue the image to be drawn. - - \note - The final position of the Image will be adjusted by the offset values defined for this Image object. If absolute positioning is - essential then these values should be taken into account prior to calling the draw() methods. However, by doing this you take - away the ability of the Imageset designer to adjust the alignment and positioning of Images, therefore your component is far - less useful since it requires code changes to modify image positioning that could have been handled from a data file. - - \param position - Vector3 object containing the location where the Image is to be drawn - - \param size - Size object describing the size that the Image is to be drawn at. - - \param clip_rect - Rect object that defines an on-screen area that the Image will be clipped to when drawing. - - \param colours - ColourRect object that describes the colour values to use for each corner of the Image. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Vector3& position, const Size& size, const Rect& clip_rect, const ColourRect& colours, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const - { - draw(Rect(position.d_x, position.d_y, position.d_x + size.d_width, position.d_y + size.d_height), position.d_z, clip_rect, colours, quad_split_mode); - } - - - /*! - \brief - Queue the image to be drawn. - - \note - The final position of the Image will be adjusted by the offset values defined for this Image object. If absolute positioning is - essential then these values should be taken into account prior to calling the draw() methods. However, by doing this you take - away the ability of the Imageset designer to adjust the alignment and positioning of Images, therefore your component is far - less useful since it requires code changes to modify image positioning that could have been handled from a data file. - - \param position - Vector3 object containing the location where the Image is to be drawn - - \note - The image will be drawn at it's internally defined size. - - \param clip_rect - Rect object that defines an on-screen area that the Image will be clipped to when drawing. - - \param colours - ColourRect object that describes the colour values to use for each corner of the Image. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Vector3& position, const Rect& clip_rect, const ColourRect& colours, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const - { - draw(Rect(position.d_x, position.d_y, position.d_x + getWidth(), position.d_y + getHeight()), position.d_z, clip_rect, colours, quad_split_mode); - } - - - /*! - \brief - Queue the image to be drawn. - - \note - The final position of the Image will be adjusted by the offset values defined for this Image object. If absolute positioning is - essential then these values should be taken into account prior to calling the draw() methods. However, by doing this you take - away the ability of the Imageset designer to adjust the alignment and positioning of Images, therefore your component is far - less useful since it requires code changes to modify image positioning that could have been handled from a data file. - - \param position - Vector3 object containing the location where the Image is to be drawn - - \param clip_rect - Rect object that defines an on-screen area that the Image will be clipped to when drawing. - - \param top_left_colour - Colour (as 0xAARRGGBB value) to be applied to the top-left corner of the Image. - - \param top_right_colour - Colour (as 0xAARRGGBB value) to be applied to the top-right corner of the Image. - - \param bottom_left_colour - Colour (as 0xAARRGGBB value) to be applied to the bottom-left corner of the Image. - - \param bottom_right_colour - Colour (as 0xAARRGGBB value) to be applied to the bottom-right corner of the Image. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Vector3& position, const Rect& clip_rect, const colour& top_left_colour = 0xFFFFFFFF, const colour& top_right_colour = 0xFFFFFFFF, const colour& bottom_left_colour = 0xFFFFFFFF, const colour& bottom_right_colour = 0xFFFFFFFF, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const - { - draw(Rect(position.d_x, position.d_y, position.d_x + getWidth(), position.d_y + getHeight()), position.d_z, clip_rect, ColourRect(top_left_colour, top_right_colour, bottom_left_colour, bottom_right_colour), quad_split_mode); - } - - - /*! - \brief - Queue the image to be drawn. - - \note - The final position of the Image will be adjusted by the offset values defined for this Image object. If absolute positioning is - essential then these values should be taken into account prior to calling the draw() methods. However, by doing this you take - away the ability of the Imageset designer to adjust the alignment and positioning of Images, therefore your component is far - less useful since it requires code changes to modify image positioning that could have been handled from a data file. - - \param dest_rect - Rect object defining the area on-screen where the Image is to be drawn. The Image will be scaled to fit the area as required. - - \param z - Z-order position for the image. Positions increase "into the screen", so 0.0f is at the top of the z-order. - - \param clip_rect - Rect object that defines an on-screen area that the Image will be clipped to when drawing. - - \param colours - ColourRect object that describes the colour values to use for each corner of the Image. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Rect& dest_rect, float z, const Rect& clip_rect,const ColourRect& colours, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const; - - - /*! - \brief - Writes an xml representation of this Image object to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - //Talihax - Font* getFont(void) const { return d_font; } - unsigned long getCodepoint(void) const { return d_codepoint; } - - - friend class std::map; - friend struct std::pair; - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Default constructor (only used by std::map) - */ - Image(void) {} - - - /*! - \brief - Constructor for Image objects. This is not normally used directly by client code, use the Imageset interface instead. - - \param owner - Pointer to a Imageset object that owns this Image. This must not be NULL. - - \param name - String object describing the name of the image being created. - - \param area - Rect object describing an area that will be associated with this image. - - \param render_offset - Point object that describes the offset to be applied when rendering this image. - - \param horzScaling - float value indicating the initial horizontal scaling to be applied to this image. - - \param vertScaling - float value indicating the initial vertical scaling to be applied to this image. - - \exception NullObjectException Thrown if \a owner was NULL. - */ - Image(const Imageset* owner, const String& name, const Rect& area, const Point& render_offset, float horzScaling = 1.0f, float vertScaling = 1.0f, unsigned long ulCodepoint = 0, Font* pFont = NULL ); - - - - /*! - \brief - Copy constructor - */ - Image(const Image& image); - - - /*! - \brief - Destructor for Image objects. - */ - ~Image(void); - - -private: - /************************************************************************* - Friends - *************************************************************************/ - friend class Imageset; - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - set the horizontal scaling factor to be applied to this Image - - \param factor - float value describing the scaling factor required. - - \return - Nothing. - */ - void setHorzScaling(float factor); - - - /*! - \brief - set the vertical scaling factor to be applied to this Image - - \param factor - float value describing the scaling factor required. - - \return - Nothing. - */ - void setVertScaling(float factor); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - const Imageset* d_owner; //!< Link back to Imageset that owns this image - Rect d_area; //!< Rect defining the area on the texture that makes up this image. - Point d_offset; //!< Offset to use when rendering - - // image auto-scaling fields. - float d_scaledWidth; //!< scaled image width. - float d_scaledHeight; //!< scaled image height. - Point d_scaledOffset; //!< scaled rendering offset. - String d_name; //!< name of this image. - Font* d_font; - unsigned long d_codepoint; -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIImage_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIImageset.h b/vendor/cegui-0.4.0-custom/include/CEGUIImageset.h deleted file mode 100644 index 7d752186f6..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIImageset.h +++ /dev/null @@ -1,593 +0,0 @@ -/************************************************************************ - filename: CEGUIImageset.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines the interface for the Imageset class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIImageset_h_ -#define _CEGUIImageset_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIRect.h" -#include "CEGUIColourRect.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImage.h" -#include "CEGUIIteratorBase.h" - -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Offers functions to define, access, and draw, a set of image components on a single graphical surface or Texture. - - Imageset objects are a means by which a single graphical image (file, Texture, etc), can be split into a number - of 'components' which can later be accessed via name. The components of an Imageset can queried for - various details, and sent to the Renderer object for drawing. -*/ -class CEGUIEXPORT Imageset -{ - friend class Imageset_xmlHandler; -private: - typedef std::map ImageRegistry; - - /************************************************************************* - Friends to allow access to constructors and destructors - *************************************************************************/ - friend Imageset* ImagesetManager::createImageset(const String& name, Texture* texture, bool bDestroyTextureManagedExternally); - friend Imageset* ImagesetManager::createImageset(const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally); - friend Imageset* ImagesetManager::createImagesetFromImageFile(const String& name, const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally); - friend void ImagesetManager::destroyImageset(const String& name); - - - /************************************************************************* - Construction and Destruction (private, only ImagesetManager can - create and destroy Imageset objects). - *************************************************************************/ - /*! - \brief - Construct a new Imageset object. Object will initially have no Images defined - - \param texture - Texture object that holds the imagery for the Imageset being created. - */ - Imageset(const String& name, Texture* texture, bool bDestroyTextureManagedExternally); - - - /*! - \brief - Construct a new Imageset object using data contained in the specified file. - - \param filename - String object that holds the name of the Imageset data file that is to be processed. - - \param resourceGroup - Resource group identifier to be passed to the resource manager. NB: This affects the - imageset xml file only, the texture loaded may have its own group specified in the XML file. - - \exception FileIOException thrown if something goes wrong while processing the file \a filename. - */ - Imageset(const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally); - - - /*! - \brief - Construct a new Imageset using the specified image file and imageset name. The created - imageset will, by default, have a single Image defined named "full_image" which represents - the entire area of the loaded image file. - - \note - Under certain renderers it may be required that the source image dimensions be some - power of 2, if this condition is not met then stretching and other undesired side-effects - may be experienced. To be safe from such effects it is generally recommended that all - images that you load have dimensions that are some power of 2. - - \param name - String object holding the name to be assigned to the created imageset. - - \param filename - String object holding the filename of the image that is to be loaded. The image should be - of some format that is supported by the Renderer that is in use. - - \param resourceGroup - Resource group identifier to be passed to the resource manager, which may specify a group - from which the image file is to be loaded. - - \exception FileIOException thrown if something goes wrong while loading the image. - */ - Imageset(const String& name, const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally); - - -public: // For luabind support - /*! - \brief - Destroys Imageset objects - */ - ~Imageset(void); - - -public: - typedef ConstBaseIterator ImageIterator; //!< Iterator type for this collection - - /************************************************************************* - Public interface - *************************************************************************/ - /*! - \brief - return Texture object for this Imageset - - \return - Texture object that holds the imagery for this Imageset - */ - Texture* getTexture(void) const {return d_texture;} - - - /*! - \brief - return String object holding the name of the Imageset - - \return - String object that holds the name of the Imageset. - */ - const String& getName(void) const {return d_name;} - - - /*! - \brief - return number of images defined for this Imageset - - \return - uint value equal to the number of Image objects defined for the Imageset - */ - uint getImageCount(void) const {return (uint)d_images.size();} - - - /*! - \brief - return true if an Image with the specified name exists. - - \param name - String object holding the name of the Image to look for. - - \return - true if an Image object named \a name is defined for this Imageset, else false. - */ - bool isImageDefined(const String& name) const {return d_images.find(name) != d_images.end();} - - - /*! - \brief - return a copy of the Image object for the named image - - \param name - String object holding the name of the Image object to be returned - - \return - constant Image object that has the requested name. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - const Image& getImage(const String& name) const; - - - /*! - \brief - remove the definition for the Image with the specified name. If no such Image exists, nothing happens. - - \param name - String object holding the name of the Image object to be removed from the Imageset, - \return - Nothing. - */ - void undefineImage(const String& name); - - - /*! - \brief - Removes the definitions for all Image objects currently defined in the Imageset - - \return - Nothing - */ - void undefineAllImages(void); - - - /*! - \brief - return a Size object describing the dimensions of the named image. - - \param name - String object holding the name of the Image. - - \return - Size object holding the dimensions of the requested Image. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - Size getImageSize(const String& name) const {return getImage(name).getSize();} - - - /*! - \brief - return the width of the named image. - - \param name - String object holding the name of the Image. - - \return - float value equalling the width of the requested Image. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - float getImageWidth(const String& name) const {return getImage(name).getWidth();} - - - /*! - \brief - return the height of the named image. - - \param name - String object holding the name of the Image. - - \return - float value equalling the height of the requested Image. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - float getImageHeight(const String& name) const {return getImage(name).getHeight();} - - - /*! - \brief - return the rendering offsets applied to the named image. - - \param name - String object holding the name of the Image. - - \return - Point object that holds the rendering offsets for the requested Image. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - Point getImageOffset(const String& name) const {return getImage(name).getOffsets();} - - - /*! - \brief - return the x rendering offset for the named image. - - \param name - String object holding the name of the Image. - - \return - float value equal to the x rendering offset applied when drawing the requested Image. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - float getImageOffsetX(const String& name) const {return getImage(name).getOffsetX();} - - - /*! - \brief - return the y rendering offset for the named image. - - \param name - String object holding the name of the Image. - - \return - float value equal to the y rendering offset applied when drawing the requested Image. - - \exception UnknownObjectException thrown if no Image named \a name is defined for the Imageset - */ - float getImageOffsetY(const String& name) const {return getImage(name).getOffsetY();} - - - /*! - \brief - Define a new Image for this Imageset - - \param name - String object holding the name that will be assigned to the new Image, which must be unique within the Imageset. - - \param position - Point object describing the pixel location of the Image on the image file / texture associated with this Imageset. - - \param size - Size object describing the dimensions of the Image, in pixels. - - \param render_offset - Point object describing the offsets, in pixels, that are to be applied to the Image when it is drawn. - - \return - Nothing - - \exception AlreadyExistsException thrown if an Image named \a name is already defined for this Imageset - */ - void defineImage(const String& name, const Point& position, const Size& size, const Point& render_offset) - { - defineImage(name, Rect(position.d_x, position.d_y, position.d_x + size.d_width, position.d_y + size.d_height), render_offset); - } - - - /*! - \brief - Define a new Image for this Imageset - - \param name - String object holding the name that will be assigned to the new Image, which must be unique within the Imageset. - - \param image_rect - Rect object describing the area on the image file / texture associated with this Imageset that will be used for the Image. - - \param render_offset - Point object describing the offsets, in pixels, that are to be applied to the Image when it is drawn. - - \return - Nothing - - \exception AlreadyExistsException thrown if an Image named \a name is already defined for this Imageset - */ - void defineImage(const String& name, const Rect& image_rect, const Point& render_offset, unsigned long ulCodepoint = 0, Font* pFont = NULL ); - - - /*! - \brief - Queues an area of the associated Texture the be drawn on the screen. Low-level routine to be used carefully! - - \param source_rect - Rect object describing the area of the image file / texture that is to be queued for drawing - - \param dest_rect - Rect describing the area of the screen that will be filled with the imagery from \a source_rect. - - \param z - float value specifying 'z' order. 0 is topmost with increasing values moving back into the screen. - - \param clip_rect - Rect object describing a 'clipping rectangle' that will be applied when drawing the requested imagery - - \param colours - ColourRect object holding the ARGB colours to be applied to the four corners of the rendered imagery. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Rect& source_rect, const Rect& dest_rect, float z, const Rect& clip_rect,const ColourRect& colours, QuadSplitMode quad_split_mode, const Image* image = NULL) const; - - - /*! - \brief - Queues an area of the associated Texture the be drawn on the screen. Low-level routine to be used carefully! - - \param source_rect - Rect object describing the area of the image file / texture that is to be queued for drawing - - \param dest_rect - Rect describing the area of the screen that will be filled with the imagery from \a source_rect. - - \param z - float value specifying 'z' order. 0 is topmost with increasing values moving back into the screen. - - \param clip_rect - Rect object describing a 'clipping rectangle' that will be applied when drawing the requested imagery - - \param top_left_colour - colour to be applied to the top left corner of the rendered imagery. - - \param top_right_colour - colour to be applied to the top right corner of the rendered imagery. - - \param bottom_left_colour - colour to be applied to the bottom left corner of the rendered imagery. - - \param bottom_right_colour - colour to be applied to the bottom right corner of the rendered imagery. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - void draw(const Rect& source_rect, const Rect& dest_rect, float z, const Rect& clip_rect, const colour& top_left_colour = 0xFFFFFFFF, const colour& top_right_colour = 0xFFFFFFFF, const colour& bottom_left_colour = 0xFFFFFFFF, const colour& bottom_right_colour = 0xFFFFFFFF, QuadSplitMode quad_split_mode = TopLeftToBottomRight) const - { - draw(source_rect, dest_rect, z, clip_rect, ColourRect(top_left_colour, top_right_colour, bottom_left_colour, bottom_right_colour), quad_split_mode); - } - - - /*! - \brief - Return whether this Imageset is auto-scaled. - - \return - true if Imageset is auto-scaled, false if not. - */ - bool isAutoScaled(void) const {return d_autoScale;} - - - /*! - \brief - Return the native display size for this Imageset. This is only relevant if the Imageset is being auto-scaled. - - \return - Size object describing the native display size for this Imageset. - */ - Size getNativeResolution(void) const {return Size(d_nativeHorzRes, d_nativeVertRes);} - - - /*! - \brief - Enable or disable auto-scaling for this Imageset. - - \param setting - true to enable auto-scaling, false to disable auto-scaling. - - \return - Nothing. - */ - void setAutoScalingEnabled(bool setting); - - - /*! - \brief - Set the native resolution for this Imageset - - \param size - Size object describing the new native screen resolution for this Imageset. - - \return - Nothing - */ - void setNativeResolution(const Size& size); - - - /*! - \brief - Notify the Imageset of the current (usually new) display resolution. - - \param size - Size object describing the display resolution - - \return - Nothing - */ - void notifyScreenResolution(const Size& size); - - - /*! - \brief - Return an Imageset::ImageIterator object that can be used to iterate over the Image objects in the Imageset. - */ - ImageIterator getIterator(void) const; - - - /*! - \brief - Writes an xml representation of this Imageset to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - -protected: - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const char ImagesetSchemaName[]; //!< Filename of the XML schema used for validating Imageset files. - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Initialise the Imageset with information taken from the specified file. - - \param filename - String object that holds the name of the Imageset data file that is to be processed. - - \param resourceGroup - Resource group identifier to be passed to the resource manager. NB: This affects the - imageset xml file only, the texture loaded may have its own group specified in the XML file. - - \return - Nothing - - \exception FileIOException thrown if something goes wrong while processing the file \a filename. - */ - void load(const String& filename, const String& resourceGroup); - - - /*! - \brief - Unloads all loaded data and leaves the Imageset in a clean (but un-usable) state. This should be called for cleanup purposes only. - */ - void unload(void); - - - /*! - \brief - set the Texture object to be used by this Imageset. Changing textures on an Imageset that is in use is not a good idea! - - \param texture - Texture object to be used by the Imageset. The old texture is NOT disposed of, that is the clients responsibility. - - \return - Nothing - - \exception NullObjectException thrown if \a texture is NULL - */ - void setTexture(Texture* texture); - - - /*! - \brief - Sets the scaling factor for all Images that are a part of this Imageset. - - \return - Nothing. - */ - void updateImageScalingFactors(void); - - /************************************************************************* - Implementation Data - *************************************************************************/ - String d_name; //!< Holds the name of this imageset. - ImageRegistry d_images; //!< Registry of Image objects for the images defined for this Imageset - Texture* d_texture; //!< Texture object that handles imagery for this Imageset - String d_textureFilename; //!< String holding the name of the texture filename (if any). - - // auto-scaling fields - bool d_autoScale; //!< true when auto-scaling is enabled. - float d_horzScaling; //!< current horizontal scaling factor. - float d_vertScaling; //!< current vertical scaling factor. - float d_nativeHorzRes; //!< native horizontal resolution for this Imageset. - float d_nativeVertRes; //!< native vertical resolution for this Imageset. - bool d_bDestroyTextureManagedExternally; // MTA gui static images are destroyed by MTA. This is the flag for that. -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIImageset_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIImagesetManager.h b/vendor/cegui-0.4.0-custom/include/CEGUIImagesetManager.h deleted file mode 100644 index 7082f32572..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIImagesetManager.h +++ /dev/null @@ -1,271 +0,0 @@ -/************************************************************************ - filename: CEGUIImagesetManager.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines interface for ImagesetManager object -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIImagesetManager_h_ -#define _CEGUIImagesetManager_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUIIteratorBase.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class providing a shared library of Imageset objects to the system. - - The ImagesetManager is used to create, access, and destroy Imageset objects. The idea is that - the ImagesetManager will function as a central repository for imagery used within the GUI system, - and that such imagery can be accessed, via a unique name, by any interested party within the system. -*/ -class CEGUIEXPORT ImagesetManager : public Singleton -{ -public: - /*! - \brief - Constructor for ImagesetManager objects - */ - ImagesetManager(void); - - - /*! - \brief - Destructor for ImagesetManager objects - */ - ~ImagesetManager(void); - - - /*! - \brief - Return singleton ImagesetManager object - - \return - Singleton ImagesetManager object - */ - static ImagesetManager& getSingleton(void); - - - /*! - \brief - Return pointer to singleton ImagesetManager object - - \return - Pointer to singleton ImagesetManager object - */ - static ImagesetManager* getSingletonPtr(void); - - - /*! - \brief - Create a Imageset object with the given name and Texture - - The created Imageset will be of limited use, and will require one or more images to be defined for the set. - - \param name - String object containing the unique name for the Imageset being created. - - \param texture - Texture object to be associated with the Imageset - - \return - Pointer to the newly created Imageset object - - \exception AlreadyExistsException Thrown if an Imageset named \a name is already present in the system. - */ - Imageset* createImageset(const String& name, Texture* texture, bool bDestroyTextureManagedExternally = false); - - /*! - \brief - Create an Imageset object from the specified file - - \param filename - String object holding the name of the Imageset definition file which should be used to create the Imageset - - \param resourceGroup - Resource group identifier to be passed to the resource manager. NB: This affects the - imageset xml file only, the texture loaded may have its own group specified in the XML file. - - \return - Pointer to the newly created Imageset object - - \exception AlreadyExistsException Thrown if an Imageset named \a name is already present in the system. - \exception FileIOException Thrown if something goes wrong while processing the file \a filename. - */ - Imageset* createImageset(const String& filename, const String& resourceGroup = "", bool bDestroyTextureManagedExternally = false); - - - /*! - \brief - Create an Imageset object from the specified image file. The Imageset will initially have a single - image defined named "full_image" which is an image that represents the entire area of the loaded image. - - \param name - String object containing the unique name for the Imageset being created. - - \param filename - String object holding the name of the image file to be loaded. - - \param resourceGroup - Resource group identifier to be passed to the resource manager when loading the image file. - - \return - Pointer to the newly created Imageset object - - \exception AlreadyExistsException Thrown if an Imageset named \a name is already present in the system. - \exception FileIOException Thrown if something goes wrong while reading the image file \a filename. - */ - Imageset* createImagesetFromImageFile(const String& name, const String& filename, const String& resourceGroup = "", bool bDestroyTextureManagedExternally = false); - - - /*! - \brief - Destroys the Imageset with the specified name - - \param name - String object containing the name of the Imageset to be destroyed. If no such Imageset exists, nothing happens. - - \return - Nothing. - */ - void destroyImageset(const String& name); - - /*! - \brief - Destroys the given Imageset object - - \param imageset - Pointer to the Imageset to be destroyed. If no such Imageset exists, nothing happens. - - \return - Nothing. - */ - void destroyImageset(Imageset* imageset); - - - /*! - \brief - Destroys all Imageset objects registered in the system - - \return - Nothing - */ - void destroyAllImagesets(void); - - - /*! - \brief - Returns a pointer to the Imageset object with the specified name - - \param name - String object containing the name of the Imageset to return a pointer to - - \return - Pointer to the requested Imageset object - - \exception UnknownObjectException Thrown if no Imageset named \a name is present in within the system - */ - Imageset* getImageset(const String& name) const; - - - /*! - \brief - Check for the existence of a named Imageset - - \param name - String object containing the name of the Imageset to look for - - \return - true if an Imageset named \a name is presently loaded in the system, else false. - */ - bool isImagesetPresent(const String& name) const {return d_imagesets.find(name) != d_imagesets.end();} - - - /*! - \brief - Notify the ImagesetManager of the current (usually new) display resolution. - - \param size - Size object describing the display resolution - - \return - Nothing - */ - void notifyScreenResolution(const Size& size); - - - /*! - \brief - Writes a full XML imageset for the specified Imageset to the given OutStream. - - \param imageset - String holding the name of the Imageset to be written to the stream. - - \param out_stream - OutStream (std::ostream based) object where data is to be sent. - - \return - Nothing. - */ - void writeImagesetToStream(const String& imageset, OutStream& out_stream) const; - - -private: - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::map ImagesetRegistry; - ImagesetRegistry d_imagesets; - -public: - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator ImagesetIterator; - - /*! - \brief - Return a ImagesetManager::ImagesetIterator object to iterate over the available Imageset objects. - */ - ImagesetIterator getIterator(void) const; -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIImageSetManager_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIImageset_xmlHandler.h b/vendor/cegui-0.4.0-custom/include/CEGUIImageset_xmlHandler.h deleted file mode 100644 index 8a002dc339..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIImageset_xmlHandler.h +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************************************ -filename: CEGUIImageset_xmlHandler.h -created: 21/2/2004 -author: Paul D Turner - -purpose: Defines the interface for the Imageset class -*************************************************************************/ -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIImageset_xmlHandler_h_ -#define _CEGUIImageset_xmlHandler_h_ - -#include "CEGUIImageset.h" -#include "CEGUIXMLHandler.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -Implementation Classes -*************************************************************************/ -/*! -\brief -Handler class used to parse the Imageset XML files using SAX2 -*/ -class Imageset_xmlHandler : public XMLHandler -{ -public: - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructor for Imageset::xmlHandler objects - - \param imageset - Pointer to the Imageset object creating this xmlHandler object - */ - Imageset_xmlHandler(Imageset* imageset) : d_imageset(imageset) {} - - /*! - \brief - Destructor for Imageset::xmlHandler objects - */ - virtual ~Imageset_xmlHandler(void) {} - - /************************************************************************* - SAX2 Handler overrides - *************************************************************************/ - /*! - \brief - document processing (only care about elements, schema validates format) - */ - virtual void elementStart(const String& element, const XMLAttributes& attributes); - virtual void elementEnd(const String& element); - - /************************************************************************* - Functions used by our implementation - *************************************************************************/ - Imageset* getImageset(void) const {return d_imageset;} - -private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const String ImagesetElement; //!< Tag name for Imageset elements. - static const String ImageElement; //!< Tag name for Image elements. - static const char ImagesetNameAttribute[]; //!< Attribute name that stores the name of the Imageset - static const char ImagesetImageFileAttribute[]; //!< Attribute name that stores the filename for the image file. - static const char ImagesetResourceGroupAttribute[]; //!< Attribute name that stores the resource group identifier used when loading image file. - static const char ImagesetNativeHorzResAttribute[]; //!< Optional attribute that stores 'native' horizontal resolution for the Imageset. - static const char ImagesetNativeVertResAttribute[]; //!< Optional attribute that stores 'native' vertical resolution for the Imageset. - static const char ImagesetAutoScaledAttribute[]; //!< Optional attribute that specifies whether the Imageset should be auto-scaled. - static const char ImageNameAttribute[]; //!< Attribute name that stores the name of the new Image. - static const char ImageXPosAttribute[]; //!< Attribute name that stores the x position of the new Image. - static const char ImageYPosAttribute[]; //!< Attribute name that stores the y position of the new Image. - static const char ImageWidthAttribute[]; //!< Attribute name that stores the width of the new Image. - static const char ImageHeightAttribute[]; //!< Attribute name that stores the height of the new Image. - static const char ImageXOffsetAttribute[]; //!< Attribute name that stores the x rendering offset of the new Image. - static const char ImageYOffsetAttribute[]; //!< Attribute name that stores the y rendering offset of the new Image. - - /************************************************************************* - Implementation Data - *************************************************************************/ - Imageset* d_imageset; //!< Holds a pointer to the Imageset that created the handler object -}; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIImageset_xmlHandler_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIInputEvent.h b/vendor/cegui-0.4.0-custom/include/CEGUIInputEvent.h deleted file mode 100644 index 1049e875f4..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIInputEvent.h +++ /dev/null @@ -1,321 +0,0 @@ -/************************************************************************ - filename: CEGUIInputEvent.h - created: 30/5/2004 - author: Paul D Turner - - purpose: Defines interface to input event classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIInputEvent_h_ -#define _CEGUIInputEvent_h_ - -#include "CEGUIBase.h" -#include "CEGUIEventArgs.h" -#include "CEGUIString.h" -#include "CEGUIVector.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - struct to give scope to scan code enumeration. -*/ -struct CEGUIEXPORT Key -{ - // enumeration of scan codes. Customised from table taken from Ogre, which took them from DirectInput... - enum Scan - { - Escape =0x01, - One =0x02, - Two =0x03, - Three =0x04, - Four =0x05, - Five =0x06, - Six =0x07, - Seven =0x08, - Eight =0x09, - Nine =0x0A, - Zero =0x0B, - Minus =0x0C, /* - on main keyboard */ - Equals =0x0D, - Backspace =0x0E, /* backspace */ - Tab =0x0F, - Q =0x10, - W =0x11, - E =0x12, - R =0x13, - T =0x14, - Y =0x15, - U =0x16, - I =0x17, - O =0x18, - P =0x19, - LeftBracket =0x1A, - RightBracket =0x1B, - Return =0x1C, /* Enter on main keyboard */ - LeftControl =0x1D, - A =0x1E, - S =0x1F, - D =0x20, - F =0x21, - G =0x22, - H =0x23, - J =0x24, - K =0x25, - L =0x26, - Semicolon =0x27, - Apostrophe =0x28, - Grave =0x29, /* accent grave */ - LeftShift =0x2A, - Backslash =0x2B, - Z =0x2C, - X =0x2D, - C =0x2E, - V =0x2F, - B =0x30, - N =0x31, - M =0x32, - Comma =0x33, - Period =0x34, /* . on main keyboard */ - Slash =0x35, /* '/' on main keyboard */ - RightShift =0x36, - Multiply =0x37, /* * on numeric keypad */ - LeftAlt =0x38, /* left Alt */ - Space =0x39, - Capital =0x3A, - F1 =0x3B, - F2 =0x3C, - F3 =0x3D, - F4 =0x3E, - F5 =0x3F, - F6 =0x40, - F7 =0x41, - F8 =0x42, - F9 =0x43, - F10 =0x44, - NumLock =0x45, - ScrollLock =0x46, /* Scroll Lock */ - Numpad7 =0x47, - Numpad8 =0x48, - Numpad9 =0x49, - Subtract =0x4A, /* - on numeric keypad */ - Numpad4 =0x4B, - Numpad5 =0x4C, - Numpad6 =0x4D, - Add =0x4E, /* + on numeric keypad */ - Numpad1 =0x4F, - Numpad2 =0x50, - Numpad3 =0x51, - Numpad0 =0x52, - Decimal =0x53, /* . on numeric keypad */ - OEM_102 =0x56, /* < > | on UK/Germany keyboards */ - F11 =0x57, - F12 =0x58, - F13 =0x64, /* (NEC PC98) */ - F14 =0x65, /* (NEC PC98) */ - F15 =0x66, /* (NEC PC98) */ - Kana =0x70, /* (Japanese keyboard) */ - ABNT_C1 =0x73, /* / ? on Portugese (Brazilian) keyboards */ - Convert =0x79, /* (Japanese keyboard) */ - NoConvert =0x7B, /* (Japanese keyboard) */ - Yen =0x7D, /* (Japanese keyboard) */ - ABNT_C2 =0x7E, /* Numpad . on Portugese (Brazilian) keyboards */ - NumpadEquals =0x8D, /* = on numeric keypad (NEC PC98) */ - PrevTrack =0x90, /* Previous Track (KC_CIRCUMFLEX on Japanese keyboard) */ - At =0x91, /* (NEC PC98) */ - Colon =0x92, /* (NEC PC98) */ - Underline =0x93, /* (NEC PC98) */ - Kanji =0x94, /* (Japanese keyboard) */ - Stop =0x95, /* (NEC PC98) */ - AX =0x96, /* (Japan AX) */ - Unlabeled =0x97, /* (J3100) */ - NextTrack =0x99, /* Next Track */ - NumpadEnter =0x9C, /* Enter on numeric keypad */ - RightControl =0x9D, - Mute =0xA0, /* Mute */ - Calculator =0xA1, /* Calculator */ - PlayPause =0xA2, /* Play / Pause */ - MediaStop =0xA4, /* Media Stop */ - VolumeDown =0xAE, /* Volume - */ - VolumeUp =0xB0, /* Volume + */ - WebHome =0xB2, /* Web home */ - NumpadComma =0xB3, /* , on numeric keypad (NEC PC98) */ - Divide =0xB5, /* / on numeric keypad */ - SysRq =0xB7, - RightAlt =0xB8, /* right Alt */ - Pause =0xC5, /* Pause */ - Home =0xC7, /* Home on arrow keypad */ - ArrowUp =0xC8, /* UpArrow on arrow keypad */ - PageUp =0xC9, /* PgUp on arrow keypad */ - ArrowLeft =0xCB, /* LeftArrow on arrow keypad */ - ArrowRight =0xCD, /* RightArrow on arrow keypad */ - End =0xCF, /* End on arrow keypad */ - ArrowDown =0xD0, /* DownArrow on arrow keypad */ - PageDown =0xD1, /* PgDn on arrow keypad */ - Insert =0xD2, /* Insert on arrow keypad */ - Delete =0xD3, /* Delete on arrow keypad */ - LeftWindows =0xDB, /* Left Windows key */ - RightWindow =0xDC, /* Right Windows key */ - RightWindows =0xDC, /* Right Windows key - Correct spelling :) */ - AppMenu =0xDD, /* AppMenu key */ - Power =0xDE, /* System Power */ - Sleep =0xDF, /* System Sleep */ - Wake =0xE3, /* System Wake */ - WebSearch =0xE5, /* Web Search */ - WebFavorites =0xE6, /* Web Favorites */ - WebRefresh =0xE7, /* Web Refresh */ - WebStop =0xE8, /* Web Stop */ - WebForward =0xE9, /* Web Forward */ - WebBack =0xEA, /* Web Back */ - MyComputer =0xEB, /* My Computer */ - Mail =0xEC, /* Mail */ - MediaSelect =0xED /* Media Select */ - }; - -}; - - -/*! -/brief - Enumeration of mouse buttons -*/ -enum MouseButton -{ - LeftButton, - RightButton, - MiddleButton, - X1Button, - X2Button, - MouseButtonCount, // -class ConstBaseIterator -{ -public: -#if defined(_MSC_VER) && (_MSC_VER <= 1200) && !defined(_STLPORT_VERSION) - typedef typename T::referent_type mapped_type; -#else - typedef typename T::mapped_type mapped_type; -#endif - - /*! - \brief - ConstBaseIterator constructor - - \param start_iter - 'real' iterator that will be the start of the range to be iterated over by this iterator. - - \param end_iter - 'real' iterator that will be the end of the range to be iterated over by this iterator. - */ - ConstBaseIterator(typename T::const_iterator start_iter, typename T::const_iterator end_iter) : - d_currIter(start_iter), - d_startIter(start_iter), - d_endIter(end_iter) - { - } - - - /*! - \brief - ConstBaseIterator destructor - */ - ~ConstBaseIterator(void) - { - } - - - /*! - \brief - ConstBaseIterator copy constructor - */ - ConstBaseIterator(const ConstBaseIterator& org) : - d_currIter(org.d_currIter), - d_startIter(org.d_startIter), - d_endIter(org.d_endIter) - { - } - - - /*! - \brief - ConstBaseIterator assignment operator - */ - ConstBaseIterator& operator=(const ConstBaseIterator& rhs) - { - d_currIter = rhs.d_currIter; - d_startIter = rhs.d_startIter; - d_endIter = rhs.d_endIter; - - return *this; - } - - - /*! - \brief - Return the key for the item at the current iterator position. - */ - typename T::key_type getCurrentKey(void) const - { - return d_currIter->first; - } - - - /*! - \brief - Return the value for the item at the current iterator position. - */ - mapped_type getCurrentValue(void) const - { - return d_currIter->second; - } - - - /*! - \brief - Return whether the current iterator position is at the end of the iterators range. - */ - bool isAtEnd(void) const - { - return d_currIter == d_endIter; - } - - - /*! - \brief - Return whether the current iterator position is at the start of the iterators range. - */ - bool isAtStart(void) const - { - return d_currIter == d_startIter; - } - - - /*! - \brief - Increase the iterator position (prefix increment). - - \note - The iterator is checked, and this call will always succeed, so do not rely on some exception to exit a loop. - */ - ConstBaseIterator& operator++() - { - if (d_currIter != d_endIter) - ++d_currIter; - - return *this; - } - - - /*! - \brief - Increase the iterator position (postfix increment). - - \note - The iterator is checked, and this call will always succeed, so do not rely on some exception to exit a loop. - */ - ConstBaseIterator operator++(int) - { - ConstBaseIterator tmp = *this; - ++*this; - - return tmp; - } - - - /*! - \brief - Decrease the iterator position (prefix decrement). - - \note - The iterator is checked, and this call will always succeed, so do not rely on some exception to exit a loop. - */ - ConstBaseIterator& operator--() - { - if (d_currIter != d_startIter) - --d_currIter; - - return *this; - } - - - /*! - \brief - Decrease the iterator position (postfix decrement). - - \note - The iterator is checked, and this call will always succeed, so do not rely on some exception to exit a loop. - */ - ConstBaseIterator operator--(int) - { - ConstBaseIterator tmp = *this; - --*this; - - return tmp; - } - - - /*! - \brief - Compares two iterators. Return true if the current position of both iterators are equivalent. - */ - bool operator==(const ConstBaseIterator& rhs) const - { - return d_currIter == rhs.d_currIter; - } - - - /*! - \brief - Compares two iterators. Return true if the current position of the iterators are different. - */ - bool operator!=(const ConstBaseIterator& rhs) const - { - return !this == rhs; - } - - - /*! - \brief - Return the value for the current iterator position. - */ - mapped_type operator*() const - { - return d_currIter->second; - } - - - /*! - \brief - Set the iterator current position to the start position. - */ - void toStart(void) - { - d_currIter = d_startIter; - } - - - /*! - \brief - Set the iterator current position to the end position. - */ - void toEnd(void) - { - d_currIter = d_endIter; - } - - -private: - /************************************************************************* - No default construction available - *************************************************************************/ - ConstBaseIterator(void) {} - - /************************************************************************* - Implementation Data - *************************************************************************/ - typename T::const_iterator d_currIter; //!< 'real' iterator describing the current position within the collection. - typename T::const_iterator d_startIter; //!< 'real' iterator describing the start position within the collection (or what we were told was the start). - typename T::const_iterator d_endIter; //!< 'real' iterator describing the end position within the collection (or what we were told was the end). -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIIteratorBase_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUILogger.h b/vendor/cegui-0.4.0-custom/include/CEGUILogger.h deleted file mode 100644 index 51c20aafaa..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUILogger.h +++ /dev/null @@ -1,195 +0,0 @@ -/************************************************************************ - filename: CEGUILogger.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines interface for the Logger class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUILogger_h_ -#define _CEGUILogger_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include -#include -#include -#include -#include "CEGUISingleton.h" -template class CDuplicateLineFilter; - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Enumeration of logging levels -*/ -enum LoggingLevel -{ - Errors, //!< Only actual error conditions will be logged. - Standard, //!< Basic events will be logged (default level). - Informative, //!< Useful tracing (object creations etc) information will be logged. - Insane //!< Mostly everything gets logged (use for heavy tracing only, log WILL be big). -}; - -struct SLoggingLine -{ - String message; - LoggingLevel level; - void operator+=(const char* szAppend) { message += szAppend; } - bool operator==(const SLoggingLine& other) const - { - return message == other.message && level == other.level; - } -}; - -/*! -\brief - Class that implements logging for the GUI system -*/ -class CEGUIEXPORT Logger : public Singleton -{ -public: - /*! - \brief - Constructor for Logger object. - */ - Logger(void); - - /*! - \brief Destructor for Logger object. - */ - ~Logger(void); - - - /*! - \brief - Return the singleton Logger object - - \return - Reference to the one and only Logger object - */ - static Logger& getSingleton(void); - - - /*! - \brief - Set the level of logging information that will get out to the log file - - \param level - One of the LoggingLevel enumerated values that specified the level of logging information required. - - \return - Nothing - */ - void setLoggingLevel(LoggingLevel level) {d_level = level;} - - - /*! - \brief - return the current logging level setting - - \return - One of the LoggingLevel enumerated values specifying the current level of logging - */ - LoggingLevel getLoggingLevel(void) const {return d_level;} - - - /*! - \brief - Add an event to the log. - - \param message - String object containing the message to be added to the event log. - - \param level - LoggingLevel for this message. If \a level is greater than the current set logging level, the message is not logged. - - \return - Nothing - */ - void logEvent(const String& message, LoggingLevel level = Standard); - - /*! - \brief - Set the name of the log file where all subsequent log entries should be written. - - \note - When this is called, and the log file is created, any cached log entries are - flushed to the log file. - - \param filename - Name of the file to put log messages. - - \param append - - true if events should be added to the end of the current file. - - false if the current contents of the file should be discarded. - */ - void setLogFilename(const String& filename, bool append = false); - -protected: - /************************************************************************* - Implementation Data - *************************************************************************/ - LoggingLevel d_level; //!< Holds current logging level - std::ofstream d_ostream; //!< Stream used to implement the logger - std::vector > d_cache; //!< Used to cache log entries before log file is created. - std::ostringstream d_workstream;//!< Used to build log entry strings. - bool d_caching; //!< true while log entries are beign cached (prior to logfile creation) - CDuplicateLineFilter* d_pDuplicateLineFilter; - -private: - /************************************************************************* - Copy constructor and assignment usage is denied. - *************************************************************************/ - Logger(const Logger& logger) {} - Logger& operator=(const Logger& logger) {return *this;} - - // Duplicate line handling - void updateLogOutput(); - void logEventInternal(const String& message, LoggingLevel level); -}; - -/************************************************************************* - This macro is used for 'Insane' level logging so that those items are - excluded from non-debug builds -*************************************************************************/ -#if defined(DEBUG) || defined (_DEBUG) -# define CEGUI_LOGINSANE( message ) CEGUI::Logger::getSingleton().logEvent((message), CEGUI::Insane); -#else -# define CEGUI_LOGINSANE( message ) -#endif - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUILogger_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIMouseCursor.h b/vendor/cegui-0.4.0-custom/include/CEGUIMouseCursor.h deleted file mode 100644 index 27682e2efd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIMouseCursor.h +++ /dev/null @@ -1,342 +0,0 @@ -/************************************************************************ - filename: CEGUIMouseCursor.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines interface for the MouseCursor class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMouseCursor_h_ -#define _CEGUIMouseCursor_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUIVector.h" -#include "CEGUIRect.h" -#include "CEGUIEventSet.h" -#include "CEGUIInputEvent.h" -#include "CEGUIUDim.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Enumeration of special values used for mouse cursor settings in Window objects. -*/ -enum MouseCursorImage -{ - BlankMouseCursor = 0, //!< No image should be displayed for the mouse cursor. - DefaultMouseCursor = -1 //!< The default mouse cursor image should be displayed. -}; - - -/*! -\brief - Class that allows access to the GUI system mouse cursor. - - The MouseCursor provides functionality to access the position and imagery of the mouse cursor / pointer -*/ -class CEGUIEXPORT MouseCursor : public EventSet, public Singleton -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by MouseCursor - static const String EventImageChanged; //!< The cursor image of the widget has changed. - - - /*! - \brief - Constructor for MouseCursor objects - */ - MouseCursor(void); - - - /*! - \brief - Destructor for MouseCursor objects - */ - ~MouseCursor(void); - - - /*! - \brief - Return singleton MouseCursor object - - \return - Singleton MouseCursor object - */ - static MouseCursor& getSingleton(void); - - - /*! - \brief - Return pointer to singleton MouseCursor object - - \return - Pointer to singleton MouseCursor object - */ - static MouseCursor* getSingletonPtr(void); - - - /*! - \brief - Set the current mouse cursor image - - \param imageset - String object holding the name of the Imageset that contains the desired Image. - - \param image_name - String object holding the name of the desired Image on Imageset \a imageset. - - \return - Nothing. - - \exception UnknownObjectException thrown if \a imageset is not known, or if \a imageset contains no Image named \a image_name. - */ - void setImage(const String& imageset, const String& image_name); - - - /*! - \brief - Set the current mouse cursor image - */ - void setImage(const Image* image); - - - /*! - \brief - Get the current mouse cursor image - \return - The current image used to draw mouse cursor. - */ - const Image* getImage(void) const {return d_cursorImage;} - - - /*! - \brief - Makes the cursor draw itself - - \return - Nothing - */ - void draw(void) const; - - - /*! - \brief - Set the current mouse cursor position - - \param position - Point object describing the new location for the mouse. This will be clipped to within the renderer screen area. - */ - void setPosition(const Point& position); - - - /*! - \brief - Offset the mouse cursor position by the deltas specified in \a offset. - - \param offset - Point object which describes the amount to move the cursor in each axis. - - \return - Nothing. - */ - void offsetPosition(const Point& offset); - - - /*! - \brief - Set the mouse cursor's alpha - - \param alpha - The cursor's alpha - - \return - Nothing. - */ - void setAlpha(float alpha); - - /*! - \brief - Set the area that the mouse cursor is constrained to. - - \param area - Pointer to a Rect object that describes the area of the display that the mouse is allowed to occupy. The given area will be clipped to - the current Renderer screen area - it is never possible for the mouse to leave this area. If this parameter is NULL, the - constraint is set to the size of the current Renderer screen area. - - \return - Nothing. - */ - void setConstraintArea(const Rect* area); - - - /*! - \brief - Set the area that the mouse cursor is constrained to. - - \param area - Pointer to a URect object that describes the area of the display that the mouse is allowed to occupy. The given area will be clipped to - the current Renderer screen area - it is never possible for the mouse to leave this area. If this parameter is NULL, the - constraint is set to the size of the current Renderer screen area. - - \return - Nothing. - */ - void setUnifiedConstraintArea(const URect* area); - - - /*! - \brief - Hides the mouse cursor. - - \return - Nothing. - */ - void hide(void) {d_visible = false;} - - - /*! - \brief - Shows the mouse cursor. - - \return - Nothing. - */ - void show(void) {d_visible = true;} - - - /*! - \brief - return whether the mouse cursor is visible. - - \return - true if the mouse cursor is visible, false if the mouse cursor is hidden. - */ - bool isVisible(void) const {return d_visible;} - - - /*! - \brief - Return the current mouse cursor position as a pixel offset from the top-left corner of the display. - - \return - Point object describing the mouse cursor position in screen pixels. - */ - Point getPosition(void) const {return Point(d_position.d_x, d_position.d_y);} - - - /*! - \brief - return the current constraint area of the mouse cursor. - - \return - Rect object describing the active area that the mouse cursor is constrained to. - */ - Rect getConstraintArea(void) const; - - - /*! - \brief - return the current constraint area of the mouse cursor. - - \return - URect object describing the active area that the mouse cursor is constrained to. - */ - const URect& getUnifiedConstraintArea(void) const; - - - /*! - \brief - Return the current mouse cursor position as display resolution independant values. - - \return - Point object describing the current mouse cursor position as resolution independant values that - range from 0.0f to 1.0f, where 0.0f represents the left-most and top-most positions, and 1.0f - represents the right-most and bottom-most positions. - */ - Point getDisplayIndependantPosition(void) const; - - -protected: - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - event triggered internally when image of mouse cursor changes - */ - virtual void onImageChanged(MouseCursorEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add mouse cursor specific events - */ - void addMouseCursorEvents(void); - - -private: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Checks the mouse cursor position is within the current 'constrain' Rect and adjusts as required. - */ - void constrainPosition(void); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - const Image* d_cursorImage; //!< Image that is currently set as the mouse cursor. - Vector3 d_position; //!< Current location of the cursor - bool d_visible; //!< true if the cursor will be drawn, else false. - URect d_constraints; //!< Specifies the area (in screen pixels) that the mouse can move around in. - ColourRect d_colourRect; //!< the cursor's colour rect -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIMouseCursor_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIProperty.h b/vendor/cegui-0.4.0-custom/include/CEGUIProperty.h deleted file mode 100644 index 85691ce2a6..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIProperty.h +++ /dev/null @@ -1,190 +0,0 @@ -/************************************************************************ - filename: CEGUIProperty.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines the Property class which forms part of a - PropertySet -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIProperty_h_ -#define _CEGUIProperty_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Dummy base class to ensure correct casting of receivers. -*/ -class CEGUIEXPORT PropertyReceiver -{ -public: - PropertyReceiver() {} - virtual ~PropertyReceiver() {} -}; - - -/*! -\brief - An abstract class that defines the interface to access object properties by name. - - Property objects allow (via a PropertySet) access to certain properties of objects - by using simple get/set functions and the name of the property to be accessed. -*/ -class CEGUIEXPORT Property -{ -public: - /*! - \brief - Creates a new Property object. - - \param name - String containing the name of the new Property. - - \param help - String containing a description of the Property and it's usage. - - \param defaultValue - String holding the textual representation of the default value for this Property - - \param writesXML - Specifies whether the writeXMLToStream method should do anything for this Property. This - enables selectivity in what properties within a PropertySet will get output as XML. - */ - Property(const String& name, const String& help, const String& defaultValue = "", bool writesXML = true) : - d_name(name), - d_help(help), - d_default(defaultValue), - d_writeXML(writesXML) - { - } - - - /*! - \brief - Destructor for Property objects - */ - virtual ~Property(void) {} - - - /*! - \brief - Return a String that describes the purpose and usage of this Property. - - \return - String that contains the help text - */ - const String& getHelp(void) const {return d_help;} - - - /*! - \brief - Return a the name of this Property - - \return - String containing the name of the Property - */ - const String& getName(void) const {return d_name;} - - - /*! - \brief - Return the current value of the Property as a String - - \param receiver - Pointer to the target object. - - \return - String object containing a textual representation of the current value of the Property - */ - virtual String get(const PropertyReceiver* receiver) const = 0; - - - /*! - \brief - Sets the value of the property - - \param receiver - Pointer to the target object. - - \param value - A String object that contains a textual representation of the new value to assign to the Property. - - \return - Nothing. - - \exception InvalidRequestException Thrown when the Property was unable to interpret the content of \a value. - */ - virtual void set(PropertyReceiver* receiver, const String& value) = 0; - - - /*! - \brief - Returns whether the property is at it's default value. - - \param receiver - Pointer to the target object. - - \return - - true if the property has it's default value. - - false if the property has been modified from it's default value. - */ - virtual bool isDefault(const PropertyReceiver* receiver) const; - - - /*! - \brief - Returns the default value of the Property as a String. - - \param receiver - Pointer to the target object. - - \return - String object containing a textual representation of the default value for this property. - */ - virtual String getDefault(const PropertyReceiver* receiver) const; - - - /*! - \brief - Writes out an XML representation of this class to the given stream. - - \note - This would normally have been implemented via XMLGenerator base class, but in this - case we require the target PropertyReceiver in order to obtain the property value. - */ - void writeXMLToStream(const PropertyReceiver* receiver, OutStream& out_stream) const; - -protected: - String d_name; //!< String that stores the Property name. - String d_help; //!< String that stores the Property help text. - String d_default; //!< String that stores the Property default value string. - bool d_writeXML; //!< Specifies whether writeXMLToStream should do anything for this property. -}; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIProperty_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIPropertyHelper.h b/vendor/cegui-0.4.0-custom/include/CEGUIPropertyHelper.h deleted file mode 100644 index e58f8334c6..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIPropertyHelper.h +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************ - filename: CEGUIPropertyHelper.h - created: 6/7/2004 - author: Paul D Turner - - purpose: Interface to the PropertyHelper class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIPropertyHelper_h_ -#define _CEGUIPropertyHelper_h_ - -#include "CEGUIWindow.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Helper class used to convert various data types to and from the format expected in Propery strings -*/ -class CEGUIEXPORT PropertyHelper -{ -public: - static float stringToFloat(const String& str); - static uint stringToUint(const String& str); - static int stringToInt(const String& str); - static bool stringToBool(const String& str); - static Size stringToSize(const String& str); - static Point stringToPoint(const String& str); - static Rect stringToRect(const String& str); - static MetricsMode stringToMetricsMode(const String& str); - static const Image* stringToImage(const String& str); - static colour stringToColour(const String& str); - static ColourRect stringToColourRect(const String& str); - static UDim stringToUDim(const String& str); - static UVector2 stringToUVector2(const String& str); - static URect stringToURect(const String& str); - - static String floatToString(float val); - static String uintToString(uint val); - static String intToString(int val); - static String boolToString(bool val); - static String sizeToString(const Size& val); - static String pointToString(const Point& val); - static String rectToString(const Rect& val); - static String metricsModeToString(MetricsMode val); - static String imageToString(const Image* const val); - static String colourToString(const colour& val); - static String colourRectToString(const ColourRect& val); - static String udimToString(const UDim& val); - static String uvector2ToString(const UVector2& val); - static String urectToString(const URect& val); -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIPropertyHelper_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIPropertySet.h b/vendor/cegui-0.4.0-custom/include/CEGUIPropertySet.h deleted file mode 100644 index 4f39196cba..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIPropertySet.h +++ /dev/null @@ -1,222 +0,0 @@ -/************************************************************************ - filename: CEGUIPropertySet.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines interface for the PropertySet class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIPropertySet_h_ -#define _CEGUIPropertySet_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIIteratorBase.h" -#include "CEGUIProperty.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class that contains a collection of Property objects. -*/ -class CEGUIEXPORT PropertySet : public PropertyReceiver -{ -public: - /*! - \brief - Constructs a new PropertySet object - */ - PropertySet(void) : d_addedUncommonProperties(false) {} - - - /*! - \brief - Destructor for PropertySet objects. - */ - virtual ~PropertySet(void) {} - - - /*! - \brief - Adds a new Property to the PropertySet - - \param property - Pointer to the Property object to be added to the PropertySet. - - \return - Nothing. - - \exception NullObjectException Thrown if \a property is NULL. - \exception AlreadyExistsException Thrown if a Property with the same name as \a property already exists in the PropertySet - */ - void addProperty(Property* property); - - - /*! - \brief - Removes a Property from the PropertySet. - - \param name - String containing the name of the Property to be removed. If Property \a name is not in the set, nothing happens. - - \return - Nothing. - */ - void removeProperty(const String& name); - - - /*! - \brief - Removes all Property objects from the PropertySet. - - \return - Nothing. - */ - void clearProperties(void); - - - /*! - \brief - Checks to see if a Property with the given name is in the PropertySet - - \param name - String containing the name of the Property to check for. - - \return - true if a Property named \a name is in the PropertySet. false if no Property named \a name is in the PropertySet. - */ - bool isPropertyPresent(const String& name) const; - - - /*! - \brief - Return the help text for the specified Property. - - \param name - String holding the name of the Property who's help text is to be returned. - - \return - String object containing the help text for the Property \a name. - - \exception UnknownObjectException Thrown if no Property named \a name is in the PropertySet. - */ - const String& getPropertyHelp(const String& name) const; - - - /*! - \brief - Gets the current value of the specified Property. - - \param name - String containing the name of the Property who's value is to be returned. - - \return - String object containing a textual representation of the requested Property. - - \exception UnknownObjectException Thrown if no Property named \a name is in the PropertySet. - */ - String getProperty(const String& name) const; - - - /*! - \brief - Sets the current value of a Property. - - \param name - String containing the name of the Property who's value is to be set. - - \param value - String containing a textual representation of the new value for the Property - - \return - Nothing - - \exception UnknownObjectException Thrown if no Property named \a name is in the PropertySet. - \exception InvalidRequestException Thrown when the Property was unable to interpret the content of \a value. - */ - void setProperty(const String& name, const String& value); - - - /*! - \brief - Returns whether a Property is at it's default value. - - \param name - String containing the name of the Property who's default state is to be tested. - - \return - - true if the property has it's default value. - - false if the property has been modified from it's default value. - */ - bool isPropertyDefault(const String& name) const; - - - /*! - \brief - Returns the default value of a Property as a String. - - \param name - String containing the name of the Property who's default string is to be returned. - - \return - String object containing a textual representation of the default value for this property. - */ - String getPropertyDefault(const String& name) const; - -private: - typedef std::map PropertyRegistry; - PropertyRegistry d_properties; - - bool d_addedUncommonProperties; - void maybeAddUncommonProperties( const String& name ) const; - void maybeAddUncommonProperties( const String& name ); -public: - virtual void addUncommonProperties( void ) {} - virtual const String& getType(void) const = 0; - - - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator PropertyIterator; - - /*! - \brief - Return a PropertySet::PropertyIterator object to iterate over the available Properties. - */ - PropertyIterator getIterator(void) const; -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIPropertySet_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRect.h b/vendor/cegui-0.4.0-custom/include/CEGUIRect.h deleted file mode 100644 index 24b9305efd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRect.h +++ /dev/null @@ -1,213 +0,0 @@ -/************************************************************************ - filename: CEGUIRect.h - created: 8/3/2004 - author: Paul D Turner - - purpose: Defines 'Rect' class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRect_h_ -#define _CEGUIRect_h_ - -#include "CEGUIBase.h" -#include "CEGUIVector.h" -#include "CEGUISize.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class encapsulating operations on a Rectangle -*/ -class CEGUIEXPORT Rect -{ -public: - Rect(void) {} - - - /*! - \brief - Constructor for a Rect. - */ - Rect(float left, float top, float right, float bottom); - - Rect(Point pos, Size sz); - - - /*! - \brief - Return top-left postion of Rect as a Point - */ - Point getPosition(void) const {return Point(d_left, d_top);} - - /*! - \brief - return width of Rect area - */ - float getWidth(void) const {return d_right - d_left;} - - - /*! - \brief - return height of Rect area - */ - float getHeight(void) const {return d_bottom - d_top;} - - - /*! - \brief - return the size of the Rect area - */ - Size getSize(void) const {return Size(getWidth(), getHeight());} - - - /*! - \brief - set the position of the Rect (leaves size in tact) - */ - void setPosition(const Point& pt); - - - /*! - \brief - set the width of the Rect object - */ - void setWidth(float width) {d_right = d_left + width;} - - /*! - \brief - set the height of the Rect object - */ - void setHeight(float height) {d_bottom = d_top + height;} - - - /*! - \brief - set the size of the Rect area - */ - void setSize(const Size& sze) {setWidth(sze.d_width); setHeight(sze.d_height);} - - - /*! - \brief - return a Rect that is the intersection of 'this' Rect with the Rect 'rect' - - \note - It can be assumed that if d_left == d_right, or d_top == d_bottom, or getWidth() == 0, or getHeight() == 0, then - 'this' rect was totally outside 'rect'. - */ - Rect getIntersection(const Rect& rect) const; - - - /*! - \brief - Applies an offset the Rect object - - \param pt - Point object containing the offsets to be applied to the Rect. - - \return - this Rect after the offset is performed - */ - Rect& offset(const Point& pt); - - - /*! - \brief - Return true if the given Point falls within this Rect - - \param pt - Point object describing the position to test. - - \return - true if position \a pt is within this Rect's area, else false - */ - bool isPointInRect(const Point& pt) const; - - - /*! - \brief - check the size of the Rect object and if it is bigger than \a sz, resize it so it isn't. - - \param sz - Size object that describes the maximum dimensions that this Rect should be limited to. - - \return - 'this' Rect object after the constrain operation - */ - Rect& constrainSizeMax(const Size& sz); - - - /*! - \brief - check the size of the Rect object and if it is smaller than \a sz, resize it so it isn't. - - \param sz - Size object that describes the minimum dimensions that this Rect should be limited to. - - \return - 'this' Rect object after the constrain operation - */ - Rect& constrainSizeMin(const Size& sz); - - - /*! - \brief - check the size of the Rect object and if it is bigger than \a max_sz or smaller than \a min_sz, resize it so it isn't. - - \param max_sz - Size object that describes the maximum dimensions that this Rect should be limited to. - - \param min_sz - Size object that describes the minimum dimensions that this Rect should be limited to. - - \return - 'this' Rect object after the constrain operation - */ - Rect& constrainSize(const Size& max_sz, const Size& min_sz); - - - /************************************************************************* - Operators - *************************************************************************/ - bool operator==(const Rect& rhs) const - { - return ((d_left == rhs.d_left) && (d_right == rhs.d_right) && (d_top == rhs.d_top) && (d_bottom == rhs.d_bottom)); - } - - bool operator!=(const Rect& rhs) const {return !operator==(rhs);} - - Rect& operator=(const Rect& rhs); - - Rect operator*(float scalar) const { return Rect(d_left * scalar, d_top * scalar, d_right * scalar, d_bottom * scalar); } - const Rect& operator*=(float scalar) { d_left *= scalar; d_top *= scalar; d_right *= scalar; d_bottom *= scalar; return *this; } - - - /************************************************************************* - Data Fields - *************************************************************************/ - float d_top, d_bottom, d_left, d_right; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIRect_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRefPtr.h b/vendor/cegui-0.4.0-custom/include/CEGUIRefPtr.h deleted file mode 100644 index 885898b185..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRefPtr.h +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************************************ - filename: CEGUIRefPtr.h - created: 15/10/2004 - author: Gerald Lindsly -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRefPtr_h_ -#define _CEGUIRefPtr_h_ - -#include "CEGUIBase.h" - -namespace CEGUI { - -class CEGUIEXPORT Referenced -{ -public: - Referenced() : d_refCount(0) {} - Referenced(const Referenced&) : d_refCount(0) {} - - Referenced& operator=(Referenced&) { return *this; } - - /* Increment the reference count by one, indicating that - a pointer to this object is referencing it. */ - void addRef() const { ++d_refCount; } - - /* Decrement the reference count by one, indicating that - a pointer to this object is no longer referencing it. - if the count drops to zero, this is deleted. */ - void release() const { if (!--d_refCount) delete this; } - - /* Decrement the reference count by one, indicating that - a pointer to this object is no longer referencing it; - however, do not delete it, even if ref count goes to 0. */ - void releaseButKeep() const { --d_refCount; } - - /** return the number pointers currently referencing this object. */ - int refCount() const { return d_refCount; } - -protected: - virtual ~Referenced(); - mutable int d_refCount; -}; - - -template class RefPtr -{ - T* d_p; - -public: -// RefPtr() : d_p(0) {} - - RefPtr() : d_p(new T()) { d_p->addRef(); } - - RefPtr(T* t) : d_p(t) { if (t) d_p->addRef(); } - RefPtr(const RefPtr& r) : d_p(r.d_p) - { if (r.d_p) d_p->addRef(); } - ~RefPtr() - { if (d_p) { - d_p->release(); - d_p = 0; - } - } - - RefPtr& operator=(T* q) - { - if (d_p != q) { - T* t = d_p; - d_p = q; - if (q) q->addRef(); - if (t) t->release(); - } - return *this; - } - - RefPtr& operator=(const RefPtr& r) { return *this = r.d_p; } - - bool operator==(const RefPtr& r) const { return d_p == r.d_p; } - bool operator!=(const RefPtr& r) const { return d_p != r.d_p; } - bool operator< (const RefPtr& r) const { return d_p < r.d_p; } - bool operator> (const RefPtr& r) const { return d_p > r.d_p; } - - bool operator ==(const T* q) const { return d_p == q; } - bool operator !=(const T* q) const { return d_p != q; } - bool operator < (const T* q) const { return d_p < q; } - bool operator > (const T* q) const { return d_p > q; } - - - T& operator*() { return *d_p; } - const T& operator*() const { return *d_p; } - - T* operator->() { return d_p; } - const T* operator->() const { return d_p; } - - T* get() { return d_p; } - const T* get() const { return d_p; } - - bool operator!() const { return d_p == 0; } - bool valid() const { return d_p != 0; } - - T* release() - { - T* t = d_p; - if (d_p) { - d_p->releaseButKeep(); - d_p = 0; - } - return t; - } -}; - -} // end namespace CEGUI - -#endif diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRenderCache.h b/vendor/cegui-0.4.0-custom/include/CEGUIRenderCache.h deleted file mode 100644 index bd05ac8059..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRenderCache.h +++ /dev/null @@ -1,208 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderCache.h - created: Fri Jun 17 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRenderCache_h_ -#define _CEGUIRenderCache_h_ - -#include "CEGUIVector.h" -#include "CEGUIRect.h" -#include "CEGUIImage.h" -#include "CEGUIFont.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that acts as a cache for images that need to be rendered. - - This is in many ways an optimisation cache, it allows a full image redraw - to occur while limiting the amount of information that needs to be re-calculated. - \par - Basically, unless the actual images (or their size) change, or the colours (or alpha) change - then imagery cached in here will suffice for a full redraw. The reasoning behind this is that - when some window underneath window 'X' changes, a full image redraw is required by the - renderer, however, since window 'X' is unchanged, performing a total recalculation of all - imagery is very wasteful, and so we use this cache to limit such waste. - \par - As another example, when a window is simply moved, there is no need to perform a total imagery - recalculation; we can still use the imagery cached here since it is position independant. - */ - class CEGUIEXPORT RenderCache - { - public: - /*! - \brief - Constructor - */ - RenderCache(); - - /*! - \brief - Destructor - */ - ~RenderCache(); - - /*! - \brief - Return whether the cache contains anything to draw. - - \return - - true if the cache contains information about images to be drawn. - - false if the cache is empty. - */ - bool hasCachedImagery() const; - - /*! - \brief - Send the contents of the cache to the Renderer. - - \param basePos - Point that describes a screen offset that cached imagery will be rendered relative to. - - \param baseZ - Z value that cached imagery will use as a base figure when calculating final z values. - - \param clipper - Rect object describing a rect to which imagery will be clipped. - - \return - Nothing - */ - void render(const Point& basePos, float baseZ, const Rect& clipper) const; - - /*! - \brief - Erase any stored image information. - */ - void clearCachedImagery(); - - /*! - \brief - Add an image to the cache. - - \param image - Image object to be cached. - - \param destArea - Destination area over which the Image object will be rendered. This area should be position - independant; so position (0,0) will be to top-left corner of whatever it is you're rendering - (like a Window for example). - - \param zOffset - Zero based z offset for this image. Allows imagery to be layered. - - \param cols - ColourRect object describing the colours to be applied when rendering this image. - - \return - Nothing - */ - void cacheImage(const Image& image, const Rect& destArea, float zOffset, const ColourRect& cols, const Rect* clipper = 0, bool clipToDisplay = false); - - /*! - \brief - Add a text to the cache. - - \param text - String object to be cached. - - \param font - Font to be used when rendering. - - \param format - TextFormatting value specifying the formatting to use when rendering. - - \param destArea - Destination area over which the Image object will be rendered. This area should be position - independant; so position (0,0) will be to top-left corner of whatever it is you're rendering - (like a Window for example). - - \param zOffset - Zero based z offset for this image. Allows imagery to be layered. - - \param cols - ColourRect object describing the colours to be applied when rendering this image. - - \return - Nothing - */ - void cacheText(const String& text, const Font* font, TextFormatting format, const Rect& destArea, float zOffset, const ColourRect& cols, const Rect* clipper = 0, bool clipToDisplay = false); - - private: - /*! - \brief - internal struct that holds info about a single image to be drawn. - */ - struct ImageInfo - { - const Image* source_image; - Rect target_area; - float z_offset; - ColourRect colours; - Rect customClipper; - bool usingCustomClipper; - bool clipToDisplay; - }; - - /*! - \brief - internal struct that holds info about text to be drawn. - */ - struct TextInfo - { - String text; - const Font* source_font; - TextFormatting formatting; - Rect target_area; - float z_offset; - ColourRect colours; - Rect customClipper; - bool usingCustomClipper; - bool clipToDisplay; - }; - - typedef std::vector ImageryList; - typedef std::vector TextList; - - ImageryList d_cachedImages; //!< Collection of ImageInfo structs. - TextList d_cachedTexts; //!< Collection of TextInfo structs. - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - - -#endif // end of guard _CEGUIRenderCache_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRenderableElement.h b/vendor/cegui-0.4.0-custom/include/CEGUIRenderableElement.h deleted file mode 100644 index e23ee72fb2..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRenderableElement.h +++ /dev/null @@ -1,311 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderableElement.h - created: 14/4/2004 - author: Paul D Turner - - purpose: Interface for base class of a 'higher-level' renderable - UI entity. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRenderableElement_h_ -#define _CEGUIRenderableElement_h_ - -#include "CEGUIBase.h" -#include "CEGUISystem.h" -#include "CEGUIColourRect.h" -#include "CEGUIVector.h" -#include "CEGUIRenderCache.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - -*/ -class CEGUIEXPORT RenderableElement -{ -public: - /************************************************************************* - Drawing methods - *************************************************************************/ - /*! - \brief - Draw the element chain starting with this element. - - \param position - Vector3 object describing the base position to be used when rendering the element chain. Each element - in the chain will be offset from this position by it's own internal position setting. - - \param clip_rect - Rect object describing the clipping area. No rendering will appear outside this area. - */ - void draw(const Vector3& position, const Rect& clip_rect); - - /*! - \brief - Draw the element chain into the given RenderCache - - \param renderCache - RenderCache object where element imagery is to be queued. - - \return - Nothing. - */ - void draw(RenderCache& renderCache) const; - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - Return a pointer to the next RenderableElement in the chain. - - \return - Pointer to a RenderableElement object that is linked this this one. May be NULL for none. - */ - RenderableElement* getNextElement(void) const {return d_next;} - - - /*! - \brief - Return the rendering colours set for this RenderableElement - - \return - ColourRect object describing the colours to be used when rendering this RenderableElement. - */ - const ColourRect& getColours(void) const {return d_colours;} - - - /*! - \brief - Return the offset position of this RenderableElement. - - \return - Point object describing the offset position that this RenderableElement is to be rendered at. This - value is added to whatever position is specified when the RenderableElement::draw method is called to - obtain the final rendering position. - */ - Point getPosition(void) const {return Point(d_area.d_left, d_area.d_top);} - - - /*! - \brief - Return the current size of the element. - - \return - Size object describing the current size of the RenderableFrame. - */ - Size getSize(void) const {return Size(d_area.getWidth(), d_area.getHeight());} - - - /*! - \brief - Return the area for the element. - - \return - Rect object describing the pixel area (offset from some unknown location) of the frame. - */ - const Rect& getRect(void) const {return d_area;} - - - /*! - \brief - return whether the element colours will be applied locally to each image drawn as part of the RenderableElement, or - applied across the whole of the RenderableElement area. - - \return - - true if the RenderableElement colours will be applied locally to each sub-image drawn as part of this RenderableElement. - - false if the RenderableElement colours will be applied evenly across the face of the entire RenderableElement. - */ - bool isColourRectPerImage(bool setting) const {return d_useColoursPerImage;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Link another RenderableElement to this one. - - The linked element will be drawn whenever this element is drawn using the same base position and clipping area - as provided when the RenderableElement::draw method is called. Whole chains of Renderable Elements can be - created using this system. - - \param element - Pointer to a RenderableElement object that will be linked to this element. - - \return - Nothing. - */ - void setNextElement(RenderableElement* element) {d_next = element;} - - - /*! - \brief - Sets the colours to be applied when rendering the element. - - \param colours - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setColours(const ColourRect& colours) {d_colours = colours;} - - - /*! - \brief - Sets the colours to be applied when rendering the element. - - \param top_left_colour - Colour to be applied to the top-left corner of each Image used in the element. - - \param top_right_colour - Colour to be applied to the top-right corner of each Image used in the element. - - \param bottom_left_colour - Colour to be applied to the bottom-left corner of each Image used in the element. - - \param bottom_right_colour - Colour to be applied to the bottom-right corner of each Image used in the element. - - \return - Nothing. - */ - void setColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour); - - - /*! - \brief - Set the rendering offset position for this element. - - \param position - Point object describing the offset position to use for this element. This value is added to whatever - position is specified when the RenderableElement::draw method is called to obtain the final rendering - position. - - \return - Nothing. - */ - void setPosition(const Point& position) {d_area.setPosition(position);} - - - /*! - \brief - set the dimensions for the frame. - - \param size - Size object describing the new size for the frame (in pixels) - */ - void setSize(const Size& size) {d_area.setSize(size);} - - - /*! - \brief - Set the area for the frame - - \param area - Rect object describing the pixel area (offset from some unknown location) of the frame. - - \return - None. - */ - void setRect(const Rect& area) {d_area = area;} - - - /*! - \brief - set whether the element colours should be applied locally to each image drawn as part of the RenderableElement, or - applied across the whole of the RenderableElement area. - - \param setting - - true to specify that RenderableElement colours be applied locally to each sub-image drawn as part of this RenderableElement. - - false to specify that RenderableElement colours should be applied evenly across the face of the entire RenderableElement. - - \return - Nothing. - */ - void setColourRectPerImage(bool setting) {d_useColoursPerImage = setting;} - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for RenderableElement base class - */ - RenderableElement(void); - - - - /*! - \brief - Destructor for RenderableElement base class - */ - virtual ~RenderableElement(void); - - -protected: - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - This function performs the required rendering for this element. - - \param position - Vector3 object describing the final rendering position for the object. - - \param clip_rect - Rect object describing the clipping area for the rendering. No rendering will be performed outside this area. - - \return - Nothing. - */ - virtual void draw_impl(const Vector3& position, const Rect& clip_rect) const = 0; - - /*! - \brief - Implementation method to draw the element into the given RenderCache - - \param renderCache - RenderCache object where element imagery is to be queued. - - \return - Nothing. - */ - virtual void draw_impl(RenderCache& renderCache) const = 0; - - - /************************************************************************* - Implementation Data - *************************************************************************/ - RenderableElement* d_next; //!< Link to another RenderableElement. - ColourRect d_colours; //!< Colours to be used for this element; - Rect d_area; //!< Currently defined area for this element. - bool d_useColoursPerImage; //!< true if d_colours should be applied separately to each Image drawn (false to interpolate across d_area). -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIRenderableElement_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRenderableFrame.h b/vendor/cegui-0.4.0-custom/include/CEGUIRenderableFrame.h deleted file mode 100644 index dd70f4ac68..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRenderableFrame.h +++ /dev/null @@ -1,190 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderableFrame.h - created: 14/4/2004 - author: Paul D Turner - - purpose: Interface to RenderableFrame UI construct -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRenderableFrame_h_ -#define _CEGUIRenderableFrame_h_ - -#include "CEGUIBase.h" -#include "CEGUIRenderableElement.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Enumeration of positions for a frame. -*/ -enum FrameLocation -{ - Invalid, // Value reserved to indicate some invalid or unknown location. - TopLeftCorner, // Top-Left corner of a frame / rectangle. - TopRightCorner, // Top-Right corner of a frame / rectangle. - BottomLeftCorner, // Bottom-Left corner of a frame / rectangle. - BottomRightCorner, // Bottom-Right corner of a frame / rectangle. - LeftEdge, // Left edge of a frame / rectangle. - TopEdge, // Top edge of a frame / rectangle. - RightEdge, // Right edge of a frame / rectangle. - BottomEdge // Bottom edge of a frame / rectangle. -}; - - -/*! -\brief - A higher order GUI entity that represents a renderable frame. - - This class is intended to be used where a (usually top-level) GUI element needs to draw a frame that is constructed from - a collection of Images. It is possible to specify the image to use for each of the four corners, which are placed appropriately - at their natural size, and the images for the four edges, which are stretched to cover the area between any corner images. Any - of the Images may be omitted, in which case that part of the frame is not drawn. If the GUI element uses only one image for its - frame (usually stretched over the entire area of the element) then a better choice would be to use a RenderableImage, or perform the - rendering directly instead. -*/ -class CEGUIEXPORT RenderableFrame : public RenderableElement -{ -public: - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Default constructor for RenderableFrame - */ - RenderableFrame(void); - - - /*! - \brief - Destructor for RenderableFrame - */ - virtual ~RenderableFrame(void); - - - /*! - \brief - specify the Image objects to use for each part of the frame. A NULL may be used to omit any part. - - \param topleft - Pointer to an Image object to render as the top-left corner of the frame. Specify NULL to omit this part of the frame. - - \param topright - Pointer to an Image object to render as the top-right corner of the frame. Specify NULL to omit this part of the frame. - - \param bottomleft - Pointer to an Image object to render as the bottom-left corner of the frame. Specify NULL to omit this part of the frame. - - \param bottomright - Pointer to an Image object to render as the bottom-right corner of the frame. Specify NULL to omit this part of the frame. - - \param left - Pointer to an Image object to render as the left edge of the frame. Specify NULL to omit this part of the frame. - - \param top - Pointer to an Image object to render as the top edge of the frame. Specify NULL to omit this part of the frame. - - \param right - Pointer to an Image object to render as the right edge of the frame. Specify NULL to omit this part of the frame. - - \param bottom - Pointer to an Image object to render as the bottom edge of the frame. Specify NULL to omit this part of the frame. - - \return - Nothing - */ - void setImages(const Image* topleft, const Image* topright, const Image* bottomleft, const Image* bottomright, const Image* left, const Image* top, const Image* right, const Image* bottom); - - - /*! - \brief - Set the Image to use for the specified location of the frame. - - \param location - One of the FrameLocation enumerated values specifying the image to be returned. - - \param image - Pointer to the Image to use for the frame location specified in \a location. May be NULL to indicate the - frame component is not required. - - \return - Nothing. - */ - void setImageForLocation(FrameLocation location, const Image* image); - - - - /*! - \brief - Return the Image being used for the specified location of the frame. - - \param location - One of the FrameLocation enumerated values specifying the image to be returned. - - \return - Pointer to the Image object currently set for the frame location specified in \a location. May return NULL if no - Image is set for the requested position. - */ - const Image* getImageForLocation(FrameLocation location) const; - - -protected: - /************************************************************************* - Implementation functions - *************************************************************************/ - /*! - \brief - Renders the imagery for a RenderableFrame element. - - \param position - Vector3 object describing the final rendering position for the object. - - \param clip_rect - Rect object describing the clipping area for the rendering. No rendering will be performed outside this area. - - \return - Nothing. - */ - void draw_impl(const Vector3& position, const Rect& clip_rect) const; - - // implements abstract method - void draw_impl(RenderCache& renderCache) const; - - /************************************************************************* - Implementation Data - *************************************************************************/ - // image pointers - const Image* d_topleft; //!< Image to draw for the top-left corner. - const Image* d_topright; //!< Image to draw for the top-right corner. - const Image* d_bottomleft; //!< Image to draw for the bottom-left corner. - const Image* d_bottomright; //!< Image to draw for the bottom-right corner. - const Image* d_left; //!< Image to draw for the left edge. - const Image* d_right; //!< Image to draw for the right edge. - const Image* d_top; //!< Image to draw for the top edge. - const Image* d_bottom; //!< Image to draw for the bottom edge. -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIRenderableFrame_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRenderableImage.h b/vendor/cegui-0.4.0-custom/include/CEGUIRenderableImage.h deleted file mode 100644 index a412b9d2cd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRenderableImage.h +++ /dev/null @@ -1,254 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderableImage.h - created: 17/4/2004 - author: Paul D Turner - - purpose: Interface to renderable image UI entity -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRenderableImage_h_ -#define _CEGUIRenderableImage_h_ - -#include "CEGUIBase.h" -#include "CEGUIRenderableElement.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - A higher order GUI entity that represents a renderable image with formatting options. - - This class is intended to be used where a (usually top-level) GUI element needs to draw an image that requires some additional - formatting. It is possible to specify the Image that is to be rendered, as well as the horizontal and vertical formatting - required. -*/ -class CEGUIEXPORT RenderableImage : public RenderableElement -{ -public: - /************************************************************************* - Formatting Enumerations - *************************************************************************/ - /*! - \brief - Enumeration of horizontal formatting options for a RenderableImage - */ - enum HorzFormatting - { - LeftAligned, //!< Image will be rendered at it's natural size and with it's left edge aligned with the left edge of the RenderableImage rect. - RightAligned, //!< Image will be rendered at it's natural size and with it's right edge aligned with the right edge of the RenderableImage rect. - HorzCentred, //!< Image will be rendered at it's natural size and horizontally centred within the RenderableImage rect. - HorzStretched, //!< Image will be horizontally stretched to cover the entire width of the RenderableImage rect. - HorzTiled //!< Image will be tiled horizontally across the width of the RenderableImage rect. The rightmost tile will be clipped to remain within the rect. - }; - - - /*! - \brief - Enumeration of vertical formatting options for a RenderableImage - */ - enum VertFormatting - { - TopAligned, //!< Image will be rendered at it's natural size and with it's top edge aligned with the top edge of the RenderableImage rect. - BottomAligned, //!< Image will be rendered at it's natural size and with it's bottom edge aligned with the bottom edge of the RenderableImage rect. - VertCentred, //!< Image will be rendered at it's natural size and vertically centred within the RenderableImage rect. - VertStretched, //!< Image will be vertically stretched to cover the entire height of the RenderableImage rect. - VertTiled //!< Image will be tiled vertically down the height of the RenderableImage rect. The bottommost tile will be clipped to remain within the rect. - }; - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Default constructor for RenderableImage objects. - */ - RenderableImage(void); - - - /*! - \brief - Destructor for RenderableImage objects - */ - virtual ~RenderableImage(void); - - - /************************************************************************* - Public Interface - *************************************************************************/ - /*! - \brief - Set the Image object to be drawn by this RenderableImage. - - \param image - Pointer to the Image object to be rendered. Can be NULL to specify no image is to be rendered. - - \return - Nothing. - */ - void setImage(const Image* image) {d_image = image;} - - - /*! - \brief - Set the required horizontal formatting - - \param formatting - One of the HorzFormatting values specifying the formatting required. - - \return - Nothing - */ - void setHorzFormatting(HorzFormatting formatting) {d_horzFormat = formatting;} - - - /*! - \brief - Set the required vertical formatting - - \param formatting - One of the VertFormatting values specifying the formatting required. - - \return - Nothing - */ - void setVertFormatting(VertFormatting formatting) {d_vertFormat = formatting;} - - - /*! - \brief - Set the required quad split mode - - \param split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles. - - \return - Nothing - */ - void setQuadSplitMode(QuadSplitMode split_mode) {d_quadSplitMode = split_mode;} - - - /*! - \brief - Return the Image object currently set to be rendered. - - \return - Pointer to the current Image object set for this RenderableImage. May return NULL if no image is set. - */ - const Image* getImage(void) const {return d_image;} - - - /*! - \brief - Return current horizontal formatting setting. - - \return - One of the HorzFormatting values specifying the formatting set. - */ - HorzFormatting getHorzFormatting(void) const {return d_horzFormat;} - - - /*! - \brief - Return current vertical formatting setting. - - \return - One of the VertFormatting values specifying the formatting set. - */ - VertFormatting getVertFormatting(void) const {return d_vertFormat;} - - - /*! - \brief - Return current quad split mode setting. - - \return - One of the QuadSplitMode values specifying the way quads are split into triangles. - */ - QuadSplitMode getQuadSplitMode(void) const {return d_quadSplitMode;} - - -protected: - /************************************************************************* - Implementation functions - *************************************************************************/ - /*! - \brief - Renders the imagery for a RenderableImage element. - - \param position - Vector3 object describing the final rendering position for the object. - - \param clip_rect - Rect object describing the clipping area for the rendering. No rendering will be performed outside this area. - - \return - Nothing. - */ - void draw_impl(const Vector3& position, const Rect& clip_rect) const; - - // implements abstract method - void draw_impl(RenderCache& renderCache) const; - - /*! - \brief - return number of horizontal tiles required. - */ - uint getHorzTileCount() const; - - /*! - \brief - return number of vertical tiles required. - */ - uint getVertTileCount() const; - - /*! - \brief - Return base x co-ord for first tile. - */ - float getBaseXCoord(const Size& sz) const; - - /*! - \brief - Return base y co-ord for first tile. - */ - float getBaseYCoord(const Size& sz) const; - - /*! - \brief - Return target size to be used for each tile. - */ - Size getDestinationSize() const; - - /************************************************************************* - Implementation Data - *************************************************************************/ - HorzFormatting d_horzFormat; //!< Currently set horizontal formatting option. - VertFormatting d_vertFormat; //!< Currently set vertical formatting option. - QuadSplitMode d_quadSplitMode; //!< Currently set quad split mode - const Image* d_image; //!< Pointer to the actual Image to be displayed. -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIRenderableImage_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIRenderer.h b/vendor/cegui-0.4.0-custom/include/CEGUIRenderer.h deleted file mode 100644 index 79bc75a2fe..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIRenderer.h +++ /dev/null @@ -1,404 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderer.h - created: 20/2/2004 - author: Paul D Turner - - purpose: Defines interface for abstract Renderer class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRenderer_h_ -#define _CEGUIRenderer_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIRect.h" -#include "CEGUIColourRect.h" -#include "CEGUIEventSet.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Enumerated type that contains the valid flags that can be to use when rendering image -*/ -enum OrientationFlags { - FlipHorizontal = 1, //!< Horizontal flip the image - FlipVertical = 2, //!< Vertical flip the image - RotateRightAngle = 4 //!< Rotate the image anticlockwise 90 degree -}; - -/*! -\brief - Enumerated type that contains the valid diagonal-mode that specify how a quad is split into triangles when rendered with fx. a 3D API -*/ -enum QuadSplitMode -{ - TopLeftToBottomRight, //!< Diagonal goes from top-left to bottom-right - BottomLeftToTopRight //!< Diagonal goes from bottom-left to top-right -}; - - -/*! -\brief - Abstract class defining the interface for Renderer objects. - - Objects derived from Renderer are the means by which the GUI system interfaces - with specific rendering technologies. To use a rendering system or API to draw - CEGUI imagery requires that an appropriate Renderer object be available. -*/ -class CEGUIEXPORT Renderer : public EventSet -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Event name constants - *************************************************************************/ - /*! - event that fires when the underlying display size had changed. - - It is important that all Renderer implementers fire this properly as the - system itself subscribes to this event. - */ - static const String EventDisplaySizeChanged; - - - /************************************************************************* - Abstract interface methods - *************************************************************************/ - /*! - \brief - Add a quad to the rendering queue. All clipping and other adjustments should have been made prior to calling this. - - \param dest_rect - Rect object describing the destination area (values are in pixels) - - \param z - float value specifying the z co-ordinate / z order of the quad - - \param tex - pointer to the Texture object that holds the imagery to be rendered - - \param texture_rect - Rect object holding the area of \a tex that is to be rendered (values are in texture co-ordinates). - - \param colours - ColourRect object describing the colour values that are to be applied when rendering. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode, const Image* image = NULL ) = 0; - - - /*! - \brief - Perform final rendering for all quads that have been queued for rendering - - The contents of the rendering queue is retained and can be rendered again as required. If the contents is not required call clearRenderList(). - - \return - False if render failed - */ - virtual bool doRender(void) = 0; - - - /*! - \brief - Clears all queued quads from the render queue. - - \return - Nothing - */ - virtual void clearRenderList(void) = 0; - - - /*! - \brief - Enable or disable the queueing of quads from this point on. - - This only affects queueing. If queueing is turned off, any calls to addQuad will cause the quad to be rendered directly. Note that - disabling queueing will not cause currently queued quads to be rendered, nor is the queue cleared - at any time the queue can still - be drawn by calling doRender, and the list can be cleared by calling clearRenderList. Re-enabling the queue causes subsequent quads - to be added as if queueing had never been disabled. - - \param setting - true to enable queueing, or false to disable queueing (see notes above). - - \return - Nothing - */ - virtual void setQueueingEnabled(bool setting) = 0; - - - /*! - \brief - Creates a 'null' Texture object. - - \return - a newly created Texture object. The returned Texture object has no size or imagery associated with it, and is - generally of little or no use. - */ - virtual Texture* createTexture(void) = 0; - - - /*! - \brief - Create a Texture object using the given image file. - - \param filename - String object that specifies the path and filename of the image file to use when creating the texture. - - \param resourceGroup - Resource group identifier to be passed to the resource provider when loading the texture file. - - \return - a newly created Texture object. The initial contents of the texture memory is the requested image file. - - \note - Textures are always created with a size that is a power of 2. If the file you specify is of a size that is not - a power of two, the final size will be rounded up. Additionally, textures are always square, so the ultimate - size is governed by the larger of the width and height of the specified file. You can check the ultimate sizes - by querying the texture after creation. - */ - virtual Texture* createTexture(const String& filename, const String& resourceGroup) = 0; - - - /*! - \brief - Create a Texture object with the given pixel dimensions as specified by \a size. NB: Textures are always square. - - \param size - float value that specifies the size to use for the width and height when creating the new texture. - - \return - a newly created Texture object. The initial contents of the texture memory is undefined / random. - - \note - Textures are always created with a size that is a power of 2. If you specify a size that is not a power of two, the final - size will be rounded up. So if you specify a size of 1024, the texture will be (1024 x 1024), however, if you specify a size - of 1025, the texture will be (2048 x 2048). You can check the ultimate size by querying the texture after creation. - */ - virtual Texture* createTexture(float size) = 0; - - - /*! - \brief - Destroy the given Texture object. - - \param texture - pointer to the Texture object to be destroyed - - \return - Nothing - */ - virtual void destroyTexture(Texture* texture) = 0; - - - /*! - \brief - Destroy all Texture objects. - - \return - Nothing - */ - virtual void destroyAllTextures(void) = 0; - - - /*! - \brief - Return whether queueing is enabled. - - \return - true if queueing is enabled, false if queueing is disabled. - */ - virtual bool isQueueingEnabled(void) const = 0; - - - /*! - \brief - Return the current width of the display in pixels - - \return - float value equal to the current width of the display in pixels. - */ - virtual float getWidth(void) const = 0; - - - /*! - \brief - Return the current height of the display in pixels - - \return - float value equal to the current height of the display in pixels. - */ - virtual float getHeight(void) const = 0; - - - /*! - \brief - Return the size of the display in pixels - - \return - Size object describing the dimensions of the current display. - */ - virtual Size getSize(void) const = 0; - - - /*! - \brief - Return a Rect describing the screen - - \return - A Rect object that describes the screen area. Typically, the top-left values are always 0, and the size of the area described is - equal to the screen resolution. - */ - virtual Rect getRect(void) const = 0; - - - /*! - \brief - Return the maximum texture size available - - \return - Size of the maximum supported texture in pixels (textures are always assumed to be square) - */ - virtual uint getMaxTextureSize(void) const = 0; - - - /*! - \brief - Return the horizontal display resolution dpi - - \return - horizontal resolution of the display in dpi. - */ - virtual uint getHorzScreenDPI(void) const = 0; - - - /*! - \brief - Return the vertical display resolution dpi - - \return - vertical resolution of the display in dpi. - */ - virtual uint getVertScreenDPI(void) const = 0; - - - /************************************************************************* - Basic stuff we provide in base class - *************************************************************************/ - /*! - \brief - Reset the z co-ordinate for rendering. - - \return - Nothing - */ - void resetZValue(void) {d_current_z = GuiZInitialValue;} - - - /*! - \brief - Update the z co-ordinate for the next major UI element (window). - - \return - Nothing - */ - void advanceZValue(void) {d_current_z -= GuiZElementStep;} - - - /*! - \brief - return the current Z value to use (equates to layer 0 for this UI element). - - \return - float value that specifies the z co-ordinate to be used for layer 0 on the current GUI element. - */ - float getCurrentZ(void) const {return d_current_z;} - - - /*! - \brief - return the z co-ordinate to use for the requested layer on the current GUI element. - - \param layer - Specifies the layer to return the Z co-ordinate for. Each GUI element can use up to 10 layers, so valid inputs are 0 to 9 inclusive. - If you specify an invalid value for \a layer, results are undefined. - - \return - float value that specifies the Z co-ordinate for layer \a layer on the current GUI element. - */ - float getZLayer(uint layer) const {return d_current_z - ((float)layer * GuiZLayerStep);} - - - /*! - \brief - Return identification string for the renderer module. If the internal id string has not been - set by the Renderer module creator, a generic string of "Unknown renderer" will be returned. - - \return - String object holding a string that identifies the Renderer in use. - */ - const String& getIdentifierString() const; - - virtual ResourceProvider* createResourceProvider(void); - - // MTA extras - virtual void NotifyImageInvalid ( Image* const image ) = 0; - -protected: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - Renderer(void); - -public: // for luabind support - virtual ~Renderer(void); - -private: - /************************************************************************* - Implementation constants - *************************************************************************/ - static const float GuiZInitialValue; //!< Initial value to use for 'z' each frame. - static const float GuiZElementStep; //!< Value to step 'z' for each GUI element. - static const float GuiZLayerStep; //!< Value to step 'z' for each GUI layer. - - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_current_z; //!< The current z co-ordinate value. - -protected: - ResourceProvider* d_resourceProvider; //!< Holds the pointer to the ResourceProvider object. - String d_identifierString; //!< String that holds some id information about the renderer. -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIRenderer_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIResourceProvider.h b/vendor/cegui-0.4.0-custom/include/CEGUIResourceProvider.h deleted file mode 100644 index dab8f1c5a3..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIResourceProvider.h +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************************************ - filename: CEGUIResourceProvider.h - created: 8/7/2004 - author: James '_mental_' O'Sullivan - - purpose: Defines abstract base class for loading DataContainer objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIResourceProvider_h_ -#define _CEGUIResourceProvider_h_ - -#include "CEGUIBase.h" -#include "CEGUIDataContainer.h" -#include "CEGUIString.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Abstract class that defines the required interface for all resource provider sub-classes. - - A ResourceProvider is used to load both XML and binary data from an external source. This could be from a filesystem or the resource manager of a specific renderer. -*/ -class CEGUIEXPORT ResourceProvider -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for the ResourceProvider class - */ - ResourceProvider() { } - - /*! - \brief - Destructor for the ResourceProvider class - */ - virtual ~ResourceProvider(void) { } - - /************************************************************************* - Accessor functions - *************************************************************************/ - -// /*! -// \brief -// Load XML data using InputSource objects. -// -// \param filename -// String containing a filename of the resource to be loaded. -// -// \param output -// Reference to a InputSourceContainer object to load the data into. -// */ -// virtual void loadInputSourceContainer(const String& filename, InputSourceContainer& output) = 0; - - /*! - \brief - Load raw binary data. - - \param filename - String containing a filename of the resource to be loaded. - - \param output - Reference to a RawDataContainer object to load the data into. - - \param resourceGroup - Optional String that may be used by implementations to identify the group from - which the resource should be loaded. - */ - virtual void loadRawDataContainer(const String& filename, RawDataContainer& output, const String& resourceGroup) = 0; - - /*! - \brief - Unload raw binary data. This gives the resource provider a change to unload the data - in its own way before the data container object is destroyed. If it does nothing, - then the object will release its memory. - - \param data - Reference to a RawDataContainer object that is about to be destroyed. - - */ - virtual void unloadRawDataContainer(RawDataContainer& data) { } - - /*! - \brief - Return the current default resource group identifier. - - \return - String object containing the currently set default resource group identifier. - */ - const String& getDefaultResourceGroup(void) const { return d_defaultResourceGroup; } - - /*! - \brief - Set the default resource group identifier. - - \param resourceGroup - String object containing the default resource group identifier to be used. - - \return - Nothing. - */ - void setDefaultResourceGroup(const String& resourceGroup) { d_defaultResourceGroup = resourceGroup; } - -protected: - String d_defaultResourceGroup; //!< Default resource group identifier. -}; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIResourceProvider_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIScheme.h b/vendor/cegui-0.4.0-custom/include/CEGUIScheme.h deleted file mode 100644 index b99529c9f8..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIScheme.h +++ /dev/null @@ -1,197 +0,0 @@ -/************************************************************************ - filename: CEGUIScheme.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines abstract base class for the GUI Scheme object. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScheme_h_ -#define _CEGUIScheme_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISchemeManager.h" - -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - A class that groups a set of GUI elements and initialises the system to access those elements. - - A GUI Scheme is a high-level construct that loads and initialises various lower-level objects - and registers them within the system for usage. So, for example, a Scheme might create some - Imageset objects, some Font objects, and register a collection of WindowFactory objects within - the system which would then be in a state to serve those elements to client code. -*/ -class CEGUIEXPORT Scheme -{ - friend class Scheme_xmlHandler; -public: - /*! - \brief - Loads all resources for this scheme. - - \return - Nothing. - */ - void loadResources(void); - - - /*! - \brief - Unloads all resources for this scheme. This should be used very carefully. - - \return - Nothing. - */ - void unloadResources(void); - - - /*! - \brief - Return whether the resources for this Scheme are all loaded. - - \return - true if all resources for the Scheme are loaded and available, or false of one or more resource is not currently loaded. - */ - bool resourcesLoaded(void) const; - - - /*! - \brief - Return the name of this Scheme. - - \return - String object containing the name of this Scheme. - */ - const String& getName(void) const {return d_name;} - -private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const char GUISchemeSchemaName[]; //!< Filename of the XML schema used for validating GUIScheme files. - - /************************************************************************* - Friends - *************************************************************************/ - friend Scheme* SchemeManager::loadScheme(const String& scheme_filename, const String& resourceGroup); - friend void SchemeManager::unloadScheme(const String& scheme_name); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Creates a scheme object from the data specified in the file \a filename - - \param filename - String object holding the name of the file to use when creating this Scheme object. - - \param resourceGroup - Group identifier to be passed to the resource provider when loading the scheme - specification file. - - \return - Nothing. - */ - Scheme(const String& filename, const String& resourceGroup); - - -public: // for luabind compatibility - /*! - \brief - Destroys a Scheme object - - \return - Nothing - */ - ~Scheme(void); - - -private: - /************************************************************************* - Structs used to hold scheme information - *************************************************************************/ - struct LoadableUIElement - { - String name; - String filename; - String resourceGroup; - }; - - struct UIElementFactory - { - String name; - }; - - struct UIModule - { - String name; - FactoryModule* module; - std::vector factories; - }; - - struct AliasMapping - { - String aliasName; - String targetName; - }; - - struct FalagardMapping - { - String windowName; - String targetName; - String lookName; - }; - - /************************************************************************* - Implementation Data - *************************************************************************/ - String d_name; //!< the name of this scheme. - - std::vector d_imagesets; - std::vector d_imagesetsFromImages; - std::vector d_fonts; - std::vector d_widgetModules; - std::vector d_aliasMappings; - std::vector d_looknfeels; - std::vector d_falagardMappings; -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIScheme_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUISchemeManager.h b/vendor/cegui-0.4.0-custom/include/CEGUISchemeManager.h deleted file mode 100644 index 6f50f15a8b..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUISchemeManager.h +++ /dev/null @@ -1,185 +0,0 @@ -/************************************************************************ - filename: CEGUISchemeManager.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines the interface to the SchemeManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISchemeManager_h_ -#define _CEGUISchemeManager_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUIIteratorBase.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - A class that manages the creation of, access to, and destruction of GUI Scheme objects -*/ -class CEGUIEXPORT SchemeManager : public Singleton -{ -public: - /*! - \brief - Constructor for SchemeManager objects - */ - SchemeManager(void); - - - /*! - \brief - Destructor for SchemeManager objects - */ - ~SchemeManager(void); - - - /*! - \brief - Return singleton SchemeManager object - - \return - Singleton SchemeManager object - */ - static SchemeManager& getSingleton(void); - - - /*! - \brief - Return pointer to singleton SchemeManager object - - \return - Pointer to singleton SchemeManager object - */ - static SchemeManager* getSingletonPtr(void); - - - /*! - \brief - Loads a scheme - - \param scheme_filename - String object that holds the filename of the scheme to be loaded - - \param resourceGroup - Resource group identifier to be passed to the resource manager. NB: This - affects loading of the scheme xml file only, scheme resources may specify - their own groups. - - \return - Pointer to an object representing the loaded Scheme. - */ - Scheme* loadScheme(const String& scheme_filename, const String& resourceGroup = ""); - - - /*! - \brief - Unloads all data referenced in a scheme. If any object is using some resource which is listed in the scheme, this function - will effectively pull the rug out from under those objects. This should be used with extreme caution, or not at all. - - \param scheme_name - String object specifying the name of the Scheme to be unloaded. - */ - void unloadScheme(const String& scheme_name); - - - /*! - \brief - Returns true if the named Scheme is present in the system (though the resources for the scheme may or may not be loaded) - - \param scheme_name - String object specifying the name of the Scheme to check for. - - \return - true if the scheme is loaded, false if it is not. - */ - bool isSchemePresent(const String& scheme_name) const {return (d_schemes.find(scheme_name) != d_schemes.end());} - - - /*! - \brief - Returns a pointer to the Scheme object with the specified name. - - \param name - String object holding the name of the Scheme to be returned. - - \return - Pointer to the Scheme named \a name. - - \exception UnknownObjectException thrown if no Scheme named \a name is present in the system - */ - Scheme* getScheme(const String& name) const; - - - /*! - \brief - Unload all schemes currently defined within the system. - - \note - Calling this method has the potential to be very dangerous; if any of the - data that forms part of the scheme is still in use, you can expect - fireworks shortly after! - - \return - Nothing. - */ - void unloadAllSchemes(void); - -private: - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::map SchemeRegistry; - SchemeRegistry d_schemes; //!< Collection that tracks the loaded Schemes. - - -public: - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator SchemeIterator; - - /*! - \brief - Return a SchemeManager::SchemeIterator object to iterate over the available schemes. - */ - SchemeIterator getIterator(void) const; -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUISchemeManager_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIScheme_xmlHandler.h b/vendor/cegui-0.4.0-custom/include/CEGUIScheme_xmlHandler.h deleted file mode 100644 index 3ce878a148..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIScheme_xmlHandler.h +++ /dev/null @@ -1,105 +0,0 @@ -/************************************************************************ - filename: CEGUIScheme_xmlHandler.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines abstract base class for the GUI Scheme object. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScheme_xmlHandler_h_ -#define _CEGUIScheme_xmlHandler_h_ - -#include "CEGUIScheme.h" -#include "CEGUIXMLHandler.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - - /*! - \brief - Handler class used to parse the Scheme XML files using SAX2 - */ - class Scheme_xmlHandler : public XMLHandler - { - public: - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructor for Scheme::xmlHandler objects - - \param scheme - Pointer to the Scheme object creating this xmlHandler object - */ - Scheme_xmlHandler(Scheme* scheme) : d_scheme(scheme) - {} - - /*! - \brief - Destructor for Scheme::xmlHandler objects - */ - virtual ~Scheme_xmlHandler(void) - {} - - /************************************************************************* - SAX2 Handler overrides - *************************************************************************/ - /*! - \brief - document processing (only care about elements, schema validates format) - */ - virtual void elementStart(const String& element, const XMLAttributes& attributes); - virtual void elementEnd(const String& element); - - private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - // XML related strings - static const String GUISchemeElement; //!< Root GUIScheme element. - static const String ImagesetElement; //!< Element specifying an Imageset - static const String ImagesetFromImageElement; //!< Element specifying an Imageset to be created directly via an image file. - static const String FontElement; //!< Element specifying a Font - static const String WindowSetElement; //!< Element specifying a module and set of WindowFactory elements. - static const String WindowFactoryElement; //!< Element specifying a WindowFactory type. - static const String WindowAliasElement; //!< Element specifying a WindowFactory type alias - static const String FalagardMappingElement; //!< Element specifying a Falagard window mapping - static const String LookNFeelElement; //!< Element specifying a LookNFeel. - static const String NameAttribute; //!< Attribute specifying the name of some object. - static const String FilenameAttribute; //!< Attribute specifying the name of some file. - static const String AliasAttribute; //!< Attribute specifying an alias name. - static const String TargetAttribute; //!< Attribute specifying target for an alias. - static const String ResourceGroupAttribute; //!< Attribute specifying resource group for some loadable resource. - static const String WindowTypeAttribute; //!< Attribute specifying the type of a window being created via a mapping. - static const String TargetTypeAttribute; //!< Attribute specifying the base target type of a falagard mapped window type. - static const String LookNFeelAttribute; //!< Attribute specifying the name of a LookNFeel for a falagard mapping.. - - - /************************************************************************* - Implementation Data - *************************************************************************/ - Scheme* d_scheme; //!< Scheme object that we are helping to build - }; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIScheme_xmlHandler_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIScriptModule.h b/vendor/cegui-0.4.0-custom/include/CEGUIScriptModule.h deleted file mode 100644 index 2391fdad27..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIScriptModule.h +++ /dev/null @@ -1,182 +0,0 @@ -/************************************************************************ - filename: CEGUIScriptModule.h - created: 16/7/2004 - author: Paul D Turner - - purpose: Abstract class interface for scripting support -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScriptModule_h_ -#define _CEGUIScriptModule_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIEvent.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Abstract interface required for all scripting support modules to be used with - the CEGUI system. -*/ -class CEGUIEXPORT ScriptModule -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for ScriptModule base class - */ - ScriptModule(void); - - - /*! - \brief - Destructor for ScriptModule base class. - */ - virtual ~ScriptModule(void) {} - - - /************************************************************************* - Abstract interface - *************************************************************************/ - /*! - \brief - Execute a script file. - - \param filename - String object holding the filename of the script file that is to be executed - - \param resourceGroup - Resource group idendifier to be passed to the ResourceProvider when loading the script file. - */ - virtual void executeScriptFile(const String& filename, const String& resourceGroup = "") = 0; - - - /*! - \brief - Execute a scripted global function. The function should not take any parameters and should return an integer. - - \param function_name - String object holding the name of the function, in the global script environment, that - is to be executed. - - \return - The integer value returned from the script function. - */ - virtual int executeScriptGlobal(const String& function_name) = 0; - - - /*! - \brief - Execute a scripted global 'event handler' function. The function should take some kind of EventArgs like parameter - that the concrete implementation of this function can create from the passed EventArgs based object. The function - should not return anything. - - \param handler_name - String object holding the name of the scripted handler function. - - \param e - EventArgs based object that should be passed, by any appropriate means, to the scripted function. - - \return - - true if the event was handled. - - false if the event was not handled. - */ - virtual bool executeScriptedEventHandler(const String& handler_name, const EventArgs& e) = 0; - - - /*! - \brief - Execute script code contained in the given CEGUI::String object. - - \param str - String object holding the valid script code that should be executed. - - \return - Nothing. - */ - virtual void executeString(const String& str) = 0; - - - /*! - \brief - Method called during system initialisation, prior to running any scripts via the ScriptModule, to enable the ScriptModule - to perform any operations required to complete initialisation or binding of the script language to the gui system objects. - - \return - Nothing. - */ - virtual void createBindings(void) {} - - - /*! - \brief - Method called during system destruction, after all scripts have been run via the ScriptModule, to enable the ScriptModule - to perform any operations required to cleanup bindings of the script language to the gui system objects, as set-up in the - earlier createBindings call. - - \return - Nothing. - */ - virtual void destroyBindings(void) {} - - /*! - \brief - Return identification string for the ScriptModule. If the internal id string has not been - set by the ScriptModule creator, a generic string of "Unknown scripting module" will be returned. - - \return - String object holding a string that identifies the ScriptModule in use. - */ - const String& getIdentifierString() const; - -protected: - String d_identifierString; //!< String that holds some id information about the module. -}; - - -/*! -\brief - Functor class used for binding named script functions to events -*/ -class ScriptFunctor -{ -public: - ScriptFunctor(const String& functionName) : scriptFunctionName(functionName) {} - ScriptFunctor(const ScriptFunctor& obj) : scriptFunctionName(obj.scriptFunctionName) {} - bool operator()(const EventArgs& e) const; - -private: - // no assignment possible - ScriptFunctor& operator=(const ScriptFunctor& rhs); - - const String scriptFunctionName; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIScriptModule_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUISingleton.h b/vendor/cegui-0.4.0-custom/include/CEGUISingleton.h deleted file mode 100644 index 51f8c16241..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUISingleton.h +++ /dev/null @@ -1,75 +0,0 @@ -/************************************************************************ - filename: CEGUISingleton.h - created: 22/2/2004 - author: Paul D Turner - - purpose: Singleton Base Class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -/************************************************************************* - - The code in this file is taken from article 1.3 in the the book: - Game Programming Gems from Charles River Media - -*************************************************************************/ -#ifndef _CEGUISingleton_h_ -#define _CEGUISingleton_h_ - -#include "CEGUIBase.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -/* Copyright (C) Scott Bilas, 2000. - * All rights reserved worldwide. - * - * This software is provided "as is" without express or implied - * warranties. You may freely copy and compile this source into - * applications you distribute provided that the copyright text - * below is included in the resulting source code, for example: - * "Portions Copyright (C) Scott Bilas, 2000" - */ - - -template class CEGUIEXPORT Singleton -{ -protected: - static T* ms_Singleton; - -public: - Singleton( void ) - { - assert( !ms_Singleton ); - ms_Singleton = static_cast(this); - } - ~Singleton( void ) - { assert( ms_Singleton ); ms_Singleton = 0; } - static T& getSingleton( void ) - { assert( ms_Singleton ); return ( *ms_Singleton ); } - static T* getSingletonPtr( void ) - { return ( ms_Singleton ); } -}; - -} // End of CEGUI namespace section - - - -#endif // end of guard _CEGUISingleton_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUISize.h b/vendor/cegui-0.4.0-custom/include/CEGUISize.h deleted file mode 100644 index e3cdbf7b6d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUISize.h +++ /dev/null @@ -1,54 +0,0 @@ -/************************************************************************ - filename: CEGUISize.h - created: 14/3/2004 - author: Paul D Turner - - purpose: Defines interface for Size class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISize_h_ -#define _CEGUISize_h_ - -#include "CEGUIBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Class that holds the size (width & height) of something. -*/ -class CEGUIEXPORT Size -{ -public: - Size(void) {} - Size(float width, float height) : d_width(width), d_height(height) {} - - bool operator==(const Size& other) const; - bool operator!=(const Size& other) const; - - float d_width, d_height; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUISize_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIString.h b/vendor/cegui-0.4.0-custom/include/CEGUIString.h deleted file mode 100644 index dba6572a92..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIString.h +++ /dev/null @@ -1,5636 +0,0 @@ -/*********************************************************************** - filename: CEGUIString.h - created: 26/2/2004 - author: Paul D Turner - - purpose: Defines string class used within the GUI system. -*************************************************************************/ -/*************************************************************************** - * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - ***************************************************************************/ -#ifndef _CEGUIString_h_ -#define _CEGUIString_h_ - -#include "CEGUIBase.h" -#include -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -#define STR_QUICKBUFF_SIZE 32 - /************************************************************************* - Basic Types - *************************************************************************/ - typedef uint8 utf8; - //typedef uint16 utf16; // removed typedef to prevent usage, as utf16 is not supported (yet) - typedef uint32 utf32; - -/*! -\brief - String class used within the GUI system. - - For the most part, this class can replace std::string in basic usage. However, currently String does not use the - current locale, and also comparisons do not take into account the Unicode data tables, so are not 'correct' - as such. -*/ -class CEGUIEXPORT String -{ -public: - /************************************************************************* - Integral Types - *************************************************************************/ - typedef utf32 value_type; //!< Basic 'code point' type used for String (utf32) - typedef size_t size_type; //!< Unsigned type used for size values and indices - typedef ptrdiff_t difference_type; //!< Signed type used for differences - typedef utf32& reference; //!< Type used for utf32 code point references - typedef const utf32& const_reference; //!< Type used for constant utf32 code point references - typedef utf32* pointer; //!< Type used for utf32 code point pointers - typedef const utf32* const_pointer; //!< Type used for constant utf32 code point pointers - - static const size_type npos; //!< Value used to represent 'not found' conditions and 'all code points' etc. - -private: - /************************************************************************* - Implementation data - *************************************************************************/ - size_type d_cplength; //!< holds length of string in code points (not including null termination) - size_type d_reserve; //!< code point reserve size (currently allocated buffer size in code points). - - mutable utf8* d_encodedbuff; //!< holds string data encoded as utf8 (generated only by calls to c_str() and data()) - mutable size_type d_encodeddatlen; //!< holds length of encoded data (in case it's smaller than buffer). - mutable size_type d_encodedbufflen; //!< length of above buffer (since buffer can be bigger then the data it holds to save re-allocations). - - utf32 d_quickbuff[STR_QUICKBUFF_SIZE]; //!< This is a integrated 'quick' buffer to save allocations for smallish strings - utf32* d_buffer; //!< Pointer the the main buffer memory. This is only valid when quick-buffer is not being used - -public: - /************************************************************************* - Iterator Classes - *************************************************************************/ - /*! - \brief - Constant forward iterator class for String objects - */ -#if defined(_MSC_VER) && (_MSC_VER <= 1200) - class const_iterator : public std::iterator -#else - class const_iterator : public std::iterator -#endif - { - - public: - ////////////////////////////////////////////////////////////////////////// - // data - ////////////////////////////////////////////////////////////////////////// - const utf32* d_ptr; - - - ////////////////////////////////////////////////////////////////////////// - // Methods - ////////////////////////////////////////////////////////////////////////// - const_iterator(void) - { - d_ptr = 0; - } - const_iterator(const_pointer ptr) - { - d_ptr = ptr; - } - - const_reference operator*() const - { - return *d_ptr; - } - -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# pragma warning (push) -# pragma warning (disable : 4284) -#endif - const_pointer operator->() const - { - return &**this; - } - -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# pragma warning (pop) -#endif - - const_iterator& operator++() - { - ++d_ptr; - return *this; - } - - const_iterator operator++(int) - { - const_iterator temp = *this; - ++*this; - return temp; - } - - const_iterator& operator--() - { - --d_ptr; - return *this; - } - - const_iterator operator--(int) - { - const_iterator temp = *this; - --*this; - return temp; - } - - const_iterator& operator+=(difference_type offset) - { - d_ptr += offset; - return *this; - } - - const_iterator operator+(difference_type offset) const - { - const_iterator temp = *this; - return temp += offset; - } - - const_iterator& operator-=(difference_type offset) - { - return *this += -offset; - } - - const_iterator operator-(difference_type offset) const - { - const_iterator temp = *this; - return temp -= offset; - } - - difference_type operator-(const const_iterator& iter) const - { - return d_ptr - iter.d_ptr; - } - - const_reference operator[](difference_type offset) const - { - return *(*this + offset); - } - - bool operator==(const const_iterator& iter) const - { - return d_ptr == iter.d_ptr; - } - - bool operator!=(const const_iterator& iter) const - { - return !(*this == iter); - } - - bool operator<(const const_iterator& iter) const - { - return d_ptr < iter.d_ptr; - } - - bool operator>(const const_iterator& iter) const - { - return (!(iter < *this)); - } - - bool operator<=(const const_iterator& iter) const - { - return (!(iter < *this)); - } - - bool operator>=(const const_iterator& iter) const - { - return (!(*this < iter)); - } - - friend const_iterator operator+(difference_type offset, const const_iterator& iter) - { - return iter + offset; - } - - }; - - /*! - \brief - Forward iterator class for String objects - */ - class iterator : public const_iterator - { - public: - iterator(void) {} - iterator(pointer ptr) : const_iterator(ptr) {} - - - reference operator*() const - { - return ((reference)**(const_iterator *)this); - } - -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# pragma warning (push) -# pragma warning (disable : 4284) -#endif - - pointer operator->() const - { - return &**this; - } - -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -# pragma warning (pop) -#endif - - iterator& operator++() - { - ++this->d_ptr; - return *this; - } - - iterator operator++(int) - { - iterator temp = *this; - ++*this; - return temp; - } - - iterator& operator--() - { - --this->d_ptr; - return *this; - } - - iterator operator--(int) - { - iterator temp = *this; - --*this; - return temp; - } - - iterator& operator+=(difference_type offset) - { - this->d_ptr += offset; - return *this; - } - - iterator operator+(difference_type offset) const - { - iterator temp = *this; - return temp += offset; - } - - iterator& operator-=(difference_type offset) - { - return *this += -offset; - } - - iterator operator-(difference_type offset) const - { - iterator temp = *this; - return temp -= offset; - } - - difference_type operator-(const const_iterator& iter) const - { - return ((const_iterator)*this - iter); - } - - reference operator[](difference_type offset) const - { - return *(*this + offset); - } - - friend iterator operator+(difference_type offset, const iterator& iter) - { - return iter + offset; - } - - }; - - /*! - \brief - Constant reverse iterator class for String objects - */ -#if defined(_MSC_VER) && ((_MSC_VER <= 1200) || ((_MSC_VER <= 1300) && defined(_STLPORT_VERSION))) - typedef std::reverse_iterator const_reverse_iterator; -#else - typedef std::reverse_iterator const_reverse_iterator; -#endif - - /*! - \brief - Reverse iterator class for String objects - */ -#if defined(_MSC_VER) && ((_MSC_VER <= 1200) || ((_MSC_VER <= 1300) && defined(_STLPORT_VERSION))) - typedef std::reverse_iterator reverse_iterator; -#else - typedef std::reverse_iterator reverse_iterator; -#endif - -public: - /*! - \brief - Functor that can be used as comparator in a std::map with String keys. - It's faster than using the default, but the map will no longer be sorted alphabetically. - */ - struct FastLessCompare - { - bool operator() (const String& a, const String& b) const - { - const size_t la = a.length(); - const size_t lb = b.length(); - if (la == lb) - return (memcmp(a.ptr(), b.ptr(), la*sizeof(utf32)) < 0); - return (la < lb); - } - }; - -public: - ////////////////////////////////////////////////////////////////////////// - // Default Construction and Destructor - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Constructs an empty string - */ - String(void) - { - init(); - } - - /*! - \brief - Destructor for String objects - */ - ~String(void); - - ////////////////////////////////////////////////////////////////////////// - // Construction via CEGUI::String - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Copy constructor - Creates a new string with the same value as \a str - - \param str - String object used to initialise the newly created string - - \return - Nothing - */ - String(const String& str) - { - init(); - assign(str); - } - - - /*! - \brief - Constructs a new string initialised with code points from another String object. - - \param str - String object used to initialise the newly created string - - \param str_idx - Starting code-point of \a str to be used when initialising the new String - - \param str_num - Maximum number of code points from \a str that are to be assigned to the new String - - \return - Nothing - */ - String(const String& str, size_type str_idx, size_type str_num = npos) - { - init(); - assign(str, str_idx, str_num); - } - - ////////////////////////////////////////////////////////////////////////// - // Construction via std::string - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Constructs a new string and initialises it using the std::string std_str - - \param std_str - The std::string object that is to be used to initialise the new String object. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - String(const std::string& std_str) - { - init(); - assign(std_str); - } - - /*! - \brief - Constructs a new string initialised with characters from the given std::string object. - - \param std_str - std::string object used to initialise the newly created string - - \param str_idx - Starting character of \a std_str to be used when initialising the new String - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param str_num - Maximum number of characters from \a std_str that are to be assigned to the new String - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - String(const std::string& std_str, size_type str_idx, size_type str_num = npos) - { - init(); - assign(std_str, str_idx, str_num); - } - - - ////////////////////////////////////////////////////////////////////////// - // Construction via UTF-8 stream (for straight ASCII use, only codes 0x00 - 0x7f are valid) - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Constructs a new String object and initialise it using the provided utf8 encoded string buffer. - - \param utf8_str - Pointer to a buffer containing a null-terminated Unicode string encoded as utf8 data. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - String(const utf8* utf8_str) - { - init(); - assign(utf8_str); - } - - /*! - \brief - Constructs a new String object and initialise it using the provided utf8 encoded string buffer. - - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param utf8_str - Pointer to a buffer containing Unicode string data encoded as utf8. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param chars_len - Length of the provided utf8 string in code units (not code-points). - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - String(const utf8* utf8_str, size_type chars_len) - { - init(); - assign(utf8_str, chars_len); - } - - ////////////////////////////////////////////////////////////////////////// - // Construction via code-point (using a UTF-32 code unit) - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Constructs a new String that is initialised with the specified code point - - \param num - The number of times \a code_point is to be put into new String object - - \param code_point - The Unicode code point to be used when initialising the String object - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - String(size_type num, utf32 code_point) - { - init(); - assign(num, code_point); - } - - ////////////////////////////////////////////////////////////////////////// - // Construction via iterator - ////////////////////////////////////////////////////////////////////////// - // Create string with characters in the range [beg, end) - /*! - \brief - Construct a new string object and initialise it with code-points from the range [beg, end). - - \param beg - Iterator describing the start of the data to be used when initialising the String object - - \param end - Iterator describing the (exclusive) end of the data to be used when initialising the String object - - \return - Nothing - */ - String(const_iterator iter_beg, const_iterator iter_end) - { - init(); - append(iter_beg, iter_end); - } - - - ////////////////////////////////////////////////////////////////////////// - // Construction via c-string - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Constructs a new String object and initialise it using the provided c-string. - - \param c_str - Pointer to a c-string. - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - String(const char* cstr) - { - init(); - assign(cstr); - } - - /*! - \brief - Constructs a new String object and initialise it using characters from the provided char array. - - \param chars - char array. - - \param chars_len - Number of chars from the array to be used. - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ -#if 0 // Disabled as messes up utf8 characters - String(const char* chars, size_type chars_len) - { - init(); - assign(chars, chars_len); - } -#endif - - ////////////////////////////////////////////////////////////////////////// - // Size operations - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Returns the size of the String in code points - - \return - Number of code points currently in the String - */ - size_type size(void) const - { - return d_cplength; - } - - /*! - \brief - Returns the size of the String in code points - - \return - Number of code points currently in the String - */ - size_type length(void) const - { - return d_cplength; - } - - /*! - \brief - Returns true if the String is empty - - \return - true if the String is empty, else false. - */ - bool empty(void) const - { - return (d_cplength == 0); - } - - /*! - \brief - Returns the maximum size of a String. - - Any operation that would result in a String that is larger than this value will throw the std::length_error exception. - - \return - The maximum number of code points that a string can contain - */ - static size_type max_size(void) - { - return (((size_type)-1) / sizeof(utf32)); - } - - ////////////////////////////////////////////////////////////////////////// - // Capacity Operations - ////////////////////////////////////////////////////////////////////////// - // return the number of code points the string could hold without re-allocation - // (due to internal encoding this will always report the figure for worst-case encoding, and could even be < size()!) - /*! - \brief - Return the number of code points that the String could hold before a re-allocation would be required. - - \return - Size of the current reserve buffer. This is the maximum number of code points the String could hold before a buffer - re-allocation would be required - */ - size_type capacity(void) const - { - return d_reserve - 1; - } - - // reserve internal memory for at-least 'num' code-points (characters). if num is 0, request is shrink-to-fit. - /*! - \brief - Specifies the amount of reserve capacity to allocate. - - \param num - The number of code points to allocate space for. If \a num is larger that the current reserve, then a re-allocation will occur. If - \a num is smaller than the current reserve (but not 0) the buffer may be shrunk to the larger of the specified number, or the current - String size (operation is currently not implemented). If \a num is 0, then the buffer is re-allocated to fit the current String size. - - \return - Nothing - - \exception std::length_error Thrown if resulting String object would be too big. - */ - void reserve(size_type num = 0) - { - if (num == 0) - trim(); - else - grow(num); - } - - ////////////////////////////////////////////////////////////////////////// - // Comparisons - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Compares this String with the String 'str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param str - The String object that is to compared with this String. - - \return - - 0 if the String objects are equal - - <0 if this String is lexicographically smaller than \a str - - >0 if this String is lexicographically greater than \a str - */ - int compare(const String& str) const - { - return compare(0, d_cplength, str); - } - - /*! - \brief - Compares code points from this String with code points from the String 'str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param idx - Index of the first code point from this String to consider. - - \param len - Maximum number of code points from this String to consider. - - \param str - The String object that is to compared with this String. - - \param str_idx - Index of the first code point from String \a str to consider. - - \param str_len - Maximum number of code points from String \a str to consider - - \return - - 0 if the specified sub-strings are equal - - <0 if specified sub-strings are lexicographically smaller than \a str - - >0 if specified sub-strings are lexicographically greater than \a str - - \exception std::out_of_range Thrown if either \a idx or \a str_idx are invalid. - */ - int compare(size_type idx, size_type len, const String& str, size_type str_idx = 0, size_type str_len = npos) const - { - if ((d_cplength < idx) || (str.d_cplength < str_idx)) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if ((len == npos) || (idx + len > d_cplength)) - len = d_cplength - idx; - - if ((str_len == npos) || (str_idx + str_len > str.d_cplength)) - str_len = str.d_cplength - str_idx; - - int val = (len == 0) ? 0 : utf32_comp_utf32(&ptr()[idx], &str.ptr()[str_idx], (len < str_len) ? len : str_len); - - return (val != 0) ? ((val < 0) ? -1 : 1) : (len < str_len) ? -1 : (len == str_len) ? 0 : 1; - } - - - /*! - \brief - Compares this String with the std::string 'std_str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param std_str - The std::string object that is to compared with this String. - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \return - - 0 if the string objects are equal - - <0 if this string is lexicographically smaller than \a std_str - - >0 if this string is lexicographically greater than \a std_str - */ - int compare(const std::string& std_str) const - { - return compare(0, d_cplength, std_str); - } - - - /*! - \brief - Compares code points from this String with code points from the std::string 'std_str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param idx - Index of the first code point from this String to consider. - - \param len - Maximum number of code points from this String to consider. - - \param std_str - The std::string object that is to compared with this String. - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \param str_idx - Index of the first character from std::string \a std_str to consider. - - \param str_len - Maximum number of characters from std::string \a std_str to consider - - \return - - 0 if the specified sub-strings are equal - - <0 if specified sub-strings are lexicographically smaller than \a std_str - - >0 if specified sub-strings are lexicographically greater than \a std_str - - \exception std::out_of_range Thrown if either \a idx or \a str_idx are invalid. - */ - int compare(size_type idx, size_type len, const std::string& std_str, size_type str_idx = 0, size_type str_len = npos) const - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (std_str.size() < str_idx) - throw(std::out_of_range("Index is out of range for std::string")); - - if ((len == npos) || (idx + len > d_cplength)) - len = d_cplength - idx; - - if ((str_len == npos) || (str_idx + str_len > std_str.size())) - str_len = (size_type)std_str.size() - str_idx; - - int val = (len == 0) ? 0 : utf32_comp_char(&ptr()[idx], &std_str.c_str()[str_idx], (len < str_len) ? len : str_len); - - return (val != 0) ? ((val < 0) ? -1 : 1) : (len < str_len) ? -1 : (len == str_len) ? 0 : 1; - } - - - /*! - \brief - Compares this String with the null-terminated utf8 encoded 'utf8_str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param utf8_str - The buffer containing valid Unicode data encoded as utf8 that is to compared with this String. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - - 0 if the strings are equal - - <0 if this string is lexicographically smaller than \a utf8_str - - >0 if this string is lexicographically greater than \a utf8_str - */ - int compare(const utf8* utf8_str) const - { - return compare(0, d_cplength, utf8_str, encoded_size(utf8_str)); - } - - - /*! - \brief - Compares code points from this String with the null-terminated utf8 encoded 'utf8_str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param idx - Index of the first code point from this String to consider. - - \param len - Maximum number of code points from this String to consider. - - \param utf8_str - The buffer containing valid Unicode data encoded as utf8 that is to compared with this String. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - - 0 if the specified sub-strings are equal - - <0 if specified sub-strings are lexicographically smaller than \a utf8_str - - >0 if specified sub-strings are lexicographically greater than \a utf8_str - - \exception std::out_of_range Thrown if \a idx is invalid. - */ - int compare(size_type idx, size_type len, const utf8* utf8_str) const - { - return compare(idx, len, utf8_str, encoded_size(utf8_str)); - } - - /*! - \brief - Compares code points from this String with the utf8 encoded data in buffer 'utf8_str'. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param idx - Index of the first code point from this String to consider. - - \param len - Maximum number of code points from this String to consider. - - \param utf8_str - The buffer containing valid Unicode data encoded as utf8 that is to compared with this String. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param str_cplen - The number of encoded code points in the buffer \a utf8_str (this is not the same as the number of code units). - - \return - - 0 if the specified sub-strings are equal - - <0 if specified sub-strings are lexicographically smaller than \a utf8_str - - >0 if specified sub-strings are lexicographically greater than \a utf8_str - - \exception std::out_of_range Thrown if \a idx is invalid. - \exception std::length_error Thrown if \a str_cplen is set to npos. - */ - int compare(size_type idx, size_type len, const utf8* utf8_str, size_type str_cplen) const - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (str_cplen == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - if ((len == npos) || (idx + len > d_cplength)) - len = d_cplength - idx; - - int val = (len == 0) ? 0 : utf32_comp_utf8(&ptr()[idx], utf8_str, (len < str_cplen) ? len : str_cplen); - - return (val != 0) ? ((val < 0) ? -1 : 1) : (len < str_cplen) ? -1 : (len == str_cplen) ? 0 : 1; - } - - - /*! - \brief - Compares this String with the given c-string. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param c_str - The c-string that is to compared with this String. - - \return - - 0 if the strings are equal - - <0 if this string is lexicographically smaller than \a c_str - - >0 if this string is lexicographically greater than \a c_str - */ - int compare(const char* cstr) const - { - return compare(0, d_cplength, cstr, strlen(cstr)); - } - - - /*! - \brief - Compares code points from this String with the given c-string. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param idx - Index of the first code point from this String to consider. - - \param len - Maximum number of code points from this String to consider. - - \param c_str - The c-string that is to compared with this String. - - \return - - 0 if the specified sub-strings are equal - - <0 if specified sub-strings are lexicographically smaller than \a c_str - - >0 if specified sub-strings are lexicographically greater than \a c_str - - \exception std::out_of_range Thrown if \a idx is invalid. - */ - int compare(size_type idx, size_type len, const char* cstr) const - { - return compare(idx, len, cstr, strlen(cstr)); - } - - - /*! - \brief - Compares code points from this String with chars in the given char array. - - \note - This does currently not properly consider Unicode and / or the system locale. - - \param idx - Index of the first code point from this String to consider. - - \param len - Maximum number of code points from this String to consider. - - \param chars - The array containing the chars that are to compared with this String. - - \param chars_len - The number of chars in the array. - - \return - - 0 if the specified sub-strings are equal - - <0 if specified sub-strings are lexicographically smaller than \a chars - - >0 if specified sub-strings are lexicographically greater than \a chars - - \exception std::out_of_range Thrown if \a idx is invalid. - \exception std::length_error Thrown if \a chars_len is set to npos. - */ - int compare(size_type idx, size_type len, const char* chars, size_type chars_len) const - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if ((len == npos) || (idx + len > d_cplength)) - len = d_cplength - idx; - - int val = (len == 0) ? 0 : utf32_comp_char(&ptr()[idx], chars, (len < chars_len) ? len : chars_len); - - return (val != 0) ? ((val < 0) ? -1 : 1) : (len < chars_len) ? -1 : (len == chars_len) ? 0 : 1; - } - - - ////////////////////////////////////////////////////////////////////////// - // Character access - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Returns the code point at the given index. - - \param idx - Zero based index of the code point to be returned. - - \note - - For constant strings length()/size() provide a valid index and will access the default utf32 value. - - For non-constant strings length()/size() is an invalid index, and acceesing (especially writing) this index could cause string corruption. - - \return - The utf32 code point at the given index within the String. - */ - reference operator[](size_type idx) - { - return (ptr()[idx]); - } - - /*! - \brief - Returns the code point at the given index. - - \param idx - Zero based index of the code point to be returned. - - \note - - For constant strings length()/size() provide a valid index and will access the default utf32 value. - - For non-constant strings length()/size() is an invalid index, and acceesing (especially writing) this index could cause string corruption. - - \return - The utf32 code point at the given index within the String. - */ - value_type operator[](size_type idx) const - { - return ptr()[idx]; - } - - /*! - \brief - Returns the code point at the given index. - - \param idx - Zero based index of the code point to be returned. - - \return - The utf32 code point at the given index within the String. - - \exception std::out_of_range Thrown if \a idx is >= length(). - */ - reference at(size_type idx) - { - if (d_cplength <= idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - return ptr()[idx]; - } - - /*! - \brief - Returns the code point at the given index. - - \param idx - Zero based index of the code point to be returned. - - \return - The utf32 code point at the given index within the String. - - \exception std::out_of_range Thrown if \a idx is >= length(). - */ - const_reference at(size_type idx) const - { - if (d_cplength <= idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - return ptr()[idx]; - } - - - ////////////////////////////////////////////////////////////////////////// - // C-Strings and arrays - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Returns contents of the String as a null terminated string of utf8 encoded data. - - \return - Pointer to a char buffer containing the contents of the String encoded as null-terminated utf8 data. - - \note - The buffer returned from this function is owned by the String object. - - \note - Any function that modifies the String data will invalidate the buffer returned by this call. - */ - const char* c_str(void) const - { - return (const char*)build_utf8_buff(); - } - - std::wstring c_wstring ( void ) const; - - /*! - \brief - Returns contents of the String as utf8 encoded data. - - \return - Pointer to a buffer containing the contents of the String encoded utf8 data. - - \note - The buffer returned from this function is owned by the String object. - - \note - Any function that modifies the String data will invalidate the buffer returned by this call. - */ - const utf8* data(void) const - { - return build_utf8_buff(); - } - - /*! - \brief - Returns a pointer to the buffer in use. - */ - utf32* ptr(void) - { - return (d_reserve > STR_QUICKBUFF_SIZE) ? d_buffer : d_quickbuff; - } - - /*! - \brief - Returns a pointer to the buffer in use. (const version) - */ - const utf32* ptr(void) const - { - return (d_reserve > STR_QUICKBUFF_SIZE) ? d_buffer : d_quickbuff; - } - - // copy, at most, 'len' code-points of the string, begining with code-point 'idx', into the array 'buf' as valid utf8 encoded data - // return number of utf8 code units placed into the buffer - /*! - \brief - Copies an area of the String into the provided buffer as encoded utf8 data. - - \param buf - Pointer to a buffer that is to receive the encoded data (this must be big enough to hold the encoded data) - - \param len - Maximum number of code points from the String that should be encoded into the buffer - - \param idx - Index of the first code point to be encoded into the buffer - - \return - The number of utf8 encoded code units transferred to the buffer. - - \note A code unit does not equal a code point. A utf32 code point, when encoded as utf8, can occupy between 1 and 4 code units. - - \exception std::out_of_range Thrown if \a idx was invalid for this String. - */ - size_type copy(utf8* buf, size_type len = npos, size_type idx = 0) const - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (len == npos) - len = d_cplength; - - return encode(&ptr()[idx], buf, npos, len); - } - - ////////////////////////////////////////////////////////////////////////// - // UTF8 Encoding length information - ////////////////////////////////////////////////////////////////////////// - // return the number of bytes required to hold 'num' code-points, starting at code-point 'idx', of the the string when encoded as utf8 data. - /*! - \brief - Return the number of utf8 code units required to hold an area of the String when encoded as utf8 data - - \param num - Maximum number of code points to consider when calculating utf8 encoded size. - - \param idx - Index of the first code point to consider when calculating the utf8 encoded size - - \return - The number of utf8 code units (bytes) required to hold the specified sub-string when encoded as utf8 data. - - \exception std::out_of_range Thrown if \a idx was invalid for this String. - */ - size_type utf8_stream_len(size_type num = npos, size_type idx = 0) const - { - using namespace std; - - if (d_cplength < idx) - throw(out_of_range("Index was out of range for CEGUI::String object")); - - size_type maxlen = d_cplength - idx; - - return encoded_size(&ptr()[idx], ceguimin(num, maxlen)); - } - - ////////////////////////////////////////////////////////////////////////// - // Assignment Functions - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Assign the value of String \a str to this String - - \param str - String object containing the string value to be assigned. - - \return - This String after the assignment has happened - */ - String& operator=(const String& str) - { - return assign(str); - } - - /*! - \brief - Assign a sub-string of String \a str to this String - - \param str - String object containing the string data to be assigned. - - \param str_idx - Index of the first code point in \a str that is to be assigned - - \param str_num - Maximum number of code points from \a str that are be be assigned - - \return - This String after the assignment has happened - - \exception std::out_of_range Thrown if str_idx is invalid for \a str - */ - String& assign(const String& str, size_type str_idx = 0, size_type str_num = npos) - { - if (str.d_cplength < str_idx) - throw(std::out_of_range("Index was out of range for CEGUI::String object")); - - if ((str_num == npos) || (str_num > str.d_cplength - str_idx)) - str_num = str.d_cplength - str_idx; - - grow(str_num); - setlen(str_num); - memcpy(ptr(), &str.ptr()[str_idx], str_num * sizeof(utf32)); - - return *this; - } - - /*! - \brief - Assign the value of std::string \a std_str to this String - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param std_str - std::string object containing the string value to be assigned. - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& operator=(const std::string& std_str) - { - return assign(std_str); - } - - /*! - \brief - Assign a sub-string of std::string \a std_str to this String - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param std_str - std::string object containing the string value to be assigned. - - \param str_idx - Index of the first character of \a std_str to be assigned - - \param str_num - Maximum number of characters from \a std_str to be assigned - - \return - This String after the assignment has happened - - \exception std::out_of_range Thrown if \a str_idx is invalid for \a std_str - \exception std::length_error Thrown if the resulting String would have been too large. - */ - - String& assign(const std::string& std_str) - { - assign(std_str.c_str()); - return *this; - } - -#if 0 // Disabled as messes up utf8 characters - String& assign(const std::string& std_str, size_type str_idx = 0, size_type str_num = npos) - { - if (std_str.size() < str_idx) - throw(std::out_of_range("Index was out of range for std::string object")); - - if ((str_num == npos) || (str_num > (size_type)std_str.size() - str_idx)) - str_num = (size_type)std_str.size() - str_idx; - - grow(str_num); - setlen(str_num); - - while(str_num--) - { - ((*this)[str_num]) = static_cast(static_cast(std_str[str_num + str_idx])); - } - - return *this; - } -#endif - /*! - \brief - Assign to this String the string value represented by the given null-terminated utf8 encoded data - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param utf8_str - Buffer containing valid null-terminated utf8 encoded data - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& operator=(const utf8* utf8_str) - { - return assign(utf8_str, utf_length(utf8_str)); - } - - /*! - \brief - Assign to this String the string value represented by the given null-terminated utf8 encoded data - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param utf8_str - Buffer containing valid null-terminated utf8 encoded data - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& assign(const utf8* utf8_str) - { - return assign(utf8_str, utf_length(utf8_str)); - } - - /*! - \brief - Assign to this String the string value represented by the given utf8 encoded data - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param utf8_str - Buffer containing valid utf8 encoded data - - \param str_num - Number of code units (not code points) in the buffer pointed to by \a utf8_str - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large, or if str_num is 'npos'. - */ - String& assign(const utf8* utf8_str, size_type str_num) - { - if (str_num == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - size_type enc_sze = encoded_size(utf8_str, str_num); - - grow(enc_sze); - encode(utf8_str, ptr(), d_reserve, str_num); - setlen(enc_sze); - return *this; - } - - /*! - \brief - Assigns the specified utf32 code point to this String. Result is always a String 1 code point in length. - - \param code_point - Valid utf32 Unicode code point to be assigned to the string - - \return - This String after assignment - */ - String& operator=(utf32 code_point) - { - return assign(1, code_point); - } - - /*! - \brief - Assigns the specified code point repeatedly to the String - - \param num - The number of times to assign the code point - - \param code_point - Valid utf32 Unicode code point to be assigned to the string - - \return - This String after assignment. - - \exception std::length_error Thrown if \a num was 'npos' - */ - String& assign(size_type num, utf32 code_point) - { - if (num == npos) - throw(std::length_error("Code point count can not be 'npos'")); - - grow(num); - setlen(num); - utf32* p = ptr(); - - while(num--) - *p++ = code_point; - - return *this; - } - - - /*! - \brief - Assign to this String the given C-string. - - \param c_str - Pointer to a valid C style string. - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& operator=(const char* cstr) - { - // Redirected to preserve utf8 characters - return assign((const utf8*)cstr); - } - - - /*! - \brief - Assign to this String the given C-string. - - \param c_str - Pointer to a valid C style string. - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& assign(const char* cstr) - { - // Redirected to preserve utf8 characters - return assign((const utf8*)cstr); - } - - - /*! - \brief - Assign to this String a number of chars from a char array. - - \param chars - char array. - - \param chars_len - Number of chars to be assigned. - - \return - This String after the assignment has happened - - \exception std::length_error Thrown if the resulting String would have been too large. - */ -#if 0 // Disabled as messes up utf8 characters - String& assign(const char* chars, size_type chars_len) - { - grow(chars_len); - utf32* pt = ptr(); - - for (size_type i = 0; i < chars_len; ++i) - { - *pt++ = static_cast(static_cast(*chars++)); - } - - setlen(chars_len); - return *this; - } -#endif - - /*! - \brief - Swaps the value of this String with the given String \a str - - \param str - String object whos value is to be swapped with this String. - - \return - Nothing - */ - void swap(String& str) - { - size_type temp_len = d_cplength; - d_cplength = str.d_cplength; - str.d_cplength = temp_len; - - size_type temp_res = d_reserve; - d_reserve = str.d_reserve; - str.d_reserve = temp_res; - - utf32* temp_buf = d_buffer; - d_buffer = str.d_buffer; - str.d_buffer = temp_buf; - - // see if we need to swap 'quick buffer' data - if (temp_res <= STR_QUICKBUFF_SIZE) - { - utf32 temp_qbf[STR_QUICKBUFF_SIZE]; - - memcpy(temp_qbf, d_quickbuff, STR_QUICKBUFF_SIZE * sizeof(utf32)); - memcpy(d_quickbuff, str.d_quickbuff, STR_QUICKBUFF_SIZE * sizeof(utf32)); - memcpy(str.d_quickbuff, temp_qbf, STR_QUICKBUFF_SIZE * sizeof(utf32)); - } - - } - - ////////////////////////////////////////////////////////////////////////// - // Appending Functions - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Appends the String \a str - - \param str - String object that is to be appended - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large. - */ - String& operator+=(const String& str) - { - return append(str); - } - - /*! - \brief - Appends a sub-string of the String \a str - - \param str - String object containing data to be appended - - \param str_idx - Index of the first code point to be appended - - \param str_num - Maximum number of code points to be appended - - \return - This String after the append operation - - \exception std::out_of_range Thrown if \a str_idx is invalid for \a str. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& append(const String& str, size_type str_idx = 0, size_type str_num = npos) - { - if (str.d_cplength < str_idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if ((str_num == npos) || (str_num > str.d_cplength - str_idx)) - str_num = str.d_cplength - str_idx; - - grow(d_cplength + str_num); - memcpy(&ptr()[d_cplength], &str.ptr()[str_idx], str_num * sizeof(utf32)); - setlen(d_cplength + str_num); - return *this; - } - - - /*! - \brief - Appends the std::string \a std_str - - \param std_str - std::string object that is to be appended - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large. - */ - String& operator+=(const std::string& std_str) - { - return append(std_str); - } - - /*! - \brief - Appends a sub-string of the std::string \a std_str - - \param std_str - std::string object containing data to be appended - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param str_idx - Index of the first character to be appended - - \param str_num - Maximum number of characters to be appended - - \return - This String after the append operation - - \exception std::out_of_range Thrown if \a str_idx is invalid for \a std_str. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& append(const std::string& std_str, size_type str_idx = 0, size_type str_num = npos) - { - if (std_str.size() < str_idx) - throw(std::out_of_range("Index is out of range for std::string")); - - if ((str_num == npos) || (str_num > (size_type)std_str.size() - str_idx)) - str_num = (size_type)std_str.size() - str_idx; - - size_type newsze = d_cplength + str_num; - - grow(newsze); - utf32* pt = &ptr()[newsze-1]; - - while(str_num--) - *pt-- = static_cast(static_cast(std_str[str_num])); - - setlen(newsze); - return *this; - } - - - /*! - \brief - Appends to the String the null-terminated utf8 encoded data in the buffer utf8_str. - - \param utf8_str - buffer holding the null-terminated utf8 encoded data that is to be appended - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large. - */ - String& operator+=(const utf8* utf8_str) - { - return append(utf8_str, utf_length(utf8_str)); - } - - /*! - \brief - Appends to the String the null-terminated utf8 encoded data in the buffer utf8_str. - - \param utf8_str - Buffer holding the null-terminated utf8 encoded data that is to be appended - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large. - */ - String& append(const utf8* utf8_str) - { - return append(utf8_str, utf_length(utf8_str)); - } - - - /*! - \brief - Appends to the String the utf8 encoded data in the buffer utf8_str. - - \param utf8_str - Buffer holding the utf8 encoded data that is to be appended - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param len - Number of code units (not code points) in the buffer to be appended - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large, or if \a len was 'npos' - */ - String& append(const utf8* utf8_str, size_type len) - { - if (len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - size_type encsz = encoded_size(utf8_str, len); - size_type newsz = d_cplength + encsz; - - grow(newsz); - encode(utf8_str, &ptr()[d_cplength], encsz, len); - setlen(newsz); - - return *this; - } - - - /*! - \brief - Appends a single code point to the string - - \param code_point - utf32 Unicode code point that is to be appended - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too long. - */ - String& operator+=(utf32 code_point) - { - return append(1, code_point); - } - - /*! - \brief - Appends a single code point multiple times to the string - - \param num - Number of copies of the code point to be appended - - \param code_point - utf32 Unicode code point that is to be appended - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too long, or if \a num was 'npos'. - */ - String& append(size_type num, utf32 code_point) - { - if (num == npos) - throw(std::length_error("Code point count can not be 'npos'")); - - size_type newsz = d_cplength + num; - grow(newsz); - - utf32* p = &ptr()[d_cplength]; - - while(num--) - *p++ = code_point; - - setlen(newsz); - - return *this; - } - - /*! - \brief - Appends a single code point to the string - - \param code_point - utf32 Unicode code point that is to be appended - - \return - Nothing - - \exception std::length_error Thrown if resulting String would be too long. - */ - void push_back(utf32 code_point) - { - append(1, code_point); - } - - /*! - \brief - Appends the code points in the reange [beg, end) - - \param beg - Iterator describing the start of the range to be appended - - \param end - Iterator describing the (exclusive) end of the range to be appended. - - \return - This String after the append operation - - \exception std::length_error Thrown if the resulting string would be too large. - */ - String& append(const_iterator iter_beg, const_iterator iter_end) - { - return replace(end(), end(), iter_beg, iter_end); - } - - - /*! - \brief - Appends to the String the given c-string. - - \param c_str - c-string that is to be appended. - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large. - */ - String& operator+=(const char* cstr) - { - return append(cstr, strlen(cstr)); - } - - - /*! - \brief - Appends to the String the given c-string. - - \param c_str - c-string that is to be appended. - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large. - */ - String& append(const char* cstr) - { - return append(cstr, strlen(cstr)); - } - - - /*! - \brief - Appends to the String chars from the given char array. - - \param chars - char array holding the chars that are to be appended - - \param chars_len - Number of chars to be appended - - \return - This String after the append operation - - \exception std::length_error Thrown if resulting String would be too large, or if \a chars_len was 'npos' - */ - String& append(const char* chars, size_type chars_len) - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - size_type newsz = d_cplength + chars_len; - - grow(newsz); - - utf32* pt = &ptr()[newsz-1]; - - while(chars_len--) - *pt-- = static_cast(static_cast(chars[chars_len])); - - setlen(newsz); - - return *this; - } - - - ////////////////////////////////////////////////////////////////////////// - // Insertion Functions - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Inserts the given String object at the specified position. - - \param idx - Index where the string is to be inserted. - - \param str - String object that is to be inserted. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& insert(size_type idx, const String& str) - { - return insert(idx, str, 0, npos); - } - - /*! - \brief - Inserts a sub-string of the given String object at the specified position. - - \param idx - Index where the string is to be inserted. - - \param str - String object containing data to be inserted. - - \param str_idx - Index of the first code point from \a str to be inserted. - - \param str_num - Maximum number of code points from \a str to be inserted. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx or \a str_idx are out of range. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& insert(size_type idx, const String& str, size_type str_idx, size_type str_num) - { - if ((d_cplength < idx) || (str.d_cplength < str_idx)) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if ((str_num == npos) || (str_num > str.d_cplength - str_idx)) - str_num = str.d_cplength - str_idx; - - size_type newsz = d_cplength + str_num; - grow(newsz); - memmove(&ptr()[idx + str_num], &ptr()[idx], (d_cplength - idx) * sizeof(utf32)); - memcpy(&ptr()[idx], &str.ptr()[str_idx], str_num * sizeof(utf32)); - setlen(newsz); - - return *this; - } - - /*! - \brief - Inserts the given std::string object at the specified position. - - \param idx - Index where the std::string is to be inserted. - - \param std_str - std::string object that is to be inserted. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& insert(size_type idx, const std::string& std_str) - { - return insert(idx, std_str, 0, npos); - } - - /*! - \brief - Inserts a sub-string of the given std::string object at the specified position. - - \param idx - Index where the string is to be inserted. - - \param std_str - std::string object containing data to be inserted. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param str_idx - Index of the first character from \a std_str to be inserted. - - \param str_num - Maximum number of characters from \a str to be inserted. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx or \a str_idx are out of range. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& insert(size_type idx, const std::string& std_str, size_type str_idx, size_type str_num) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (std_str.size() < str_idx) - throw(std::out_of_range("Index is out of range for std::string")); - - if ((str_num == npos) || (str_num > (size_type)std_str.size() - str_idx)) - str_num = (size_type)std_str.size() - str_idx; - - size_type newsz = d_cplength + str_num; - grow(newsz); - - memmove(&ptr()[idx + str_num], &ptr()[idx], (d_cplength - idx) * sizeof(utf32)); - - utf32* pt = &ptr()[idx + str_num - 1]; - - while(str_num--) - *pt-- = static_cast(static_cast(std_str[str_idx + str_num])); - - setlen(newsz); - - return *this; - } - - /*! - \brief - Inserts the given null-terminated utf8 encoded data at the specified position. - - \param idx - Index where the data is to be inserted. - - \param utf8_str - Buffer containing the null-terminated utf8 encoded data that is to be inserted. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& insert(size_type idx, const utf8* utf8_str) - { - return insert(idx, utf8_str, utf_length(utf8_str)); - } - - /*! - \brief - Inserts the given utf8 encoded data at the specified position. - - \param idx - Index where the data is to be inserted. - - \param utf8_str - Buffer containing the utf8 encoded data that is to be inserted. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param len - Length of the data to be inserted in uf8 code units (not code points) - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large, or if \a len is 'npos' - */ - String& insert(size_type idx, const utf8* utf8_str, size_type len) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (len == npos) - throw(std::length_error("Length of utf8 encoded string can not be 'npos'")); - - size_type encsz = encoded_size(utf8_str, len); - size_type newsz = d_cplength + encsz; - - grow(newsz); - memmove(&ptr()[idx + encsz], &ptr()[idx], (d_cplength - idx) * sizeof(utf32)); - encode(utf8_str, &ptr()[idx], encsz, len); - setlen(newsz); - - return *this; - } - - /*! - \brief - Inserts a code point multiple times into the String - - \param idx - Index where the code point(s) are to be inserted - - \param num - The number of times to insert the code point - - \param code_point - The utf32 code point that is to be inserted - - \return - This String after the insertion. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large, or if \a num is 'npos' - */ - String& insert(size_type idx, size_type num, utf32 code_point) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (num == npos) - throw(std::length_error("Code point count can not be 'npos'")); - - size_type newsz = d_cplength + num; - grow(newsz); - - memmove(&ptr()[idx + num], &ptr()[idx], (d_cplength - idx) * sizeof(utf32)); - - utf32* pt = &ptr()[idx + num - 1]; - - while(num--) - *pt-- = code_point; - - setlen(newsz); - - return *this; - } - - /*! - \brief - Inserts a code point multiple times into the String - - \param pos - Iterator describing the position where the code point(s) are to be inserted - - \param num - The number of times to insert the code point - - \param code_point - The utf32 code point that is to be inserted - - \return - This String after the insertion. - - \exception std::length_error Thrown if resulting String would be too large, or if \a num is 'npos' - */ - void insert(iterator pos, size_type num, utf32 code_point) - { - insert(safe_iter_dif(pos, begin()), num, code_point); - } - - /*! - \brief - Inserts a single code point into the String - - \param pos - Iterator describing the position where the code point is to be inserted - - \param code_point - The utf32 code point that is to be inserted - - \return - This String after the insertion. - - \exception std::length_error Thrown if resulting String would be too large. - */ - iterator insert(iterator pos, utf32 code_point) - { - insert(pos, 1, code_point); - return pos; - } - - /*! - \brief - Inserts code points specified by the range [beg, end). - - \param pos - Iterator describing the position where the data is to be inserted - - \param beg - Iterator describing the begining of the range to be inserted - - \param end - Iterator describing the (exclusive) end of the range to be inserted. - - \return - Nothing. - - \exception std::length_error Thrown if resulting String would be too large. - */ - void insert(iterator iter_pos, const_iterator iter_beg, const_iterator iter_end) - { - replace(iter_pos, iter_pos, iter_beg, iter_end); - } - - - /*! - \brief - Inserts the given c-string at the specified position. - - \param idx - Index where the c-string is to be inserted. - - \param c_str - c-string that is to be inserted. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large. - */ - String& insert(size_type idx, const char* cstr) - { - return insert(idx, cstr, strlen(cstr)); - } - - - /*! - \brief - Inserts chars from the given char array at the specified position. - - \param idx - Index where the data is to be inserted. - - \param chars - char array containing the chars that are to be inserted. - - \param chars_len - Length of the char array to be inserted. - - \return - This String after the insert. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - \exception std::length_error Thrown if resulting String would be too large, or if \a chars_len is 'npos' - */ - String& insert(size_type idx, const char* chars, size_type chars_len) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (chars_len == npos) - throw(std::length_error("Length of char array can not be 'npos'")); - - size_type newsz = d_cplength + chars_len; - - grow(newsz); - memmove(&ptr()[idx + chars_len], &ptr()[idx], (d_cplength - idx) * sizeof(utf32)); - - utf32* pt = &ptr()[idx + chars_len - 1]; - - while(chars_len--) - *pt-- = static_cast(static_cast(chars[chars_len])); - - setlen(newsz); - - return *this; - } - - - ////////////////////////////////////////////////////////////////////////// - // Erasing characters - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Removes all data from the String - - \return - Nothing - */ - void clear(void) - { - setlen(0); - trim(); - } - - /*! - \brief - Removes all data from the String - - \return - The empty String (*this) - */ - String& erase(void) - { - clear(); - return *this; - } - - /*! - \brief - Erase a single code point from the string - - \param idx - The index of the code point to be removed. - - \return - This String after the erase operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - String& erase(size_type idx) - { - return erase(idx, 1); - } - - /*! - \brief - Erase a range of code points - - \param idx - Index of the first code point to be removed. - - \param len - Maximum number of code points to be removed. - - \return - This String after the erase operation. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - String& erase(size_type idx, size_type len = npos) - { - // cover the no-op case. - if (len == 0) - return *this; - - if (d_cplength <= idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (len == npos) - len = d_cplength - idx; - - size_type newsz = d_cplength - len; - - memmove(&ptr()[idx], &ptr()[idx + len], (d_cplength - idx - len) * sizeof(utf32)); - setlen(newsz); - return *this; - } - - /*! - \brief - Erase the code point described by the given iterator - - \param pos - Iterator describing the code point to be erased - - \return - This String after the erase operation. - */ - String& erase(iterator pos) - { - return erase(safe_iter_dif(pos, begin()), 1); - } - - /*! - \brief - Erase a range of code points described by the iterators [beg, end). - - \param beg - Iterator describing the postion of the beginning of the range to erase - - \param end - Iterator describing the postion of the (exclusive) end of the range to erase - - \return - This String after the erase operation. - */ - String& erase(iterator iter_beg, iterator iter_end) - { - return erase(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg)); - } - - ////////////////////////////////////////////////////////////////////////// - // Resizing - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Resizes the String either by inserting default utf32 code points to make it larger, or by truncating to make it smaller - - \param num - The length, in code points, that the String is to be made. - - \return - Nothing. - - \exception std::length_error Thrown if the String would be too large. - */ - void resize(size_type num) - { - resize(num, utf32()); - } - - /*! - \brief - Resizes the String either by inserting the given utf32 code point to make it larger, or by truncating to make it smaller - - \param num - The length, in code points, that the String is to be made. - - \param code_point - The utf32 code point that should be used when majing the String larger - - \return - Nothing. - - \exception std::length_error Thrown if the String would be too large. - */ - void resize(size_type num, utf32 code_point) - { - if (num < d_cplength) - { - setlen(num); - } - else - { - append(num - d_cplength, code_point); - } - - } - - ////////////////////////////////////////////////////////////////////////// - // Replacing Characters - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Replace code points in the String with the specified String object - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced (if this is 0, operation is an insert at position \a idx) - - \param str - The String object that is to replace the specified code points - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(size_type idx, size_type len, const String& str) - { - return replace(idx, len, str, 0, npos); - } - - /*! - \brief - Replace the code points in the range [beg, end) with the specified String object - - \note - If \a beg == \a end, the operation is a insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param str - The String object that is to replace the specified range of code points - - \return - This String after the replace operation - - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(iterator iter_beg, iterator iter_end, const String& str) - { - return replace(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg), str, 0, npos); - } - - /*! - \brief - Replace code points in the String with a specified sub-string of a given String object. - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced. If this is 0, the operation is an insert at position \a idx. - - \param str - String object containing the data that will replace the specified range of code points - - \param str_idx - Index of the first code point of \a str that is to replace the specified code point range - - \param str_num - Maximum number of code points of \a str that are to replace the specified code point range - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if either \a idx, or \a str_idx are invalid - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& replace(size_type idx, size_type len, const String& str, size_type str_idx, size_type str_num) - { - if ((d_cplength < idx) || (str.d_cplength < str_idx)) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (((str_idx + str_num) > str.d_cplength) || (str_num == npos)) - str_num = str.d_cplength - str_idx; - - if (((len + idx) > d_cplength) || (len == npos)) - len = d_cplength - idx; - - size_type newsz = d_cplength + str_num - len; - - grow(newsz); - - if ((idx + len) < d_cplength) - memmove(&ptr()[idx + str_num], &ptr()[len + idx], (d_cplength - idx - len) * sizeof(utf32)); - - memcpy(&ptr()[idx], &str.ptr()[str_idx], str_num * sizeof(utf32)); - setlen(newsz); - - return *this; - } - - - /*! - \brief - Replace code points in the String with the specified std::string object - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced (if this is 0, operation is an insert at position \a idx) - - \param std_str - The std::string object that is to replace the specified code points - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(size_type idx, size_type len, const std::string& std_str) - { - return replace(idx, len, std_str, 0, npos); - } - - /*! - \brief - Replace the code points in the range [beg, end) with the specified std::string object - - \note - If \a beg == \a end, the operation is a insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param std_str - The std::string object that is to replace the specified range of code points - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \return - This String after the replace operation - - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(iterator iter_beg, iterator iter_end, const std::string& std_str) - { - return replace(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg), std_str, 0, npos); - } - - /*! - \brief - Replace code points in the String with a specified sub-string of a given std::string object. - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced. If this is 0, the operation is an insert at position \a idx. - - \param std_str - std::string object containing the data that will replace the specified range of code points - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \param str_idx - Index of the first code point of \a std_str that is to replace the specified code point range - - \param str_num - Maximum number of code points of \a std_str that are to replace the specified code point range - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if either \a idx, or \a str_idx are invalid - \exception std::length_error Thrown if the resulting String would have been too large. - */ - String& replace(size_type idx, size_type len, const std::string& std_str, size_type str_idx, size_type str_num) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (std_str.size() < str_idx) - throw(std::out_of_range("Index is out of range for std::string")); - - if (((str_idx + str_num) > std_str.size()) || (str_num == npos)) - str_num = (size_type)std_str.size() - str_idx; - - if (((len + idx) > d_cplength) || (len == npos)) - len = d_cplength - idx; - - size_type newsz = d_cplength + str_num - len; - - grow(newsz); - - if ((idx + len) < d_cplength) - memmove(&ptr()[idx + str_num], &ptr()[len + idx], (d_cplength - idx - len) * sizeof(utf32)); - - utf32* pt = &ptr()[idx + str_num - 1]; - - while (str_num--) - *pt-- = static_cast(static_cast(std_str[str_idx + str_num])); - - setlen(newsz); - - return *this; - } - - - /*! - \brief - Replace code points in the String with the specified null-terminated utf8 encoded data. - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced (if this is 0, operation is an insert at position \a idx) - - \param utf8_str - Buffer containing the null-terminated utf8 encoded data that is to replace the specified code points - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(size_type idx, size_type len, const utf8* utf8_str) - { - return replace(idx, len, utf8_str, utf_length(utf8_str)); - } - - /*! - \brief - Replace the code points in the range [beg, end) with the specified null-terminated utf8 encoded data. - - \note - If \a beg == \a end, the operation is a insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param utf8_str - Buffer containing the null-terminated utf8 encoded data that is to replace the specified range of code points - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \return - This String after the replace operation - - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(iterator iter_beg, iterator iter_end, const utf8* utf8_str) - { - return replace(iter_beg, iter_end, utf8_str, utf_length(utf8_str)); - } - - /*! - \brief - Replace code points in the String with the specified utf8 encoded data. - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced (if this is 0, operation is an insert at position \a idx) - - \param utf8_str - Buffer containing the null-terminated utf8 encoded data that is to replace the specified code points - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param str_len - Length of the utf8 encoded data in utf8 code units (not code points). - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if the resulting String would be too large, or if \a str_len was 'npos'. - */ - String& replace(size_type idx, size_type len, const utf8* utf8_str, size_type str_len) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - if (((len + idx) > d_cplength) || (len == npos)) - len = d_cplength - idx; - - size_type encsz = encoded_size(utf8_str, str_len); - size_type newsz = d_cplength + encsz - len; - - grow(newsz); - - if ((idx + len) < d_cplength) - memmove(&ptr()[idx + encsz], &ptr()[len + idx], (d_cplength - idx - len) * sizeof(utf32)); - - encode(utf8_str, &ptr()[idx], encsz, str_len); - - setlen(newsz); - return *this; - } - - /*! - \brief - Replace the code points in the range [beg, end) with the specified null-terminated utf8 encoded data. - - \note - If \a beg == \a end, the operation is a insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param utf8_str - Buffer containing the null-terminated utf8 encoded data that is to replace the specified range of code points - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param str_len - Length of the utf8 encoded data in utf8 code units (not code points). - - \return - This String after the replace operation - - \exception std::length_error Thrown if the resulting String would be too large, or if \a str_len was 'npos'. - */ - String& replace(iterator iter_beg, iterator iter_end, const utf8* utf8_str, size_type str_len) - { - return replace(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg), utf8_str, str_len); - } - - /*! - \brief - Replaces a specified range of code points with occurrences of a given code point - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to replace. If this is 0 the operation is an insert - - \param num - Number of occurrences of \a code_point that are to replace the specified range of code points - - \param code_point - Code point that is to be used when replacing the specified range of code points - - \return - This String after the replace operation. - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if resulting String would have been too long, or if \a num was 'npos'. - */ - String& replace(size_type idx, size_type len, size_type num, utf32 code_point) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (num == npos) - throw(std::length_error("Code point count can not be 'npos'")); - - if (((len + idx) > d_cplength) || (len == npos)) - len = d_cplength - idx; - - size_type newsz = d_cplength + num - len; - - grow(newsz); - - if ((idx + len) < d_cplength) - memmove(&ptr()[idx + num], &ptr()[len + idx], (d_cplength - idx - len) * sizeof(utf32)); - - utf32* pt = &ptr()[idx + num - 1]; - - while (num--) - *pt-- = code_point; - - setlen(newsz); - - return *this; - } - - /*! - \brief - Replace the code points in the range [beg, end) with occurrences of a given code point - - \note - If \a beg == \a end, the operation is an insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param num - Number of occurrences of \a code_point that are to replace the specified range of code points - - \param code_point - Code point that is to be used when replacing the specified range of code points - - \return - This String after the replace operation - - \exception std::length_error Thrown if resulting String would have been too long, or if \a num was 'npos'. - */ - String& replace(iterator iter_beg, iterator iter_end, size_type num, utf32 code_point) - { - return replace(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg), num, code_point); - } - - - /*! - \brief - Replace the code points in the range [beg, end) with code points from the range [newBeg, newEnd). - - \note - If \a beg == \a end, the operation is an insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param newBeg - Iterator describing the beginning of the range to insert. - - \param newEnd - Iterator describing the (exclusive) end of the range to insert. - - \return - This String after the insert operation. - - \exception std::length_error Thrown if the resulting string would be too long. - */ - String& replace(iterator iter_beg, iterator iter_end, const_iterator iter_newBeg, const_iterator iter_newEnd) - { - if (iter_newBeg == iter_newEnd) - { - erase(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg)); - } - else - { - size_type str_len = safe_iter_dif(iter_newEnd, iter_newBeg); - size_type idx = safe_iter_dif(iter_beg, begin()); - size_type len = safe_iter_dif(iter_end, iter_beg); - - if ((len + idx) > d_cplength) - len = d_cplength - idx; - - size_type newsz = d_cplength + str_len - len; - - grow(newsz); - - if ((idx + len) < d_cplength) - memmove(&ptr()[idx + str_len], &ptr()[len + idx], (d_cplength - idx - len) * sizeof(utf32)); - - memcpy(&ptr()[idx], iter_newBeg.d_ptr, str_len * sizeof(utf32)); - setlen(newsz); - } - - return *this; - } - - - /*! - \brief - Replace code points in the String with the specified c-string. - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced (if this is 0, operation is an insert at position \a idx) - - \param c_str - c-string that is to replace the specified code points - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(size_type idx, size_type len, const char* cstr) - { - return replace(idx, len, cstr, strlen(cstr)); - } - - - /*! - \brief - Replace the code points in the range [beg, end) with the specified c-string. - - \note - If \a beg == \a end, the operation is a insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param c_str - c-string that is to replace the specified range of code points - - \return - This String after the replace operation - - \exception std::length_error Thrown if the resulting String would be too large. - */ - String& replace(iterator iter_beg, iterator iter_end, const char* cstr) - { - return replace(iter_beg, iter_end, cstr, strlen(cstr)); - } - - - /*! - \brief - Replace code points in the String with chars from the given char array. - - \param idx - Index of the first code point to be replaced - - \param len - Maximum number of code points to be replaced (if this is 0, operation is an insert at position \a idx) - - \param chars - char array containing the cars that are to replace the specified code points - - \param chars_len - Number of chars in the char array. - - \return - This String after the replace operation - - \exception std::out_of_range Thrown if \a idx is invalid for this String - \exception std::length_error Thrown if the resulting String would be too large, or if \a chars_len was 'npos'. - */ - String& replace(size_type idx, size_type len, const char* chars, size_type chars_len) - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for CEGUI::String")); - - if (chars_len == npos) - throw(std::length_error("Length for the char array can not be 'npos'")); - - if (((len + idx) > d_cplength) || (len == npos)) - len = d_cplength - idx; - - size_type newsz = d_cplength + chars_len - len; - - grow(newsz); - - if ((idx + len) < d_cplength) - memmove(&ptr()[idx + chars_len], &ptr()[len + idx], (d_cplength - idx - len) * sizeof(utf32)); - - utf32* pt = &ptr()[idx + chars_len - 1]; - - while (chars_len--) - *pt-- = static_cast(static_cast(chars[chars_len])); - - setlen(newsz); - return *this; - } - - - /*! - \brief - Replace the code points in the range [beg, end) with chars from the given char array. - - \note - If \a beg == \a end, the operation is a insert at iterator position \a beg - - \param beg - Iterator describing the start of the range to be replaced - - \param end - Iterator describing the (exclusive) end of the range to be replaced. - - \param chars - char array containing the chars that are to replace the specified range of code points - - \param chars_len - Number of chars in the char array. - - \return - This String after the replace operation - - \exception std::length_error Thrown if the resulting String would be too large, or if \a chars_len was 'npos'. - */ - String& replace(iterator iter_beg, iterator iter_end, const char* chars, size_type chars_len) - { - return replace(safe_iter_dif(iter_beg, begin()), safe_iter_dif(iter_end, iter_beg), chars, chars_len); - } - - - ////////////////////////////////////////////////////////////////////////// - // Find a code point - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Search forwards for a given code point - - \param code_point - The utf32 code point to search for - - \param idx - Index of the code point where the search is to start. - - \return - - Index of the first occurrence of \a code_point travelling forwards from \a idx. - - npos if the code point could not be found - */ - size_type find(utf32 code_point, size_type idx = 0) const - { - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - while (idx < d_cplength) - { - if (*pt++ == code_point) - return idx; - - ++idx; - } - - } - - return npos; - } - - /*! - \brief - Search backwards for a given code point - - \param code_point - The utf32 code point to search for - - \param idx - Index of the code point where the search is to start. - - \return - - Index of the first occurrence of \a code_point travelling backwards from \a idx. - - npos if the code point could not be found - */ - size_type rfind(utf32 code_point, size_type idx = npos) const - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - if (d_cplength > 0) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (*pt-- == code_point) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - ////////////////////////////////////////////////////////////////////////// - // Find a substring - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Search forwards for a sub-string - - \param str - String object describing the sub-string to search for - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a str travelling forwards from \a idx. - - npos if the sub-string could not be found - */ - size_type find(const String& str, size_type idx = 0) const - { - if ((str.d_cplength == 0) && (idx < d_cplength)) - return idx; - - if (idx < d_cplength) - { - // loop while search string could fit in to search area - while (d_cplength - idx >= str.d_cplength) - { - if (0 == compare(idx, str.d_cplength, str)) - return idx; - - ++idx; - } - - } - - return npos; - } - - /*! - \brief - Search backwards for a sub-string - - \param str - String object describing the sub-string to search for - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a str travelling backwards from \a idx. - - npos if the sub-string could not be found - */ - size_type rfind(const String& str, size_type idx = npos) const - { - if (str.d_cplength == 0) - return (idx < d_cplength) ? idx : d_cplength; - - if (str.d_cplength <= d_cplength) - { - if (idx > (d_cplength - str.d_cplength)) - idx = d_cplength - str.d_cplength; - - do - { - if (0 == compare(idx, str.d_cplength, str)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - /*! - \brief - Search forwards for a sub-string - - \param std_str - std::string object describing the sub-string to search for - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a std_str travelling forwards from \a idx. - - npos if the sub-string could not be found - */ - size_type find(const std::string& std_str, size_type idx = 0) const - { - std::string::size_type sze = std_str.size(); - - if ((sze == 0) && (idx < d_cplength)) - return idx; - - if (idx < d_cplength) - { - // loop while search string could fit in to search area - while (d_cplength - idx >= sze) - { - if (0 == compare(idx, (size_type)sze, std_str)) - return idx; - - ++idx; - } - - } - - return npos; - } - - /*! - \brief - Search backwards for a sub-string - - \param std_str - std::string object describing the sub-string to search for - - \note - Characters from \a std_str are considered to represent Unicode code points in the range 0x00..0xFF. No translation of - the encountered data is performed. - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a std_str travelling backwards from \a idx. - - npos if the sub-string could not be found - */ - size_type rfind(const std::string& std_str, size_type idx = npos) const - { - std::string::size_type sze = std_str.size(); - - if (sze == 0) - return (idx < d_cplength) ? idx : d_cplength; - - if (sze <= d_cplength) - { - if (idx > (d_cplength - sze)) - idx = d_cplength - sze; - - do - { - if (0 == compare(idx, (size_type)sze, std_str)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - /*! - \brief - Search forwards for a sub-string - - \param utf8_str - Buffer containing null-terminated utf8 encoded data describing the sub-string to search for - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a utf8_str travelling forwards from \a idx. - - npos if the sub-string could not be found - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find(const utf8* utf8_str, size_type idx = 0) const - { - return find(utf8_str, idx, utf_length(utf8_str)); - } - - /*! - \brief - Search backwards for a sub-string - - \param utf8_str - Buffer containing null-terminated utf8 encoded data describing the sub-string to search for - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a utf8_str travelling backwards from \a idx. - - npos if the sub-string could not be found - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type rfind(const utf8* utf8_str, size_type idx = npos) const - { - return rfind(utf8_str, idx, utf_length(utf8_str)); - } - - /*! - \brief - Search forwards for a sub-string - - \param utf8_str - Buffer containing utf8 encoded data describing the sub-string to search for - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the code point where the search is to start - - \param str_len - Length of the utf8 encoded sub-string in utf8 code units (not code points) - - \return - - Index of the first occurrence of sub-string \a utf8_str travelling forwards from \a idx. - - npos if the sub-string could not be found - - \exception std::length_error Thrown if \a str_len is 'npos' - */ - size_type find(const utf8* utf8_str, size_type idx, size_type str_len) const - { - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - size_type sze = encoded_size(utf8_str, str_len); - - if ((sze == 0) && (idx < d_cplength)) - return idx; - - if (idx < d_cplength) - { - // loop while search string could fit in to search area - while (d_cplength - idx >= sze) - { - if (0 == compare(idx, sze, utf8_str, sze)) - return idx; - - ++idx; - } - - } - - return npos; - } - - /*! - \brief - Search backwards for a sub-string - - \param utf8_str - Buffer containing utf8 encoded data describing the sub-string to search for - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the code point where the search is to start - - \param str_len - Length of the utf8 encoded sub-string in utf8 code units (not code points) - - \return - - Index of the first occurrence of sub-string \a utf8_str travelling backwards from \a idx. - - npos if the sub-string could not be found - - \exception std::length_error Thrown if \a str_len is 'npos' - */ - size_type rfind(const utf8* utf8_str, size_type idx, size_type str_len) const - { - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - size_type sze = encoded_size(utf8_str, str_len); - - if (sze == 0) - return (idx < d_cplength) ? idx : d_cplength; - - if (sze <= d_cplength) - { - if (idx > (d_cplength - sze)) - idx = d_cplength - sze; - - do - { - if (0 == compare(idx, sze, utf8_str, sze)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - /*! - \brief - Search forwards for a sub-string - - \param c_str - c-string describing the sub-string to search for - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a c_str travelling forwards from \a idx. - - npos if the sub-string could not be found - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find(const char* cstr, size_type idx = 0) const - { - return find(cstr, idx, strlen(cstr)); - } - - - /*! - \brief - Search backwards for a sub-string - - \param c_str - c-string describing the sub-string to search for - - \param idx - Index of the code point where the search is to start - - \return - - Index of the first occurrence of sub-string \a c_str travelling backwards from \a idx. - - npos if the sub-string could not be found - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type rfind(const char* cstr, size_type idx = npos) const - { - return rfind(cstr, idx, strlen(cstr)); - } - - - /*! - \brief - Search forwards for a sub-string - - \param chars - char array describing the sub-string to search for - - \param idx - Index of the code point where the search is to start - - \param chars_len - Number of chars in the char array. - - \return - - Index of the first occurrence of sub-string \a chars travelling forwards from \a idx. - - npos if the sub-string could not be found - - \exception std::length_error Thrown if \a chars_len is 'npos' - */ - size_type find(const char* chars, size_type idx, size_type chars_len) const - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if ((chars_len == 0) && (idx < d_cplength)) - return idx; - - if (idx < d_cplength) - { - // loop while search string could fit in to search area - while (d_cplength - idx >= chars_len) - { - if (0 == compare(idx, chars_len, chars, chars_len)) - return idx; - - ++idx; - } - - } - - return npos; - } - - - /*! - \brief - Search backwards for a sub-string - - \param chars - char array describing the sub-string to search for - - \param idx - Index of the code point where the search is to start - - \param chars_len - Number of chars in the char array. - - \return - - Index of the first occurrence of sub-string \a chars travelling backwards from \a idx. - - npos if the sub-string could not be found - - \exception std::length_error Thrown if \a chars_len is 'npos' - */ - size_type rfind(const char* chars, size_type idx, size_type chars_len) const - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if (chars_len == 0) - return (idx < d_cplength) ? idx : d_cplength; - - if (chars_len <= d_cplength) - { - if (idx > (d_cplength - chars_len)) - idx = d_cplength - chars_len; - - do - { - if (0 == compare(idx, chars_len, chars, chars_len)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - ////////////////////////////////////////////////////////////////////////// - // Find first of different code-points - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Find the first occurrence of one of a set of code points. - - \param str - String object describing the set of code points. - - \param idx - Index of the start point for the search - - \return - - Index of the first occurrence of any one of the code points in \a str starting from from \a idx. - - npos if none of the code points in \a str were found. - */ - size_type find_first_of(const String& str, size_type idx = 0) const - { - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != str.find(*pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - /*! - \brief - Find the first code point that is not one of a set of code points. - - \param str - String object describing the set of code points. - - \param idx - Index of the start point for the search - - \return - - Index of the first code point that does not match any one of the code points in \a str starting from from \a idx. - - npos if all code points matched one of the code points in \a str. - */ - size_type find_first_not_of(const String& str, size_type idx = 0) const - { - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == str.find(*pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - - /*! - \brief - Find the first occurrence of one of a set of code points. - - \param std_str - std::string object describing the set of code points. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param idx - Index of the start point for the search - - \return - - Index of the first occurrence of any one of the code points in \a std_str starting from from \a idx. - - npos if none of the code points in \a std_str were found. - */ - size_type find_first_of(const std::string& std_str, size_type idx = 0) const - { - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != find_codepoint(std_str, *pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - /*! - \brief - Find the first code point that is not one of a set of code points. - - \param std_str - std::string object describing the set of code points. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param idx - Index of the start point for the search - - \return - - Index of the first code point that does not match any one of the code points in \a std_str starting from from \a idx. - - npos if all code points matched one of the code points in \a std_str. - */ - size_type find_first_not_of(const std::string& std_str, size_type idx = 0) const - { - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == find_codepoint(std_str, *pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - - /*! - \brief - Find the first occurrence of one of a set of code points. - - \param utf8_str - Buffer containing null-terminated utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \return - - Index of the first occurrence of any one of the code points in \a utf8_str starting from from \a idx. - - npos if none of the code points in \a utf8_str were found. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_first_of(const utf8* utf8_str, size_type idx = 0) const - { - return find_first_of(utf8_str, idx, utf_length(utf8_str)); - } - - /*! - \brief - Find the first code point that is not one of a set of code points. - - \param utf8_str - Buffer containing null-terminated utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \return - - Index of the first code point that does not match any one of the code points in \a utf8_str starting from from \a idx. - - npos if all code points matched one of the code points in \a utf8_str. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_first_not_of(const utf8* utf8_str, size_type idx = 0) const - { - return find_first_not_of(utf8_str, idx, utf_length(utf8_str)); - } - - /*! - \brief - Find the first occurrence of one of a set of code points. - - \param utf8_str - Buffer containing utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \param str_len - Length of the utf8 encoded data in utf8 code units (not code points). - - \return - - Index of the first occurrence of any one of the code points in \a utf8_str starting from from \a idx. - - npos if none of the code points in \a utf8_str were found. - - \exception std::length_error Thrown if \a str_len was 'npos'. - */ - size_type find_first_of(const utf8* utf8_str, size_type idx, size_type str_len) const - { - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - if (idx < d_cplength) - { - size_type encsze = encoded_size(utf8_str, str_len); - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != find_codepoint(utf8_str, encsze, *pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - /*! - \brief - Find the first code point that is not one of a set of code points. - - \param utf8_str - Buffer containing utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \param str_len - Length of the utf8 encoded data in utf8 code units (not code points). - - \return - - Index of the first code point that does not match any one of the code points in \a utf8_str starting from from \a idx. - - npos if all code points matched one of the code points in \a utf8_str. - - \exception std::length_error Thrown if \a str_len was 'npos'. - */ - size_type find_first_not_of(const utf8* utf8_str, size_type idx, size_type str_len) const - { - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - if (idx < d_cplength) - { - size_type encsze = encoded_size(utf8_str, str_len); - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == find_codepoint(utf8_str, encsze, *pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - - /*! - \brief - Search forwards for a given code point - - \param code_point - The utf32 code point to search for - - \param idx - Index of the code point where the search is to start. - - \return - - Index of the first occurrence of \a code_point starting from from \a idx. - - npos if the code point could not be found - */ - size_type find_first_of(utf32 code_point, size_type idx = 0) const - { - return find(code_point, idx); - } - - /*! - \brief - Search forwards for the first code point that does not match a given code point - - \param code_point - The utf32 code point to search for - - \param idx - Index of the code point where the search is to start. - - \return - - Index of the first code point that does not match \a code_point starting from from \a idx. - - npos if all code points matched \a code_point - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_first_not_of(utf32 code_point, size_type idx = 0) const - { - if (idx < d_cplength) - { - do - { - if ((*this)[idx] != code_point) - return idx; - - } while(idx++ < d_cplength); - - } - - return npos; - } - - - /*! - \brief - Find the first occurrence of one of a set of chars. - - \param c_str - c-string describing the set of chars. - - \param idx - Index of the start point for the search - - \return - - Index of the first occurrence of any one of the chars in \a c_str starting from from \a idx. - - npos if none of the chars in \a c_str were found. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_first_of(const char* cstr, size_type idx = 0) const - { - return find_first_of(cstr, idx, strlen(cstr)); - } - - - /*! - \brief - Find the first code point that is not one of a set of chars. - - \param c_str - c-string describing the set of chars. - - \param idx - Index of the start point for the search - - \return - - Index of the first code point that does not match any one of the chars in \a c_str starting from from \a idx. - - npos if all code points matched any of the chars in \a c_str. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_first_not_of(const char* cstr, size_type idx = 0) const - { - return find_first_not_of(cstr, idx, strlen(cstr)); - } - - - /*! - \brief - Find the first occurrence of one of a set of chars. - - \param chars - char array containing the set of chars. - - \param idx - Index of the start point for the search - - \param chars_len - Number of chars in the char array. - - \return - - Index of the first occurrence of any one of the chars in \a chars starting from from \a idx. - - npos if none of the chars in \a chars were found. - - \exception std::length_error Thrown if \a chars_len was 'npos'. - */ - size_type find_first_of(const char* chars, size_type idx, size_type chars_len) const - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != find_codepoint(chars, chars_len, *pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - - /*! - \brief - Find the first code point that is not one of a set of chars. - - \param chars - char array containing the set of chars. - - \param idx - Index of the start point for the search - - \param chars_len - Number of chars in the car array. - - \return - - Index of the first code point that does not match any one of the chars in \a chars starting from from \a idx. - - npos if all code points matched any of the chars in \a chars. - - \exception std::length_error Thrown if \a chars_len was 'npos'. - */ - size_type find_first_not_of(const char* chars, size_type idx, size_type chars_len) const - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if (idx < d_cplength) - { - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == find_codepoint(chars, chars_len, *pt++)) - return idx; - - } while (++idx != d_cplength); - - } - - return npos; - } - - - ////////////////////////////////////////////////////////////////////////// - // Find last of different code-points - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Find the last occurrence of one of a set of code points. - - \param str - String object describing the set of code points. - - \param idx - Index of the start point for the search - - \return - - Index of the last occurrence of any one of the code points in \a str starting from \a idx. - - npos if none of the code points in \a str were found. - */ - size_type find_last_of(const String& str, size_type idx = npos) const - { - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != str.find(*pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - /*! - \brief - Find the last code point that is not one of a set of code points. - - \param str - String object describing the set of code points. - - \param idx - Index of the start point for the search - - \return - - Index of the last code point that does not match any one of the code points in \a str starting from \a idx. - - npos if all code points matched one of the code points in \a str. - */ - size_type find_last_not_of(const String& str, size_type idx = npos) const - { - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == str.find(*pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - /*! - \brief - Find the last occurrence of one of a set of code points. - - \param std_str - std::string object describing the set of code points. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param idx - Index of the start point for the search - - \return - - Index of the last occurrence of any one of the code points in \a std_str starting from \a idx. - - npos if none of the code points in \a std_str were found. - */ - size_type find_last_of(const std::string& std_str, size_type idx = npos) const - { - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != find_codepoint(std_str, *pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - /*! - \brief - Find the last code point that is not one of a set of code points. - - \param std_str - std::string object describing the set of code points. - - \note - The characters of \a std_str are taken to be unencoded data which represent Unicode code points 0x00..0xFF. No translation of - the provided data will occur. - - \param idx - Index of the start point for the search - - \return - - Index of the last code point that does not match any one of the code points in \a std_str starting from \a idx. - - npos if all code points matched one of the code points in \a std_str. - */ - size_type find_last_not_of(const std::string& std_str, size_type idx = npos) const - { - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == find_codepoint(std_str, *pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - /*! - \brief - Find the last occurrence of one of a set of code points. - - \param utf8_str - Buffer containing null-terminated utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \return - - Index of the last occurrence of any one of the code points in \a utf8_str starting from \a idx. - - npos if none of the code points in \a utf8_str were found. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_last_of(const utf8* utf8_str, size_type idx = npos) const - { - return find_last_of(utf8_str, idx, utf_length(utf8_str)); - } - - /*! - \brief - Find the last code point that is not one of a set of code points. - - \param utf8_str - Buffer containing null-terminated utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \return - - Index of the last code point that does not match any one of the code points in \a utf8_str starting from \a idx. - - npos if all code points matched one of the code points in \a utf8_str. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_last_not_of(const utf8* utf8_str, size_type idx = npos) const - { - return find_last_not_of(utf8_str, idx, utf_length(utf8_str)); - } - - /*! - \brief - Find the last occurrence of one of a set of code points. - - \param utf8_str - Buffer containing utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \param str_len - Length of the utf8 encoded data in utf8 code units (not code points). - - \return - - Index of the last occurrence of any one of the code points in \a utf8_str starting from from \a idx. - - npos if none of the code points in \a utf8_str were found. - - \exception std::length_error Thrown if \a str_len was 'npos'. - */ - size_type find_last_of(const utf8* utf8_str, size_type idx, size_type str_len) const - { - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - size_type encsze = encoded_size(utf8_str, str_len); - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != find_codepoint(utf8_str, encsze, *pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - /*! - \brief - Find the last code point that is not one of a set of code points. - - \param utf8_str - Buffer containing utf8 encoded data describing the set of code points. - - \note - A basic string literal (cast to utf8*) can be passed to this function, provided that the string is - comprised only of code points 0x00..0x7f. The use of extended ASCII characters (with values >0x7f) - would result in incorrect behaviour as the String will attempt to 'decode' the data, with unpredictable - results. - - \param idx - Index of the start point for the search - - \param str_len - Length of the utf8 encoded data in utf8 code units (not code points). - - \return - - Index of the last code point that does not match any one of the code points in \a utf8_str starting from from \a idx. - - npos if all code points matched one of the code points in \a utf8_str. - - \exception std::length_error Thrown if \a str_len was 'npos'. - */ - size_type find_last_not_of(const utf8* utf8_str, size_type idx, size_type str_len) const - { - if (str_len == npos) - throw(std::length_error("Length for utf8 encoded string can not be 'npos'")); - - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - size_type encsze = encoded_size(utf8_str, str_len); - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == find_codepoint(utf8_str, encsze, *pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - /*! - \brief - Search for last occurrence of a given code point - - \param code_point - The utf32 code point to search for - - \param idx - Index of the code point where the search is to start. - - \return - - Index of the last occurrence of \a code_point starting from \a idx. - - npos if the code point could not be found - */ - size_type find_last_of(utf32 code_point, size_type idx = npos) const - { - return rfind(code_point, idx); - } - - /*! - \brief - Search for the last code point that does not match a given code point - - \param code_point - The utf32 code point to search for - - \param idx - Index of the code point where the search is to start. - - \return - - Index of the last code point that does not match \a code_point starting from from \a idx. - - npos if all code points matched \a code_point - */ - size_type find_last_not_of(utf32 code_point, size_type idx = npos) const - { - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - do - { - if ((*this)[idx] != code_point) - return idx; - - } while(idx-- != 0); - - } - - return npos; - } - - - /*! - \brief - Find the last occurrence of one of a set of chars. - - \param c_str - c-string describing the set of chars. - - \param idx - Index of the start point for the search - - \return - - Index of the last occurrence of any one of the chars in \a c_str starting from \a idx. - - npos if none of the chars in \a c_str were found. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_last_of(const char* cstr, size_type idx = npos) const - { - return find_last_of(cstr, idx, strlen(cstr)); - } - - - /*! - \brief - Find the last code point that is not one of a set of chars. - - \param c_str - c-string describing the set of chars. - - \param idx - Index of the start point for the search - - \return - - Index of the last code point that does not match any one of the chars in \a c_str starting from \a idx. - - npos if all code points matched any of the chars in \a c_str. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - size_type find_last_not_of(const char* cstr, size_type idx = npos) const - { - return find_last_not_of(cstr, idx, strlen(cstr)); - } - - - /*! - \brief - Find the last occurrence of one of a set of chars. - - \param chars - char array containing the set of chars. - - \param idx - Index of the start point for the search - - \param chars_len - Number of chars in the char array. - - \return - - Index of the last occurrence of any one of the chars in \a chars, starting from from \a idx. - - npos if none of the chars in \a chars were found. - - \exception std::length_error Thrown if \a chars_len was 'npos'. - */ - size_type find_last_of(const char* chars, size_type idx, size_type chars_len) const - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos != find_codepoint(chars, chars_len, *pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - /*! - \brief - Find the last code point that is not one of a set of chars. - - \param chars - char array containing the set of chars. - - \param idx - Index of the start point for the search - - \param chars_len - Number of chars in the char array. - - \return - - Index of the last code point that does not match any one of the chars in \a chars, starting from from \a idx. - - npos if all code points matched any of the chars in \a chars. - - \exception std::length_error Thrown if \a chars_len was 'npos'. - */ - size_type find_last_not_of(const char* chars, size_type idx, size_type chars_len) const - { - if (chars_len == npos) - throw(std::length_error("Length for char array can not be 'npos'")); - - if (d_cplength > 0) - { - if (idx >= d_cplength) - idx = d_cplength - 1; - - const utf32* pt = &ptr()[idx]; - - do - { - if (npos == find_codepoint(chars, chars_len, *pt--)) - return idx; - - } while (idx-- != 0); - - } - - return npos; - } - - - ////////////////////////////////////////////////////////////////////////// - // Substring - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Returns a substring of this String. - - \param idx - Index of the first code point to use for the sub-string. - - \param len - Maximum number of code points to use for the sub-string - - \return - A String object containing the specified sub-string. - - \exception std::out_of_range Thrown if \a idx is invalid for this String. - */ - String substr(size_type idx = 0, size_type len = npos) const - { - if (d_cplength < idx) - throw(std::out_of_range("Index is out of range for this CEGUI::String")); - - return String(*this, idx, len); - } - - ////////////////////////////////////////////////////////////////////////// - // Iterator creation - ////////////////////////////////////////////////////////////////////////// - /*! - \brief - Return a forwards iterator that describes the beginning of the String - - \return - iterator object that describes the beginning of the String. - */ - iterator begin(void) - { - return iterator(ptr()); - } - - /*! - \brief - Return a constant forwards iterator that describes the beginning of the String - - \return - const_iterator object that describes the beginning of the String. - */ - const_iterator begin(void) const - { - return const_iterator(ptr()); - } - - /*! - \brief - Return a forwards iterator that describes the end of the String - - \return - iterator object that describes the end of the String. - */ - iterator end(void) - { - return iterator(&ptr()[d_cplength]); - } - - /*! - \brief - Return a constant forwards iterator that describes the end of the String - - \return - const_iterator object that describes the end of the String. - */ - const_iterator end(void) const - { - return const_iterator(&ptr()[d_cplength]); - } - - /*! - \brief - Return a reverse iterator that describes the beginning of the String - - \return - reverse_iterator object that describes the beginning of the String (so is actually at the end) - */ - reverse_iterator rbegin(void) - { - return reverse_iterator(end()); - } - - /*! - \brief - Return a constant reverse iterator that describes the beginning of the String - - \return - const_reverse_iterator object that describes the beginning of the String (so is actually at the end) - */ - const_reverse_iterator rbegin(void) const - { - return const_reverse_iterator(end()); - } - - /*! - \brief - Return a reverse iterator that describes the end of the String - - \return - reverse_iterator object that describes the end of the String (so is actually at the beginning) - */ - reverse_iterator rend(void) - { - return reverse_iterator(begin()); - } - - /*! - \brief - Return a constant reverse iterator that describes the end of the String - - \return - const_reverse_iterator object that describes the end of the String (so is actually at the beginning) - */ - const_reverse_iterator rend(void) const - { - return const_reverse_iterator(begin()); - } - - /*! - \brief - Get the bidirectional version of a string - - \return - A modified variant of the string which has a shaping algorithm applied - */ - String bidify(void) const; - -private: - /************************************************************************* - Implementation Functions - *************************************************************************/ - // string management - - // change size of allocated buffer so it is at least 'new_size'. - // May or may not cause re-allocation and copy of buffer if size is larger - // will never re-allocate to make size smaller. (see trim()) - bool grow(size_type new_size); - - // perform re-allocation to remove wasted space. - void trim(void); - - // set the length of the string, and terminate it, according to the given value (will not re-allocate, use grow() first). - void setlen(size_type len) - { - d_cplength = len; - ptr()[len] = (utf32)(0); - } - - // initialise string object - void init(void) - { - d_reserve = STR_QUICKBUFF_SIZE; - d_encodedbuff = 0; - d_encodedbufflen = 0; - d_encodeddatlen = 0; - d_buffer = 0; - setlen(0); - } - - // return true if the given pointer is inside the string data - bool inside(utf32* inptr) - { - if (inptr < ptr() || ptr() + d_cplength <= inptr) - return false; - else - return true; - } - - // compute distance between two iterators, returning a 'safe' value - size_type safe_iter_dif(const const_iterator& iter1, const const_iterator& iter2) const - { - return (iter1.d_ptr == 0) ? 0 : (iter1 - iter2); - } - - // encoding functions - // for all: - // src_len is in code units, or 0 for null terminated string. - // dest_len is in code units. - // returns number of code units put into dest buffer. - size_type encode(const utf32* src, utf8* dest, size_type dest_len, size_type src_len = 0) const - { - // count length for null terminated source... - if (src_len == 0) - { - src_len = utf_length(src); - } - - size_type destCapacity = dest_len; - - // while there is data in the source buffer, - for (uint idx = 0; idx < src_len; ++idx) - { - utf32 cp = src[idx]; - - // check there is enough destination buffer to receive this encoded unit (exit loop & return if not) - if (destCapacity < encoded_size(cp)) - { - break; - } - - if (cp < 0x80) - { - *dest++ = (utf8)cp; - --destCapacity; - } - else if (cp < 0x0800) - { - *dest++ = (utf8)((cp >> 6) | 0xC0); - *dest++ = (utf8)((cp & 0x3F) | 0x80); - destCapacity -= 2; - } - else if (cp < 0x10000) - { - *dest++ = (utf8)((cp >> 12) | 0xE0); - *dest++ = (utf8)(((cp >> 6) & 0x3F) | 0x80); - *dest++ = (utf8)((cp & 0x3F) | 0x80); - destCapacity -= 3; - } - else - { - *dest++ = (utf8)((cp >> 18) | 0xF0); - *dest++ = (utf8)(((cp >> 12) & 0x3F) | 0x80); - *dest++ = (utf8)(((cp >> 6) & 0x3F) | 0x80); - *dest++ = (utf8)((cp & 0x3F) | 0x80); - destCapacity -= 4; - } - - } - - return dest_len - destCapacity; - } - - size_type encode(const utf8* src, utf32* dest, size_type dest_len, size_type src_len = 0) const - { - // count length for null terminated source... - if (src_len == 0) - { - src_len = utf_length(src); - } - - size_type destCapacity = dest_len; - - // while there is data in the source buffer, and space in the dest buffer - for (uint idx = 0; ((idx < src_len) && (destCapacity > 0));) - { - utf32 cp; - utf8 cu = src[idx++]; - - if (cu < 0x80) - { - cp = (utf32)(cu); - } - else if (cu < 0xE0) - { - cp = ((cu & 0x1F) << 6); - cp |= (src[idx++] & 0x3F); - } - else if (cu < 0xF0) - { - cp = ((cu & 0x0F) << 12); - cp |= ((src[idx++] & 0x3F) << 6); - cp |= (src[idx++] & 0x3F); - } - else - { - cp = ((cu & 0x07) << 18); - cp |= ((src[idx++] & 0x3F) << 12); - cp |= ((src[idx++] & 0x3F) << 6); - cp |= (src[idx++] & 0x3F); - } - - *dest++ = cp; - --destCapacity; - } - - return dest_len - destCapacity; - } - - // return the number of utf8 code units required to encode the given utf32 code point - size_type encoded_size(utf32 code_point) const - { - if (code_point < 0x80) - return 1; - else if (code_point < 0x0800) - return 2; - else if (code_point < 0x10000) - return 3; - else - return 4; - } - - // return number of code units required to re-encode given null-terminated utf32 data as utf8. return does not include terminating null. - size_type encoded_size(const utf32* buf) const - { - return encoded_size(buf, utf_length(buf)); - } - - // return number of code units required to re-encode given utf32 data as utf8. len is number of code units in 'buf'. - size_type encoded_size(const utf32* buf, size_type len) const - { - size_type count = 0; - - while (len--) - { - count += encoded_size(*buf++); - } - - return count; - } - - // return number of utf32 code units required to re-encode given utf8 data as utf32. return does not include terminating null. - size_type encoded_size(const utf8* buf) const - { - return encoded_size(buf, utf_length(buf)); - } - - // return number of utf32 code units required to re-encode given utf8 data as utf32. len is number of code units in 'buf'. - size_type encoded_size(const utf8* buf, size_type len) const - { - utf8 tcp; - size_type count = 0; - - while (len--) - { - tcp = *buf++; - ++count; - size_type size = 0; - - if (tcp < 0x80) - { - } - else if (tcp < 0xE0) - { - size = 1; - ++buf; - } - else if (tcp < 0xF0) - { - size = 2; - buf += 2; - } - else - { - size = 3; - buf += 3; - } - - if (len >= size) - len -= size; - else - break; - } - - return count; - } - - // return number of code units in a null terminated string - size_type utf_length(const utf8* utf8_str) const - { - size_type cnt = 0; - while (*utf8_str++) - cnt++; - - return cnt; - } - - // return number of code units in a null terminated string - size_type utf_length(const utf32* utf32_str) const - { - size_type cnt = 0; - while (*utf32_str++) - cnt++; - - return cnt; - } - - // build an internal buffer with the string encoded as utf8 (remains valid until string is modified). - utf8* build_utf8_buff(void) const; - - // compare two utf32 buffers - int utf32_comp_utf32(const utf32* buf1, const utf32* buf2, size_type cp_count) const - { - if (!cp_count) - return 0; - - while ((--cp_count) && (*buf1 == *buf2)) - buf1++, buf2++; - - return *buf1 - *buf2; - } - - // compare utf32 buffer with char buffer (chars are taken to be code-points in the range 0x00-0xFF) - int utf32_comp_char(const utf32* buf1, const char* buf2, size_type cp_count) const - { - if (!cp_count) - return 0; - - while ((--cp_count) && (*buf1 == static_cast(static_cast(*buf2)))) - buf1++, buf2++; - - return *buf1 - static_cast(static_cast(*buf2)); - } - - // compare utf32 buffer with encoded utf8 data - int utf32_comp_utf8(const utf32* buf1, const utf8* buf2, size_type cp_count) const - { - if (!cp_count) - return 0; - - utf32 cp; - utf8 cu; - - do - { - cu = *buf2++; - - if (cu < 0x80) - { - cp = (utf32)(cu); - } - else if (cu < 0xE0) - { - cp = ((cu & 0x1F) << 6); - cp |= (*buf2++ & 0x3F); - } - else if (cu < 0xF0) - { - cp = ((cu & 0x0F) << 12); - cp |= ((*buf2++ & 0x3F) << 6); - cp |= (*buf2++ & 0x3F); - } - else - { - cp = ((cu & 0x07) << 18); - cp |= ((*buf2++ & 0x3F) << 12); - cp |= ((*buf2++ & 0x3F) << 6); - cp |= (*buf2++ & 0x3F); - } - - } while ((*buf1++ == cp) && (--cp_count)); - - return (*--buf1) - cp; - } - - // return index of first occurrence of 'code_point' in std::string 'str', or npos if none - size_type find_codepoint(const std::string& str, utf32 code_point) const - { - size_type idx = 0, sze = (size_type)str.size(); - - while (idx != sze) - { - if (code_point == static_cast(static_cast(str[idx]))) - return idx; - - ++idx; - } - - return npos; - } - - // return index of first occurrence of 'code_point' in utf8 encoded string 'str', or npos if none. len is in code points. - size_type find_codepoint(const utf8* str, size_type len, utf32 code_point) const - { - size_type idx = 0; - - utf32 cp; - utf8 cu; - - while (idx != len) { - cu = *str++; - - if (cu < 0x80) - { - cp = (utf32)(cu); - } - else if (cu < 0xE0) - { - cp = ((cu & 0x1F) << 6); - cp |= (*str++ & 0x3F); - } - else if (cu < 0xF0) - { - cp = ((cu & 0x0F) << 12); - cp |= ((*str++ & 0x3F) << 6); - cp |= (*str++ & 0x3F); - } - else - { - cp = ((cu & 0x07) << 18); - cp |= ((*str++ & 0x3F) << 12); - cp |= ((*str++ & 0x3F) << 6); - cp |= (*str++ & 0x3F); - } - - if (code_point == cp) - return idx; - - ++idx; - } - - return npos; - } - - - // return index of first occurrence of 'code_point' in char array 'chars', or npos if none - size_type find_codepoint(const char* chars, size_type chars_len, utf32 code_point) const - { - for (size_type idx = 0; idx != chars_len; ++idx) - { - if (code_point == static_cast(static_cast(chars[idx]))) - return idx; - } - - return npos; - } - -}; - - -////////////////////////////////////////////////////////////////////////// -// Comparison operators -////////////////////////////////////////////////////////////////////////// -/*! -\brief - Return true if String \a str1 is equal to String \a str2 -*/ -bool CEGUIEXPORT operator==(const String& str1, const String& str2); - -/*! -\brief - Return true if String \a str is equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator==(const String& str, const std::string& std_str); - -/*! -\brief - Return true if String \a str is equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator==(const std::string& std_str, const String& str); - -/*! -\brief - Return true if String \a str is equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator==(const String& str, const utf8* utf8_str); - -/*! -\brief - Return true if String \a str is equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator==(const utf8* utf8_str, const String& str); - -/*! -\brief - Return true if String \a str1 is not equal to String \a str2 -*/ -bool CEGUIEXPORT operator!=(const String& str1, const String& str2); - -/*! -\brief - Return true if String \a str is not equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator!=(const String& str, const std::string& std_str); - -/*! -\brief - Return true if String \a str is not equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator!=(const std::string& std_str, const String& str); - -/*! -\brief - Return true if String \a str is not equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator!=(const String& str, const utf8* utf8_str); - -/*! -\brief - Return true if String \a str is not equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator!=(const utf8* utf8_str, const String& str); - -/*! -\brief - Return true if String \a str1 is lexicographically less than String \a str2 -*/ -bool CEGUIEXPORT operator<(const String& str1, const String& str2); - -/*! -\brief - Return true if String \a str is lexicographically less than std::string \a std_str -*/ -bool CEGUIEXPORT operator<(const String& str, const std::string& std_str); - -/*! -\brief - Return true if String \a str is lexicographically less than std::string \a std_str -*/ -bool CEGUIEXPORT operator<(const std::string& std_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically less than null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator<(const String& str, const utf8* utf8_str); - -/*! -\brief - Return true if String \a str is lexicographically less than null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator<(const utf8* utf8_str, const String& str); - -/*! -\brief - Return true if String \a str1 is lexicographically greater than String \a str2 -*/ -bool CEGUIEXPORT operator>(const String& str1, const String& str2); - -/*! -\brief - Return true if String \a str is lexicographically greater than std::string \a std_str -*/ -bool CEGUIEXPORT operator>(const String& str, const std::string& std_str); - -/*! -\brief - Return true if String \a str is lexicographically greater than std::string \a std_str -*/ -bool CEGUIEXPORT operator>(const std::string& std_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically greater than null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator>(const String& str, const utf8* utf8_str); - -/*! -\brief - Return true if String \a str is lexicographically greater than null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator>(const utf8* utf8_str, const String& str); - -/*! -\brief - Return true if String \a str1 is lexicographically less than or equal to String \a str2 -*/ -bool CEGUIEXPORT operator<=(const String& str1, const String& str2); - -/*! -\brief - Return true if String \a str is lexicographically less than or equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator<=(const String& str, const std::string& std_str); - -/*! -\brief - Return true if String \a str is lexicographically less than or equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator<=(const std::string& std_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically less than or equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator<=(const String& str, const utf8* utf8_str); - -/*! -\brief - Return true if String \a str is lexicographically less than or equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator<=(const utf8* utf8_str, const String& str); - -/*! -\brief - Return true if String \a str1 is lexicographically greater than or equal to String \a str2 -*/ -bool CEGUIEXPORT operator>=(const String& str1, const String& str2); - -/*! -\brief - Return true if String \a str is lexicographically greater than or equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator>=(const String& str, const std::string& std_str); - -/*! -\brief - Return true if String \a str is lexicographically greater than or equal to std::string \a std_str -*/ -bool CEGUIEXPORT operator>=(const std::string& std_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically greater than or equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator>=(const String& str, const utf8* utf8_str); - -/*! -\brief - Return true if String \a str is lexicographically greater than or equal to null-terminated utf8 data \a utf8_str -*/ -bool CEGUIEXPORT operator>=(const utf8* utf8_str, const String& str); - -/*! -\brief - Return true if String \a str is equal to c-string \a c_str -*/ -bool CEGUIEXPORT operator==(const String& str, const char* c_str); - -/*! -\brief - Return true if c-string \a c_str is equal to String \a str -*/ -bool CEGUIEXPORT operator==(const char* c_str, const String& str); - -/*! -\brief - Return true if String \a str is not equal to c-string \a c_str -*/ -bool CEGUIEXPORT operator!=(const String& str, const char* c_str); - -/*! -\brief - Return true if c-string \a c_str is not equal to String \a str -*/ -bool CEGUIEXPORT operator!=(const char* c_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically less than c-string \a c_str -*/ -bool CEGUIEXPORT operator<(const String& str, const char* c_str); - -/*! -\brief - Return true if c-string \a c_str is lexicographically less than String \a str -*/ -bool CEGUIEXPORT operator<(const char* c_str, const String& str); - -/*! -\brief -Return true if String \a str is lexicographically greater than c-string \a c_str -*/ -bool CEGUIEXPORT operator>(const String& str, const char* c_str); - -/*! -\brief -Return true if c-string \a c_str is lexicographically greater than String \a str -*/ -bool CEGUIEXPORT operator>(const char* c_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically less than or equal to c-string \a c_str -*/ -bool CEGUIEXPORT operator<=(const String& str, const char* c_str); - -/*! -\brief - Return true if c-string \a c_str is lexicographically less than or equal to String \a str -*/ -bool CEGUIEXPORT operator<=(const char* c_str, const String& str); - -/*! -\brief - Return true if String \a str is lexicographically greater than or equal to c-string \a c_str -*/ -bool CEGUIEXPORT operator>=(const String& str, const char* c_str); - -/*! -\brief - Return true if c-string \a c_str is lexicographically greater than or equal to String \a str -*/ -bool CEGUIEXPORT operator>=(const char* c_str, const String& str); - -////////////////////////////////////////////////////////////////////////// -// Concatenation operator functions -////////////////////////////////////////////////////////////////////////// -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param str1 - String object describing first part of the new string - -\param str2 - String object describing the second part of the new string - -\return - A String object that is the concatenation of \a str1 and \a str2 - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const String& str1, const String& str2); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param str - String object describing first part of the new string - -\param std_str - std::string object describing the second part of the new string - -\return - A String object that is the concatenation of \a str and \a std_str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const String& str, const std::string& std_str); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param std_str - std::string object describing the first part of the new string - -\param str - String object describing the second part of the new string - -\return - A String object that is the concatenation of \a std_str and \a str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const std::string& std_str, const String& str); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param str - String object describing first part of the new string - -\param utf8_str - Buffer containing null-terminated utf8 encoded data describing the second part of the new string - -\return - A String object that is the concatenation of \a str and \a utf8_str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const String& str, const utf8* utf8_str); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param utf8_str - Buffer containing null-terminated utf8 encoded data describing the first part of the new string - -\param str - String object describing the second part of the new string - -\return - A String object that is the concatenation of \a str and \a utf8_str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const utf8* utf8_str, const String& str); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param str - String object describing the first part of the new string - -\param code_point - utf32 code point describing the second part of the new string - -\return - A String object that is the concatenation of \a str and \a code_point - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const String& str, utf32 code_point); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param code_point - utf32 code point describing the first part of the new string - -\param str - String object describing the second part of the new string - -\return - A String object that is the concatenation of \a code_point and \a str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(utf32 code_point, const String& str); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param str - String object describing first part of the new string - -\param c_str - c-string describing the second part of the new string - -\return - A String object that is the concatenation of \a str and \a c_str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const String& str, const char* c_str); - -/*! -\brief - Return String object that is the concatenation of the given inputs - -\param c_str - c-string describing the first part of the new string - -\param str - String object describing the second part of the new string - -\return - A String object that is the concatenation of \a c_str and \a str - -\exception std::length_error Thrown if the resulting String would be too large. -*/ -String CEGUIEXPORT operator+(const char* c_str, const String& str); - - -////////////////////////////////////////////////////////////////////////// -// Output (stream) functions -////////////////////////////////////////////////////////////////////////// -CEGUIEXPORT std::ostream& operator<<(std::ostream& s, const String& str); - - -////////////////////////////////////////////////////////////////////////// -// Modifying operations -////////////////////////////////////////////////////////////////////////// -/*! -\brief - Swap the contents for two String objects - -\param str1 - String object who's contents are to be swapped with \a str2 - -\param str2 - String object who's contents are to be swapped with \a str1 - -\return - Nothing -*/ -void CEGUIEXPORT swap(String& str1, String& str2); - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIString_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h b/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h deleted file mode 100644 index 2fb478ed64..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h +++ /dev/null @@ -1,2105 +0,0 @@ -/************************************************************************ - * $Id$ - * - * ------------ - * Description: - * ------------ - * This is an implemention of Unicode's Bidirectional Algorithm - * (known as UAX #9). - * - * http://www.unicode.org/reports/tr9/ - * - * Author: Ahmad Khalifa - * - * ----------------- - * Revision Details: (Updated by Revision Control System) - * ----------------- - * $Date$ - * $Author$ - * $Revision$ - * $Source$ - * - * (www.arabeyes.org - under MIT license) - * - ************************************************************************/ -#ifndef _MINIBIDI_h_ -#define _MINIBIDI_h_ - -#include "CEGUIBase.h" - -#include /* malloc() and free() definition */ -#ifdef _LINUX -#include -#endif - - -//////////////////////////////////////////////////// -// -// Detect array boundary issue -// -//////////////////////////////////////////////////// -#ifdef MTA_DEBUG - //#define DETECT_ARRAY_ISSUES -#endif - -#ifdef DETECT_ARRAY_ISSUES - - template < class T > - class CBoundedArray - { - public: - T* m_data; - int m_size; - - CBoundedArray ( T* data, int size ) - { - m_data = data; - m_size = size; - } - - T operator[]( int index ) const - { - assert ( index >= 0 && index < m_size ); - return m_data[index]; - } - - T& operator[]( int index ) - { - assert ( index >= 0 && index < m_size ); - return m_data[index]; - } - }; - - - typedef CBoundedArray < uchar > UCharArray; - typedef CBoundedArray < CEGUI::utf32 > UTF32Array; - -#else - - typedef uchar* UCharArray; - typedef CEGUI::utf32* UTF32Array; - -#endif - - - -/* - * Datatype Extension Macros - */ -#define BLOCKTYPE CEGUI::utf32 * -#define CHARTYPE CEGUI::utf32 -#define GETCHAR(from,x) from[x] - -#define GetType(x) getType(x) -/*=====TESTING mode===========*/ -//#define GetType(x) getCAPRtl(x) - -#define lenof(x) sizeof(x) / sizeof(x[0]) -#define MAX_STACK 60 - -/* character types */ -enum -{ - /* Strong Char Types */ - L, /* Left-to-Right char */ - LRE, /* Left-to-Right Embedding */ - LRO, /* Left-to-Right Override */ - R, /* Right-to-Left char */ - AL, /* Right-to-Left Arabic char */ - RLE, /* Right-to-Left Embedding */ - RLO, /* Right-to-Left Override */ - /* Weak Char Types */ - PDF, /* Pop Directional Format */ - EN, /* European Number */ - ES, /* European Number Separator */ - ET, /* European Number Terminator */ - AN, /* Arabic Number */ - CS, /* Common Number Separator */ - NSM, /* Non Spacing Mark */ - BN, /* Boundary Neutral */ - /* Neutral Char Types */ - B, /* Paragraph Separator */ - S, /* Segment Separator */ - WS, /* Whitespace */ - ON, /* Other Neutrals */ -}; - -/* Shaping Types */ -enum -{ - SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */ - SR, /* Right-Joining, ie has Isolated, Final */ - SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ - SU, /* Non-Joining */ - SC /* Join-Causing, like U+0640 (TATWEEL) */ -}; - -#define odd(x) (x%2) -/* Returns the first odd/even value greater than x */ -#define leastGreaterOdd(x) odd(x) ? (x+2) : (x+1) -#define leastGreaterEven(x) odd(x) ? (x+1) : (x+2) - -/* Shaping Helpers */ -#define STYPE(xh) ((xh >= SHAPE_FIRST) && (xh <= SHAPE_LAST)) ? \ - shapetypes[xh-SHAPE_FIRST].type : SU -#define SISOLATED(xh) shapetypes[xh-SHAPE_FIRST].form_b -#define SFINAL(xh) xh+1 -#define SINITIAL(xh) xh+2 -#define SMEDIAL(xh) xh+3 - - -/* function declarations */ -int findIndexOfRun(UCharArray level , int start, int count, int tlevel); -unsigned char getType(CHARTYPE ch); -//unsigned char getCAPRtl(CHARTYPE ch); -void doMirror(CHARTYPE* ch); - -typedef struct{ - unsigned char type; - unsigned short form_b; -} shape_node; - -/* Kept near the actual table, for verification. */ -#define SHAPE_FIRST 0x621 -#define SHAPE_LAST 0x64A -/* very bad Memory alignment for 32-bit machines - * could split it to 2 arrays or promote type to 2 bytes type - */ -const shape_node shapetypes[] = { -/* index, Typ, Iso */ -/* 621 */ {SU, 0xFE80}, -/* 622 */ {SR, 0xFE81}, -/* 623 */ {SR, 0xFE83}, -/* 624 */ {SR, 0xFE85}, -/* 625 */ {SR, 0xFE87}, -/* 626 */ {SD, 0xFE89}, -/* 627 */ {SR, 0xFE8D}, -/* 628 */ {SD, 0xFE8F}, -/* 629 */ {SR, 0xFE93}, -/* 62A */ {SD, 0xFE95}, -/* 62B */ {SD, 0xFE99}, -/* 62C */ {SD, 0xFE9D}, -/* 62D */ {SD, 0xFEA1}, -/* 62E */ {SD, 0xFEA5}, -/* 62F */ {SR, 0xFEA9}, -/* 630 */ {SR, 0xFEAB}, -/* 631 */ {SR, 0xFEAD}, -/* 632 */ {SR, 0xFEAF}, -/* 633 */ {SD, 0xFEB1}, -/* 634 */ {SD, 0xFEB5}, -/* 635 */ {SD, 0xFEB9}, -/* 636 */ {SD, 0xFEBD}, -/* 637 */ {SD, 0xFEC1}, -/* 638 */ {SD, 0xFEC5}, -/* 639 */ {SD, 0xFEC9}, -/* 63A */ {SD, 0xFECD}, -/* 63B */ {SU, 0x0}, -/* 63C */ {SU, 0x0}, -/* 63D */ {SU, 0x0}, -/* 63E */ {SU, 0x0}, -/* 63F */ {SU, 0x0}, -/* 640 */ {SC, 0x0}, -/* 641 */ {SD, 0xFED1}, -/* 642 */ {SD, 0xFED5}, -/* 643 */ {SD, 0xFED9}, -/* 644 */ {SD, 0xFEDD}, -/* 645 */ {SD, 0xFEE1}, -/* 646 */ {SD, 0xFEE5}, -/* 647 */ {SD, 0xFEE9}, -/* 648 */ {SR, 0xFEED}, -/* 649 */ {SR, 0xFEEF}, /* SD */ -/* 64A */ {SD, 0xFEF1} -}; - -/* - * Flips the text buffer, according to max level, and - * all higher levels - * - * Input: - * from: text buffer, on which to apply flipping - * level: resolved levels buffer - * max: the maximum level found in this line (should be unsigned char) - * count: line size in wchar_t - */ -void flipThisRun(UTF32Array from, const UCharArray level, const int max, const int count) -{ - int i, j, rcount, tlevel; - CHARTYPE temp; - - j = i = 0; - while(i((i-j)/2); rcount--) - { - temp = GETCHAR(from, j+rcount-1); - GETCHAR(from, j+rcount-1) = GETCHAR(from, i-rcount); - GETCHAR(from, i-rcount) = temp; - } - } -} - -/* - * Finds the index of a run with level equals tlevel - */ -int findIndexOfRun(const UCharArray level , int start, int count, int tlevel) -{ - int i; - for(i=start; i 1) { - k = (i + j) / 2; - if (ch < lookup[k].first) - j = k; - else if (ch > lookup[k].last) - i = k; - else - return (unsigned char)lookup[k].type; - } - - /* - * If we reach here, the character was not in any of the - * intervals listed in the lookup table. This means we return - * ON (`Other Neutrals'). This is the appropriate code for any - * character genuinely not listed in the Unicode table, and - * also the table above has deliberately left out any - * characters _explicitly_ listed as ON (to save space!). - */ - return ON; -} - -/* The Main shaping function, and the only one to be used - * by the outside world. - * - * line: buffer to apply shaping to. this must be passed by doBidi() first - * to: output buffer for the shaped data - * from: start bidi at this index - * count: number of characters in line - */ -int doShape(const UTF32Array line, UTF32Array to, int from, int count) -{ - int i, j, ligFlag; - unsigned char prevTemp, nextTemp; - - ligFlag = 0; - prevTemp = SU; - nextTemp = SU; - for(i=from; i= 0) - { - if(GetType(GETCHAR(line, j)) != NSM) - { - prevTemp = STYPE(GETCHAR(line, j)); - break; - } - } - j=i; - while(++j < count) - { - if(GetType(GETCHAR(line, j)) != NSM) - { - nextTemp = STYPE(GETCHAR(line, j)); - break; - }else if(j == count-1) - { - nextTemp = SU; - break; - } - } - - switch(STYPE(GETCHAR(line, i))) - { - case SC: - case SU: - to[i] = GETCHAR(line, i); - break; - - case SR: - if(prevTemp == SD || prevTemp == SC) - to[i] = SFINAL(SISOLATED(GETCHAR(line, i))); - else - to[i] = SISOLATED(GETCHAR(line, i)); - break; - - case SD: - /* Make Ligatures */ - if(GETCHAR(line, i) == 0x644) - { - j=i; - CHARTYPE tempChar = 0; - while(j++ 0) - { - currentEmbedding = levelStack[stackTop-1]; - currentOverride = overrideStack[stackTop-1]; - stackTop--; - } - break; - /* Whitespace is treated as neutral for now */ - case WS: - case B: - case S: - levels[j] = currentEmbedding; - tempType = ON; - if(currentOverride != ON) - tempType = currentOverride; - types[j] = tempType; - j++; - break; - default: - levels[j] = currentEmbedding; - if(currentOverride != ON) - tempType = currentOverride; - types[j] = tempType; - j++; - break; - } - } - }else - { - j = count; - for( i=0; i= 0 && j <= count ); - return j; -} - -/* Rule (W3) */ -void doALtoR(UCharArray types, int count) -{ - int i=0; - for(; i= 0 && levels[j] == tempType) - { - if(types[j] == AL) - { - types[i] = AN; - break; - } - else if(types[j] == R || types[j] == L) - { - break; - } - } - } - } - - /* Rule (W3) - * W3. Change all ALs to R. - * - * Optimization: on Rule Xn, we might set a flag on AL type - * to prevent this loop in L R lines only... - */ - doALtoR(types, count); - - /* Rule (W4) - * W4. A single European separator between two European numbers changes - * to a European number. A single common separator between two numbers - * of the same type changes to that type. - */ - for( i=1; i<(count-1); i++) // Changed i=0 to i=1 to fix crash - { - if(types[i] == ES) - { - if(types[i-1] == EN && types[i+1] == EN) - types[i] = EN; - }else if(types[i] == CS) - { - if(types[i-1] == EN && types[i+1] == EN) - types[i] = EN; - else if(types[i-1] == AN && types[i+1] == AN) - types[i] = AN; - } - } - - /* Rule (W5) - * W5. A sequence of European terminators adjacent to European numbers - * changes to all European numbers. - * - * Optimization: lots here... else ifs need rearrangement - */ - if(fET) - { - for(i=1; i= 0 && levels[j] == tempType) - { - if(types[j] == L) - { - types[i] = L; - break; - } - else if(types[j] == R || types[j] == AL) - { - break; - } - - } - } - } - - - /* Rule (N1) - * N1. A sequence of neutrals takes the direction of the surrounding - * strong text if the text on both sides has the same direction. European - * and Arabic numbers are treated as though they were R. - */ - tempType = paragraphLevel; - tempTypeSec = 0; // Added to fix uninitialized value - for(i=0; i 0 ) // Added to fix a crash - { - if(types[i-1] == R || types[i-1] == EN || types[i-1] == AN) - tempType = R; - else - tempType = L; - } - else // Added for test - tempType = L; // Added for test - - j=i; - - while(j < count) - { - tempTypeSec = types[j]; - if(tempTypeSec == ON) - j++; - else - break; - } - if(j == count) - tempTypeSec = odd(paragraphLevel) ? R : L; - - - if(((tempTypeSec == L || tempTypeSec == LRE) && (tempType == L)) || - (((tempTypeSec == R) || (tempTypeSec == EN) || (tempTypeSec == AN)) && (tempType == R))) - { - while(i0 && (GetType(GETCHAR(line, j)) == WS)) - { - j--; - } - if(j < (count-1)) - { - for(j++; j=i ; j--) - { - levels[j] = paragraphLevel; - } - } - }else if(tempType == B || tempType == S) - levels[i] = paragraphLevel; - } - - /* Rule (L4) - * L4. A character that possesses the mirrored property as specified by - * Section 4.7, Mirrored, must be depicted by a mirrored glyph if the - * resolved directionality of that character is R. - */ - /* Note: this is implemented before L2 for efficiency */ - for(i=0; ii; i++, j--) - { - temp = GETCHAR(line, i); - GETCHAR(line, i) = GETCHAR(line, j); - GETCHAR(line, j) = temp; - } - i=it+1; - } - } - } - - /* Shaping - * Shaping is Applied to each run of levels separately.... - */ - - if(applyShape) - { - - for(i=0; i= i ) - { - tempType = levels[j]; - i=j; - while((i++ < count - 1) && (levels[i] == tempType)); // Changed 'count' to 'count-1' to fix a crash - doShape(line, shapeTo, j, i); - j=i; - //tempType = levels[j]; // Removed to fix a crash (It doesn't look used anyway) - - } - } - j++; - } - for(i=0; i tempType) - { - tempType = levels[i]; - imax=i; - } - i++; - } - /* maximum level in tempType, its index in imax. */ - while(tempType > 0) /* loop from highest level to the least odd, */ - { /* which i assume is 1 */ - flipThisRun(line, levels, tempType, count); - tempType--; - } - -#ifdef DETECT_ARRAY_ISSUES - free(_types); - free(_levels); -#else - free(types); - free(levels); -#endif - - return count; -} - - -/* - * takes a pointer to a character that is checked for - * having a mirror glyph, and replaced on the spot - */ -void doMirror(CHARTYPE* ch) -{ - static const struct{ - CHARTYPE first, mirror; - } lookup[] = { - {0x0028, 0x0029}, - {0x0029, 0x0028}, - {0x003C, 0x003E}, - {0x003E, 0x003C}, - {0x005B, 0x005D}, - {0x005D, 0x005B}, - {0x007B, 0x007D}, - {0x007D, 0x007B}, - {0x00AB, 0x00BB}, - {0x00BB, 0x00AB}, - {0x2039, 0x203A}, - {0x203A, 0x2039}, - {0x2045, 0x2046}, - {0x2046, 0x2045}, - {0x207D, 0x207E}, - {0x207E, 0x207D}, - {0x208D, 0x208E}, - {0x208E, 0x208D}, - {0x2208, 0x220B}, - {0x2209, 0x220C}, - {0x220A, 0x220D}, - {0x220B, 0x2208}, - {0x220C, 0x2209}, - {0x220D, 0x220A}, - {0x2215, 0x29F5}, - {0x223C, 0x223D}, - {0x223D, 0x223C}, - {0x2243, 0x22CD}, - {0x2252, 0x2253}, - {0x2253, 0x2252}, - {0x2254, 0x2255}, - {0x2255, 0x2254}, - {0x2264, 0x2265}, - {0x2265, 0x2264}, - {0x2266, 0x2267}, - {0x2267, 0x2266}, - {0x2268, 0x2269}, - {0x2269, 0x2268}, - {0x226A, 0x226B}, - {0x226B, 0x226A}, - {0x226E, 0x226F}, - {0x226F, 0x226E}, - {0x2270, 0x2271}, - {0x2271, 0x2270}, - {0x2272, 0x2273}, - {0x2273, 0x2272}, - {0x2274, 0x2275}, - {0x2275, 0x2274}, - {0x2276, 0x2277}, - {0x2277, 0x2276}, - {0x2278, 0x2279}, - {0x2279, 0x2278}, - {0x227A, 0x227B}, - {0x227B, 0x227A}, - {0x227C, 0x227D}, - {0x227D, 0x227C}, - {0x227E, 0x227F}, - {0x227F, 0x227E}, - {0x2280, 0x2281}, - {0x2281, 0x2280}, - {0x2282, 0x2283}, - {0x2283, 0x2282}, - {0x2284, 0x2285}, - {0x2285, 0x2284}, - {0x2286, 0x2287}, - {0x2287, 0x2286}, - {0x2288, 0x2289}, - {0x2289, 0x2288}, - {0x228A, 0x228B}, - {0x228B, 0x228A}, - {0x228F, 0x2290}, - {0x2290, 0x228F}, - {0x2291, 0x2292}, - {0x2292, 0x2291}, - {0x2298, 0x29B8}, - {0x22A2, 0x22A3}, - {0x22A3, 0x22A2}, - {0x22A6, 0x2ADE}, - {0x22A8, 0x2AE4}, - {0x22A9, 0x2AE3}, - {0x22AB, 0x2AE5}, - {0x22B0, 0x22B1}, - {0x22B1, 0x22B0}, - {0x22B2, 0x22B3}, - {0x22B3, 0x22B2}, - {0x22B4, 0x22B5}, - {0x22B5, 0x22B4}, - {0x22B6, 0x22B7}, - {0x22B7, 0x22B6}, - {0x22C9, 0x22CA}, - {0x22CA, 0x22C9}, - {0x22CB, 0x22CC}, - {0x22CC, 0x22CB}, - {0x22CD, 0x2243}, - {0x22D0, 0x22D1}, - {0x22D1, 0x22D0}, - {0x22D6, 0x22D7}, - {0x22D7, 0x22D6}, - {0x22D8, 0x22D9}, - {0x22D9, 0x22D8}, - {0x22DA, 0x22DB}, - {0x22DB, 0x22DA}, - {0x22DC, 0x22DD}, - {0x22DD, 0x22DC}, - {0x22DE, 0x22DF}, - {0x22DF, 0x22DE}, - {0x22E0, 0x22E1}, - {0x22E1, 0x22E0}, - {0x22E2, 0x22E3}, - {0x22E3, 0x22E2}, - {0x22E4, 0x22E5}, - {0x22E5, 0x22E4}, - {0x22E6, 0x22E7}, - {0x22E7, 0x22E6}, - {0x22E8, 0x22E9}, - {0x22E9, 0x22E8}, - {0x22EA, 0x22EB}, - {0x22EB, 0x22EA}, - {0x22EC, 0x22ED}, - {0x22ED, 0x22EC}, - {0x22F0, 0x22F1}, - {0x22F1, 0x22F0}, - {0x22F2, 0x22FA}, - {0x22F3, 0x22FB}, - {0x22F4, 0x22FC}, - {0x22F6, 0x22FD}, - {0x22F7, 0x22FE}, - {0x22FA, 0x22F2}, - {0x22FB, 0x22F3}, - {0x22FC, 0x22F4}, - {0x22FD, 0x22F6}, - {0x22FE, 0x22F7}, - {0x2308, 0x2309}, - {0x2309, 0x2308}, - {0x230A, 0x230B}, - {0x230B, 0x230A}, - {0x2329, 0x232A}, - {0x232A, 0x2329}, - {0x2768, 0x2769}, - {0x2769, 0x2768}, - {0x276A, 0x276B}, - {0x276B, 0x276A}, - {0x276C, 0x276D}, - {0x276D, 0x276C}, - {0x276E, 0x276F}, - {0x276F, 0x276E}, - {0x2770, 0x2771}, - {0x2771, 0x2770}, - {0x2772, 0x2773}, - {0x2773, 0x2772}, - {0x2774, 0x2775}, - {0x2775, 0x2774}, - {0x27C3, 0x27C4}, - {0x27C4, 0x27C3}, - {0x27C5, 0x27C6}, - {0x27C6, 0x27C5}, - {0x27D5, 0x27D6}, - {0x27D6, 0x27D5}, - {0x27DD, 0x27DE}, - {0x27DE, 0x27DD}, - {0x27E2, 0x27E3}, - {0x27E3, 0x27E2}, - {0x27E4, 0x27E5}, - {0x27E5, 0x27E4}, - {0x27E6, 0x27E7}, - {0x27E7, 0x27E6}, - {0x27E8, 0x27E9}, - {0x27E9, 0x27E8}, - {0x27EA, 0x27EB}, - {0x27EB, 0x27EA}, - {0x2983, 0x2984}, - {0x2984, 0x2983}, - {0x2985, 0x2986}, - {0x2986, 0x2985}, - {0x2987, 0x2988}, - {0x2988, 0x2987}, - {0x2989, 0x298A}, - {0x298A, 0x2989}, - {0x298B, 0x298C}, - {0x298C, 0x298B}, - {0x298D, 0x2990}, - {0x298E, 0x298F}, - {0x298F, 0x298E}, - {0x2990, 0x298D}, - {0x2991, 0x2992}, - {0x2992, 0x2991}, - {0x2993, 0x2994}, - {0x2994, 0x2993}, - {0x2995, 0x2996}, - {0x2996, 0x2995}, - {0x2997, 0x2998}, - {0x2998, 0x2997}, - {0x29B8, 0x2298}, - {0x29C0, 0x29C1}, - {0x29C1, 0x29C0}, - {0x29C4, 0x29C5}, - {0x29C5, 0x29C4}, - {0x29CF, 0x29D0}, - {0x29D0, 0x29CF}, - {0x29D1, 0x29D2}, - {0x29D2, 0x29D1}, - {0x29D4, 0x29D5}, - {0x29D5, 0x29D4}, - {0x29D8, 0x29D9}, - {0x29D9, 0x29D8}, - {0x29DA, 0x29DB}, - {0x29DB, 0x29DA}, - {0x29F5, 0x2215}, - {0x29F8, 0x29F9}, - {0x29F9, 0x29F8}, - {0x29FC, 0x29FD}, - {0x29FD, 0x29FC}, - {0x2A2B, 0x2A2C}, - {0x2A2C, 0x2A2B}, - {0x2A2D, 0x2A2E}, - {0x2A2E, 0x2A2D}, - {0x2A34, 0x2A35}, - {0x2A35, 0x2A34}, - {0x2A3C, 0x2A3D}, - {0x2A3D, 0x2A3C}, - {0x2A64, 0x2A65}, - {0x2A65, 0x2A64}, - {0x2A79, 0x2A7A}, - {0x2A7A, 0x2A79}, - {0x2A7D, 0x2A7E}, - {0x2A7E, 0x2A7D}, - {0x2A7F, 0x2A80}, - {0x2A80, 0x2A7F}, - {0x2A81, 0x2A82}, - {0x2A82, 0x2A81}, - {0x2A83, 0x2A84}, - {0x2A84, 0x2A83}, - {0x2A8B, 0x2A8C}, - {0x2A8C, 0x2A8B}, - {0x2A91, 0x2A92}, - {0x2A92, 0x2A91}, - {0x2A93, 0x2A94}, - {0x2A94, 0x2A93}, - {0x2A95, 0x2A96}, - {0x2A96, 0x2A95}, - {0x2A97, 0x2A98}, - {0x2A98, 0x2A97}, - {0x2A99, 0x2A9A}, - {0x2A9A, 0x2A99}, - {0x2A9B, 0x2A9C}, - {0x2A9C, 0x2A9B}, - {0x2AA1, 0x2AA2}, - {0x2AA2, 0x2AA1}, - {0x2AA6, 0x2AA7}, - {0x2AA7, 0x2AA6}, - {0x2AA8, 0x2AA9}, - {0x2AA9, 0x2AA8}, - {0x2AAA, 0x2AAB}, - {0x2AAB, 0x2AAA}, - {0x2AAC, 0x2AAD}, - {0x2AAD, 0x2AAC}, - {0x2AAF, 0x2AB0}, - {0x2AB0, 0x2AAF}, - {0x2AB3, 0x2AB4}, - {0x2AB4, 0x2AB3}, - {0x2ABB, 0x2ABC}, - {0x2ABC, 0x2ABB}, - {0x2ABD, 0x2ABE}, - {0x2ABE, 0x2ABD}, - {0x2ABF, 0x2AC0}, - {0x2AC0, 0x2ABF}, - {0x2AC1, 0x2AC2}, - {0x2AC2, 0x2AC1}, - {0x2AC3, 0x2AC4}, - {0x2AC4, 0x2AC3}, - {0x2AC5, 0x2AC6}, - {0x2AC6, 0x2AC5}, - {0x2ACD, 0x2ACE}, - {0x2ACE, 0x2ACD}, - {0x2ACF, 0x2AD0}, - {0x2AD0, 0x2ACF}, - {0x2AD1, 0x2AD2}, - {0x2AD2, 0x2AD1}, - {0x2AD3, 0x2AD4}, - {0x2AD4, 0x2AD3}, - {0x2AD5, 0x2AD6}, - {0x2AD6, 0x2AD5}, - {0x2ADE, 0x22A6}, - {0x2AE3, 0x22A9}, - {0x2AE4, 0x22A8}, - {0x2AE5, 0x22AB}, - {0x2AEC, 0x2AED}, - {0x2AED, 0x2AEC}, - {0x2AF7, 0x2AF8}, - {0x2AF8, 0x2AF7}, - {0x2AF9, 0x2AFA}, - {0x2AFA, 0x2AF9}, - {0x2E02, 0x2E03}, - {0x2E03, 0x2E02}, - {0x2E04, 0x2E05}, - {0x2E05, 0x2E04}, - {0x2E09, 0x2E0A}, - {0x2E0A, 0x2E09}, - {0x2E0C, 0x2E0D}, - {0x2E0D, 0x2E0C}, - {0x2E1C, 0x2E1D}, - {0x2E1D, 0x2E1C}, - {0x3008, 0x3009}, - {0x3009, 0x3008}, - {0x300A, 0x300B}, - {0x300B, 0x300A}, - {0x300C, 0x300D}, - {0x300D, 0x300C}, - {0x300E, 0x300F}, - {0x300F, 0x300E}, - {0x3010, 0x3011}, - {0x3011, 0x3010}, - {0x3014, 0x3015}, - {0x3015, 0x3014}, - {0x3016, 0x3017}, - {0x3017, 0x3016}, - {0x3018, 0x3019}, - {0x3019, 0x3018}, - {0x301A, 0x301B}, - {0x301B, 0x301A}, - {0xFF08, 0xFF09}, - {0xFF09, 0xFF08}, - {0xFF1C, 0xFF1E}, - {0xFF1E, 0xFF1C}, - {0xFF3B, 0xFF3D}, - {0xFF3D, 0xFF3B}, - {0xFF5B, 0xFF5D}, - {0xFF5D, 0xFF5B}, - {0xFF5F, 0xFF60}, - {0xFF60, 0xFF5F}, - {0xFF62, 0xFF63}, - {0xFF63, 0xFF62}, - }; - - int i, j, k; - - i = -1; - j = lenof(lookup); - - while (j - i > 1) { - k = (i + j) / 2; - if (*ch < lookup[k].first) - j = k; - else if (*ch > lookup[k].first) - i = k; - else if(*ch == lookup[k].first) - { - //return (unsigned char)lookup[k].type; - *ch = lookup[k].mirror; - return; - } - } -} - - -#ifdef DETECT_ARRAY_ISSUES - -//////////////////////////////////////////////////// -// -// Stress test doBidi function -// -//////////////////////////////////////////////////// -void doBidiTest ( void ) -{ - std::vector < CEGUI::utf32 > buffer; - buffer.resize ( 1000 ); - CEGUI::utf32* ptr = &buffer[0]; - - for ( uint i = 0 ; i < 100 ; i++ ) - { - uint uiSize = rand () % 64; - - for ( uint s = 0 ; s < uiSize ; s++ ) - { - ptr[s] = ( rand () << 16 ) + rand (); - - uint mask = 0xffffffff; - switch ( rand() % 5 ) - { - case 0: - mask = 0x7f; break; - case 1: - mask = 0xff; break; - case 2: - mask = 0x7ff; break; - case 3: - mask = 0x1fff; break; - case 4: - mask = 0xffffffff; break; - default: - mask = 0xffffffff; break; - }; - ptr[s] &= mask; - } - - doBidi(ptr, uiSize, true, true); - } -} - -#endif - -#endif \ No newline at end of file diff --git a/vendor/cegui-0.4.0-custom/include/CEGUISystem.h b/vendor/cegui-0.4.0-custom/include/CEGUISystem.h deleted file mode 100644 index c6588bc606..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUISystem.h +++ /dev/null @@ -1,1047 +0,0 @@ -/************************************************************************ - filename: CEGUISystem.h - created: 20/2/2004 - author: Paul D Turner - - purpose: Defines interface for main GUI system class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISystem_h_ -#define _CEGUISystem_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUIRenderer.h" -#include "CEGUIMouseCursor.h" -#include "CEGUIInputEvent.h" -#include "CEGUIResourceProvider.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -//! Implementation struct that tracks and controls multiclick for mouse buttons. -struct MouseClickTrackerImpl; - - -/*! -\brief - The System class is the CEGUI class that provides access to all other elements in this system. - - This object must be created by the client application. The System object requires that you pass it - an initialised Renderer object which it can use to interface to whatever rendering system will be - used to display the GUI imagery. -*/ -class CEGUIEXPORT System : public Singleton, public EventSet -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Constants - *************************************************************************/ - static const double DefaultSingleClickTimeout; //!< Default timeout for generation of single click events. - static const double DefaultMultiClickTimeout; //!< Default timeout for generation of multi-click events. - static const Size DefaultMultiClickAreaSize; //!< Default allowable mouse movement for multi-click event generation. - - // event names - static const String EventGUISheetChanged; //!< Name of event fired whenever the GUI sheet is changed. - static const String EventSingleClickTimeoutChanged; //!< Name of event fired when the single-click timeout is changed. - static const String EventMultiClickTimeoutChanged; //!< Name of event fired when the multi-click timeout is changed. - static const String EventMultiClickAreaSizeChanged; //!< Name of event fired when the size of the multi-click tolerance area is changed. - static const String EventDefaultFontChanged; //!< Name of event fired when the default font changes. - static const String EventDefaultMouseCursorChanged; //!< Name of event fired when the default mouse cursor changes. - static const String EventMouseMoveScalingChanged; //!< Name of event fired when the mouse move scaling factor changes. - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructs a System object. - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param logFile - pointer to a utf8 encoded buffer containing the name to use for the log file. - */ - System(Renderer* renderer, const utf8* logFile = (const utf8*)"CEGUI.log"); - - /*! - \brief - Construct a new System object - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param resourceProvider - Pointer to a ResourceProvider object. - - \param logFile - pointer to a utf8 encoded buffer containing the name to use for the log file. - */ - System(Renderer* renderer, ResourceProvider* resourceProvider, const utf8* logFile = (const utf8*)"CEGUI.log"); - - - /*! - \brief - Construct a new System object - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param scriptModule - Pointer to a ScriptModule object. may be NULL. - - \param configFile - pointer to a utf8 encoded buffer containing the name to use for the configuration file. - */ - System(Renderer* renderer, ScriptModule* scriptModule, const utf8* configFile = (const utf8*)"cegui.config"); - - - /*! - \brief - Construct a new System object - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param scriptModule - Pointer to a ScriptModule object. may be NULL. - - \param resourceProvider - Pointer to a ResourceProvider object. - - \param configFile - pointer to a utf8 encoded buffer containing the name to use for the configuration file. - */ - System(Renderer* renderer, ScriptModule* scriptModule, ResourceProvider* resourceProvider, const utf8* configFile = (const utf8*)"cegui.config"); - - - /*! - \brief - Constructs a System object. - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param xmlParser - Pointer to a valid XMLParser object to be used when parsing XML files, or NULL to use a default parser. - - \param logFile - pointer to a utf8 encoded buffer containing the name to use for the log file. - */ - System(Renderer* renderer, XMLParser* xmlParser, const utf8* logFile = (const utf8*)"CEGUI.log"); - - - /*! - \brief - Constructs a System object. - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param resourceProvider - Pointer to a ResourceProvider object. - - \param xmlParser - Pointer to a valid XMLParser object to be used when parsing XML files, or NULL to use a default parser. - - \param logFile - pointer to a utf8 encoded buffer containing the name to use for the log file. - */ - System(Renderer* renderer, ResourceProvider* resourceProvider, XMLParser* xmlParser, const utf8* logFile = (const utf8*)"CEGUI.log"); - - - /*! - \brief - Construct a new System object - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param xmlParser - Pointer to a valid XMLParser object to be used when parsing XML files, or NULL to use a default parser. - - \param scriptModule - Pointer to a ScriptModule object. may be NULL. - - \param configFile - pointer to a utf8 encoded buffer containing the name to use for the configuration file. - */ - System(Renderer* renderer, XMLParser* xmlParser, ScriptModule* scriptModule, const utf8* configFile = (const utf8*)"cegui.config"); - - - /*! - \brief - Construct a new System object - - \param renderer - Pointer to the valid Renderer object that will be used to render GUI imagery - - \param resourceProvider - Pointer to a ResourceProvider object. - - \param xmlParser - Pointer to a valid XMLParser object to be used when parsing XML files, or NULL to use a default parser. - - \param scriptModule - Pointer to a ScriptModule object. may be NULL. - - \param configFile - pointer to a utf8 encoded buffer containing the name to use for the configuration file. - */ - System(Renderer* renderer, ResourceProvider* resourceProvider, XMLParser* xmlParser, ScriptModule* scriptModule, const utf8* configFile = (const utf8*)"cegui.config"); - - - /*! - \brief - Destructor for System objects. - */ - ~System(void); - - - /*! - \brief - Return a pointer to the Renderer object being used by the system - - \return - Pointer to the Renderer object used by the system. - */ - Renderer* getRenderer(void) const {return d_renderer;} - - /*! - \brief - Return a pointer to the FontManager object being used by the system - - \return - Pointer to the Renderer object used by the system. - */ - FontManager* getFontManager(void) const {return d_fontManager;} - - - /*! - \brief - Return singleton System object - - \return - Singleton System object - */ - static System& getSingleton(void); - - - /*! - \brief - Return pointer to singleton System object - - \return - Pointer to singleton System object - */ - static System* getSingletonPtr(void); - - - /*! - \brief - Set the default font to be used by the system - - \param name - String object containing the name of the font to be used as the system default. - - \return - Nothing. - */ - void setDefaultFont(const String& name); - - - /*! - \brief - Set the default font to be used by the system - - \param font - Pointer to the font to be used as the system default. - - \return - Nothing. - */ - void setDefaultFont(Font* font); - - - /*! - \brief - Return a pointer to the default Font for the GUI system - - \return - Pointer to a Font object that is the default font in the system. - */ - Font* getDefaultFont(void) const {return d_defaultFont;} - - - /*! - \brief - Causes a full re-draw next time renderGUI() is called - - \return - Nothing - */ - void signalRedraw() {d_gui_redraw = true;} - - - /*! - \brief - Return a boolean value to indicate whether a full re-draw is requested next time renderGUI() is called. - - \return - true if a re-draw has been requested - */ - bool isRedrawRequested() const {return d_gui_redraw;} - - - /*! - \brief - Render the GUI - - Depending upon the internal state, this may either re-use rendering from last time, or trigger a full re-draw from all elements. - - \return - False if render failed - */ - bool renderGUI(void); - - - /*! - \brief - Set the active GUI sheet (root) window. - - \param sheet - Pointer to a Window object that will become the new GUI 'root' - - \return - Pointer to the window that was previously set as the GUI root. - */ - Window* setGUISheet(Window* sheet); - - - /*! - \brief - Return a pointer to the active GUI sheet (root) window. - - \return - Pointer to the window object that has been set as the GUI root element. - */ - Window* getGUISheet(void) const {return d_activeSheet;} - - - /*! - \brief - Return the current timeout for generation of single-click events. - - A single-click is defined here as a button being pressed and then released. - - \return - double value equal to the current single-click timeout value. - */ - double getSingleClickTimeout(void) const {return d_click_timeout;} - - - /*! - \brief - Return the current timeout for generation of multi-click events. - - A multi-click event is a double-click, or a triple-click. The value returned - here is the maximum allowable time between mouse button down events for which - a multi-click event will be generated. - - \return - double value equal to the current multi-click timeout value. - */ - double getMultiClickTimeout(void) const {return d_dblclick_timeout;} - - - /*! - \brief - Return the size of the allowable mouse movement tolerance used when generating multi-click events. - - This size defines an area with the mouse at the centre. The mouse must stay within the tolerance defined - for a multi-click (double click, or triple click) event to be generated. - - \return - Size object describing the current multi-click tolerance area size. - */ - const Size& getMultiClickToleranceAreaSize(void) const {return d_dblclick_size;} - - - /*! - \brief - Set the timeout used for generation of single-click events. - - A single-click is defined here as a button being pressed and then released. - - \param timeout - double value equal to the single-click timeout value to be used from now onwards. - - \return - Nothing. - */ - void setSingleClickTimeout(double timeout); - - - /*! - \brief - Set the timeout to be used for the generation of multi-click events. - - A multi-click event is a double-click, or a triple-click. The value returned - here is the maximum allowable time between mouse button down events for which - a multi-click event will be generated. - - \param timeout - double value equal to the multi-click timeout value to be used from now onwards. - - \return - Nothing. - */ - void setMultiClickTimeout(double timeout); - - - /*! - \brief - Set the size of the allowable mouse movement tolerance used when generating multi-click events. - - This size defines an area with the mouse at the centre. The mouse must stay within the tolerance defined - for a multi-click (double click, or triple click) event to be generated. - - \param sz - Size object describing the multi-click tolerance area size to be used. - - \return - Nothing. - */ - void setMultiClickToleranceAreaSize(const Size& sz); - - - /*! - \brief - Return the currently set default mouse cursor image - - \return - Pointer to the current default image used for the mouse cursor. May return NULL if default cursor has not been set, - or has intentionally been set to NULL - which results in a blank default cursor. - */ - const Image* getDefaultMouseCursor(void) const {return d_defaultMouseCursor;} - - - /*! - \brief - Set the image to be used as the default mouse cursor. - - \param image - Pointer to an image object that is to be used as the default mouse cursor. To have no cursor rendered by default, you - can specify NULL here. - - \return - Nothing. - */ - void setDefaultMouseCursor(const Image* image); - - - /*! - \brief - Set the image to be used as the default mouse cursor. - - \param image - One of the MouseCursorImage enumerated values. - - \return - Nothing. - */ - void setDefaultMouseCursor(MouseCursorImage image) {setDefaultMouseCursor((const Image*)image);} - - - /*! - \brief - Set the image to be used as the default mouse cursor. - - \param imageset - String object that contains the name of the Imageset that contains the image to be used. - - \param image_name - String object that contains the name of the Image on \a imageset that is to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if \a imageset is not known, or if \a imageset contains no Image named \a image_name. - */ - void setDefaultMouseCursor(const String& imageset, const String& image_name); - - - /*! - \brief - Return the Window object that the mouse is presently within - - \return - Pointer to the Window object that currently contains the mouse cursor, or NULL if none. - */ - Window* getWindowContainingMouse(void) const {return d_wndWithMouse;} - - - /*! - \brief - Return a pointer to the ScriptModule being used for scripting within the GUI system. - - \return - Pointer to a ScriptModule based object. - */ - ScriptModule* getScriptingModule(void) const; - - /*! - \brief - Return a pointer to the ResourceProvider being used within the GUI system. - - \return - Pointer to a ResourceProvider based object. - */ - ResourceProvider* getResourceProvider(void) const; - - /*! - \brief - Execute a script file if possible. - - \param filename - String object holding the filename of the script file that is to be executed - - \param resourceGroup - Resource group identifier to be passed to the ResourceProvider when loading the script file. - */ - void executeScriptFile(const String& filename, const String& resourceGroup = "") const; - - - /*! - \brief - Execute a scripted global function if possible. The function should not take any parameters and should return an integer. - - \param function_name - String object holding the name of the function, in the global script environment, that - is to be executed. - - \return - The integer value returned from the script function. - */ - int executeScriptGlobal(const String& function_name) const; - - - /*! - \brief - If possible, execute script code contained in the given CEGUI::String object. - - \param str - String object holding the valid script code that should be executed. - - \return - Nothing. - */ - void executeScriptString(const String& str) const; - - - /*! - \brief - return the current mouse movement scaling factor. - - \return - float value that is equal to the currently set mouse movement scaling factor. Defaults to 1.0f. - */ - float getMouseMoveScaling(void) const; - - - /*! - \brief - Set the current mouse movement scaling factor - - \param scaling - float value specifying the scaling to be applied to mouse movement inputs. - - \return - nothing. - */ - void setMouseMoveScaling(float scaling); - - - /*! - \brief - Internal method used to inform the System object whenever a window is destroyed, so that System can perform any required - housekeeping. - - \note - This method is not intended for client code usage. If you use this method anything can, and probably will, go wrong! - */ - void notifyWindowDestroyed(const Window* window); - - - /*! - \brief - Return the current system keys value. - - \return - uint value representing a combination of the SystemKey bits. - */ - uint getSystemKeys(void) const { return d_sysKeys; } - - /*! - \brief - Return the XMLParser object. - */ - XMLParser* getXMLParser(void) const { return d_xmlParser; } - - - /*! - \brief - Set the system default Tooltip object. This value may be NULL to indicate that no default Tooltip will be - available. - - \param tooltip - Pointer to a valid Tooltip based object which should be used as the default tooltip for the system, or NULL to - indicate that no system default tooltip is required. Note that when passing a pointer to a Tooltip object, - ownership of the Tooltip does not pass to System. - - \return - Nothing. - */ - void setTooltip(Tooltip* tooltip); - - /*! - \brief - Set the system default Tooltip to be used by specifying a Window type. - - System will internally attempt to create an instance of the specified window type (which must be - derived from the base Tooltip class). If the Tooltip creation fails, the error is logged and no - system default Tooltip will be available. - - \param tooltipType - String object holding the name of the Tooltip based Window type which should be used as the Tooltip for - the system default. - - \return - Nothing. - */ - void setTooltip(const String& tooltipType); - - /*! - \brief - return a poiter to the system default tooltip. May return 0. - - \return - Pointer to the current system default tooltip. May return 0 if - no system default tooltip is available. - */ - Tooltip* getDefaultTooltip(void) const { return d_defaultTooltip; } - - - /*! - \brief - Internal method to directly set the current modal target. - - \note - This method is called internally by Window, and must be used by client code. - Doing so will most likely not have the expected results. - */ - void setModalTarget(Window* target) {d_modalTarget = target;} - - /*! - \brief - Return a pointer to the Window that is currently the modal target. - - \return - Pointer to the current modal target. NULL if there is no modal target. - */ - Window* getModalTarget(void) const {return d_modalTarget;} - - - /************************************************************************* - Input injection interface - *************************************************************************/ - /*! - \brief - Method that injects a mouse movement event into the system - - \param delta_x - amount the mouse moved on the x axis. - - \param delta_y - amount the mouse moved on the y axis. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectMouseMove(float delta_x, float delta_y); - - - /*! - \brief - Method that injects that the mouse has left the application window - - \return - - true if the generated mouse move event was handled. - - false if the generated mouse move event was not handled. - */ - bool injectMouseLeaves(void); - - - /*! - \brief - Method that injects a mouse button down event into the system. - - \param button - One of the MouseButton values indicating which button was pressed. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectMouseButtonDown(MouseButton button); - - - /*! - \brief - Method that injects a mouse button up event into the system. - - \param button - One of the MouseButton values indicating which button was released. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectMouseButtonUp(MouseButton button); - - - /*! - \brief - Method that injects a key down event into the system. - - \param key_code - uint value indicating which key was pressed. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectKeyDown(uint key_code); - - - /*! - \brief - Method that injects a key up event into the system. - - \param key_code - uint value indicating which key was released. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectKeyUp(uint key_code); - - - /*! - \brief - Method that injects a typed character event into the system. - - \param code_point - Unicode code point of the character that was typed. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectChar(utf32 code_point); - - - /*! - \brief - Method that injects a mouse-wheel / scroll-wheel event into the system. - - \param delta - float value representing the amount the wheel moved. - - \return - - true if the input was processed by the gui system. - - false if the input was not processed by the gui system. - */ - bool injectMouseWheelChange(float delta); - - - /*! - \brief - Method that injects a new position for the mouse cursor. - - \param x_pos - New absolute pixel position of the mouse cursor on the x axis. - - \param y_pos - New absolute pixel position of the mouse cursoe in the y axis. - - \return - - true if the generated mouse move event was handled. - - false if the generated mouse move event was not handled. - */ - bool injectMousePosition(float x_pos, float y_pos); - - - /*! - \brief - Method to inject time pulses into the system. - - \param timeElapsed - float value indicating the amount of time passed, in seconds, since the last time this method was called. - - \return - Currently, this method always returns true. - */ - bool injectTimePulse(float timeElapsed); - - bool isStarted(void) { return d_started; } - - void SetGuiWorkingDirectory ( const String& strDir ) { d_guiWorkingDirectory = strDir; } - String GetGuiWorkingDirectory ( void ) { return d_guiWorkingDirectory; } - - bool d_started; - static void SetBidiEnabled ( bool bEnabled ) { ms_bBidiEnabled = bEnabled; } - static bool ms_bBidiEnabled; -private: - // unimplemented constructors / assignment - System(const System& obj); - System& operator=(const System& obj); - - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const char CEGUIConfigSchemaName[]; //!< Filename of the XML schema used for validating Config files. - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Given Point \a pt, return a pointer to the Window that should receive a mouse input if \a pt is the mouse location. - - \param pt - Point object describing a screen location in pixels. - - \return - Pointer to a Window object that should receive mouse input with the system in its current state and the mouse at location \a pt. - */ - Window* getTargetWindow(const Point& pt) const; - - - /*! - \brief - Return a pointer to the Window that should receive keyboard input considering the current modal target. - - \return - Pointer to a Window object that should receive the keyboard input. - */ - Window* getKeyboardTargetWindow(void) const; - - - /*! - \brief - Return a pointer to the next window that is to receive the input if the given Window did not use it. - - \param w - Pointer to the Window that just received the input. - - \return - Pointer to the next window to receive the input. - */ - Window* getNextTargetWindow(Window* w) const; - - - /*! - \brief - Translate a MouseButton value into the corresponding SystemKey value - - \param btn - MouseButton value describing the value to be converted - - \return - SystemKey value that corresponds to the same button as \a btn - */ - SystemKey mouseButtonToSyskey(MouseButton btn) const; - - - /*! - \brief - Translate a Key::Scan value into the corresponding SystemKey value. - - This takes key direction into account, since we map two keys onto one value. - - \param key - Key::Scan value describing the value to be converted - - \param direction - true if the key is being pressed, false if the key is being released. - - \return - SystemKey value that corresponds to the same key as \a key, or 0 if key was not a system key. - */ - SystemKey keyCodeToSyskey(Key::Scan key, bool direction); - - - /*! - \brief - Method to do the work of the constructor - */ - void constructor_impl(Renderer* renderer, ResourceProvider* resourceProvider, XMLParser* xmlParser, ScriptModule* scriptModule, const String& configFile, const String& logFile); - - - /*! - \brief - add events for the System object - */ - void addSystemEvents(void); - - - /*! - \brief - Handler method for display size change notifications - */ - bool handleDisplaySizeChange(const EventArgs& e); - - - /************************************************************************* - Handlers for System events - *************************************************************************/ - /*! - \brief - Handler called when the main system GUI Sheet (or root window) is changed. - - \a e is a WindowEventArgs with 'window' set to the old root window. - */ - void onGUISheetChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the single-click timeout value is changed. - */ - void onSingleClickTimeoutChanged(EventArgs& e); - - - /*! - \brief - Handler called when the multi-click timeout value is changed. - */ - void onMultiClickTimeoutChanged(EventArgs& e); - - - /*! - \brief - Handler called when the size of the multi-click tolerance area is changed. - */ - void onMultiClickAreaSizeChanged(EventArgs& e); - - - /*! - \brief - Handler called when the default system font is changed. - */ - void onDefaultFontChanged(EventArgs& e); - - - /*! - \brief - Handler called when the default system mouse cursor image is changed. - */ - void onDefaultMouseCursorChanged(EventArgs& e); - - - /*! - \brief - Handler called when the mouse movement scaling factor is changed. - */ - void onMouseMoveScalingChanged(EventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - Renderer* d_renderer; //!< Holds the pointer to the Renderer object given to us in the constructor - ResourceProvider* d_resourceProvider; //!< Holds the pointer to the ResourceProvider object given to us by the renderer or the System constructor. - Font* d_defaultFont; //!< Holds a pointer to the default GUI font. - FontManager* d_fontManager; //!< Holds a pointer to the FontManager object in the constructor - bool d_gui_redraw; //!< True if GUI should be re-drawn, false if render should re-use last times queue. - - Window* d_wndWithMouse; //!< Pointer to the window that currently contains the mouse. - Window* d_activeSheet; //!< The active GUI sheet (root window) - Window* d_modalTarget; //!< Pointer to the window that is the current modal target. NULL is there is no modal target. - - String d_strVersion; //!< CEGUI version - - uint d_sysKeys; //!< Current set of system keys pressed (in mk1 these were passed in, here we track these ourself). - bool d_lshift; //!< Tracks state of left shift. - bool d_rshift; //!< Tracks state of right shift. - bool d_lctrl; //!< Tracks state of left control. - bool d_rctrl; //!< Tracks state of right control. - bool d_lalt; //!< Tracks state of left alt. - bool d_ralt; //!< Tracks state of right alt. - - double d_click_timeout; //!< Timeout value, in seconds, used to generate a single-click (button down then up) - double d_dblclick_timeout; //!< Timeout value, in seconds, used to generate multi-click events (botton down, then up, then down, and so on). - Size d_dblclick_size; //!< Size of area the mouse can move and still make multi-clicks. - - MouseClickTrackerImpl* const d_clickTrackerPimpl; //!< Tracks mouse button click generation. - - // mouse cursor related - const Image* d_defaultMouseCursor; //!< Image to be used as the default mouse cursor. - - // scripting - ScriptModule* d_scriptModule; //!< Points to the scripting support module. - String d_termScriptName; //!< Name of the script to run upon system shutdown. - - String d_guiWorkingDirectory; - - float d_mouseScalingFactor; //!< Scaling applied to mouse movement inputs. - - XMLParser* d_xmlParser; //!< XMLParser object we use to process xml files. - bool d_ourXmlParser; //!< true when we created the xml parser. - - Tooltip* d_defaultTooltip; //!< System default tooltip object. - bool d_weOwnTooltip; //!< true if System created the custom Tooltip. -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUISystem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUITextUtils.h b/vendor/cegui-0.4.0-custom/include/CEGUITextUtils.h deleted file mode 100644 index e6561fcfba..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUITextUtils.h +++ /dev/null @@ -1,164 +0,0 @@ -/************************************************************************ - filename: CEGUITextUtils.h - created: 30/5/2004 - author: Paul D Turner - - purpose: Interface to a static class containing some utility - functions for text / string operations -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITextUtils_h_ -#define _CEGUITextUtils_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Text utility support class. This class is all static members. You do not create instances of this class. -*/ -class CEGUIEXPORT TextUtils -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - static const String DefaultWhitespace; //!< The default set of whitespace - static const String DefaultAlphanumerical; //!< default set of alphanumericals. - static const String DefaultWrapDelimiters; //!< The default set of word-wrap delimiters - - - /************************************************************************* - Methods - *************************************************************************/ - /*! - \brief - return a String containing the the next word in a String. - - This method returns a String object containing the the word, starting at index \a start_idx, of String \a str - as delimited by the code points specified in string \a delimiters (or the ends of the input string). - - \param str - String object containing the input data. - - \param start_idx - index into \a str where the search for the next word is to begin. Defaults to start of \a str. - - \param delimiters - String object containing the set of delimiter code points to be used when determining the start and end - points of a word in string \a str. Defaults to whitespace. - - \return - String object containing the next \a delimiters delimited word from \a str, starting at index \a start_idx. - */ - static String getNextWord(const String& str, String::size_type start_idx = 0, const String& delimiters = DefaultWhitespace); - - - /*! - \brief - Return the index of the first character of the word at \a idx. - - /note - This currently uses DefaultWhitespace and DefaultAlphanumerical to determine groupings for what constitutes a 'word'. - - \param str - String containing text. - - \param idx - Index into \a str where search for start of word is to begin. - - \return - Index into \a str which marks the begining of the word at index \a idx. - */ - static String::size_type getWordStartIdx(const String& str, String::size_type idx); - - - /*! - \brief - Return the index of the first character of the word after the word at \a idx. - - /note - This currently uses DefaultWhitespace and DefaultAlphanumerical to determine groupings for what constitutes a 'word'. - - \param str - String containing text. - - \param idx - Index into \a str where search is to begin. - - \return - Index into \a str which marks the begining of the word at after the word at index \a idx. - If \a idx is within the last word, then the return is the last index in \a str. - */ - static String::size_type getNextWordStartIdx(const String& str, String::size_type idx); - - - /*! - \brief - Trim all characters from the set specified in \a chars from the begining of \a str. - - \param str - String object to be trimmed. - - \param chars - String object containing the set of code points to be trimmed. - */ - static void trimLeadingChars(String& str, const String& chars); - - - /*! - \brief - Trim all characters from the set specified in \a chars from the end of \a str. - - \param str - String object to be trimmed. - - \param chars - String object containing the set of code points to be trimmed. - */ - static void trimTrailingChars(String& str, const String& chars); - - -private: - /************************************************************************* - Data - *************************************************************************/ - static String d_delimiters; //!< Current set of delimiters. - static String d_whitespace; //!< Current set of whitespace. - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor and Destructor are private. This class has all static members. - */ - TextUtils(void); - ~TextUtils(void); -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUITextUtils_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUITexture.h b/vendor/cegui-0.4.0-custom/include/CEGUITexture.h deleted file mode 100644 index 8fa7f1d35e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUITexture.h +++ /dev/null @@ -1,139 +0,0 @@ -/************************************************************************ - filename: CEGUITexture.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines abstract interface for texture objects. Texture - objects are created & destroyed by the Renderer. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITexture_h_ -#define _CEGUITexture_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Abstract base class specifying the required interface for Texture objects. - - Texture objects are created via the Renderer. The actual inner workings of any Texture object - are dependant upon the Renderer (and underlying API) in use. This base class defines the minimal - set of functions that is required for the rest of the system to work. Texture objects are only - created through the Renderer object's texture creation functions. -*/ -class CEGUIEXPORT Texture -{ -public: - /************************************************************************* - Abstract Interface - *************************************************************************/ - /*! - \brief - Returns the current pixel width of the texture - - \return - ushort value that is the current width of the texture in pixels - */ - virtual ushort getWidth(void) const = 0; - - - /*! - \brief - Returns the current pixel height of the texture - - \return - ushort value that is the current height of the texture in pixels - */ - virtual ushort getHeight(void) const = 0; - - - /*! - \brief - Loads the specified image file into the texture. The texture is resized as required to hold the image. - - \param filename - The filename of the image file that is to be loaded into the texture - - \param resourceGroup - Resource group identifier to be passed to the resource provider when loading the image file. - - \return - Nothing. - */ - virtual void loadFromFile(const String& filename, const String& resourceGroup) = 0; - - - /*! - \brief - Loads (copies) an image in memory into the texture. The texture is resized as required to hold the image. - - \param buffPtr - Pointer to the buffer containing the image data - - \param buffWidth - Width of the buffer (in 0xAARRGGBB pixels) - - \param buffHeight - Height of the buffer (in 0xAARRGGBB pixels) - - \return - Nothing. - */ - virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight) = 0; - - - /*! - \brief - Return a pointer to the Renderer object that created and owns this Texture - - \return - Pointer to the Renderer object that owns the Texture - */ - Renderer* getRenderer(void) const {return d_owner;} - - -protected: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for Texture base class. This is never called by client code. - */ - Texture(Renderer* owner) : d_owner(owner) {} - -public: // luabind compatibility - /*! - \brief - Destructor for Texture base class. This is never called by client code. - */ - virtual ~Texture(void) {} - -private: - Renderer* d_owner; // -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIUDim_h_ -#define _CEGUIUDim_h_ - -#include "CEGUIRect.h" -#include "CEGUIVector.h" - -// some macros to aid in the creation of UDims -#define cegui_absdim(x) UDim(0,(x)) -#define cegui_reldim(x) UDim((x),0) - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class representing a unified dimension; that is a dimension that has both - a relative 'scale' portion and and absolute 'offset' portion. - */ - class CEGUIEXPORT UDim - { - public: - UDim() {} - UDim(float scale, float offset) : d_scale(scale), d_offset(offset) {} - ~UDim() {} - - float asAbsolute(float base) const { return PixelAligned(base * d_scale) + d_offset; } - float asRelative(float base) const { return (base != 0.0f) ? d_offset / base + d_scale : 0.0f; } - - UDim operator+(const UDim& other) const { return UDim(d_scale + other.d_scale, d_offset + other.d_offset); } - UDim operator-(const UDim& other) const { return UDim(d_scale - other.d_scale, d_offset - other.d_offset); } - UDim operator/(const UDim& other) const { return UDim(d_scale / other.d_scale, d_offset / other.d_offset); } - UDim operator*(const UDim& other) const { return UDim(d_scale * other.d_scale, d_offset * other.d_offset); } - - const UDim& operator+=(const UDim& other) { d_scale += other.d_scale; d_offset += other.d_offset; return *this; } - const UDim& operator-=(const UDim& other) { d_scale -= other.d_scale; d_offset -= other.d_offset; return *this; } - const UDim& operator/=(const UDim& other) { d_scale /= other.d_scale; d_offset /= other.d_offset; return *this; } - const UDim& operator*=(const UDim& other) { d_scale *= other.d_scale; d_offset *= other.d_offset; return *this; } - - bool operator==(const UDim& other) const { return d_scale == other.d_scale && d_offset == other.d_offset; } - bool operator!=(const UDim& other) const { return !operator==(other); } - - float d_scale, d_offset; - }; - - /*! - \brief - Two dimensional vector class built using unified dimensions (UDims). - The UVector2 class is used for representing both positions and sizes. - */ - class CEGUIEXPORT UVector2 - { - public: - UVector2() {} - UVector2(const UDim& x, const UDim& y) : d_x(x), d_y(y) {} - ~UVector2() {} - - Vector2 asAbsolute(const Size& base) const { return Vector2(d_x.asAbsolute(base.d_width), d_y.asAbsolute(base.d_height)); } - Vector2 asRelative(const Size& base) const { return Vector2(d_x.asRelative(base.d_width), d_y.asRelative(base.d_height)); } - - UVector2 operator+(const UVector2& other) const { return UVector2(d_x + other.d_x, d_y + other.d_y); } - UVector2 operator-(const UVector2& other) const { return UVector2(d_x - other.d_x, d_y - other.d_y); } - UVector2 operator/(const UVector2& other) const { return UVector2(d_x / other.d_x, d_y / other.d_y); } - UVector2 operator*(const UVector2& other) const { return UVector2(d_x * other.d_x, d_y * other.d_y); } - - const UVector2& operator+=(const UVector2& other) { d_x += other.d_x; d_y += other.d_y; return *this; } - const UVector2& operator-=(const UVector2& other) { d_x -= other.d_x; d_y -= other.d_y; return *this; } - const UVector2& operator/=(const UVector2& other) { d_x /= other.d_x; d_y /= other.d_y; return *this; } - const UVector2& operator*=(const UVector2& other) { d_x *= other.d_x; d_y *= other.d_y; return *this; } - - bool operator==(const UVector2& other) const { return d_x == other.d_x && d_y == other.d_y; } - bool operator!=(const UVector2& other) const { return !operator==(other); } - - UDim d_x, d_y; - }; - - /*! - \brief - Area rectangle class built using unified dimensions (UDims). - */ - class CEGUIEXPORT URect - { - public: - URect() {} - - URect(const UVector2& min, const UVector2& max) : d_min(min), d_max(max) {} - - URect(const UDim& left, const UDim& top, const UDim& right, const UDim& bottom) - { - d_min.d_x = left; - d_min.d_y = top; - d_max.d_x = right; - d_max.d_y = bottom; - } - - ~URect() {} - - Rect asAbsolute(const Size& base) const - { - return Rect( - d_min.d_x.asAbsolute(base.d_width), - d_min.d_y.asAbsolute(base.d_height), - d_max.d_x.asAbsolute(base.d_width), - d_max.d_y.asAbsolute(base.d_height) - ); - } - - Rect asRelative(const Size& base) const - { - return Rect( - d_min.d_x.asRelative(base.d_width), - d_min.d_y.asRelative(base.d_height), - d_max.d_x.asRelative(base.d_width), - d_max.d_y.asRelative(base.d_height) - ); - } - - const UVector2& getPosition() const { return d_min; } - UVector2 getSize() const { return d_max - d_min; } - UDim getWidth() const { return d_max.d_x - d_min.d_x; } - UDim getHeight() const { return d_max.d_y - d_min.d_y; } - - void setPosition(const UVector2& pos) - { - UVector2 sz(d_max - d_min); - d_min = pos; - d_max = d_min + sz; - } - - void setSize(const UVector2& sz) - { - d_max = d_min + sz; - } - - void setWidth(const UDim& w) { d_max.d_x = d_min.d_x + w; } - void setHeight(const UDim& h) { d_max.d_y = d_min.d_y + h; } - - void offset(const UVector2& sz) - { - d_min += sz; - d_max += sz; - } - - UVector2 d_min, d_max; - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIUDim_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIVector.h b/vendor/cegui-0.4.0-custom/include/CEGUIVector.h deleted file mode 100644 index 2412d6e7a9..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIVector.h +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************************************ - filename: CEGUIVector.h - created: 14/3/2004 - author: Paul D Turner - - purpose: Defines interfaces for Vector classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIVector_h_ -#define _CEGUIVector_h_ - -#include "CEGUIBase.h" -#include "CEGUISize.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Class used as a two dimensional vector (aka a Point) -*/ -class CEGUIEXPORT Vector2 -{ -public: - Vector2(void) {} - Vector2(float x, float y) : d_x(x), d_y(y) {} - - Vector2& operator*=(const Vector2& vec) - { - d_x *= vec.d_x; - d_y *= vec.d_y; - - return *this; - } - - Vector2& operator/=(const Vector2& vec) - { - d_x /= vec.d_x; - d_y /= vec.d_y; - - return *this; - } - - Vector2& operator+=(const Vector2& vec) - { - d_x += vec.d_x; - d_y += vec.d_y; - - return *this; - } - - Vector2& operator-=(const Vector2& vec) - { - d_x -= vec.d_x; - d_y -= vec.d_y; - - return *this; - } - - Vector2 operator+(const Vector2& vec) const - { - return Vector2(d_x + vec.d_x, d_y + vec.d_y); - } - - Vector2 operator-(const Vector2& vec) const - { - return Vector2(d_x - vec.d_x, d_y - vec.d_y); - } - - Vector2 operator*(const Vector2& vec) const - { - return Vector2(d_x * vec.d_x, d_y * vec.d_y); - } - - bool operator==(const Vector2& vec) const - { - return ((d_x == vec.d_x) && (d_y == vec.d_y)); - } - - bool operator!=(const Vector2& vec) const - { - return !(operator==(vec)); - } - - Size asSize() const { return Size(d_x, d_y); } - - float d_x, d_y; -}; - -/*! -\brief - Point class -*/ -typedef Vector2 Point; - - -/*! -\brief - Class used as a three dimensional vector -*/ -class CEGUIEXPORT Vector3 -{ -public: - Vector3(void) {} - Vector3(float x, float y, float z) : d_x(x), d_y(y), d_z(z) {} - - float d_x, d_y, d_z; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIVector_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIVersion.h b/vendor/cegui-0.4.0-custom/include/CEGUIVersion.h deleted file mode 100644 index 77fe979bad..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIVersion.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************ - filename: CEGUIVersion.h - created: 7/3/2005 - author: jacmoe -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - -This file contains CEGUI version defines -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -#ifndef _CEGUIVersion_h_ -#define _CEGUIVersion_h_ - -////////////////////////////////////////////////////////////////////////// -// Define CEGUI version -////////////////////////////////////////////////////////////////////////// -#define CEGUI_VERSION_MAJOR 0 -#define CEGUI_VERSION_MINOR 4 -#define CEGUI_VERSION_PATCH 1 - -#endif // end of guard _CEGUIVersion_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIWindow.h b/vendor/cegui-0.4.0-custom/include/CEGUIWindow.h deleted file mode 100644 index 562c507a4e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIWindow.h +++ /dev/null @@ -1,4024 +0,0 @@ -/************************************************************************ - filename: CEGUIWindow.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines abstract base class for Window objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIWindow_h_ -#define _CEGUIWindow_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIVector.h" -#include "CEGUIRect.h" -#include "CEGUISize.h" -#include "CEGUIEventSet.h" -#include "CEGUIPropertySet.h" -#include "CEGUISystem.h" -#include "CEGUIInputEvent.h" -#include "CEGUIWindowProperties.h" -#include "CEGUIUDim.h" -#include "CEGUIRenderCache.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Mode used for Window size and position metrics. - - Position information for a Window is always 'relative' to it's parent even in Absolute mode. - In Relative mode, layout is maintained for different screen resolutions, and also offers the - ability for child windows to properly adjust their layout as their parent is sized. -*/ -enum MetricsMode -{ - Relative, //!< Metrics are specified as a decimal fraction of parent Window size. - Absolute, //!< Metrics are specified as whole pixels. - Inherited //!< Metrics are inherited from parent. -}; - -/*! -\brief - Enumerated type used when specifying vertical alignments. - */ -enum VerticalAlignment -{ - VA_TOP, //!< Elements position specifies an offset of it's top edge from the top edge of it's parent. - VA_CENTRE, //!< Elements position specifies an offset of it's vertical centre from the vertical centre of it's parent. - VA_BOTTOM //!< Elements position specifies an offset of it's bottom edge from the bottom edge of it's parent. -}; - -/*! -\brief - Enumerated type used when specifying horizontal alignments. - */ -enum HorizontalAlignment -{ - HA_LEFT, //!< Elements position specifies an offset of it's left edge from the left edge of it's parent. - HA_CENTRE, //!< Elements position specifies an offset of it's horizontal centre from the horizontal centre of it's parent. - HA_RIGHT //!< Elements position specifies an offset of it's right edge from the right edge of it's parent. -}; - -/*! -\brief - An abstract base class providing common functionality and specifying the required interface for derived classes. - - The Window base class is the only UI object class that the core of the system knows about, for this reason every - other window, widget, or similar item within the system must be derived from Window. The base class provides the - common functionality required by all UI objects, and specifies the minimal interface required to be implemented by - derived classes. -*/ -class CEGUIEXPORT Window : public PropertySet, public EventSet -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventParentSized; //!< Parent of this Window has been re-sized. - static const String EventSized; //!< Window size has changed - static const String EventMoved; //!< Window position has changed - static const String EventTextChanged; //!< Text string for the Window has changed - static const String EventFontChanged; //!< Font object for the Window has been changed - static const String EventAlphaChanged; //!< Alpha blend value for the Window has changed - static const String EventIDChanged; //!< Client assigned ID code for the Window has changed - static const String EventActivated; //!< Window has been activated (has input focus) - static const String EventDeactivated; //!< Window has been deactivated (loses input focus) - static const String EventShown; //!< Window has been made visible - static const String EventHidden; //!< Window has been hidden from view - static const String EventEnabled; //!< Window has been enabled (interaction is possible) - static const String EventDisabled; //!< Window has been disabled (interaction is no longer possible) - static const String EventMetricsModeChanged; //!< Active metrics mode has been modified - static const String EventClippedByParentChanged; //!< Clipping by parent mode has been modified - static const String EventDestroyedByParentChanged;//!< Destruction by parent mode has been modified - static const String EventInheritsAlphaChanged; //!< Alpha inherited from parent mode has been modified. - static const String EventAlwaysOnTopChanged; //!< Always on top mode has been modified - static const String EventInputCaptureGained; //!< Window has captured all inputs - static const String EventInputCaptureLost; //!< Window has lost it's capture on inputs - static const String EventRenderingStarted; //!< Rendering of the Window has started - static const String EventRenderingEnded; //!< Rendering for the Window has finished - static const String EventChildAdded; //!< A child Window has been added - static const String EventChildRemoved; //!< A child window has been removed - static const String EventDestructionStarted; //!< Destruction of the Window is about to begin. - static const String EventZOrderChanged; //!< The z-order of the window has changed - static const String EventDragDropItemEnters; //!< A DragContainer has been dragged over this window. - static const String EventDragDropItemLeaves; //!< A DragContainer has left this window. - static const String EventDragDropItemDropped; //!< A DragContainer was dropped on this Window. - static const String EventVerticalAlignmentChanged; //!< The vertical alignment of the window has changed. - static const String EventHorizontalAlignmentChanged; //!< The vertical alignment of the window has changed. - - // generated externally (inputs) - static const String EventMouseEnters; //!< Mouse cursor has entered the Window. - static const String EventMouseLeaves; //!< Mouse cursor has left the Window. - static const String EventMouseMove; //!< Mouse cursor was moved within the area of the Window. - static const String EventMouseWheel; //!< Mouse wheel was scrolled within the Window. - static const String EventMouseButtonDown; //!< A mouse button was pressed down within the Window. - static const String EventMouseButtonUp; //!< A mouse button was released within the Window. - static const String EventMouseClick; //!< A mouse button was clicked (down then up) within the Window. - static const String EventMouseDoubleClick; //!< A mouse button was double-clicked within the Window. - static const String EventMouseTripleClick; //!< A mouse button was triple-clicked within the Window. - static const String EventKeyDown; //!< A key on the keyboard was pressed. - static const String EventKeyUp; //!< A key on the keyboard was released. - static const String EventCharacterKey; //!< A text character was typed on the keyboard. - - // lil_Toady: This is our custom event, we use to handle redraws with - static const String EventRedrawRequested; - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for Window base class - - \param type - String object holding Window type (usually provided by WindowFactory). - - \param name - String object holding unique name for the Window. - */ - Window(const String& type, const String& name); - - - /*! - \brief - Destructor for Window base class - */ - virtual ~Window(void); - - - /************************************************************************* - Accessor functions - *************************************************************************/ - /*! - \brief - return a String object holding the type name for this Window. - - \return - String object holding the Window type. - */ - const String& getType(void) const; - - - /*! - \brief - return a String object holding the name of this Window. - - \return - String object holding the unique Window name. - */ - const String& getName(void) const {return d_name;} - - - /*! - \brief - returns whether or not this Window is set to be destroyed when its parent is destroyed. - - \return - true if the Window will be destroyed when its parent is destroyed, false if it will remain. - */ - bool isDestroyedByParent(void) const {return d_destroyedByParent;} - - - /*! - \brief - returns whether or not this Window is an always on top (a.k.a 'topmost') Window. - - \return - true if this Window is always show on top of other normal windows. false if the Window has normal z-order behaviour. - */ - bool isAlwaysOnTop(void) const {return d_alwaysOnTop;} - - - /*! - \brief - return true if the Window is currently disabled - - \param localOnly - States whether to only return the state set for this window, and so not factor in - inherited state from ancestor windows. - - \return - true if the window is disabled, false if the window is enabled. - */ - bool isDisabled(bool localOnly = false) const; - - - /*! - \brief - return true if the Window is currently visible. - - A true return from this function does not mean that the window is not completely obscured by other windows, just that the window - is processed when rendering and is not hidden. - - \param localOnly - States whether to only return the state set for this window, and so not factor in - inherited state from ancestor windows. - - \return - true if the window is drawn, false if the window is hidden and therefore ignored when rendering. - */ - bool isVisible(bool localOnly = false) const; - - - /*! - \brief - return true if this is the active Window (the window that receives inputs) - - Mouse events are always sent to the window containing the mouse cursor regardless of what this reports (unless the window has captured - inputs). This mainly refers to where other (keyboard) inputs are sent. - - \return - true if this window has input focus, or false if it does not. - */ - bool isActive(void) const; - - - /*! - \brief - return true if this Window is clipped so that its rendering does not pass outside its parent windows area. - - \return - true if the window will be clipped by its parent window, or false if this windows rendering may pass outside its parents area - */ - bool isClippedByParent(void) const {return d_clippedByParent;} - - - /*! - \brief - return the ID code currently assigned to this Window by client code. - - \return - uint value equal to the currently assigned ID code for this Window. - */ - uint getID(void) const {return d_ID;} - - - /*! - \brief - return the number of child Window objects currently attached to this Window. - - \return - uint value equal to the number of Window objects directly attached to this Window as children. - */ - uint getChildCount(void) const {return (uint)d_children.size();} - - - /*! - \brief - returns whether a Window with the specified name is currently attached to this Window as a child. - - \param name - String object containing the name of the Window to look for. - - \return - true if a Window named \a name is currently attached to this Window as a child, else false. - */ - bool isChild(const String& name) const; - - - /*! - \brief - returns whether at least one window with the given ID code is attached as a child. - - \note - ID codes are client assigned and may or may not be unique, and as such, the return from this function - will only have meaning to the client code. - - \param ID - uint ID code to look for. - - \return - true if a child window was found with the ID code \a ID, or false if no child window was found with the ID \a ID. - */ - bool isChild(uint ID) const; - - - /*! - \brief - return true if the given Window is a child of this window. - - \param window - Pointer to the Window object to look for. - - \return - true if Window object \a window is attached to this window as a child. - */ - bool isChild(const Window* window) const; - - - /*! - \brief - return a pointer to the child window with the specified name. - - This function will throw an exception if no child object with the given name is attached. This decision - was made (over returning NULL if no window was found) so that client code can assume that if the call - returns it has a valid window pointer. We provide the isChild() functions for checking if a given window - is attached. - - \param name - String object holding the name of the child window to return a pointer to. - - \return - Pointer to the Window object attached to this window that has the name \a name. - - \exception UnknownObjectException thrown if no window named \a name is attached to this Window. - */ - Window* getChild(const String& name) const; - - - /*! - \brief - return a pointer to the first attached child window with the specified ID. - - This function will throw an exception if no child object with the given ID is attached. This decision - was made (over returning NULL if no window was found) so that client code can assume that if the call - returns it has a valid window pointer. We provide the isChild() functions for checking if a given window - is attached. - - \param ID - uint value specifying the ID code of the window to return a pointer to. - - \return - Pointer to the (first) Window object attached to this window that has the ID code \a ID. - - \exception UnknownObjectException thrown if no window with the ID code \a ID is attached to this Window. - */ - Window* getChild(uint ID) const; - - - /*! - \brief - return a pointer to the child window that is attached to 'this' at the given index. - - \param idx - Index of the child window whos pointer should be returned. This value is not bounds checked, - client code should ensure that this is less than the value returned by getChildCount(). - - \return - Pointer to the child window currently attached at index position \a idx - */ - Window* getChildAtIdx(uint idx) const {return d_children[idx];} - - - /*! - \brief - return a pointer to the Window that currently has input focus starting with this Window. - - \return - Pointer to the window that is active (has input focus) starting at 'this. Will return 'this' if this Window is active - and either no children are attached or if none of the attached children are active. Returns NULL if this Window (and - therefore all children) are not active. - */ - Window* getActiveChild(void); - const Window* getActiveChild(void) const; - - - /*! - \brief - return true if the specified Window is some ancestor of this Window - - \param name - String object holding the name of the Window to check for. - - \return - true if a Window named \a name is an ancestor (parent, or parent of parent, etc) of this Window, or false if not. - */ - bool isAncestor(const String& name) const; - - - /*! - \brief - return true if any Window with the given ID is some ancestor of this Window. - - \param ID - uint value specifying the ID to look for. - - \return - true if an ancestor (parent, or parent of parent, etc) was found with the ID code \a ID, else false. - */ - bool isAncestor(uint ID) const; - - - /*! - \brief - return true if the specified Window is some ancestor of this Window. - - \param window - Pointer to the Window object to look for. - - \return - true if \a window was found to be an ancestor (parent, or parent of parent, etc) of this Window, otherwise false. - */ - bool isAncestor(const Window* window) const; - - - /*! - \brief - return the Font object active for the Window. - - \param useDefault - Sepcifies whether to return the default font if Window has no preference set. - - \return - Pointer to the Font being used by this Window. If the window has no assigned font, the default font is returned. - */ - const Font* getFont(bool useDefault = true) const; - - - /*! - \brief - return the current text for the Window - - \return - A String object that holds the current text for this Window. - */ - const String& getText(bool bidified=false) const {return bidified ? d_text : d_text_raw;} - - - /*! - \brief - return true if the Window inherits alpha from its parent(s). - - \return - true if the Window inherits alpha from its parent(s), false if the alpha for this Window is independant. - */ - bool inheritsAlpha(void) const {return d_inheritsAlpha;} - - - /*! - \brief - return the current alpha value set for this Window - - \note - The alpha value set for any given window may or may not be the final alpha value that is used when rendering. All window - objects, by default, inherit alpha from thier parent window(s) - this will blend child windows, relatively, down the line of - inheritance. This behaviour can be overridden via the setInheritsAlpha() method. To return the true alpha value that will be - applied when rendering, use the getEffectiveAlpha() method. - - \return - the currently set alpha value for this Window. Will be between 0.0f and 1.0f. - */ - float getAlpha(void) const {return d_alpha;} - - - /*! - \brief - return the effective alpha value that will be used when rendering this window, taking into account inheritance of parent - window(s) alpha. - - \return - the effective alpha that will be applied to this Window when rendering. Will be between 0.0f and 1.0f. - */ - float getEffectiveAlpha(void) const; - - - /*! - \brief - return a Rect object that describes the Window area. - - \return - Rect object that describes the area covered by the Window. The values in the returned Rect are in whatever form is set - as the current metric type. The returned Rect is unclipped and relative to the Window objects parent. - */ - Rect getRect(void) const; - - - /*! - \brief - return a Rect object describing the Window area in screen space. - - \return - Rect object that describes the area covered by the Window. The values in the returned Rect are in screen pixels. The - returned Rect is clipped as appropriate and depending upon the 'ClippedByParent' setting. - - \note - This has now been made virtual to ease some customisations that require more specialised clipping requirements. - */ - virtual Rect getPixelRect(void) const; - - - /*! - \brief - return a Rect object describing the clipped inner area for this window. - - \return - Rect object that describes, in appropriately clipped screen pixel co-ordinates, the window object's inner rect area. - */ - Rect getInnerRect(void) const; - - - /*! - \brief - return a Rect object describing the Window area unclipped, in screen space. - - \return - Rect object that describes the area covered by the Window. The values in the returned Rect are in screen pixels. The - returned rect is fully unclipped. - */ - Rect getUnclippedPixelRect(void) const; - - - /*! - \brief - Return a Rect object that describes, unclipped, the inner rectangle for this window. The inner rectangle is - typically an area that excludes some frame or other rendering that should not be touched by subsequent rendering. - - \return - Rect object that describes, in unclipped screen pixel co-ordinates, the window object's inner rect area. - */ - virtual Rect getUnclippedInnerRect(void) const; - - - /*! - \brief - return the Window that currently has inputs captured. - - \return - Pointer to the Window object that currently has inputs captured, or NULL if no Window has captured input. - */ - static Window* getCaptureWindow(void) {return d_captureWindow;} - - - /*! - \brief - return true if this Window has input captured. - - \return - true if this Window has captured inputs, or false if some other Window, or no Window, has captured inputs. - */ - bool isCapturedByThis(void) const {return getCaptureWindow() == this;} - - - /*! - \brief - return true if a child window has captured inputs. - - \return - true if inputs are captured by a Window that is attached as a child of this Window, else false. - */ - bool isCapturedByAncestor(void) const {return isAncestor(getCaptureWindow());} - - - /*! - \brief - return true if an ancestor window has captured inputs. - - \return - true if inputs are captured by a Window that is some ancestor (parent, parent of parent, etc) of this Window, else false. - */ - bool isCapturedByChild(void) const {return isChild(getCaptureWindow());} - - - /*! - \brief - check if the given position would hit this window. - - \param position - Point object describing the position to check in screen pixels - - \return - true if \a position 'hits' this Window, else false. - */ - virtual bool isHit(const Point& position) const; - - - /*! - \brief - return the child Window that is 'hit' by the given position - - \param position - Point object that describes the position to check in screen pixels - - \return - Pointer to the child Window that was hit according to the Point \a position, or NULL if no child window was hit. - */ - Window* getChildAtPosition(const Point& position) const; - - - /*! - \brief - return the child Window that is 'hit' by the given position, and is allowed to handle mouse events. - - \param position - Point object that describes the position to check in screen pixels - - \return - Pointer to the child Window that was hit according to the Point \a position, or NULL if no child window was hit. - */ - Window* getTargetChildAtPosition(const Point& position) const; - - - /*! - \brief - return the current metrics mode employed by the Window - - \return - One of the values of the MectricsMode enumerated type, that describes the current metrics in use by the Window. - */ - MetricsMode getMetricsMode(void) const; - - - /*! - \brief - return the x position of the window. Interpretation of return value depends upon the metric type in use by this window. - - \return - float value that specifies the x position of the Window relative to it's parent, depending on the metrics system in use for this - Window, this value will specify either pixels or a decimal fraction of the width of the parent Window. - */ - float getXPosition(void) const; - - - /*! - \brief - return the y position of the window. Interpretation of return value depends upon the metric type in use by this window. - - \return - float value that specifies the y position of the Window relative to it's parent, depending on the metrics system in use for this - Window, this value will specify either pixels or a decimal fraction of the height of the parent Window. - */ - float getYPosition(void) const; - - - /*! - \brief - return the position of the window. Interpretation of return value depends upon the metric type in use by this window. - - \return - Point object that describes the position of the Window relative to it's parent, depending on the metrics system in use for this - Window, the values in the Point will specify either pixels or decimal fractions of the total width and height of the parent. - */ - Point getPosition(void) const; - - - /*! - \brief - return the width of the Window. Interpretation of return value depends upon the metric type in use by this window. - - \return - float value that specifies the width of the Window. Depending upon the metrics system in use for this window, the return - value will either be in pixels, or as a decimal fraction of the width of the parent Window. - */ - float getWidth(void) const; - - /*! - \brief - return the height of the Window. Interpretation of return value depends upon the metric type in use by this window. - - \return - float value that specifies the height of the Window. Depending upon the metrics system in use for this window, the return - value will either be in pixels, or as a decimal fraction of the height of the parent Window. - */ - float getHeight(void) const; - - - /*! - \brief - return the size of the Window. Interpretation of return value depends upon the metric type in use by this window. - - \return - Size object that describes the dimensions of the Window. Depending upon the metrics system in use for this window, the - values will either be in pixels, or as decimal fractions of the width and height of the parent Window. - */ - Size getSize(void) const; - - - /*! - \brief - return the parent of this Window. - - \return - Pointer to the Window object that is the parent of this Window. This value can be NULL, in which case the Window is a GUI - Sheet / Root. - */ - Window* getParent(void) const {return d_parent;} - - - /*! - \brief - Return the current maximum size for this window. - - \return - Size object describing the maximum size for this window. If using absolute co-ordinates the returned object has it's values expressed - as screen pixels. If using relative co-ordinates the returned object has it's values expressed as fractions of the current display size. - */ - Size getMaximumSize(void) const; - - - /*! - \brief - Return the current minimum size for this window. - - \return - Size object describing the minimum size for this window. If using absolute co-ordinates the returned object has it's values expressed - as screen pixels. If using relative co-ordinates the returned object has it's values expressed as fractions of the current display size. - */ - Size getMinimumSize(void) const; - - - /*! - \brief - Return a pointer to the mouse cursor image to use when the mouse is within this window. - - \param useDefault - Sepcifies whether to return the default font if Window has no preference set. - - \return - Pointer to the mouse cursor image that will be used when the mouse enters this window. May return NULL indicating no cursor. - */ - const Image* getMouseCursor(bool useDefault = true) const; - - - /*! - \brief - Return the window area rect in relative metrics. - - \return - Rect object describing this windows area, relative to the parent window, in parent relative metrics. - */ - Rect getRelativeRect(void) const { return d_area.asRelative(getParentSize()); } - - - /*! - \brief - Return the window position in relative metrics. - - \return - Point object describing this windows position, relative to the parent window, in parent relative metrics. - */ - Point getRelativePosition(void) const { return d_area.getPosition().asRelative(getParentSize()); } - - - /*! - \brief - Return the window X position in relative metrics. - - \return - float value describing this windows X position, relative to the parent window, in parent relative metrics. - */ - float getRelativeXPosition(void) const { return d_area.d_min.d_x.asRelative(getParentWidth()); } - - - /*! - \brief - Return the window Y position in relative metrics. - - \return - float value describing this windows Y position, relative to the parent window, in parent relative metrics. - */ - float getRelativeYPosition(void) const { return d_area.d_min.d_y.asRelative(getParentHeight()); } - - - /*! - \brief - Return the window size in relative metrics. - - \return - Size object describing this windows size in parent relative metrics. - */ - Size getRelativeSize(void) const { return d_area.getSize().asRelative(getParentSize()).asSize(); } - - - /*! - \brief - Return the window width in relative metrics. - - \return - float value describing this windows width in parent relative metrics. - */ - float getRelativeWidth(void) const { return d_area.getWidth().asRelative(getParentWidth()); } - - - /*! - \brief - Return the window height in relative metrics. - - \return - float value describing this windows height in parent relative metrics. - */ - float getRelativeHeight(void) const { return d_area.getHeight().asRelative(getParentHeight()); } - - - /*! - \brief - Return the window area rect in absolute metrics. - - \return - Rect object describing this windows area, relative to the parent window, in absolute metrics - */ - Rect getAbsoluteRect(void) const { return Rect(d_area.getPosition().asAbsolute(getParentSize()), d_pixelSize); } - - - /*! - \brief - Return the window position in absolute metrics. - - \return - Point object describing this windows position, relative to the parent window, in absolute metrics. - */ - Point getAbsolutePosition(void) const { return d_area.getPosition().asAbsolute(getParentSize()); } - - - /*! - \brief - Return the window X position in absolute metrics. - - \return - float value describing this windows X position, relative to the parent window, in absolute metrics. - */ - float getAbsoluteXPosition(void) const { return d_area.d_min.d_x.asAbsolute(getParentWidth()); } - - - /*! - \brief - Return the window Y position in absolute metrics. - - \return - float value describing this windows Y position, relative to the parent window, in absolute metrics. - */ - float getAbsoluteYPosition(void) const { return d_area.d_min.d_y.asAbsolute(getParentHeight()); } - - - /*! - \brief - Return the window size in absolute metrics. - - \return - Size object describing this windows size in absolute metrics. - */ - Size getAbsoluteSize(void) const { return d_pixelSize; } - - - /*! - \brief - Return the window width in absolute metrics. - - \return - float value describing this windows width in absolute metrics. - */ - float getAbsoluteWidth(void) const { return d_pixelSize.d_width; } - - - /*! - \brief - Return the window height in absolute metrics. - - \return - float value describing this windows height in absolute metrics. - */ - float getAbsoluteHeight(void) const { return d_pixelSize.d_height; } - - - /*! - \brief - Return the user data set for this Window. - - Each Window can have some client assigned data attached to it, this data is not used by the GUI system - in any way. Interpretation of the data is entirely application specific. - - \return - pointer to the user data that is currently set for this window. - */ - void* getUserData(void) const {return d_userData;} - - - /*! - \brief - return the x position of the window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - float value that specifies the x position of the Window relative to it's parent, using the specified MetricsMode. - */ - float getXPosition(MetricsMode mode) const; - - - /*! - \brief - return the y position of the window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - float value that specifies the y position of the Window relative to it's parent, using the specified MetricsMode. - */ - float getYPosition(MetricsMode mode) const; - - - /*! - \brief - return the position of the window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - Point object that describes the position of the Window relative to it's parent, using the specified MetricsMode. - */ - Point getPosition(MetricsMode mode) const; - - - /*! - \brief - return the width of the Window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - float value that specifies the width of the Window using the specified MetricsMode. - */ - float getWidth(MetricsMode mode) const; - - - /*! - \brief - return the height of the Window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - float value that specifies the height of the Window using the specified MetricsMode. - */ - float getHeight(MetricsMode mode) const; - - - /*! - \brief - return the size of the Window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - Size object that describes the dimensions of the Window using the specified MetricsMode. - */ - Size getSize(MetricsMode mode) const; - - - /*! - \brief - return a Rect object that describes the Window area using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \return - Rect object that describes the area covered by the Window using the specified MetricsMode. - */ - Rect getRect(MetricsMode mode) const; - - - /*! - \brief - Return whether this window is set to restore old input capture when it loses input capture. - - This is only really useful for certain sub-components for widget writers. - - \return - - true if the window will restore the previous capture window when it loses input capture. - - false if the window will set the capture window to NULL when it loses input capture (this is the default behaviour). - */ - bool restoresOldCapture(void) const {return d_restoreOldCapture;} - - - /*! - \brief - Return whether z-order changes are enabled or disabled for this Window. - - \return - - true if z-order changes are enabled for this window. moveToFront/moveToBack work normally as expected. - - false: z-order changes are disabled for this window. moveToFront/moveToBack are ignored for this window. - */ - bool isZOrderingEnabled(void) const; - - - /*! - \brief - Return whether this window will receive multi-click events or multiple 'down' events instead. - - \return - - true if the Window will receive double-click and triple-click events. - - false if the Window will receive multiple mouse button down events instead of double/triple click events. - */ - bool wantsMultiClickEvents(void) const; - - - /*! - \brief - Return whether mouse button down event autorepeat is enabled for this window. - - \return - - true if autorepeat of mouse button down events is enabled for this window. - - false if autorepeat of mouse button down events is not enabled for this window. - */ - bool isMouseAutoRepeatEnabled(void) const; - - - /*! - \brief - Return the current auto-repeat delay setting for this window. - - \return - float value indicating the delay, in seconds, defore the first repeat mouse button down event will be triggered when autorepeat is enabled. - */ - float getAutoRepeatDelay(void) const; - - - /*! - \brief - Return the current auto-repeat rate setting for this window. - - \return - float value indicating the rate, in seconds, at which repeat mouse button down events will be generated after the initial delay has expired. - */ - float getAutoRepeatRate(void) const; - - - /*! - \brief - Return whether the window wants inputs passed to its attached - child windows when the window has inputs captured. - - \return - - true if System should pass captured input events to child windows. - - false if System should pass captured input events to this window only. - */ - bool distributesCapturedInputs(void) const; - - - /*! - \brief - Return whether this Window is using the system default Tooltip for its Tooltip window. - - \return - - true if the Window will use the system default tooltip. - - false if the window has a custom Tooltip object. - */ - bool isUsingDefaultTooltip(void) const; - - /*! - \brief - Return a pointer to the Tooltip object used by this Window. The value returned may - point to the system default Tooltip, a custom Window specific Tooltip, or be NULL. - - \return - Pointer to a Tooltip based object, or NULL. - */ - Tooltip* getTooltip(void) const; - - /*! - \brief - Return the custom tooltip type. - - \return - String object holding the current custom tooltip window type, or an empty string if no custom tooltip is set. - */ - String getTooltipType(void) const; - - /*! - \brief - Return the current tooltip text set for this Window. - - \return - String object holding the current tooltip text set for this window. - */ - const String& getTooltipText(void) const; - - /*! - \brief - Return whether this window inherits Tooltip text from its parent when its own tooltip text is not set. - - \return - - true if the window inherits tooltip text from its parent when its own text is not set. - - false if the window does not inherit tooltip text from its parent (and shows no tooltip when no text is set). - */ - bool inheritsTooltipText(void) const; - - /*! - \brief - Return whether this window will rise to the top of the z-order when clicked with the left mouse button. - - \return - - true if the window will come to the top of other windows when the left mouse button is pushed within its area. - - false if the window does not change z-order position when the left mouse button is pushed within its area. - */ - bool isRiseOnClickEnabled(void) const { return d_riseOnClick; } - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - bool testClassName(const String& class_name) const {return testClassName_impl(class_name);} - - /*! - \brief - Get the vertical alignment. - - Returns the vertical alignment for the window. This setting affects how the windows position is - interpreted relative to its parent. - - \return - One of the VerticalAlignment enumerated values. - */ - VerticalAlignment getVerticalAlignment() const {return d_vertAlign;} - - /*! - \brief - Get the horizontal alignment. - - Returns the horizontal alignment for the window. This setting affects how the windows position is - interpreted relative to its parent. - - \return - One of the HorizontalAlignment enumerated values. - */ - HorizontalAlignment getHorizontalAlignment() const {return d_horzAlign;} - - /*! - \brief - Return the RenderCache object for this Window. - - \return - Reference to the RenderCache object for this Window. - */ - RenderCache& getRenderCache() { return d_renderCache; } - - /*! - \brief - Get the name of the LookNFeel assigned to this window. - - \return - String object holding the name of the look assigned to this window. - Returns the empty string if no look is assigned. - */ - const String& getLookNFeel(); - - /*! - \brief - Get whether or not this Window is the modal target. - - \return - Returns true if this Window is the modal target, otherwise false. - */ - bool getModalState(void) const {return (System::getSingleton().getModalTarget() == this);} - - - /*! - \brief - Returns a named user string. - - \param name - String object holding the name of the string to be returned. - - \return - String object holding the data stored for the requested user string. - - \exception UnknownObjectException thrown if a user string named \a name does not exist. - */ - const String& getUserString(const String& name) const; - - /*! - \brief - Return whether a user string with the specified name exists. - - \param name - String object holding the name of the string to be checked. - - \return - - true if a user string named \a name exists. - - false if no such user string exists. - */ - bool isUserStringDefined(const String& name) const; - - /*! - \brief - Returns the active sibling window. - - This searches the immediate children of this window's parent, and returns a pointer - to the active window. The method will return this if we are the immediate child of our - parent that is active. If our parent is not active, or if no immediate child of our - parent is active then 0 is returned. If this window has no parent, and this window is - not active then 0 is returned, else this is returned. - - \return - A pointer to the immediate child window attached to our parent that is currently active, - or 0 if no immediate child of our parent is active. - */ - Window* getActiveSibling(); - - /*! - \brief - Returns whether this window should ignore mouse event and pass them through to and other windows behind it. - In effect making the window transparent to the mouse. - - \return - true if mouse pass through is enabled. - false if mouse pass through is not enabled. - */ - bool isMousePassThroughEnabled(void) const {return d_mousePassThroughEnabled;} - - /************************************************************************* - Manipulator functions - *************************************************************************/ - /*! - \brief - Renames the window. - - \param new_name - String object holding the new name for the window. - - \exception AlreadyExistsException - thrown if a Window named \a new_name already exists in the system. - */ - void rename(const String& new_name); - - /*! - \brief - Initialises the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void) {} - - - /*! - \brief - Set whether or not this Window will automatically be destroyed when its parent Window is destroyed. - - \param setting - set to true to have the Window auto-destroyed when its parent is destroyed (default), or false to have the Window - remain after its parent is destroyed. - - \return - Nothing - */ - void setDestroyedByParent(bool setting); - - - /*! - \brief - Set whether this window is always on top, or not. - - \param setting - true to have the Window appear on top of all other non always on top windows, or false to allow the window to be covered by other windows. - - \return - Nothing - */ - void setAlwaysOnTop(bool setting); - - - /*! - \brief - Set whether this window is enabled or disabled. A disabled window normally can not be interacted with, and may have different rendering. - - \param setting - true to enable the Window, and false to disable the Window. - - \return - Nothing - */ - void setEnabled(bool setting); - - - /*! - \brief - enable the Window to allow interaction. - - \return - Nothing - */ - void enable(void) {setEnabled(true);} - - - /*! - \brief - disable the Window to prevent interaction. - - \return - Nothing - */ - void disable(void) {setEnabled(false);} - - - /*! - \brief - Set whether the Window is visible or hidden. - - \param setting - true to make the Window visible, or false to make the Window hidden - - \return - Nothing - */ - void setVisible(bool setting); - - - /*! - \brief - show the Window - - \return - Nothing - */ - void show(void) {setVisible(true);} - - - /*! - \brief - hide the Window. - - \return - Nothing - */ - void hide(void) {setVisible(false);} - - - /*! - \brief - Activate the Window giving it input focus and bringing it to the top of all non always-on-top Windows. - - \return - Nothing - */ - void activate(void); - - - /*! - \brief - Deactivate the window. No further inputs will be received by the window until it is re-activated either programmatically or - by the user interacting with the gui. - - \return - Nothing. - */ - void deactivate(void); - - - /*! - \brief - Set whether this Window will be clipped by its parent window(s). - - \param setting - true to have the Window clipped so that rendering is constrained to within the area of its parent(s), or false to have rendering constrained - to the screen only. - - \return - Nothing - */ - void setClippedByParent(bool setting); - - - /*! - \brief - Set the current ID for the Window. - - \param ID - Client assigned ID code for this Window. The GUI system assigns no meaning to any IDs, they are a device purely for client code usage. - - \return - Nothing - */ - void setID(uint ID); - - - /*! - \brief - Set the current text string for the Window. - - \param text - String object containing the text that is to be set as the Window text. - - \return - Nothing - */ - void setText(const String& text); - - - /*! - \brief - Set the current width of the Window. Interpretation of the input value \a width is dependant upon the current metrics system set for the Window. - - \param width - float value that specifies the new width for the window, in units consistent with whatever metrics mode is in operation. - - \return - Nothing - */ - void setWidth(float width); - - - /*! - \brief - Set the current height of the Window. Interpretation of the input value \a height is dependant upon the current metrics system set for the Window. - - \param height - float value that specifies the new height for the window, in units consistent with whatever metrics mode is in operation. - - \return - Nothing - */ - void setHeight(float height); - - - /*! - \brief - Set the current size of the Window. Interpretation of the input value \a size is dependant upon the current metrics system set for the Window. - - \param size - Size object that describes the new dimensions for the window, in units consistent with whatever metrics mode is in operation. - - \return - Nothing - */ - void setSize(const Size& size); - - - /*! - \brief - Set the current 'x' position of the Window. Interpretation of the input value \a x is dependant upon the current metrics system set for the Window. - - \param x - float value that specifies the new x postion of the Window, in units consistent with the current metrics mode. - - \return - Nothing - */ - void setXPosition(float x); - - - /*! - \brief - Set the current 'y' position of the Window. Interpretation of the input value \a y is dependant upon the current metrics system set for the Window. - - \param y - float value that specifies the new y postion of the Window, in units consistent with the current metrics mode. - - \return - Nothing - */ - void setYPosition(float y); - - - /*! - \brief - Set the current position of the Window. Interpretation of the input value \a position is dependant upon the current metrics system set for the Window. - - \param position - Point object that describes the new postion of the Window, in units consistent with the current metrics mode. - - \return - Nothing - */ - void setPosition(const Point& position); - - - /*! - \brief - Set the current area for the Window, this allows for setting of position and size at the same time. - Interpretation of the input value \a area is dependant upon the current metrics system set for the Window. - - \param area - Rect object that describes the new area for Window, in units consistent with the current metrics mode. - - \return - Nothing - */ - void setAreaRect(const Rect& area); - - - /*! - \brief - Set the font used by this Window. - - \param font - Pointer to the Font object to be used by this Window. If \a font is NULL, the default font will be used. - - \return - Nothing - */ - void setFont(const Font* font); - - - /*! - \brief - Set the font used by this Window. - - \param name - String object holding the name of the Font object to be used by this Window. If \a name == "", the default font will be used. - - \return - Nothing - - \exception UnknownObjectException thrown if the specified Font is unknown within the system. - */ - void setFont(const String& name); - - - /*! - \brief - Add the named Window as a child of this Window. If the Window \a name is already attached to a Window, it is detached before - being added to this Window. - - \param name - String object holding the name of the Window to be added. - - \return - Nothing. - - \exception UnknownObjectException thrown if no Window named \a name exists. - \exception InvalidRequestException thrown if Window \a name is an ancestor of this Window, to prevent cyclic Window structures. - */ - void addChildWindow(const String& name); - - - /*! - \brief - Add the specified Window as a child of this Window. If the Window \a window is already attached to a Window, it is detached before - being added to this Window. - - \param window - Pointer to the Window object to be added. - - \return - Nothing - - \exception InvalidRequestException thrown if Window \a window is an ancestor of this Window, to prevent cyclic Window structures. - */ - void addChildWindow(Window* window); - - - /*! - \brief - Remove the named Window from this windows child list. - - \param name - String object holding the name of the Window to be removed. If the Window specified is not attached to this Window, nothing happens. - - \return - Nothing. - */ - void removeChildWindow(const String& name); - - - /*! - \brief - Remove the specified Window form this windows child list. - - \param window - Pointer to the Window object to be removed. If the \a window is not attached to this Window, then nothing happens. - - \return - Nothing. - */ - void removeChildWindow(Window* window); - - - /*! - \brief - Remove the first child Window with the specified ID. If there is more than one attached Window objects with the specified ID, only the fist - one encountered will be removed. - - \param ID - ID number assigned to the Window to be removed. If no Window with ID code \a ID is attached, nothing happens. - - \return - Nothing. - */ - void removeChildWindow(uint ID); - - - /*! - \brief - Move the Window to the top of the z order. - - - If the Window is a non always-on-top window it is moved the the top of all other non always-on-top sibling windows, and the process - repeated for all ancestors. - - If the Window is an always-on-top window it is moved to the of of all sibling Windows, and the process repeated for all ancestors. - - \return - Nothing - */ - void moveToFront(); - - - /*! - \brief - Move the Window to the bottom of the Z order. - - - If the window is non always-on-top the Window is sent to the very bottom of its sibling windows and the process repeated for all ancestors. - - If the window is always-on-top, the Window is sent to the bottom of all sibling always-on-top windows and the process repeated for all ancestors. - - \return - Nothing - */ - void moveToBack(); - - - /*! - \brief - Captures input to this window - - \return - - true if input was successfully captured to this window. - - false if input could not be captured to this window (maybe because the window is not active). - */ - bool captureInput(void); - - - /*! - \brief - Releases input capture from this Window. If this Window does not have inputs captured, nothing happens. - - \return - Nothing - */ - void releaseInput(void); - - - /*! - \brief - Set whether this window will remember and restore the previous window that had inputs captured. - - \param setting - - true: The window will remember and restore the previous capture window. The CaptureLost event is not fired - on the previous window when this window steals input capture. When this window releases capture, the old capture - window is silently restored. - - - false: Input capture works as normal, each window losing capture is signalled via CaptureLost, and upon the final - release of capture, no previous setting is restored (this is the default 'normal' behaviour). - - \return - Nothing - */ - void setRestoreCapture(bool setting); - - - /*! - \brief - Set the current alpha value for this window. - - \note - The alpha value set for any given window may or may not be the final alpha value that is used when rendering. All window - objects, by default, inherit alpha from thier parent window(s) - this will blend child windows, relatively, down the line of - inheritance. This behaviour can be overridden via the setInheritsAlpha() method. To return the true alpha value that will be - applied when rendering, use the getEffectiveAlpha() method. - - \param alpha - The new alpha value for the window. Value should be between 0.0f and 1.0f. - - \return - Nothing - */ - void setAlpha(float alpha); - - - /*! - \brief - Sets whether this Window will inherit alpha from its parent windows. - - \param setting - true if the Window should use inherited alpha, or false if the Window should have an independant alpha value. - - \return - Nothing - */ - void setInheritsAlpha(bool setting); - - - /*! - \brief - Signal the System object to redraw (at least) this Window on the next render cycle. - - \return - Nothing - */ - void requestRedraw(void); - void requestRedraw(void) const; - - /*! - \brief - Signal the System object to redraw (at least) this Window on the next render cycle. - - \return - Nothing - */ - void forceRedraw(void); - - /*! - \brief - set the current metrics mode employed by the Window - - \param mode - One of the values of the MectricsMode enumerated type, that describes the metrics mode to be used by the Window. - - \return - Nothing - */ - void setMetricsMode(MetricsMode mode); - - - /*! - \brief - Set the minimum size for this window. - - \param sz - Size object describing the minimum size for the window. For absolute metrics, the Size values are in screen pixels, - for relative metrics the Size values are relative to the display size. - */ - void setMinimumSize(const Size& sz); - - - /*! - \brief - Set the maximum size for this window. - - \param sz - Size object describing the maximum size for the window. For absolute metrics, the Size values are in screen pixels, - for relative metrics the Size values are relative to the display size. - */ - void setMaximumSize(const Size& sz); - - - /*! - \brief - Set the mouse cursor image to be used when the mouse enters this window. - - \param image - Pointer to the Image object to use as the mouse cursor image when the mouse enters the area for this Window. - - \return - Nothing. - */ - void setMouseCursor(const Image* image) {d_mouseCursor = image;} - - - /*! - \brief - Set the mouse cursor image to be used when the mouse enters this window. - - \param image - One of the MouseCursorImage enumerated values. - - \return - Nothing. - */ - void setMouseCursor(MouseCursorImage image) {d_mouseCursor = (const Image*)image;} - - - /*! - \brief - Set the mouse cursor image to be used when the mouse enters this window. - - \param imageset - String object that contains the name of the Imageset that contains the image to be used. - - \param image_name - String object that contains the name of the Image on \a imageset that is to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if \a imageset is not known, or if \a imageset contains no Image named \a image_name. - */ - void setMouseCursor(const String& imageset, const String& image_name); - - - /*! - \brief - Set the user data set for this Window. - - Each Window can have some client assigned data attached to it, this data is not used by the GUI system - in any way. Interpretation of the data is entirely application specific. - - \param user_data - pointer to the user data that is to be set for this window. - - \return - Nothing. - */ - void setUserData(void* user_data) {d_userData = user_data;} - - - /*! - \brief - set the x position of the window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param x - float value that specifies the x position of the Window relative to it's parent, using the specified MetricsMode. - - \return - Nothing. - */ - void setXPosition(MetricsMode mode, float x); - - - /*! - \brief - set the y position of the window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param y - float value that specifies the y position of the Window relative to it's parent, using the specified MetricsMode. - - \return - Nothing. - */ - void setYPosition(MetricsMode mode, float y); - - - /*! - \brief - set the position of the window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param position - Point object that describes the position of the Window relative to it's parent, using the specified MetricsMode. - - \return - Nothing - */ - void setPosition(MetricsMode mode, const Point& position); - - - /*! - \brief - set the width of the Window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param width - float value that specifies the width of the Window using the specified MetricsMode. - - \return - Nothing. - */ - void setWidth(MetricsMode mode, float width); - - - /*! - \brief - set the height of the Window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param height - float value that specifies the height of the Window using the specified MetricsMode. - - \return - Nothing. - */ - void setHeight(MetricsMode mode, float height); - - - /*! - \brief - set the size of the Window using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param size - Size object that describes the dimensions of the Window using the specified MetricsMode. - - \return - Nothing. - */ - void setSize(MetricsMode mode, const Size& size); - - - /*! - \brief - set the Rect that describes the Window area using the specified metrics system. - - \param mode - One of the MetricsMode enumerated values specifying the metrics system to be used for the return value. - - \param area - Rect object that describes the area to be covered by the Window using the specified MetricsMode. - - \return - Nothing. - */ - void setRect(MetricsMode mode, const Rect& area); - - - /*! - \brief - Set whether z-order changes are enabled or disabled for this Window. - - \param setting - - true if z-order changes are enabled for this window. moveToFront/moveToBack work normally as expected. - - false: z-order changes are disabled for this window. moveToFront/moveToBack are ignored for this window. - - \return - Nothing. - */ - void setZOrderingEnabled(bool setting); - - - /*! - \brief - Set whether this window will receive multi-click events or multiple 'down' events instead. - - \param setting - - true if the Window will receive double-click and triple-click events. - - false if the Window will receive multiple mouse button down events instead of double/triple click events. - - \return - Nothing. - */ - void setWantsMultiClickEvents(bool setting); - - - /*! - \brief - Set whether mouse button down event autorepeat is enabled for this window. - - \param setting - - true to enable autorepeat of mouse button down events. - - false to disable autorepeat of mouse button down events. - - \return - Nothing. - */ - void setMouseAutoRepeatEnabled(bool setting); - - - /*! - \brief - Set the current auto-repeat delay setting for this window. - - \param delay - float value indicating the delay, in seconds, defore the first repeat mouse button down event should be triggered when autorepeat is enabled. - - \return - Nothing. - */ - void setAutoRepeatDelay(float delay); - - - /*! - \brief - Set the current auto-repeat rate setting for this window. - - \param rate - float value indicating the rate, in seconds, at which repeat mouse button down events should be generated after the initial delay has expired. - - \return - Nothing. - */ - void setAutoRepeatRate(float rate); - - - /*! - \brief - Set whether the window wants inputs passed to its attached - child windows when the window has inputs captured. - - \param setting - - true if System should pass captured input events to child windows. - - false if System should pass captured input events to this window only. - */ - void setDistributesCapturedInputs(bool setting); - - /*! - \brief - Internal support method for drag & drop. You do not normally call - this directly from client code. See the DragContainer class. - */ - void notifyDragDropItemEnters(DragContainer* item); - - /*! - \brief - Internal support method for drag & drop. You do not normally call - this directly from client code. See the DragContainer class. - */ - void notifyDragDropItemLeaves(DragContainer* item); - - /*! - \brief - Internal support method for drag & drop. You do not normally call - this directly from client code. See the DragContainer class. - */ - void notifyDragDropItemDropped(DragContainer* item); - - /*! - \brief - Internal destroy method which actually just adds the window and any - parent destructed child windows to the dead pool. - - This is virtual to allow for specialised cleanup which may be required - in some advanced cases. If you override this for the above reason, you - MUST call this base class version. - - \note - You never have to call this method yourself, use WindowManager to - destroy your Window objects (which will call this for you). - */ - virtual void destroy(void); - - /*! - \brief - Set the custom Tooltip object for this Window. This value may be NULL to indicate that the - Window should use the system default Tooltip object. - - \param tooltip - Pointer to a valid Tooltip based object which should be used as the tooltip for this Window, or NULL to - indicate that the Window should use the system default Tooltip object. Note that when passing a pointer - to a Tooltip object, ownership of the Tooltip does not pass to this Window object. - - \return - Nothing. - */ - void setTooltip(Tooltip* tooltip); - - /*! - \brief - Set the custom Tooltip to be used by this Window by specifying a Window type. - - The Window will internally attempt to create an instance of the specified window type (which must be - derived from the base Tooltip class). If the Tooltip creation fails, the error is logged and the - Window will revert to using either the existing custom Tooltip or the system default Tooltip. - - \param tooltipType - String object holding the name of the Tooltip based Window type which should be used as the Tooltip for - this Window. - - \return - Nothing. - */ - void setTooltipType(const String& tooltipType); - - /*! - \brief - Set the tooltip text for this window. - - \param tip - String object holding the text to be displayed in the tooltip for this Window. - - \return - Nothing. - */ - void setTooltipText(const String& tip); - - /*! - \brief - Set whether this window inherits Tooltip text from its parent when its own tooltip text is not set. - - \param setting - - true if the window should inherit tooltip text from its parent when its own text is not set. - - false if the window should not inherit tooltip text from its parent (and so show no tooltip when no text is set). - - \return - Nothing. - */ - void setInheritsTooltipText(bool setting); - - /*! - \brief - Set whether this window will rise to the top of the z-order when clicked with the left mouse button. - - \param setting - - true if the window should come to the top of other windows when the left mouse button is pushed within its area. - - false if the window should not change z-order position when the left mouse button is pushed within its area. - - \return - Nothing. - */ - void setRiseOnClickEnabled(bool setting) { d_riseOnClick = setting; } - - /*! - \brief - Set the vertical alignment. - - Modifies the vertical alignment for the window. This setting affects how the windows position is - interpreted relative to its parent. - - \param alignment - One of the VerticalAlignment enumerated values. - - \return - Nothing. - */ - void setVerticalAlignment(const VerticalAlignment alignment); - - /*! - \brief - Set the horizontal alignment. - - Modifies the horizontal alignment for the window. This setting affects how the windows position is - interpreted relative to its parent. - - \param alignment - One of the HorizontalAlignment enumerated values. - - \return - Nothing. - */ - void setHorizontalAlignment(const HorizontalAlignment alignment); - - /*! - \brief - Set the LookNFeel that shoule be used for this window. - - \param falagardType - String object holding the mapped falagard type name (since actual window type will be "Falagard/something") - and not what was passed to WindowManager. This will be returned from getType instead of the base type. - - \param look - String object holding the name of the look to be assigned to the window. - - \return - Nothing. - - \exception InvalidRequestException thrown if the window already has a look assigned to it. - */ - void setLookNFeel(const String& falagardType, const String& look); - - /*! - \brief - Set the modal state for this Window. - - \param state - Boolean value defining if this Window should be the modal target. - If true, this Window will be activated and set as the modal target. - If false, the modal target will be cleared if this Window is currently the modal target. - - \return - Nothing. - */ - void setModalState(bool state); - - /*! - \brief - method called to perform extended laying out of attached child windows. - - The system may call this at various times (like when it is resized for example), and it - may be invoked directly where required. - - \return - Nothing. - */ - virtual void performChildWindowLayout(); - - /*! - \brief - Sets the value a named user string, creating it as required. - - \param name - String object holding the name of the string to be returned. - - \param value - String object holding the value to be assigned to the user string. - - \return - Nothing. - */ - void setUserString(const String& name, const String& value); - - /*! - \brief - Sets whether this window should ignore mouse events and pass them through to any windows behind it. - In effect making the window transparent to the mouse. - - \param setting - true if mouse pass through is enabled. - false if mouse pass through is not enabled. - */ - void setMousePassThroughEnabled(bool setting) {d_mousePassThroughEnabled = setting;} - - /************************************************************************* - Co-ordinate and Size Conversion Functions - *************************************************************************/ - /*! - \brief - Convert the given X co-ordinate from absolute to relative metrics. - - \param val - X co-ordinate specified in pixels relative to this Window (so 0 is this windows left edge). - - \return - A relative metric value that is equivalent to \a val, given the Window objects current width. - */ - float absoluteToRelativeX(float val) const; - - - /*! - \brief - Convert the given Y co-ordinate from absolute to relative metrics. - - \param val - Y co-ordinate specified in pixels relative to this Window (so 0 is this windows top edge). - - \return - A relative metric value that is equivalent to \a val, given the Window objects current height. - */ - float absoluteToRelativeY(float val) const; - - - /*! - \brief - Convert the given position from absolute to relative metrics. - - \param pt - Point object that describes a position specified in pixels relative to this Window (so 0,0 is this windows top-left corner). - - \return - A Point object describing a relative metric position that is equivalent to \a pt, given the Window objects current size. - */ - Point absoluteToRelative(const Point& pt) const; - - - /*! - \brief - Convert the given size from absolute to relative metrics. - - \param sze - Size object that describes a size specified in pixels. - - \return - A Size object describing a relative metric size that is equivalent to \a sze, given the Window objects current size. - */ - Size absoluteToRelative(const Size& sze) const; - - - /*! - \brief - Convert the given area from absolute to relative metrics. - - \param rect - Rect object describing the area specified in pixels relative to this Window. - - \return - A Rect object describing a relative metric area that is equivalent to \a rect, given the Window objects current size. - */ - Rect absoluteToRelative(const Rect& rect) const; - - - /*! - \brief - Convert the given X co-ordinate from relative to absolute metrics. - - \param val - X co-ordinate specified in relative metrics for this Window (so 0 is this windows left edge). - - \return - An absolute metric value that is equivalent to \a val, given the Window objects current width. - */ - float relativeToAbsoluteX(float val) const; - - - /*! - \brief - Convert the given Y co-ordinate from relative to absolute metrics. - - \param val - Y co-ordinate specified in relative metrics for this Window (so 0 is this windows top edge). - - \return - An absolute metric value that is equivalent to \a val, given the Window objects current height. - */ - float relativeToAbsoluteY(float val) const; - - - /*! - \brief - Convert the given position from relative to absolute metrics. - - \param pt - Point object describing a position specified in relative metrics for this Window (so 0,0 is this windows top-left corner). - - \return - A Point object describing a position in absolute metric values that is equivalent to \a pt, given the Window objects current size. - */ - Point relativeToAbsolute(const Point& pt) const; - - - /*! - \brief - Convert the given size from relative to absolute metrics. - - \param sze - Size object describing a size specified in relative metrics for this Window. - - \return - A Size object that describes a size in absolute metric values that is equivalent to \a sze, given the Window objects current size. - */ - Size relativeToAbsolute(const Size& sze) const; - - - /*! - \brief - Convert the given area from relative to absolute metrics. - - \param rect - Rect object describing the area specified in relative metrics for this Window. - - \return - A Rect object that describes an area in absolute metric values that is equivalent to \a rect, given the Window objects current size. - */ - Rect relativeToAbsolute(const Rect& rect) const; - - - /*! - \brief - Convert a window co-ordinate value, specified in whichever metrics mode is active, to a screen relative pixel co-ordinate. - - \param x - x co-ordinate value to be converted - - \return - float value describing a pixel screen co-ordinate that is equivalent to window co-ordinate \a x. - */ - float windowToScreenX(float x) const; - - - /*! - \brief - Convert a window co-ordinate value, specified in whichever metrics mode is active, to a screen relative pixel co-ordinate. - - \param y - y co-ordinate value to be converted - - \return - float value describing a screen co-ordinate that is equivalent to window co-ordinate \a y. - */ - float windowToScreenY(float y) const; - - - /*! - \brief - Convert a window co-ordinate position, specified in whichever metrics mode is active, to a screen relative pixel co-ordinate position. - - \param pt - Point object describing the position to be converted - - \return - Point object describing a screen co-ordinate position that is equivalent to window co-ordinate position \a pt. - */ - Point windowToScreen(const Point& pt) const; - - - /*! - \brief - Convert a window size value, specified in whichever metrics mode is active, to a size in pixels. - - \param sze - Size object describing the size to be converted - - \return - Size object describing describing a size in pixels that is equivalent to the window based size \a sze. - */ - Size windowToScreen(const Size& sze) const; - - - /*! - \brief - Convert a window area, specified in whichever metrics mode is active, to a screen area. - - \param rect - Rect object describing the area to be converted - - \return - Rect object describing a screen area that is equivalent to window area \a rect. - */ - Rect windowToScreen(const Rect& rect) const; - - - /*! - \brief - Convert a screen relative pixel co-ordinate value to a window co-ordinate value, specified in whichever metrics mode is active. - - \param x - x co-ordinate value to be converted - - \return - float value describing a window co-ordinate value that is equivalent to screen co-ordinate \a x. - */ - float screenToWindowX(float x) const; - - - /*! - \brief - Convert a screen relative pixel co-ordinate value to a window co-ordinate value, specified in whichever metrics mode is active. - - \param y - y co-ordinate value to be converted - - \return - float value describing a window co-ordinate value that is equivalent to screen co-ordinate \a y. - */ - float screenToWindowY(float y) const; - - - /*! - \brief - Convert a screen relative pixel position to a window co-ordinate position, specified in whichever metrics mode is active. - - \param pt - Point object describing the position to be converted - - \return - Point object describing a window co-ordinate position that is equivalent to screen co-ordinate \a x. - */ - Point screenToWindow(const Point& pt) const; - - - /*! - \brief - Convert a pixel screen size to a window based size, specified in whichever metrics mode is active. - - \param sze - Size object describing the size to be converted - - \return - Size object describing a window based size that is equivalent to screen based size \a sze. - */ - Size screenToWindow(const Size& sze) const; - - - /*! - \brief - Convert a screen area to a window area, specified in whichever metrics mode is active. - - \param rect - Rect object describing the area to be converted - - \return - Rect object describing a window area that is equivalent to screen area \a rect. - */ - Rect screenToWindow(const Rect& rect) const; - - - /*! - \brief - Convert the given X co-ordinate from unified to relative metrics. - - \param val - X co-ordinate specified as a UDim relative to this Window (so {0, 0} is this windows left edge). - - \return - A relative metric value that is equivalent to \a val, given the Window objects current width. - */ - float unifiedToRelativeX(const UDim& val) const; - - - /*! - \brief - Convert the given Y co-ordinate from unified to relative metrics. - - \param val - Y co-ordinate specified in as a UDim relative to this Window (so {0, 0} is this windows top edge). - - \return - A relative metric value that is equivalent to \a val, given the Window objects current height. - */ - float unifiedToRelativeY(const UDim& val) const; - - - /*! - \brief - Convert the given UVector2 value from unified to relative metrics. - - \param val - UVector2 object that describes a position specified in unified dimensions relative to this Window (so {{0, 0}, {0, 0}) is this windows top-left corner). - - \return - A Vector2 object describing a relative metric point that is equivalent to \a val, given the Window objects current size. - */ - Vector2 unifiedToRelative(const UVector2& val) const; - - - /*! - \brief - Convert the given area from unfied to relative metrics. - - \param val - URect object describing the area specified in unified dimensions relative to this Window. - - \return - A Rect object describing a relative metric area that is equivalent to \a val, given the Window objects current size. - */ - Rect unifiedToRelative(const URect& val) const; - - - /*! - \brief - Convert the given X co-ordinate from unified to absolute metrics. - - \param val - X co-ordinate specified as a UDim relative to this Window (so {0, 0} is this windows left edge). - - \return - An absolute metric value that is equivalent to \a val, given the Window objects current width. - */ - float unifiedToAbsoluteX(const UDim& val) const; - - - /*! - \brief - Convert the given Y co-ordinate from unified to absolute metrics. - - \param val - Y co-ordinate specified in as a UDim relative to this Window (so {0, 0} is this windows top edge). - - \return - An absolute metric value that is equivalent to \a val, given the Window objects current height. - */ - float unifiedToAbsoluteY(const UDim& val) const; - - - /*! - \brief - Convert the given UVector2 value from unified to absolute metrics. - - \param val - UVector2 object that describes a position specified in unified dimensions relative to this Window (so {{0, 0}, {0, 0}) is this windows top-left corner). - - \return - A Vector2 object describing a absolute metric point that is equivalent to \a val, given the Window objects current size. - */ - Vector2 unifiedToAbsolute(const UVector2& val) const; - - - /*! - \brief - Convert the given area from unfied to absolute metrics. - - \param val - URect object describing the area specified in unified dimensions relative to this Window. - - \return - A Rect object describing an absolute metric area that is equivalent to \a val, given the Window objects current size. - */ - Rect unifiedToAbsolute(const URect& val) const; - - - /*! - \brief - Convert a window co-ordinate value, specified as a UDim, to a screen relative pixel co-ordinate. - - \param x - UDim x co-ordinate value to be converted - - \return - float value describing a pixel screen co-ordinate that is equivalent to window UDim co-ordinate \a x. - */ - float windowToScreenX(const UDim& x) const; - - - /*! - \brief - Convert a window co-ordinate value, specified as a UDim, to a screen relative pixel co-ordinate. - - \param y - UDim y co-ordinate value to be converted - - \return - float value describing a screen co-ordinate that is equivalent to window UDim co-ordinate \a y. - */ - float windowToScreenY(const UDim& y) const; - - - /*! - \brief - Convert a window co-ordinate point, specified as a UVector2, to a screen relative pixel co-ordinate point. - - \param vec - UVector2 object describing the point to be converted - - \return - Vector2 object describing a screen co-ordinate position that is equivalent to window based UVector2 \a vec. - */ - Vector2 windowToScreen(const UVector2& vec) const; - - - /*! - \brief - Convert a window area, specified as a URect, to a screen area. - - \param rect - URect object describing the area to be converted - - \return - Rect object describing a screen area that is equivalent to window area \a rect. - */ - Rect windowToScreen(const URect& rect) const; - - - /*! - \brief - Convert a screen relative UDim co-ordinate value to a window co-ordinate value, specified in whichever metrics mode is active. - - \param x - UDim x co-ordinate value to be converted - - \return - float value describing a window co-ordinate value that is equivalent to screen UDim co-ordinate \a x. - */ - float screenToWindowX(const UDim& x) const; - - - /*! - \brief - Convert a screen relative UDim co-ordinate value to a window co-ordinate value, specified in whichever metrics mode is active. - - \param y - UDim y co-ordinate value to be converted - - \return - float value describing a window co-ordinate value that is equivalent to screen UDim co-ordinate \a y. - */ - float screenToWindowY(const UDim& y) const; - - - /*! - \brief - Convert a screen relative UVector2 point to a window co-ordinate point, specified in whichever metrics mode is active. - - \param vec - UVector2 object describing the point to be converted - - \return - Vector2 object describing a window co-ordinate point that is equivalent to screen based UVector2 point \a vec. - */ - Vector2 screenToWindow(const UVector2& vec) const; - - - /*! - \brief - Convert a URect screen area to a window area, specified in whichever metrics mode is active. - - \param rect - URect object describing the area to be converted - - \return - Rect object describing a window area that is equivalent to URect screen area \a rect. - */ - Rect screenToWindow(const URect& rect) const; - - - /************************************************************************* - Interface to unified co-ordinate system - *************************************************************************/ - /*! - \brief - Set the window area. - - Sets the area occupied by this window. The defined area is offset from the - top-left corner of this windows parent window or from the top-left corner of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param xpos - UDim describing the new x co-ordinate (left edge) of the window area. - - \param ypos - UDim describing the new y co-ordinate (top-edge) of the window area. - - \param width - UDim describing the new width of the window area. - - \param height - UDim describing the new height of the window area. - */ - void setWindowArea(const UDim& xpos, const UDim& ypos, const UDim& width, const UDim& height); - - /*! - \brief - Set the window area. - - Sets the area occupied by this window. The defined area is offset from the - top-left corner of this windows parent window or from the top-left corner of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param pos - UVector2 describing the new position (top-left corner) of the window area. - - \param size - UVector2 describing the new size of the window area. - */ - void setWindowArea(const UVector2& pos, const UVector2& size); - - /*! - \brief - Set the window area. - - Sets the area occupied by this window. The defined area is offset from the - top-left corner of this windows parent window or from the top-left corner of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param area - URect describing the new area rectangle of the window area. - */ - void setWindowArea(const URect& area); - - /*! - \brief - Set the window's position. - - Sets the position of the area occupied by this window. The position is offset from the - top-left corner of this windows parent window or from the top-left corner of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param pos - UVector2 describing the new position (top-left corner) of the window area. - */ - void setWindowPosition(const UVector2& pos); - - /*! - \brief - Set the window's X position. - - Sets the x position (left edge) of the area occupied by this window. The position is - offset from the left edge of this windows parent window or from the left edge of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param x - UDim describing the new x position of the window area. - */ - void setWindowXPosition(const UDim& x); - - /*! - \brief - Set the window's Y position. - - Sets the y position (top edge) of the area occupied by this window. The position is - offset from the top edge of this windows parent window or from the top edge of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param y - UDim describing the new y position of the window area. - */ - void setWindowYPosition(const UDim& y); - - /*! - \brief - Set the window's size. - - Sets the size of the area occupied by this window. - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param size - UVector2 describing the new size of the window area. - */ - void setWindowSize(const UVector2& size); - - /*! - \brief - Set the window's width. - - Sets the width of the area occupied by this window. - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param width - UDim describing the new width of the window area. - */ - void setWindowWidth(const UDim& width); - - /*! - \brief - Set the window's height. - - Sets the height of the area occupied by this window. - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param height - UDim describing the new height of the window area. - */ - void setWindowHeight(const UDim& height); - - /*! - \brief - Set the window's maximum size. - - Sets the maximum size that this windows area may occupy (whether size changes occur by user - interaction, general system operation, or by direct setting by client code). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param size - UVector2 describing the new maximum size of the window area. - */ - void setWindowMaxSize(const UVector2& size); - - /*! - \brief - Set the window's minimum size. - - Sets the minimum size that this windows area may occupy (whether size changes occur by user - interaction, general system operation, or by direct setting by client code). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \param size - UVector2 describing the new minimum size of the window area. - */ - void setWindowMinSize(const UVector2& size); - - /*! - \brief - Return the windows area. - - Returns the area occupied by this window. The defined area is offset from the - top-left corner of this windows parent window or from the top-left corner of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - URect describing the rectangle of the window area. - */ - const URect& getWindowArea() const; - - /*! - \brief - Get the window's position. - - Gets the position of the area occupied by this window. The position is offset from the - top-left corner of this windows parent window or from the top-left corner of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UVector2 describing the position (top-left corner) of the window area. - */ - const UVector2& getWindowPosition() const; - - /*! - \brief - Get the window's X position. - - Gets the x position (left edge) of the area occupied by this window. The position is - offset from the left edge of this windows parent window or from the left edge of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UDim describing the x position of the window area. - */ - const UDim& getWindowXPosition() const; - - /*! - \brief - Get the window's Y position. - - Gets the y position (top edge) of the area occupied by this window. The position is - offset from the top edge of this windows parent window or from the top edge of - the display if this window has no parent (i.e. it is the root window). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UDim describing the y position of the window area. - */ - const UDim& getWindowYPosition() const; - - /*! - \brief - Get the window's size. - - Gets the size of the area occupied by this window. - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UVector2 describing the size of the window area. - */ - UVector2 getWindowSize() const; - - /*! - \brief - Get the window's width. - - Gets the width of the area occupied by this window. - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UDim describing the width of the window area. - */ - UDim getWindowWidth() const; - - /*! - \brief - Get the window's height. - - Gets the height of the area occupied by this window. - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UDim describing the height of the window area. - */ - UDim getWindowHeight() const; - - /*! - \brief - Get the window's maximum size. - - Gets the maximum size that this windows area may occupy (whether size changes occur by user - interaction, general system operation, or by direct setting by client code). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UVector2 describing the maximum size of the window area. - */ - const UVector2& getWindowMaxSize() const; - - /*! - \brief - Get the window's minimum size. - - Gets the minimum size that this windows area may occupy (whether size changes occur by user - interaction, general system operation, or by direct setting by client code). - - \note - This method makes use of "Unified Dimensions". These contain both parent relative and - absolute pixel components, which are used in determining the final value used. - - \return - UVector2 describing the minimum size of the window area. - */ - const UVector2& getWindowMinSize() const; - - - /************************************************************************* - Main render function. - *************************************************************************/ - /*! - \brief - Causes the Window object to render itself and all of it's attached children - - \return - Nothing - */ - void render(void); - - - /*! - \brief - Cause window to update itself and any attached children. Client code does not need to call this method; to - ensure full, and proper updates, call the injectTimePulse methodname method provided by the System class. - - \note - The update order is such that 'this' window is updated prior to any child windows, this is so - that child windows that access the parent in their update code get the correct updated state. - - \param elapsed - float value indicating the number of seconds passed since the last update. - - \return - Nothing. - */ - void update(float elapsed); - - - /*! - \brief - Writes an xml representation of this window object to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - virtual void writeXMLToStream(OutStream& out_stream) const; - -protected: - /************************************************************************* - System object can trigger events directly - *************************************************************************/ - friend class System; - - - /************************************************************************* - Event trigger methods - *************************************************************************/ - /*! - \brief - Handler called when the window's size changes. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onSized(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's position changes. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onMoved(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's text is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onTextChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's font is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onFontChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's alpha blend value is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onAlphaChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's client assigned ID is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onIDChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window is shown (made visible). - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onShown(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window is hidden. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onHidden(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window is enabled. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onEnabled(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window is disabled. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onDisabled(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's active metrics system is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onMetricsChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's setting for being clipped by it's parent is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onClippingChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's setting for being destroyed automatically be it's parent is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onParentDestroyChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's setting for inheriting alpha-blending is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onInheritsAlphaChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the window's always-on-top setting is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onAlwaysOnTopChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when this window gains capture of mouse inputs. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onCaptureGained(WindowEventArgs& e); - - - /*! - \brief - Handler called when this window loses capture of mouse inputs. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onCaptureLost(WindowEventArgs& e); - - - /*! - \brief - Handler called when rendering for this window has started. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onRenderingStarted(WindowEventArgs& e); - - - /*! - \brief - Handler called when rendering for this window has ended. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onRenderingEnded(WindowEventArgs& e); - - - /*! - \brief - Handler called when the z-order position of this window has changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onZChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when this window's destruction sequence has begun. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onDestructionStarted(WindowEventArgs& e); - - - /*! - \brief - Handler called when this window has become the active window. - - \param e - ActivationEventArgs class whose 'otherWindow' field is set to the window that previously was active, or NULL for none. - */ - virtual void onActivated(ActivationEventArgs& e); - - - /*! - \brief - Handler called when this window has lost input focus and has been deactivated. - - \param e - ActivationEventArgs object whose 'otherWindow' field is set to the window that has now become active, or NULL for none. - */ - virtual void onDeactivated(ActivationEventArgs& e); - - - /*! - \brief - Handler called when this window's parent window has been resized. If this window is the root / GUI Sheet - window, this call will be made when the screen size changes. - - \param e - WindowEventArgs object whose 'window' pointer field is set the the window that caused the event; this is typically either - this window's parent window, or NULL to indicate the screen size has changed. - */ - virtual void onParentSized(WindowEventArgs& e); - - - /*! - \brief - Handler called when a child window is added to this window. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that has been added. - */ - virtual void onChildAdded(WindowEventArgs& e); - - - /*! - \brief - Handler called when a child window is removed from this window. - - \param e - WindowEventArgs object whose 'window' pointer field is set the window that has been removed. - */ - virtual void onChildRemoved(WindowEventArgs& e); - - - /*! - \brief - Handler called when the mouse cursor has entered this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseEnters(MouseEventArgs& e); - - - /*! - \brief - Handler called when the mouse cursor has left this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseLeaves(MouseEventArgs& e); - - - /*! - \brief - Handler called when the mouse cursor has been moved within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseMove(MouseEventArgs& e); - - - /*! - \brief - Handler called when the mouse wheel (z-axis) position changes within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseWheel(MouseEventArgs& e); - - - /*! - \brief - Handler called when a mouse button has been depressed within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseButtonDown(MouseEventArgs& e); - - - /*! - \brief - Handler called when a mouse button has been released within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseButtonUp(MouseEventArgs& e); - - - /*! - \brief - Handler called when a mouse button has been clicked (that is depressed and then released, within a specified time) - within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseClicked(MouseEventArgs& e); - - - /*! - \brief - Handler called when a mouse button has been double-clicked within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseDoubleClicked(MouseEventArgs& e); - - - /*! - \brief - Handler called when a mouse button has been triple-clicked within this window's area. - - \param e - MouseEventArgs object. All fields are valid. - */ - virtual void onMouseTripleClicked(MouseEventArgs& e); - - - /*! - \brief - Handler called when a key as been depressed while this window has input focus. - - \param e - KeyEventArgs object whose 'scancode' field is set to the Key::Scan value representing the key that was pressed, and whose - 'sysKeys' field represents the combination of SystemKey that were active when the event was generated. - */ - virtual void onKeyDown(KeyEventArgs& e); - - - /*! - \brief - Handler called when a key as been released while this window has input focus. - - \param e - KeyEventArgs object whose 'scancode' field is set to the Key::Scan value representing the key that was released, and whose - 'sysKeys' field represents the combination of SystemKey that were active when the event was generated. All other fields should be - considered as 'junk'. - */ - virtual void onKeyUp(KeyEventArgs& e); - - - /*! - \brief - Handler called when a character-key has been pressed while this window has input focus. - - \param e - KeyEventArgs object whose 'codepoint' field is set to the Unicode code point (encoded as utf32) for the character typed, and whose - 'sysKeys' field represents the combination of SystemKey that were active when the event was generated. All other fields should be - considered as 'junk'. - */ - virtual void onCharacter(KeyEventArgs& e); - - /*! - \brief - Handler called when a DragContainer is dragged over this window. - - \param e - DragDropEventArgs object initialised as follows: - - window field is normaly set to point to 'this' window. - - dragDropItem is a pointer to a DragContainer window that triggered the event. - */ - virtual void onDragDropItemEnters(DragDropEventArgs& e); - - - /*! - \brief - Handler called when a DragContainer is dragged over this window. - - \param e - DragDropEventArgs object initialised as follows: - - window field is normaly set to point to 'this' window. - - dragDropItem is a pointer to a DragContainer window that triggered the event. - */ - virtual void onDragDropItemLeaves(DragDropEventArgs& e); - - - /*! - \brief - Handler called when a DragContainer is dragged over this window. - - \param e - DragDropEventArgs object initialised as follows: - - window field is normaly set to point to 'this' window. - - dragDropItem is a pointer to a DragContainer window that triggered the event. - */ - virtual void onDragDropItemDropped(DragDropEventArgs& e); - - - /*! - \brief - Handler called when the vertical alignment setting for the window is changed. - - \param e - WindowEventArgs object initialised as follows: - - window field is set to point to the Window object whos alignment has changed (typically 'this'). - */ - virtual void onVerticalAlignmentChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the horizontal alignment setting for the window is changed. - - \param e - WindowEventArgs object initialised as follows: - - window field is set to point to the Window object whos alignment has changed (typically 'this'). - */ - virtual void onHorizontalAlignmentChanged(WindowEventArgs& e); - - - /*! *** MTA EVENT *** - \brief - Handler called when cegui internally requests an object redraw - - \param e - WindowEventArgs object initialised as follows: - - window field is set to point to the Window object whos redraw has been requested (typically 'this'). - */ - virtual void onRedrawRequested(WindowEventArgs& e); - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Perform actual update processing for this Window. - - \param elapsed - float value indicating the number of seconds elapsed since the last update call. - - \return - Nothing. - */ - virtual void updateSelf(float elapsed); - - - /*! - \brief - Perform the actual rendering for this Window. - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawSelf(float z); - - - /*! - \brief - Update the rendering cache. - - Populates the Window's RenderCache with imagery to be sent to the renderer. - */ - virtual void populateRenderCache() {} - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Window") return true; - return false; - } - - - /*! - \brief - Set the parent window for this window object. - - \param parent - Pointer to a Window object that is to be assigned as the parent to this Window. - - \return - Nothing - */ - void setParent(Window* parent); - - - /*! - \brief - Return the pixel Width of the parent element. This always returns a valid number. - - \return - float value that is equal to the pixel width of this Window objects parent - */ - float getParentWidth(void) const; - - - /*! - \brief - Return the pixel Height of the parent element. This always returns a valid number. - - \return - float value that is equal to the pixel height of this Window objects parent - */ - float getParentHeight(void) const; - - - /*! - \brief - Return the pixel size of the parent element. This always returns a valid object. - - \return - Size object that describes the pixel dimensions of this Window objects parent - */ - Size getParentSize(void) const; - - - /*! - \brief - Return a Rect object that describes, in values relative to \a window, the absolute area described by \a rect. - - \param window - Pointer to a window object that is to be used as the base for the conversion. If this is NULL then the size of the - display, as returned by the renderer object, is used. - - \param rect - Rect object describing the area, in absolute values, that is to be returned as relative values. - - \return - Rect object that describes in values relative to \a window, the same area described as absolute values in \a rect. - */ - Rect absoluteToRelative_impl(const Window* window, const Rect& rect) const; - Size absoluteToRelative_impl(const Window* window, const Size& sz) const; - Point absoluteToRelative_impl(const Window* window, const Point& pt) const; - float absoluteToRelativeX_impl(const Window* window, float x) const; - float absoluteToRelativeY_impl(const Window* window, float y) const; - - - /*! - \brief - Return a Rect object that describes, in absolute values offset from \a window, the relative area described by \a rect. - - \param window - Pointer to a window object that is to be used as the base for the conversion. If this is NULL then the size of the - display, as returned by the renderer object, is used. - - \param rect - Rect object describing the area, in relative values, that is to be returned as absolute values. - - \return - Rect object that describes in absolute values offset from \a window, the same area described as relative values in \a rect. - */ - Rect relativeToAbsolute_impl(const Window* window, const Rect& rect) const; - Size relativeToAbsolute_impl(const Window* window, const Size& sz) const; - Point relativeToAbsolute_impl(const Window* window, const Point& pt) const; - float relativeToAbsoluteX_impl(const Window* window, float x) const; - float relativeToAbsoluteY_impl(const Window* window, float y) const; - - Size getWindowSize_impl(const Window* window) const; - - - /*! - \brief - Return the inherited metrics mode. This is either the metrics mode of our parent, or Relative - if we have no parent. - */ - MetricsMode getInheritedMetricsMode(void) const; - - - /*! - \brief - Fires off a repeated mouse button down event for this window. - */ - void generateAutoRepeatEvent(MouseButton button); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - // child stuff - typedef std::vector ChildList; - ChildList d_children; //!< The list of child Window objects attached to this. - ChildList d_drawList; //!< Child window objects arranged in rendering order. - - // general data - MetricsMode d_metricsMode; //!< Holds the active metrics mode for this window - static Window* d_captureWindow; //!< Window that has captured inputs - Window* d_oldCapture; //!< The Window that previously had capture (used for restoreOldCapture mode) - Window* d_parent; //!< Holds pointer to the parent window. - const Font* d_font; //!< Holds pointer to the Window objects current Font. - String d_text; //!< Holds the visual text / label / caption for this Window. - String d_text_raw; //!< Holds the raw, unprocessed text / label / caption for this Window. - uint d_ID; //!< User ID assigned to this Window - float d_alpha; //!< Alpha transparency setting for the Window - URect d_area; //!< This Window objects area as defined by a URect. - Size d_pixelSize; //!< Current constrained pixel size of the window. - const Image* d_mouseCursor; //!< Holds pointer to the Window objects current mouse cursor image. - void* d_userData; //!< Holds pointer to some user assigned data. - - typedef std::map UserStringMap; - UserStringMap d_userStrings; //!< Holds a collection of named user string values. - - // positional alignments - HorizontalAlignment d_horzAlign; //!< Specifies the base for horizontal alignment. - VerticalAlignment d_vertAlign; //!< Specifies the base for vertical alignment. - - // maximum and minimum sizes - UVector2 d_minSize; //!< current minimum size for the window. - UVector2 d_maxSize; //!< current maximum size for the window. - - // settings - bool d_enabled; //!< true when Window is enabled - bool d_visible; //!< true when Window is visible (that is it will be rendered, but may be obscured so no necesarily really visible) - bool d_active; //!< true when Window is the active Window (receiving inputs). - bool d_clippedByParent; //!< true when Window will be clipped by parent Window area Rect. - bool d_destroyedByParent; //!< true when Window will be auto-destroyed by parent. - bool d_alwaysOnTop; //!< true if Window will be drawn on top of all other Windows - bool d_inheritsAlpha; //!< true if the Window inherits alpha from the parent Window - bool d_restoreOldCapture; //!< true if the Window restores capture to the previous window when it releases capture. - bool d_zOrderingEnabled; //!< true if the Window responds to z-order change requests. - bool d_wantsMultiClicks; //!< true if the Window wishes to hear about multi-click mouse events. - bool d_distCapturedInputs; //!< true if unhandled captured inputs should be distributed to child windows. - bool d_riseOnClick; //!< True if the window should come to the front of the z order in respose to a left mouse button down event. - - // mouse button autorepeat data - bool d_autoRepeat; //!< true if button will auto-repeat mouse button down events while mouse button is held down, - float d_repeatDelay; //!< seconds before first repeat event is fired - float d_repeatRate; //!< secons between further repeats after delay has expired. - bool d_repeating; //!< implements repeating - is true after delay has elapsed, - float d_repeatElapsed; //!< implements repeating - tracks time elapsed. - MouseButton d_repeatButton; //!< Button we're tracking (implication of this is that we only support one button at a time). - - // Tooltip stuff - String d_tooltipText; //!< Text string used as tip for this window. - Tooltip* d_customTip; //!< Possible custom Tooltip for this window. - bool d_weOwnTip; //!< true if this Window created the custom Tooltip. - bool d_inheritsTipText; //!< true if the Window inherits tooltip text from its parent (when none set for itself). - - // rendering - RenderCache d_renderCache; //!< Object which acts as a cache for Images to be drawn by this Window. - mutable bool d_needsRedraw; //!< true if window image cache needs to be regenerated. - - // Look'N'Feel stuff - String d_lookName; //!< Name of the Look assigned to this window (if any). - - // Event pass through - bool d_mousePassThroughEnabled; //!< true if this window can never be "hit" by the cursor. false for normal mouse event handling. - -protected: - /************************************************************************* - Properties for Window base class - *************************************************************************/ - static WindowProperties::AbsoluteHeight d_absHeightProperty; - static WindowProperties::AbsoluteMaxSize d_absMaxSizeProperty; - static WindowProperties::AbsoluteMinSize d_absMinSizeProperty; - static WindowProperties::AbsolutePosition d_absPositionProperty; - static WindowProperties::AbsoluteRect d_absRectProperty; - static WindowProperties::AbsoluteSize d_absSizeProperty; - static WindowProperties::AbsoluteWidth d_absWidthProperty; - static WindowProperties::AbsoluteXPosition d_absXPosProperty; - static WindowProperties::AbsoluteYPosition d_absYPosProperty; - static WindowProperties::Alpha d_alphaProperty; - static WindowProperties::AlwaysOnTop d_alwaysOnTopProperty; - static WindowProperties::ClippedByParent d_clippedByParentProperty; - static WindowProperties::DestroyedByParent d_destroyedByParentProperty; - static WindowProperties::Disabled d_disabledProperty; - static WindowProperties::Font d_fontProperty; - static WindowProperties::Height d_heightProperty; - static WindowProperties::ID d_IDProperty; - static WindowProperties::InheritsAlpha d_inheritsAlphaProperty; - static WindowProperties::MetricsMode d_metricsModeProperty; - static WindowProperties::MouseCursorImage d_mouseCursorProperty; - static WindowProperties::Position d_positionProperty; - static WindowProperties::Rect d_rectProperty; - static WindowProperties::RelativeHeight d_relHeightProperty; - static WindowProperties::RelativeMaxSize d_relMaxSizeProperty; - static WindowProperties::RelativeMinSize d_relMinSizeProperty; - static WindowProperties::RelativePosition d_relPositionProperty; - static WindowProperties::RelativeRect d_relRectProperty; - static WindowProperties::RelativeSize d_relSizeProperty; - static WindowProperties::RelativeWidth d_relWidthProperty; - static WindowProperties::RelativeXPosition d_relXPosProperty; - static WindowProperties::RelativeYPosition d_relYPosProperty; - static WindowProperties::RestoreOldCapture d_restoreOldCaptureProperty; - static WindowProperties::Size d_sizeProperty; - static WindowProperties::Text d_textProperty; - static WindowProperties::Visible d_visibleProperty; - static WindowProperties::Width d_widthProperty; - static WindowProperties::XPosition d_xPosProperty; - static WindowProperties::YPosition d_yPosProperty; - static WindowProperties::ZOrderChangeEnabled d_zOrderChangeProperty; - static WindowProperties::WantsMultiClickEvents d_wantsMultiClicksProperty; - static WindowProperties::MouseButtonDownAutoRepeat d_autoRepeatProperty; - static WindowProperties::AutoRepeatDelay d_autoRepeatDelayProperty; - static WindowProperties::AutoRepeatRate d_autoRepeatRateProperty; - static WindowProperties::DistributeCapturedInputs d_distInputsProperty; - static WindowProperties::CustomTooltipType d_tooltipTypeProperty; - static WindowProperties::Tooltip d_tooltipProperty; - static WindowProperties::InheritsTooltipText d_inheritsTooltipProperty; - static WindowProperties::RiseOnClick d_riseOnClickProperty; - static WindowProperties::VerticalAlignment d_vertAlignProperty; - static WindowProperties::HorizontalAlignment d_horzAlignProperty; - static WindowProperties::UnifiedAreaRect d_unifiedAreaRectProperty; - static WindowProperties::UnifiedPosition d_unifiedPositionProperty; - static WindowProperties::UnifiedXPosition d_unifiedXPositionProperty; - static WindowProperties::UnifiedYPosition d_unifiedYPositionProperty; - static WindowProperties::UnifiedSize d_unifiedSizeProperty; - static WindowProperties::UnifiedWidth d_unifiedWidthProperty; - static WindowProperties::UnifiedHeight d_unifiedHeightProperty; - static WindowProperties::UnifiedMinSize d_unifiedMinSizeProperty; - static WindowProperties::UnifiedMaxSize d_unifiedMaxSizeProperty; - static WindowProperties::MousePassThroughEnabled d_mousePassThroughEnabledProperty; - - - /************************************************************************* - implementation functions - *************************************************************************/ - /*! - \brief - Add standard CEGUI::Window events - */ - void addStandardEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addStandardEvents(false); } - - /*! - \brief - Cleanup child windows - */ - virtual void cleanupChildren(void); - - /*! - \brief - Add given window to child list at an appropriate position - */ - virtual void addChild_impl(Window* wnd); - - /*! - \brief - Remove given window from child list - */ - virtual void removeChild_impl(Window* wnd); - - /*! - \brief - Notify 'this' and all siblings of a ZOrder change event - */ - virtual void onZChange_impl(void); - - - /*! - \brief - Add standard CEGUI::Window properties. - */ - void addStandardProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addStandardProperties(false); } - - - /*! - \brief - Implements move to fron behavior. - */ - virtual void moveToFront_impl(bool wasClicked); - - - /*! - \brief - Implementation of rise on click functionality. - */ - void doRiseOnClick(void); - - - /*! - \brief - Implementation method to modify window area while correctly applying min / max size processing, and - firing any appropriate events. - - /note - This is the implementation function for setting size and position. - In order to simplify area management, from this point on, all modifications to window size and - position (area rect) should come through here. - - /param pos - UVector2 object describing the new area position. - - /param size - UVector2 object describing the new area size. - - /param topLeftSizing - - true to indicate the the operation is a sizing operation on the top and/or left edges of the area, - and so window movement should be inhibited if size is at max or min. - - false to indicate the operation is not a strict sizing operation on the top and/or left edges and - that the window position may change as required - - /param fireEvents - - true if events should be fired as normal. - - false to inhibit firing of events (required, for example, if you need to call this from - the onSize/onMove handlers). - */ - void setWindowArea_impl(const UVector2& pos, const UVector2& size, bool topLeftSizing = false, bool fireEvents = true); - - /*! - \brief - Add the given window to the drawing list at an appropriate position for it's settings and the - required direction. Basically, when \a at_back is false, the window will appear in front of - all other windows with the same 'always on top' setting. When \a at_back is true, the window - will appear behind all other windows wih the same 'always on top' setting. - - \param wnd - Window object to be added to the drawing list. - - \param at_back - Indicates whether the window should be placed at the back of other windows in the same group. - If this is false, the window is place in front of other windows in the group. - - \return - Nothing. - */ - void addWindowToDrawList(Window& wnd, bool at_back = false); - - /*! - \brief - Removes the window from the drawing list. If the window is not attached to the drawing list - then nothing happens. - - \param wnd - Window object to be removed from the drawing list. - - \return - Nothing. - */ - void removeWindowFromDrawList(const Window& wnd); - - virtual int writePropertiesXML(OutStream& out_stream) const; - virtual int writeChildWindowsXML(OutStream& out_stream) const; - - /************************************************************************* - May not copy or assign Window objects - *************************************************************************/ - Window(const Window& wnd) {} - Window& operator=(const Window& wnd) {return *this;} - - /************************************************************************* - Private implementation Data - *************************************************************************/ - const String d_type; //!< String holding the type name for the Window (is also the name of the WindowFactory that created us) - String d_name; //!< The name of the window (GUI system unique). - String d_falagardType; //!< Type name of the window as defined in a Falagard mapping. -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIWindow_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIWindowFactory.h b/vendor/cegui-0.4.0-custom/include/CEGUIWindowFactory.h deleted file mode 100644 index 13c3268af6..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIWindowFactory.h +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowFactory.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines abstract base class for WindowFactory objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIWindowFactory_h_ -#define _CEGUIWindowFactory_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIWindow.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Abstract class that defines the required interface for all WindowFactory objects - - A WindowFactory is used to create and destroy windows of a specific type. For every - type of Window object wihin the system (widgets, dialogs, movable windows etc) there - must be an associated WindowFactory registered with the WindowManager so that the system - knows how to create and destroy those types of Window base object. -*/ -class CEGUIEXPORT WindowFactory -{ -public: - /*! - \brief - Create a new Window object of whatever type this WindowFactory produces. - - \param name - A unique name that is to be assigned to the newly created Window object - - \return - Pointer to the new Window object. - */ - virtual Window* createWindow(const String& name) = 0; - - /*! - \brief - Destroys the given Window object. - - \param window - Pointer to the Window object to be destroyed. - - \return - Nothing. - */ - virtual void destroyWindow(Window* window) = 0; - - /*! - \brief - Get the string that describes the type of Window object this WindowFactory produces. - - \return - String object that contains the unique Window object type produced by this WindowFactory - */ - const String& getTypeName(void) const {return d_type;} - -protected: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - WindowFactory(const String& type) : d_type(type) {} - -public: // luabind compatibility - virtual ~WindowFactory(void) {} - -protected: - /************************************************************************* - Implementation Data - *************************************************************************/ - String d_type; //!< String holding the type of object created by this factory -}; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIWindowFactory_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIWindowFactoryManager.h b/vendor/cegui-0.4.0-custom/include/CEGUIWindowFactoryManager.h deleted file mode 100644 index 04a8858a5f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIWindowFactoryManager.h +++ /dev/null @@ -1,430 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowFactoryManager.h - created: 22/2/2004 - author: Paul D Turner - - purpose: Defines interface for WindowFactoryManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIWindowFactoryManager_h_ -#define _CEGUIWindowFactoryManager_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUILogger.h" -#include "CEGUIIteratorBase.h" -#include -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class that manages WindowFactory objects -*/ -class CEGUIEXPORT WindowFactoryManager : public Singleton -{ -public: - /*! - \brief - struct used to hold mapping information required to create a falagard based window. - */ - struct CEGUIEXPORT FalagardWindowMapping - { - String d_windowType; - String d_lookName; - String d_baseType; - }; - - /*! - \brief - Class used to track active alias targets for Window factory types. - */ - class CEGUIEXPORT AliasTargetStack - { - public: - /*! - \brief - Constructor for WindowAliasTargetStack objects - */ - AliasTargetStack(void) {} - - - /*! - \brief - Destructor for WindowAliasTargetStack objects - */ - ~AliasTargetStack(void) {} - - - /*! - \brief - Return a String holding the current target type for this stack - - \return - reference to a String object holding the currently active target type name for this stack. - */ - const String& getActiveTarget(void) const; - - /*! - \brief - Return the number of stacked target types in the stack - - \return - number of target types stacked for this alias. - */ - uint getStackedTargetCount(void) const; - - - private: - friend class WindowFactoryManager; - typedef std::vector TargetTypeStack; //!< Type used to implement stack of target type names. - - TargetTypeStack d_targetStack; //!< Container holding the target types. - }; - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructs a new WindowFactoryManager object. - */ - WindowFactoryManager(void) - { - Logger::getSingleton().logEvent((utf8*)"CEGUI::WindowFactoryManager singleton created"); - } - - - /*! - \brief - Destructor for WindowFactoryManager objects - */ - ~WindowFactoryManager(void) - { - Logger::getSingleton().logEvent((utf8*)"CEGUI::WindowFactoryManager singleton destroyed"); - } - - - /************************************************************************* - Public Interface - *************************************************************************/ - /*! - \brief - Return singleton WindowFactoryManager object - - \return - Singleton WindowFactoryManager object - */ - static WindowFactoryManager& getSingleton(void); - - - /*! - \brief - Return pointer to singleton WindowFactoryManager object - - \return - Pointer to singleton WindowFactoryManager object - */ - static WindowFactoryManager* getSingletonPtr(void); - - - /*! - \brief - Adds a new WindowFactory to the list of registered factories. - - \param factory - Pointer to the WindowFactory to be added to the WindowManager. - - \return - Nothing - - \exception NullObjectException \a factory was null. - \exception AlreadyExistsException \a factory provided a Window type name which is in use by another registered WindowFactory. - */ - void addFactory(WindowFactory* factory); - - - /*! - \brief - Removes a WindowFactory from the list of registered factories. - - \note - The WindowFactory object is not destroyed (since it was created externally), instead it is just removed from the list. - - \param name - String which holds the name (technically, Window type name) of the WindowFactory to be removed. If \a name is not - in the list, no error occurs (nothing happens). - - \return - Nothing - */ - void removeFactory(const String& name); - - - /*! - \brief - Removes a WindowFactory from the list of registered factories. - - \note - The WindowFactory object is not destroyed (since it was created externally), instead it is just removed from the list. - - \param factory - Pointer to the factory object to be removed. If \a factory is null, or if no such WindowFactory is in the list, no - error occurs (nothing happens). - - \return - Nothing - */ - void removeFactory(WindowFactory* factory); - - - /*! - \brief - Remove all WindowFactory objects from the list. - - \return - Nothing - */ - void removeAllFactories(void) {d_factoryRegistry.clear();} - - - /*! - \brief - Return a pointer to the specified WindowFactory object. - - \param type - String holding the Window object type to return the WindowFactory for. - - \return - Pointer to the WindowFactory object that creates Windows of the type \a type. - - \exception UnknownObjectException No WindowFactory object for Window objects of type \a type was found. - */ - WindowFactory* getFactory(const String& type) const; - - - /*! - \brief - Checks the list of registered WindowFactory objects, aliases, and - falagard mapped types for one which can create Window objects of the - specified type. - - \param name - String containing the Window type name to check for. - - \return - - true if a WindowFactory, alias, or falagard mapping for Window objects - of type \a name is registered. - - false if the system knows nothing about windows of type \a name. - */ - bool isFactoryPresent(const String& name) const; - - - /*! - \brief - Adds an alias for a current window type. - - This method allows you to create an alias for a specified window type. This means that you can then use - either name as the type parameter when creating a window. - - \note - You need to be careful using this system. Creating an alias using a name that already exists will replace the previous - mapping for that alias. Each alias name maintains a stack, which means that it is possible to remove an alias and have the - previous alias restored. The windows created via an alias use the real type, so removing an alias after window creation is always - safe (i.e. it is not the same as removing a real factory, which would cause an exception when trying to destroy a window with a missing - factory). - - \param aliasName - String object holding the alias name. That is the name that \a targetType will also be known as from no on. - - \param targetType - String object holding the type window type name that is to be aliased. This type must already exist. - - \return - Nothing. - - \exception UnknownObjectException thrown if \a targetType is not known within the system. - */ - void addWindowTypeAlias(const String& aliasName, const String& targetType); - - - /*! - \brief - Remove the specified alias mapping. If the alias mapping does not exist, nothing happens. - - \note - You are required to supply both the alias and target names because there may exist more than one entry for a given - alias - therefore you are required to be explicit about which alias is to be removed. - - \param aliasName - String object holding the alias name. - - \param targetType - String object holding the type window type name that was aliased. - - \return - Nothing. - */ - void removeWindowTypeAlias(const String& aliasName, const String& targetType); - - /*! - \brief - Add a mapping for a falagard based window. - - This function creates maps a target window type and target 'look' name onto a registered window type, thus allowing - the ususal window creation interface to be used to create windows that require extra information to full initialise - themselves. - \note - These mappings support 'late binding' to the target window type, as such the type indicated by \a targetType need not - exist in the system until attempting to create a Window using the type. - \par - Also note that creating a mapping for an existing type will replace any previous mapping for that same type. - - \param newType - The type name that will be used to create windows using the target type and look. - - \param targetType - The base window type. - - \param lookName - The name of the 'look' that will be used by windows of this type. - - \return - Nothing. - */ - void addFalagardWindowMapping(const String& newType, const String& targetType, const String& lookName); - - /*! - \brief - Remove the specified falagard type mapping if it exists. - - \return - Nothing. - */ - void removeFalagardWindowMapping(const String& type); - - /*! - \brief - Return whether the given type is a falagard mapped type. - - \param type - Name of a window type. - - \return - - true if the requested type is a Falagard mapped window type. - - false if the requested type is a normal WindowFactory (or alias), or if the type does not exist. - */ - bool isFalagardMappedType(const String& type) const; - - /*! - \brief - Return the name of the LookN'Feel assigned to the specified window mapping. - - \param type - Name of a window type. The window type referenced should be a falagard mapped type. - - \return - String object holding the name of the look mapped for the requested type. - - \exception InvalidRequestException thrown if \a type is not a falagard mapping type (or maybe the type didn't exist). - */ - const String& getMappedLookForType(const String& type) const; - - - /*! - \brief - Use the alias system, where required, to 'de-reference' the specified - type to an actual window type that can be created directly (that being - either a concrete window type, or a falagard mapped type). - - \note - Even though implied by the above description, this method does not - check that a factory for the final type exists; we simply say that the - returned type is not an alias for some other type. - - \param type - String describing the type to be de-referenced. - - \return - String object holding a type for a window that can be created directly; - that is, a type that does not describe an alias to some other type. - */ - String getDereferencedAliasType(const String& type) const; - -private: - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::map WindowFactoryRegistry; //!< Type used to implement registry of WindowFactory objects - typedef std::map TypeAliasRegistry; //!< Type used to implement registry of window type aliases. - typedef std::map FalagardMapRegistry; //!< Type used to implement registry of falagard window mappings. - - WindowFactoryRegistry d_factoryRegistry; //!< The container that forms the WindowFactory registry - TypeAliasRegistry d_aliasRegistry; //!< The container that forms the window type alias registry. - FalagardMapRegistry d_falagardRegistry; //!< Container that hold all the falagard window mappings. - -public: - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator WindowFactoryIterator; - typedef ConstBaseIterator TypeAliasIterator; - typedef ConstBaseIterator FalagardMappingIterator; - - /*! - \brief - Return a WindowFactoryManager::WindowFactoryIterator object to iterate over the available WindowFactory types. - */ - WindowFactoryIterator getIterator(void) const; - - - /*! - \brief - Return a WindowFactoryManager::TypeAliasIterator object to iterate over the defined aliases for window types. - */ - TypeAliasIterator getAliasIterator(void) const; - - - /*! - \brief - Return a WindowFactoryManager::FalagardMappingIterator object to iterate over the defined falagard window mappings. - */ - FalagardMappingIterator getFalagardMappingIterator() const; -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIWindowFactoryManager_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIWindowManager.h b/vendor/cegui-0.4.0-custom/include/CEGUIWindowManager.h deleted file mode 100644 index c257fca348..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIWindowManager.h +++ /dev/null @@ -1,400 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowManager.h - created: 21/2/2004 - author: Paul D Turner - - purpose: Defines the interface for the WindowManager object -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIWindowManager_h_ -#define _CEGUIWindowManager_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUISingleton.h" -#include "CEGUILogger.h" -#include "CEGUIIteratorBase.h" -#include -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4275) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - The WindowManager class describes an object that manages creation and lifetime of Window objects. - - The WindowManager is the means by which Window objects are created and destroyed. For each sub-class - of Window that is to be created, there must exist a WindowFactory object which is registered with the - WindowFactoryManager. Additionally, the WindowManager tracks every Window object created, and can be - used to access those Window objects by name. -*/ -class CEGUIEXPORT WindowManager : public Singleton -{ -public: - /************************************************************************* - Public static data - *************************************************************************/ - static const String GeneratedWindowNameBase; //!< Base name to use for generated window names. - - /*! - \brief - Function type that is used as a callback when loading layouts from XML; the function is called - for each Property element encountered. - - \param window - Window object that the property is to be applied to. - - \param propname - String holding the name of the property that is being set. - - \param propvalue - String holding the new value that will be applied to the property specified by /a propname. - - \param userdata - Some client code supplied data. - - \return - - true if the property should be set. - - false if the property should not be set, - */ - typedef bool PropertyCallback(Window* window, String& propname, String& propvalue, void* userdata); - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructs a new WindowManager object. - - NB: Client code should not create WindowManager objects - they are of limited use to you! The - intended pattern of access is to get a pointer to the GUI system's WindowManager via the System - object, and use that. - */ - WindowManager(void); - - - /*! - \brief - Destructor for WindowManager objects - - This will properly destry all remaining Window objects. Note that WindowFactory objects will not - be destroyed (since they are owned by whoever created them). - */ - ~WindowManager(void); - - - /*! - \brief - Return singleton WindowManager object - - \return - Singleton WindowManager object - */ - static WindowManager& getSingleton(void); - - - /*! - \brief - Return pointer to singleton WindowManager object - - \return - Pointer to singleton WindowManager object - */ - static WindowManager* getSingletonPtr(void); - - - /************************************************************************* - Window Related Methods - *************************************************************************/ - /*! - \brief - Creates a new Window object of the specified type, and gives it the specified unique name. - - \param type - String that describes the type of Window to be created. A valid WindowFactory for the specified type must be registered. - - \param name - String that holds a unique name that is to be given to the new window. If this string is empty (""), a name - will be generated for the window. - - \return - Pointer to the newly created Window object. - - \exception AlreadyExistsException A Window object with the name \a name already exists. - \exception UnknownObjectException No WindowFactory is registered for \a type Window objects. - \exception GenericException Some other error occurred (Exception message has details). - */ - Window* createWindow(const String& type, const String& name = ""); - - - /*! - \brief - Destroy the specified Window object. - - \param window - Pointer to the Window object to be destroyed. If the \a window is null, or is not recognised, nothing happens. - - \return - Nothing - - \exception InvalidRequestException Can be thrown if the WindowFactory for \a window's object type was removed. - */ - void destroyWindow(Window* window); - - - /*! - \brief - Destroy the specified Window object. - - \param - window String containing the name of the Window object to be destroyed. If \a window is not recognised, nothing happens. - - \return - Nothing. - - \exception InvalidRequestException Can be thrown if the WindowFactory for \a window's object type was removed. - */ - void destroyWindow(const String& window); - - - /*! - \brief - Return a pointer to the specified Window object. - - \param name - String holding the name of the Window object to be returned. - - \return - Pointer to the Window object with the name \a name. - - \exception UnknownObjectException No Window object with a name matching \a name was found. - */ - Window* getWindow(const String& name) const; - - - /*! - \brief - Examines the list of Window objects to see if one exists with the given name - - \param name - String holding the name of the Window object to look for. - - \return - true if a Window object was found with a name matching \a name. false if no matching Window object was found. - */ - bool isWindowPresent(const String& name) const; - - - /*! - \brief - Destroys all Window objects within the system - - \return - Nothing. - - \exception InvalidRequestException Thrown if the WindowFactory for any Window object type has been removed. - */ - void destroyAllWindows(void); - - - /*! - \brief - Creates a set of windows (a Gui layout) from the information in the specified XML file. - - \param filename - String object holding the filename of the XML file to be processed. - - \param name_prefix - String object holding the prefix that is to be used when creating the windows in the layout file, this - function allows a layout to be loaded multiple times without having name clashes. Note that if you use - this facility, then all windows defined within the layout must have names assigned; you currently can not - use this feature in combination with automatically generated window names. - - \param resourceGroup - Resource group identifier to be passed to the resource provider when loading the layout file. - - \param callback - PropertyCallback function to be called for each Property element loaded from the layout. This is - called prior to the property value being applied to the window enabling client code manipulation of - properties. - - \param userdata - Client code data pointer passed to the PropertyCallback function. - - \return - Pointer to the root Window object defined in the layout. - - \exception FileIOException thrown if something goes wrong while processing the file \a filename. - \exception InvalidRequestException thrown if \a filename appears to be invalid. - */ - Window* loadWindowLayout(const String& filename, const String& name_prefix = "", const String& resourceGroup = "", PropertyCallback* callback = NULL, void* userdata = NULL); - - /*! - \brief - Return whether the window dead pool is empty. - - \return - - true if there are no windows in the dead pool. - - false if the dead pool contains >=1 window awaiting destruction. - */ - bool isDeadPoolEmpty(void) const; - - /*! - \brief - Permanently destroys any windows placed in the dead pool. - - \note - It is probably not a good idea to call this from a Window based event handler - if the specific window has been or is being destroyed. - - \return - Nothing. - */ - void cleanDeadPool(void); - - /*! - \brief - Writes a full XML window layout, starting at the given Window to the given OutStream. - - \param window - Window object to become the root of the layout. - - \param out_stream - OutStream (std::ostream based) object where data is to be sent. - - \param writeParent - If the starting window has a parent window, specifies whether to write the parent name into - the Parent attribute of the GUILayout XML element. - - \return - Nothing. - */ - void writeWindowLayoutToStream(const Window& window, OutStream& out_stream, bool writeParent = false) const; - - /*! - \brief - Writes a full XML window layout, starting at the given Window to the given OutStream. - - \param window - String holding the name of the Window object to become the root of the layout. - - \param out_stream - OutStream (std::ostream based) object where data is to be sent. - - \param writeParent - If the starting window has a parent window, specifies whether to write the parent name into - the Parent attribute of the GUILayout XML element. - - \return - Nothing. - */ - void writeWindowLayoutToStream(const String& window, OutStream& out_stream, bool writeParent = false) const; - - /*! - \brief - Rename a window. - - \param window - String holding the current name of the window to be renamed. - - \param new_name - String holding the new name for the window - - \exception UnknownObjectException - thrown if \a window is not known in the system. - - \exception AlreadyExistsException - thrown if a Window named \a new_name already exists. - */ - void renameWindow(const String& window, const String& new_name); - - /*! - \brief - Rename a window. - - \param window - Pointer to the window to be renamed. - - \param new_name - String holding the new name for the window - - \exception AlreadyExistsException - thrown if a Window named \a new_name already exists. - */ - void renameWindow(Window* window, const String& new_name); - -private: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Implementation method to generate a unique name to use for a window. - */ - String generateUniqueWindowName(); - - /************************************************************************* - Implementation Constants - *************************************************************************/ - static const char GUILayoutSchemaName[]; //!< Filename of the XML schema used for validating GUILayout files. - - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::map WindowRegistry; //!< Type used to implement registry of Window objects - typedef std::vector WindowVector; //!< Type to use for a collection of Window pointers. - - WindowRegistry d_windowRegistry; //!< The container that forms the Window registry - WindowVector d_deathrow; //!< Collection of 'destroyed' windows. - - unsigned long d_uid_counter; //!< Counter used to generate unique window names. - -public: - /************************************************************************* - Iterator stuff - *************************************************************************/ - typedef ConstBaseIterator WindowIterator; - - /*! - \brief - Return a WindowManager::WindowIterator object to iterate over the currently defined Windows. - */ - WindowIterator getIterator(void) const; - - // Hack to store our first created editbox - Window* m_editBox; -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIWindowManager_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIWindowProperties.h b/vendor/cegui-0.4.0-custom/include/CEGUIWindowProperties.h deleted file mode 100644 index 9598b5b035..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIWindowProperties.h +++ /dev/null @@ -1,1704 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowProperties.h - created: 5/7/2004 - author: Paul D Turner - - purpose: Interface to available window base class properties -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIWindowProperties_h_ -#define _CEGUIWindowProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of WindowProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Window base class -*/ -namespace WindowProperties -{ -/*! -\brief - Property to access minimum window size. - - This property offers access to the minimum size setting for the window, using screen relative metrics. - - \par Usage: - - Name: RelativeMinSize - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the minimum width as a floating point number. - - h:[float] specifies the minimum height as a floating point number. -*/ -class RelativeMinSize : public Property -{ -public: - RelativeMinSize() : Property( - "RelativeMinSize", - "Property to get/set the minimum size for the Window. Value is \"w:[float] h:[float]\" using relative metrics (this setting is relative to the display size).", - "w:0.000000 h:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access maximum window size. - - This property offers access to the maximum size setting for the window, using screen relative metrics. - - \par Usage: - - Name: RelativeMaxSize - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the maximum width as a floating point number. - - h:[float] specifies the maximum height as a floating point number. -*/ -class RelativeMaxSize : public Property -{ -public: - RelativeMaxSize() : Property( - "RelativeMaxSize", - "Property to get/set the maximum size for the Window. Value is \"w:[float] h:[float]\" using relative metrics (this setting is relative to the display size).", - "w:1.000000 h:1.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access minimum window size. - - This property offers access to the minimum size setting for the window, using absolute screen pixel metrics. - - \par Usage: - - Name: AbsoluteMinSize - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the minimum width as a floating point number. - - h:[float] specifies the minimum height as a floating point number. -*/ -class AbsoluteMinSize : public Property -{ -public: - AbsoluteMinSize() : Property( - "AbsoluteMinSize", - "Property to get/set the minimum size for the Window. Value is \"w:[float] h:[float]\" using absolute (pixel) metrics.", - "w:0.000000 h:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access maximum window size. - - This property offers access to the maximum size setting for the window, using absolute screen pixel metrics. - - \par Usage: - - Name: AbsoluteMaxSize - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the maximum width as a floating point number. - - h:[float] specifies the maximum height as a floating point number. -*/ -class AbsoluteMaxSize : public Property -{ -public: - AbsoluteMaxSize() : Property( - "AbsoluteMaxSize", - "Property to get/set the maximum size for the Window. Value is \"w:[float] h:[float]\" using absolute (pixel) metrics.", - "", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - - // default depends upon current size of display. - bool isDefault(const PropertyReceiver* receiver) const; - String getDefault(const PropertyReceiver* receiver) const; -}; - - -/*! -\brief - Property to access the metrics mode setting. - - This property offers access to the metrics mode setting for the window. - - \par Usage: - - Name: MetricsMode - - Format: "[text]". - - \par Where [text] is: - - "Relative" for the relative metrics mode. - - "Absolute" for the absolute metrics mode. - - "Inherited" if metrics should be inherited from the parent (only used with set method). -*/ -class MetricsMode : public Property -{ -public: - MetricsMode() : Property( - "MetricsMode", - "Property to get/set the metrics mode for the Window. Value is \"Relative\", \"Absolute\", or \"Inherited\".", - "Relative") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window ID field. - - This property offers access to the client specified ID for the window. - - \par Usage: - - Name: ID - - Format: "[uint]". - - \par Where: - - [uint] is any unsigned integer value. -*/ -class ID : public Property -{ -public: - ID() : Property( - "ID", - "Property to get/set the ID value of the Window. Value is an unsigned integer number.", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window alpha setting. - - This property offers access to the alpha-blend setting for the window. - - \par Usage: - - Name: Alpha - - Format: "[float]". - - \par Where: - - [float] is a floating point number between 0.0 and 1.0. -*/ -class Alpha : public Property -{ -public: - Alpha() : Property( - "Alpha", - "Property to get/set the alpha value of the Window. Value is floating point number.", - "1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Font setting. - - This property offers access to the current Font setting for the window. - - \par Usage: - - Name: Font - - Format: "[text]". - - \par Where: - - [text] is the name of the Font to assign for this window. The Font specified must already be loaded. -*/ -class Font : public Property -{ -public: - Font() : Property( - "Font", - "Property to get/set the font for the Window. Value is the name of the font to use (must be loaded already).", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - bool isDefault(const PropertyReceiver* receiver) const; -}; - - -/*! -\brief - Property to access window text setting. - - This property offers access to the current text for the window. - - \par Usage: - - Name: Text - - Format: "[text]". - - \par Where: - - [text] is the name of the Font to assign for this window. The Font specified must already be loaded. -*/ -class Text : public Property -{ -public: - Text() : Property( - "Text", - "Property to get/set the text / caption for the Window. Value is the text string to use.", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window mouse cursor setting. - - This property offers access to the current mouse cursor image for the window. - - \par Usage: - - Name: MouseCursorImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class MouseCursorImage : public Property -{ -public: - MouseCursorImage() : Property( - "MouseCursorImage", - "Property to get/set the mouse cursor image for the Window. Value should be \"set: image:\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - bool isDefault(const PropertyReceiver* receiver) const; -}; - - -/*! -\brief - Property to access window "clipped by parent" setting. - - This property offers access to the clipped by parent setting for the window. - - \par Usage: - - Name: ClippedByParent - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window is clipped by it's parent. - - "False" to indicate the Window is not clipped by it's parent. -*/ -class ClippedByParent : public Property -{ -public: - ClippedByParent() : Property( - "ClippedByParent", - "Property to get/set the 'clipped by parent' setting for the Window. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window "Inherits Alpha" setting. - - This property offers access to the inherits alpha setting for the window. - - \par Usage: - - Name: InheritsAlpha - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window inherits alpha blend values from it's ancestors. - - "False" to indicate the Window does not inherit alpha blend values from it's ancestors. -*/ -class InheritsAlpha : public Property -{ -public: - InheritsAlpha() : Property( - "InheritsAlpha", - "Property to get/set the 'inherits alpha' setting for the Window. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window "Always-On-Top" setting. - - This property offers access to the always on top / topmost setting for the window. - - \par Usage: - - Name: AlwaysOnTop - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window is always on top, and appears above all other non-always on top Windows. - - "False" to indicate the Window is not always on top, and will appear below all other always on top Windows. -*/ -class AlwaysOnTop : public Property -{ -public: - AlwaysOnTop() : Property( - "AlwaysOnTop", - "Property to get/set the 'always on top' setting for the Window. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Disabled setting. - - This property offers access to the enabled / disabled setting for the window. - - \par Usage: - - Name: Disabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window is disabled, and will normally receive no inputs from the user. - - "False" to indicate the Window is not disabled and will receive inputs from the user as normal. -*/ -class Disabled : public Property -{ -public: - Disabled() : Property( - "Disabled", - "Property to get/set the 'disabled state' setting for the Window. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - bool isDefault(const PropertyReceiver* receiver) const; -}; - - -/*! -\brief - Property to access window Visible setting. - - This property offers access to the visible setting for the window. - - \par Usage: - - Name: Visible - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window is visible. - - "False" to indicate the Window is not visible. -*/ -class Visible : public Property -{ -public: - Visible() : Property( - "Visible", - "Property to get/set the 'visible state' setting for the Window. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - bool isDefault(const PropertyReceiver* receiver) const; -}; - - -/*! -\brief - Property to access window Restore Old Capture setting. - - This property offers access to the restore old capture setting for the window. This setting is of generally limited use, it - is primary purpose is for certain operations required for compound widgets. - - \par Usage: - - Name: RestoreOldCapture - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window should restore any previous capture Window when it loses input capture. - - "False" to indicate the Window should not restore the old capture Window. This is the default behaviour. -*/ -class RestoreOldCapture : public Property -{ -public: - RestoreOldCapture() : Property( - "RestoreOldCapture", - "Property to get/set the 'restore old capture' setting for the Window. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Destroyed by Parent setting. - - This property offers access to the destryed by parent setting for the window. - - \par Usage: - - Name: DestroyedByParent - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window should be automatically destroyed when it's parent Window is destroyed. - - "False" to indicate the Window should not be destroyed when it's parent Window is destroyed. -*/ -class DestroyedByParent : public Property -{ -public: - DestroyedByParent() : Property( - "DestroyedByParent", - "Property to get/set the 'destroyed by parent' setting for the Window. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window width. - - This property offers access to the Width setting for the window, using the Windows active metrics mode. - - \par Usage: - - Name: Width - - Format: "[float]". - - \par Where: - - [float] specifies the width as a floating point number, using the active metrics system for the Window. -*/ -class Width : public Property -{ -public: - Width() : Property( - "Width", - "Property to get/set the width of the Window. Value is floating point using the active metrics mode.", - "0.000000", false) {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window width. - - This property offers access to the Width setting for the window, using the relative metrics mode. - - \par Usage: - - Name: RelativeWidth - - Format: "[float]". - - \par Where: - - [float] specifies the width as a floating point number, using the relative metrics system. -*/ -class RelativeWidth : public Property -{ -public: - RelativeWidth() : Property( - "RelativeWidth", - "Property to get/set the width of the Window. Value is floating point using relative metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window width. - - This property offers access to the Width setting for the window, using the absolute metrics mode. - - \par Usage: - - Name: AbsoluteWidth - - Format: "[float]". - - \par Where: - - [float] specifies the width as a floating point number, using the absolute metrics system. -*/ -class AbsoluteWidth: public Property -{ -public: - AbsoluteWidth() : Property( - "AbsoluteWidth", - "Property to get/set the width of the Window. Value is floating point using absolute metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window height. - - This property offers access to the Height setting for the window, using the Windows active metrics mode. - - \par Usage: - - Name: Height - - Format: "[float]". - - \par Where: - - [float] specifies the height as a floating point number, using the active metrics system for the Window. -*/ -class Height : public Property -{ -public: - Height() : Property( - "Height", - "Property to get/set the height of the Window. Value is floating point using the active metrics mode.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window height. - - This property offers access to the Height setting for the window, using the relative metrics mode. - - \par Usage: - - Name: RelativeHeight - - Format: "[float]". - - \par Where: - - [float] specifies the height as a floating point number, using the relative metrics system. -*/ -class RelativeHeight : public Property -{ -public: - RelativeHeight() : Property( - "RelativeHeight", - "Property to get/set the height of the Window. Value is floating point using relative metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window height. - - This property offers access to the Height setting for the window, using the absolute metrics mode. - - \par Usage: - - Name: AbsoluteHeight - - Format: "[float]". - - \par Where: - - [float] specifies the height as a floating point number, using the absolute metrics system. -*/ -class AbsoluteHeight : public Property -{ -public: - AbsoluteHeight() : Property( - "AbsoluteHeight", - "Property to get/set the height of the Window. Value is floating point using absolute metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the window size. - - This property offers access to the size setting for the window, using the Windows active metrics mode. - - \par Usage: - - Name: Size - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the minimum width as a floating point number, using the active metrics system for the Window. - - h:[float] specifies the minimum height as a floating point number, using the active metrics system for the Window. -*/ -class Size : public Property -{ -public: - Size() : Property( - "Size", - "Property to get/set the size of the Window. Value is \"w:[float] h:[float]\" using the active metrics mode.", - "w:0.000000 h:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the window size. - - This property offers access to the size setting for the window, using the relative metrics system. - - \par Usage: - - Name: RelativeSize - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the minimum width as a floating point number, using the relative metrics system. - - h:[float] specifies the minimum height as a floating point number, using the relative metrics system. -*/ -class RelativeSize : public Property -{ -public: - RelativeSize() : Property( - "RelativeSize", - "Property to get/set the size of the Window. Value is \"w:[float] h:[float]\" using relative metrics.", - "w:0.000000 h:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the window size. - - This property offers access to the size setting for the window, using the absolute metrics system. - - \par Usage: - - Name: AbsoluteSize - - Format: "w:[float] h:[float]". - - \par Where: - - w:[float] specifies the minimum width as a floating point number, using the absolute metrics system. - - h:[float] specifies the minimum height as a floating point number, using the absolute metrics system. -*/ -class AbsoluteSize : public Property -{ -public: - AbsoluteSize() : Property( - "AbsoluteSize", - "Property to get/set the size of the Window. Value is \"w:[float] h:[float]\" using absolute metrics.", - "w:0.000000 h:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window X position. - - This property offers access to the X position for the window, using the Windows active metrics mode. - - \par Usage: - - Name: XPosition - - Format: "[float]". - - \par Where: - - [float] specifies the x position co-ordinate as a floating point number, using the active metrics system for the Window. -*/ -class XPosition : public Property -{ -public: - XPosition() : Property( - "XPosition", - "Property to get/set the x co-ordinate position of the Window. Value is a floating point number using the active metrics mode.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window X position. - - This property offers access to the X position for the window, using the relative metrics system. - - \par Usage: - - Name: RelativeXPosition - - Format: "[float]". - - \par Where: - - [float] specifies the x position co-ordinate as a floating point number, using the relative metrics system. -*/ -class RelativeXPosition : public Property -{ -public: - RelativeXPosition() : Property( - "RelativeXPosition", - "Property to get/set the x co-ordinate position of the Window. Value is a floating point number using relative metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window X position. - - This property offers access to the X position for the window, using the absolute metrics system. - - \par Usage: - - Name: AbsoluteXPosition - - Format: "[float]". - - \par Where: - - [float] specifies the x position co-ordinate as a floating point number, using the absolute metrics system. -*/ -class AbsoluteXPosition : public Property -{ -public: - AbsoluteXPosition() : Property( - "AbsoluteXPosition", - "Property to get/set the x co-ordinate position of the Window. Value is a floating point number using absolute metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Y position. - - This property offers access to the Y position for the window, using the Windows active metrics mode. - - \par Usage: - - Name: YPosition - - Format: "[float]". - - \par Where: - - [float] specifies the y position co-ordinate as a floating point number, using the active metrics system for the Window. -*/ -class YPosition : public Property -{ -public: - YPosition() : Property( - "YPosition", - "Property to get/set the y co-ordinate position of the Window. Value is a floating point number using the active metrics mode.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Y position. - - This property offers access to the Y position for the window, using the relative metrics system. - - \par Usage: - - Name: RelativeYPosition - - Format: "[float]". - - \par Where: - - [float] specifies the y position co-ordinate as a floating point number, using the relative metrics system. -*/ -class RelativeYPosition : public Property -{ -public: - RelativeYPosition() : Property( - "RelativeYPosition", - "Property to get/set the y co-ordinate position of the Window. Value is a floating point number using relative metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Y position. - - This property offers access to the Y position for the window, using the absolute metrics system. - - \par Usage: - - Name: AbsoluteYPosition - - Format: "[float]". - - \par Where: - - [float] specifies the y position co-ordinate as a floating point number, using the absolute metrics system. -*/ -class AbsoluteYPosition : public Property -{ -public: - AbsoluteYPosition() : Property( - "AbsoluteYPosition", - "Property to get/set the y co-ordinate position of the Window. Value is a floating point number using absolute metrics.", - "0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window position. - - This property offers access to the position for the window, using the Windows active metrics mode. - - \par Usage: - - Name: Position - - Format: "x:[float] y:[float]". - - \par Where: - - x:[float] specifies the x position co-ordinate as a floating point number, using the active metrics system for the Window. - - y:[float] specifies the y position co-ordinate as a floating point number, using the active metrics system for the Window. -*/ -class Position : public Property -{ -public: - Position() : Property( - "Position", - "Property to get/set the position of the Window. Value is \"x:[float] y:[float]\" using the active metrics mode.", - "x:0.000000 y:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window position. - - This property offers access to the position for the window, using the relative metrics system. - - \par Usage: - - Name: RelativePosition - - Format: "x:[float] y:[float]". - - \par Where: - - x:[float] specifies the x position co-ordinate as a floating point number, using the relative metrics system. - - y:[float] specifies the y position co-ordinate as a floating point number, using the relative metrics system. -*/ -class RelativePosition : public Property -{ -public: - RelativePosition() : Property( - "RelativePosition", - "Property to get/set the position of the Window. Value is \"x:[float] y:[float]\" using relative metrics.", - "x:0.000000 y:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window position. - - This property offers access to the position for the window, using the absolute metrics system. - - \par Usage: - - Name: AbsolutePosition - - Format: "x:[float] y:[float]". - - \par Where: - - x:[float] specifies the x position co-ordinate as a floating point number, using the absolute metrics system. - - y:[float] specifies the y position co-ordinate as a floating point number, using the absolute metrics system. -*/ -class AbsolutePosition : public Property -{ -public: - AbsolutePosition() : Property( - "AbsolutePosition", - "Property to get/set the position of the Window. Value is \"x:[float] y:[float]\" using absolute metrics.", - "x:0.000000 y:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window area rectangle. - - This property offers access to the area rectangle (Rect) for the window, using the Windows active metrics mode. - - \par Usage: - - Name: Rect - - Format: "l:[float] t:[float] r:[float] b:[float]". - - \par Where: - - l:[float] specifies the position of the left edge of the area as a floating point number, using the active metrics system for the Window. - - t:[float] specifies the position of the top edge of the area as a floating point number, using the active metrics system for the Window. - - r:[float] specifies the position of the right edge of the area as a floating point number, using the active metrics system for the Window. - - b:[float] specifies the position of the bottom edge of the area as a floating point number, using the active metrics system for the Window. -*/ -class Rect : public Property -{ -public: - Rect() : Property( - "Rect", - "Property to get/set the area rectangle of the Window. Value is \"l:[float] t:[float] r:[float] b:[float]\" (where l is left, t is top, r is right, and b is bottom) using the active metrics system.", - "l:0.000000 t:0.000000 r:0.000000 b:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window area rectangle. - - This property offers access to the area rectangle (Rect) for the window, using the relative metrics system. - - \par Usage: - - Name: RelativeRect - - Format: "l:[float] t:[float] r:[float] b:[float]". - - \par Where: - - l:[float] specifies the position of the left edge of the area as a floating point number, using the relative metrics system. - - t:[float] specifies the position of the top edge of the area as a floating point number, using the relative metrics system. - - r:[float] specifies the position of the right edge of the area as a floating point number, using the relative metrics system. - - b:[float] specifies the position of the bottom edge of the area as a floating point number, using the relative metrics system. -*/ -class RelativeRect : public Property -{ -public: - RelativeRect() : Property( - "RelativeRect", - "Property to get/set the area rectangle of the Window. Value is \"l:[float] t:[float] r:[float] b:[float]\" (where l is left, t is top, r is right, and b is bottom) using relative metrics.", - "l:0.000000 t:0.000000 r:0.000000 b:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window area rectangle. - - This property offers access to the area rectangle (Rect) for the window, using the absolute metrics system. - - \par Usage: - - Name: AbsoluteRect - - Format: "l:[float] t:[float] r:[float] b:[float]". - - \par Where: - - l:[float] specifies the position of the left edge of the area as a floating point number, using the absolute metrics system. - - t:[float] specifies the position of the top edge of the area as a floating point number, using the absolute metrics system. - - r:[float] specifies the position of the right edge of the area as a floating point number, using the absolute metrics system. - - b:[float] specifies the position of the bottom edge of the area as a floating point number, using the absolute metrics system. -*/ -class AbsoluteRect : public Property -{ -public: - AbsoluteRect() : Property( - "AbsoluteRect", - "Property to get/set the area rectangle of the Window. Value is \"l:[float] t:[float] r:[float] b:[float]\" (where l is left, t is top, r is right, and b is bottom) using absolute metrics.", - "l:0.000000 t:0.000000 r:0.000000 b:0.000000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window Z-Order changing enabled setting. - - This property offers access to the setting that controls whether z-order changes are enabled for the window. - - \par Usage: - - Name: ZOrderChangeEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window should respect requests to change z-order. - - "False" to indicate the Window should not change it's z-order. -*/ -class ZOrderChangeEnabled : public Property -{ -public: - ZOrderChangeEnabled() : Property( - "ZOrderChangeEnabled", - "Property to get/set the 'z-order changing enabled' setting for the Window. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to control whether the window will receive double/triple-click events. - - This property offers access to the setting that controls whether a window will receive double-click and - triple-click events, or whether the window will receive multiple single mouse button down events instead. - - \par Usage: - - Name: WantsMultiClickEvents - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window wants double-click and triple-click events. - - "False" to indicate the Window wants multiple single mouse button down events. -*/ -class WantsMultiClickEvents : public Property -{ -public: - WantsMultiClickEvents() : Property( - "WantsMultiClickEvents", - "Property to get/set whether the window will receive double-click and triple-click events. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to control whether the window will receive autorepeat mouse button down events. - - This property offers access to the setting that controls whether a window will receive autorepeat - mouse button down events. - - \par Usage: - - Name: MouseButtonDownAutoRepeat - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window will receive autorepeat mouse button down events. - - "False" to indicate the Window will not receive autorepeat mouse button down events. -*/ -class MouseButtonDownAutoRepeat : public Property -{ -public: - MouseButtonDownAutoRepeat() : Property( - "MouseButtonDownAutoRepeat", - "Property to get/set whether the window will receive autorepeat mouse button down events. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window autorepeat delay value. - - This property offers access to the value that controls the initial delay for autorepeat mouse button down events. - - \par Usage: - - Name: AutoRepeatDelay - - Format: "[float]". - - \par Where: - - [float] specifies the delay in seconds. -*/ -class AutoRepeatDelay : public Property -{ -public: - AutoRepeatDelay() : Property( - "AutoRepeatDelay", - "Property to get/set the autorepeat delay. Value is a floating point number indicating the delay required in seconds.", - "0.300000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access window autorepeat rate value. - - This property offers access to the value that controls the generation rate for autorepeat mouse button down events. - - \par Usage: - - Name: AutoRepeatRate - - Format: "[float]". - - \par Where: - - [float] specifies the rate at which autorepeat events will be generated in seconds. -*/ -class AutoRepeatRate : public Property -{ -public: - AutoRepeatRate() : Property( - "AutoRepeatRate", - "Property to get/set the autorepeat rate. Value is a floating point number indicating the rate required in seconds.", - "0.060000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access whether inputs are passed to child windows when - input is captured to this window. - - \par Usage: - - Name: DistributeCapturedInputs - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate 'captured' inputs should be passed to attached child windows. - - "False" to indicate 'captured' inputs should be passed to this window only. -*/ -class DistributeCapturedInputs : public Property -{ -public: - DistributeCapturedInputs() : Property( - "DistributeCapturedInputs", - "Property to get/set whether captured inputs are passed to child windows. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the custom tooltip for this Window. - - \par Usage: - - Name: CustomTooltipType - - Format: "[text]". - - \par Where: - - [Text] is the typename of the custom tooltip for the Window. - */ -class CustomTooltipType : public Property -{ -public: - CustomTooltipType() : Property( - "CustomTooltipType", - "Property to get/set the custom tooltip for the window. Value is the type name of the custom tooltip.", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the tooltip text for this Window. - - \par Usage: - - Name: Tooltip - - Format: "[text]". - - \par Where: - - [Text] is the tooltip text for this window. - */ -class Tooltip : public Property -{ -public: - Tooltip() : Property( - "Tooltip", - "Property to get/set the tooltip text for the window. Value is the tooltip text for the window.", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access whether the window inherits its tooltip text from its parent whn it has no tooltip text of its own. - - \par Usage: - - Name: InheritsTooltipText - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window inherits its tooltip text from its parent. - - "False" to indicate the Window does not inherit its tooltip text. -*/ -class InheritsTooltipText : public Property -{ -public: - InheritsTooltipText() : Property( - "InheritsTooltipText", - "Property to get/set whether the window inherits its parents tooltip text when it has none of its own. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access whether the window rises to the top of the z order when clicked. - - \par Usage: - - Name: RiseOnClick - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window will rise to the surface when clicked. - - "False" to indicate the Window will not change z position when clicked. -*/ -class RiseOnClick : public Property -{ -public: - RiseOnClick() : Property( - "RiseOnClick", - "Property to get/set whether the window will come tot he top of the z order hwn clicked. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the vertical alignment setting for the window. - - \par Usage: - - Name: VerticalAlignment - - Format: "[text]". - - \par Where [Text] is: - - "Top" to indicate the windows position is an offset of its top edge from its parents top edge. - - "Centre" to indicate the windows position is an offset of its centre point from its parents centre point. - - "Bottom" to indicate the windows position is an offset of its bottom edge from its parents bottom edge. -*/ -class VerticalAlignment : public Property -{ - public: - VerticalAlignment() : Property( - "VerticalAlignment", - "Property to get/set the windows vertical alignment. Value is one of \"Top\", \"Centre\" or \"Bottom\".", - "Top") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the horizontal alignment setting for the window. - - \par Usage: - - Name: HorizontalAlignment - - Format: "[text]". - - \par Where [Text] is: - - "Left" to indicate the windows position is an offset of its left edge from its parents left edge. - - "Centre" to indicate the windows position is an offset of its centre point from its parents centre point. - - "Right" to indicate the windows position is an offset of its right edge from its parents right edge. -*/ -class HorizontalAlignment : public Property -{ - public: - HorizontalAlignment() : Property( - "HorizontalAlignment", - "Property to get/set the windows horizontal alignment. Value is one of \"Left\", \"Centre\" or \"Right\".", - "Left") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified area rectangle of the window. - - \par Usage: - - Name: UnifiedAreaRect - - Format: "{{[ls],[lo]},{[ts],[to]},{[rs],[ro]},{[bs],[bo]}}" - - \par Where: - - [ls] is a floating point value describing the relative scale value for the left edge. - - [lo] is a floating point value describing the absolute offset value for the left edge. - - [ts] is a floating point value describing the relative scale value for the top edge. - - [to] is a floating point value describing the absolute offset value for the top edge. - - [rs] is a floating point value describing the relative scale value for the right edge. - - [ro] is a floating point value describing the absolute offset value for the right edge. - - [bs] is a floating point value describing the relative scale value for the bottom edge. - - [bo] is a floating point value describing the absolute offset value for the bottom edge. -*/ -class UnifiedAreaRect : public Property -{ - public: - UnifiedAreaRect() : Property( - "UnifiedAreaRect", - "Property to get/set the windows unified area rectangle. Value is a \"URect\".", - "{{0.000000,0.000000},{0.000000,0.000000},{0.000000,0.000000},{0.000000,0.000000}}") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified position of the window. - - \par Usage: - - Name: UnifiedPosition - - Format: "{{[xs],[xo]},{[ys],[yo]}}" - - \par Where: - - [xs] is a floating point value describing the relative scale value for the position x-coordinate. - - [xo] is a floating point value describing the absolute offset value for the position x-coordinate. - - [ys] is a floating point value describing the relative scale value for the position y-coordinate. - - [yo] is a floating point value describing the absolute offset value for the position y-coordinate. -*/ -class UnifiedPosition : public Property -{ - public: - UnifiedPosition() : Property( - "UnifiedPosition", - "Property to get/set the windows unified position. Value is a \"UVector2\".", - "{{0.000000,0.000000},{0.000000,0.000000}}", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified position x-coordinate of the window. - - \par Usage: - - Name: UnifiedXPosition - - Format: "{[s],[o]}" - - \par Where: - - [s] is a floating point value describing the relative scale value for the position x-coordinate. - - [o] is a floating point value describing the absolute offset value for the position x-coordinate. -*/ -class UnifiedXPosition : public Property -{ - public: - UnifiedXPosition() : Property( - "UnifiedXPosition", - "Property to get/set the windows unified position x-coordinate. Value is a \"UDim\".", - "{0.000000,0.000000}", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified position y-coordinate of the window. - - \par Usage: - - Name: UnifiedYPosition - - Format: "{[s],[o]}" - - \par Where: - - [s] is a floating point value describing the relative scale value for the position y-coordinate. - - [o] is a floating point value describing the absolute offset value for the position y-coordinate. -*/ -class UnifiedYPosition : public Property -{ - public: - UnifiedYPosition() : Property( - "UnifiedYPosition", - "Property to get/set the windows unified position y-coordinate. Value is a \"UDim\".", - "{0.000000,0.000000}", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified position of the window. - - \par Usage: - - Name: UnifiedSize - - Format: "{{[ws],[wo]},{[hs],[ho]}}" - - \par Where: - - [ws] is a floating point value describing the relative scale value for the width. - - [wo] is a floating point value describing the absolute offset value for the width. - - [hs] is a floating point value describing the relative scale value for the height. - - [ho] is a floating point value describing the absolute offset value for the height. -*/ -class UnifiedSize : public Property -{ - public: - UnifiedSize() : Property( - "UnifiedSize", - "Property to get/set the windows unified size. Value is a \"UVector2\".", - "{{0.000000,0.000000},{0.000000,0.000000}}", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified width of the window. - - \par Usage: - - Name: UnifiedWidth - - Format: "{[s],[o]}" - - \par Where: - - [s] is a floating point value describing the relative scale value for the width. - - [o] is a floating point value describing the absolute offset value for the width. -*/ -class UnifiedWidth : public Property -{ - public: - UnifiedWidth() : Property( - "UnifiedWidth", - "Property to get/set the windows unified width. Value is a \"UDim\".", - "{0.000000,0.000000}", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified height of the window. - - \par Usage: - - Name: UnifiedHeight - - Format: "{[s],[o]}" - - \par Where: - - [s] is a floating point value describing the relative scale value for the height. - - [o] is a floating point value describing the absolute offset value for the height. -*/ -class UnifiedHeight : public Property -{ - public: - UnifiedHeight() : Property( - "UnifiedHeight", - "Property to get/set the windows unified height. Value is a \"UDim\".", - "{0.000000,0.000000}", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified minimum size of the window. - - \par Usage: - - Name: UnifiedMinSize - - Format: "{{[ws],[wo]},{[hs],[ho]}}" - - \par Where: - - [ws] is a floating point value describing the relative scale value for the minimum width. - - [wo] is a floating point value describing the absolute offset value for the minimum width. - - [hs] is a floating point value describing the relative scale value for the minimum height. - - [ho] is a floating point value describing the absolute offset value for the minimum height. -*/ -class UnifiedMinSize : public Property -{ - public: - UnifiedMinSize() : Property( - "UnifiedMinSize", - "Property to get/set the windows unified minimum size. Value is a \"UVector2\".", - "{{0.000000,0.000000},{0.000000,0.000000}}") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/* -\brief - Property to access the unified maximum size of the window. - - \par Usage: - - Name: UnifiedMaxSize - - Format: "{{[ws],[wo]},{[hs],[ho]}}" - - \par Where: - - [ws] is a floating point value describing the relative scale value for the maximum width. - - [wo] is a floating point value describing the absolute offset value for the maximum width. - - [hs] is a floating point value describing the relative scale value for the maximum height. - - [ho] is a floating point value describing the absolute offset value for the maximum height. -*/ -class UnifiedMaxSize : public Property -{ - public: - UnifiedMaxSize() : Property( - "UnifiedMaxSize", - "Property to get/set the windows unified maximum size. Value is a \"UVector2\".", - "{{0.000000,0.000000},{0.000000,0.000000}}") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access whether the window ignores mouse events and pass them through to any windows behind it. - - \par Usage: - - Name: MousePassThroughEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the Window will not respond to mouse events but pass them directly to any children behind it. - - "False" to indicate the Window will respond to normally to all mouse events (Default). -*/ -class MousePassThroughEnabled : public Property -{ -public: - MousePassThroughEnabled() : Property( - "MousePassThroughEnabled", - "Property to get/set whether the window ignores mouse events and pass them through to any windows behind it. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of WindowProperties namespace section - - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIWindowProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIXMLAttributes.h b/vendor/cegui-0.4.0-custom/include/CEGUIXMLAttributes.h deleted file mode 100644 index 29c0cb91aa..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIXMLAttributes.h +++ /dev/null @@ -1,244 +0,0 @@ -/************************************************************************ - filename: CEGUIXMLAttributes.h - created: Sat Mar 12 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIXMLAttributes_h_ -#define _CEGUIXMLAttributes_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class representing a block of attributes associated with an XML element. - */ - class CEGUIEXPORT XMLAttributes - { - public: - /*! - \brief - XMLAttributes constructor. - */ - XMLAttributes(void); - - /*! - \brief - XMLAttributes Destructor - */ - virtual ~XMLAttributes(void); - - /*! - \brief - Adds an attribute to the attribute block. If the attribute value already exists, it is replaced with - the new value. - - \param attrName - String object holding the name of the attribute to be added. - - \param attrValue - String object holding a string representation of the attribute value. - - \return - Nothing. - */ - void add(const String& attrName, const String& attrValue); - - /*! - \brief - Removes an attribute from the attribute block. - - \param attrName - String object holding the name of the attribute to be removed. - - \return - Nothing. - */ - void remove(const String& attrName); - - /*! - \brief - Return whether the named attribute exists within the attribute block. - - \param attrName - String object holding the name of the attribute to be checked. - - \return - - true if an attribute with the name \a attrName is present in the attribute block. - - false if no attribute named \a attrName is present in the attribute block. - */ - bool exists(const String& attrName) const; - - /*! - \brief - Return the number of attributes in the attribute block. - - \return - value specifying the number of attributes in this attribute block. - */ - size_t getCount(void) const; - - /*! - \brief - Return the name of an attribute based upon its index within the attribute block. - - \note - Nothing is specified about the order of elements within the attribute block. Elements - may not, for example, appear in the order they were specified in the XML file. - - \param index - zero based index of the attribute whos name is to be returned. - - \return - String object holding the name of the attribute at the requested index. - - \exception IllegalRequestException thrown if \a index is out of range for this attribute block. - */ - const String& getName(size_t index) const; - - /*! - \brief - Return the value string of an attribute based upon its index within the attribute block. - - \note - Nothing is specified about the order of elements within the attribute block. Elements - may not, for example, appear in the order they were specified in the XML file. - - \param index - zero based index of the attribute whos value string is to be returned. - - \return - String object holding the string value of the attribute at the requested index. - - \exception IllegalRequestException thrown if \a index is out of range for this attribute block. - */ - const String& getValue(size_t index) const; - - /*! - \brief - Return the value string for attribute \a attrName. - - \param attrName - String object holding the name of the attribute whos value string is to be returned - - \return - String object hilding the value string for attribute \a attrName. - - \exception UnknownObjectException thrown if no attribute named \a attrName is present in the attribute block. - */ - const String& getValue(const String& attrName) const; - - /*! - \brief - Return the value of attribute \a attrName as a string. - - \param attrName - String object holding the name of the attribute whos value is to be returned. - - \param def - String object holding the default value to be returned if \a attrName does not exist in the attribute block. - For some parsers, defaults can be gotten from schemas and such like, though for others this may not be desired - or possible, so this parameter is used to ensure a default is available in the abscence of other mechanisms. - - \return - String object containing the value of attribute \a attrName if present, or \a def if not. - */ - const String& getValueAsString(const String& attrName, const String& def = "") const; - - /*! - \brief - Return the value of attribute \a attrName as a boolean value. - - \param attrName - String object holding the name of the attribute whos value is to be returned. - - \param def - bool value specifying the default value to be returned if \a attrName does not exist in the attribute block. - For some parsers, defaults can be gotten from schemas and such like, though for others this may not be desired - or possible, so this parameter is used to ensure a default is available in the abscence of other mechanisms. - - \return - bool value equal to the value of attribute \a attrName if present, or \a def if not. - - \exception IllegalRequestException thrown if the attribute value string coul dnot be converted to the requested type. - */ - bool getValueAsBool(const String& attrName, bool def = false) const; - - /*! - \brief - Return the value of attribute \a attrName as a integer value. - - \param attrName - String object holding the name of the attribute whos value is to be returned. - - \param def - integer value specifying the default value to be returned if \a attrName does not exist in the attribute block. - For some parsers, defaults can be gotten from schemas and such like, though for others this may not be desired - or possible, so this parameter is used to ensure a default is available in the abscence of other mechanisms. - - \return - integer value equal to the value of attribute \a attrName if present, or \a def if not. - - \exception IllegalRequestException thrown if the attribute value string coul dnot be converted to the requested type. - */ - int getValueAsInteger(const String& attrName, int def = 0) const; - - /*! - \brief - Return the value of attribute \a attrName as a floating point value. - - \param attrName - String object holding the name of the attribute whos value is to be returned. - - \param def - float value specifying the default value to be returned if \a attrName does not exist in the attribute block. - For some parsers, defaults can be gotten from schemas and such like, though for others this may not be desired - or possible, so this parameter is used to ensure a default is available in the abscence of other mechanisms. - - \return - float value equal to the value of attribute \a attrName if present, or \a def if not. - - \exception IllegalRequestException thrown if the attribute value string coul dnot be converted to the requested type. - */ - float getValueAsFloat(const String& attrName, float def = 0.0f) const; - - protected: - typedef std::map AttributeMap; - AttributeMap d_attrs; - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIXMLAttributes_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIXMLHandler.h b/vendor/cegui-0.4.0-custom/include/CEGUIXMLHandler.h deleted file mode 100644 index 3b1cbd075d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIXMLHandler.h +++ /dev/null @@ -1,79 +0,0 @@ -/************************************************************************ - filename: CEGUIXMLHandler.h - created: 12/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIXMLHandler_h_ -#define _CEGUIXMLHandler_h_ - -#include "CEGUIBase.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - class CEGUIEXPORT XMLHandler - { - public: - /*! - \brief - XMLHandler base class constructor. - */ - XMLHandler(void); - - /*! - \brief - XMLHandler base class destructor. - */ - virtual ~XMLHandler(void); - - /*! - \brief - Method called to notify the handler at the start of each XML element encountered. - - \param element - String object holding the name of the element that is starting. - - \param attributes - An XMLAttributes object holding the collection of attributes specified for the element. - - \return - Nothing. - */ - virtual void elementStart(const String& element, const XMLAttributes& attributes); - - /*! - \brief - Method called to notify the handler at the end of each XML element encountered. - - \param element - String object holding the name of the element that is ending. - - \return - Nothing. - */ - virtual void elementEnd(const String& element); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIXMLHandler_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIXMLParser.h b/vendor/cegui-0.4.0-custom/include/CEGUIXMLParser.h deleted file mode 100644 index e85d4f5431..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIXMLParser.h +++ /dev/null @@ -1,141 +0,0 @@ -/************************************************************************ - filename: CEGUIXMLParser.h - created: 12/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIXMLParser_h_ -#define _CEGUIXMLParser_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - This is an abstract class that is used by CEGUI to interface with XML parser libraries. - */ - class CEGUIEXPORT XMLParser - { - public: - /*! - \brief - XMLParser base class constructor. - */ - XMLParser(void); - - /*! - \brief - XMLParser base class destructor. - */ - virtual ~XMLParser(void); - - /*! - \brief - Initialises the XMLParser module ready for use. - - Note that this calls the protected abstract method 'initialiseImpl', which should - be provided in your implementation to perform any required initialisation. - - \return - - true if the module initialised successfully. - - false if the module initialisation failed. - */ - bool initialise(void); - - /*! - \brief - Cleans up the XMLParser module after use. - - Note that this calls the protected abstract method 'cleanupImpl', which should - be provided in your implementation to perform any required cleanup. - - \return - Nothing. - */ - void cleanup(void); - - /*! - \brief - abstract method which initiates parsing of an XML file. - - \param handler - XMLHandler based object which will process the XML elements. - - \param filename - String object holding the filename of the XML file to be parsed. - - \param schemaName - String object holding the name of the XML schema file to use for validating the XML. - Note that whether this is used or not is dependant upon the XMLParser in use. - - \param resourceGroup - String object holding the resource group identifier which will be passed to the - ResourceProvider when loading the XML and schema files. - - \return - Nothing. - */ - virtual void parseXMLFile(XMLHandler& handler, const String& filename, const String& schemaName, const String& resourceGroup) = 0; - - /*! - \brief - Return identification string for the XML parser module. If the internal id string has not been - set by the XML parser module creator, a generic string of "Unknown XML parser" will be returned. - - \return - String object holding a string that identifies the XML parser in use. - */ - const String& getIdentifierString() const; - - protected: - /*! - \brief - abstract method which initialises the XMLParser ready for use. - - \return - - true if the module initialised successfully. - - false if the module initialisation failed. - */ - virtual bool initialiseImpl(void) = 0; - - /*! - \brief - abstract method which cleans up the XMLParser after use. - - \return - Nothing. - */ - - virtual void cleanupImpl(void) = 0; - - // data fields - String d_identifierString; //!< String that holds some id information about the module. - - private: - bool d_initialised; //!< true if the parser module has been initialised, - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIXMLParser_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIXercesParser.h b/vendor/cegui-0.4.0-custom/include/CEGUIXercesParser.h deleted file mode 100644 index c8d78d70be..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIXercesParser.h +++ /dev/null @@ -1,98 +0,0 @@ -/************************************************************************ - filename: CEGUIXercesParser.h - created: Sat Mar 12 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIXercesParser_h_ -#define _CEGUIXercesParser_h_ - -#include "CEGUIXMLParser.h" - -// Xerces-C includes -#include -#include -#include -#include -#include -#include -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - class XercesHandler : public XERCES_CPP_NAMESPACE::DefaultHandler - { - public: - XercesHandler(XMLHandler& handler); - ~XercesHandler(void); - - // Implementation of methods in Xerces DefaultHandler. - void startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const XERCES_CPP_NAMESPACE::Attributes& attrs); - void endElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname); - void warning (const XERCES_CPP_NAMESPACE::SAXParseException &exc); - void error (const XERCES_CPP_NAMESPACE::SAXParseException &exc); - void fatalError (const XERCES_CPP_NAMESPACE::SAXParseException &exc); - - protected: - XMLHandler& d_handler; //!< This is the 'real' CEGUI based handler which we interface via. - }; - - /*! - \brief - Implementation of XMLParser using Xerces-C++ - */ - class XercesParser : public XMLParser - { - public: - XercesParser(void); - ~XercesParser(void); - - // Implementation of public abstract interface - void parseXMLFile(XMLHandler& handler, const String& filename, const String& schemaName, const String& resourceGroup); - - // Internal methods - /*! - \brief - Populate the CEGUI::XMLAttributes object with attribute data from the Xerces attributes block. - */ - static void populateAttributesBlock(const XERCES_CPP_NAMESPACE::Attributes& src, XMLAttributes& dest); - - /*! - \brief - Return a CEGUI::String containing the Xerces XMLChar string data in \a xmlch_str. - */ - static String transcodeXmlCharToString(const XMLCh* const xmlch_str); - - protected: - static void initialiseSchema(XERCES_CPP_NAMESPACE::SAX2XMLReader* reader, const String& schemaName, const String& xmlFilename, const String& resourceGroup); - static XERCES_CPP_NAMESPACE::SAX2XMLReader* createReader(XERCES_CPP_NAMESPACE::DefaultHandler& handler); - static void doParse(XERCES_CPP_NAMESPACE::SAX2XMLReader* parser, const String& xmlFilename, const String& resourceGroup); - - // Implementation of abstract interface. - bool initialiseImpl(void); - void cleanupImpl(void); - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIXercesParser_h_ diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIcolour.h b/vendor/cegui-0.4.0-custom/include/CEGUIcolour.h deleted file mode 100644 index 101a6d5159..0000000000 --- a/vendor/cegui-0.4.0-custom/include/CEGUIcolour.h +++ /dev/null @@ -1,280 +0,0 @@ -/************************************************************************ - filename: CEGUIcolour.h - created: 20/8/2004 - author: Paul D Turner (with code from Jeff Leigh) - - purpose: Defines interface to the colour class used to represent - colour values within the system -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIcolour_h_ -#define _CEGUIcolour_h_ - -#include "CEGUIBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -typedef uint32 argb_t; //!< 32 bit ARGB representation of a colour. - -/*! -\brief - Class representing colour values within the system. -*/ -class CEGUIEXPORT colour -{ -public: - /************************************************************************* - Construction & Destruction - *************************************************************************/ - colour(void); - colour(const colour& val); - colour(float red, float green, float blue, float alpha = 1.0f); - colour(argb_t argb); - - /************************************************************************* - Accessors - *************************************************************************/ - argb_t getARGB(void) const - { - if (!d_argbValid) - { - d_argb = calculateARGB(); - d_argbValid = true; - } - - return d_argb; - } - - float getAlpha(void) const {return d_alpha;} - float getRed(void) const {return d_red;} - float getGreen(void) const {return d_green;} - float getBlue(void) const {return d_blue;} - - float getHue(void) const; - float getSaturation(void) const; - float getLumination(void) const; - - - /************************************************************************* - Manipulators - *************************************************************************/ - void setARGB(argb_t argb); - inline void setAlpha(float alpha) - { - d_argbValid = false; - d_alpha = alpha; - } - - inline void setRed(float red) - { - d_argbValid = false; - d_red = red; - } - - inline void setGreen(float green) - { - d_argbValid = false; - d_green = green; - } - - inline void setBlue(float blue) - { - d_argbValid = false; - d_blue = blue; - } - - inline void set(float red, float green, float blue, float alpha = 1.0f) - { - d_argbValid = false; - d_alpha = alpha; - d_red = red; - d_green = green; - d_blue = blue; - } - - inline void setRGB(float red, float green, float blue) - { - d_argbValid = false; - d_red = red; - d_green = green; - d_blue = blue; - } - - inline void setRGB(const colour& val) - { - d_red = val.d_red; - d_green = val.d_green; - d_blue = val.d_blue; - if (d_argbValid) - { - d_argbValid = val.d_argbValid; - if (d_argbValid) - d_argb = (d_argb & 0xFF000000) | (val.d_argb & 0x00FFFFFF); - } - } - - void setHSL(float hue, float saturation, float luminance, float alpha = 1.0f); - - void invertColour(void); - void invertColourWithAlpha(void); - - /************************************************************************* - Operators - *************************************************************************/ - inline colour& operator=(argb_t val) - { - setARGB(val); - return *this; - } - - inline colour& operator=(const colour& val) - { - d_alpha = val.d_alpha; - d_red = val.d_red; - d_green = val.d_green; - d_blue = val.d_blue; - d_argb = val.d_argb; - d_argbValid = val.d_argbValid; - - return *this; - } - - inline colour& operator&=(argb_t val) - { - setARGB(getARGB() & val); - return *this; - } - - inline colour& operator&=(const colour& val) - { - setARGB(getARGB() & val.getARGB()); - return *this; - } - - inline colour& operator|=(argb_t val) - { - setARGB(getARGB() | val); - return *this; - } - - inline colour& operator|=(const colour& val) - { - setARGB(getARGB() | val.getARGB()); - return *this; - } - - inline colour& operator<<=(int val) - { - setARGB(getARGB() << val); - return *this; - } - - inline colour& operator>>=(int val) - { - setARGB(getARGB() >> val); - return *this; - } - - inline colour operator+(const colour& val) const - { - return colour( - d_red + val.d_red, - d_green + val.d_green, - d_blue + val.d_blue, - d_alpha + val.d_alpha - ); - } - - inline colour operator-(const colour& val) const - { - return colour( - d_red - val.d_red, - d_green - val.d_green, - d_blue - val.d_blue, - d_alpha - val.d_alpha - ); - } - - inline colour operator*(const float val) const - { - return colour( - d_red * val, - d_green * val, - d_blue * val, - d_alpha * val - ); - } - - inline colour& operator*=(const colour& val) - { - d_red *= val.d_red; - d_blue *= val.d_blue; - d_green *= val.d_green; - d_alpha *= val.d_alpha; - - d_argbValid = false; - - return *this; - } - - /************************************************************************* - Compare operators - *************************************************************************/ - inline bool operator==(const colour& rhs) const - { - return d_red == rhs.d_red && - d_green == rhs.d_green && - d_blue == rhs.d_blue && - d_alpha == rhs.d_alpha; - } - - inline bool operator!=(const colour& rhs) const - { - return !(*this == rhs); - } - - // - // Conversion operators - // - operator argb_t() const {return getARGB();} - -private: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - calculate and return the ARGB value based on the current colour component values. - */ - argb_t calculateARGB(void) const; - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_alpha, d_red, d_green, d_blue; //!< Colour components. - mutable argb_t d_argb; //!< Colour as ARGB value. - mutable bool d_argbValid; //!< True if argb value is valid. -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIcolour_h_ diff --git a/vendor/cegui-0.4.0-custom/include/StdInc.h b/vendor/cegui-0.4.0-custom/include/StdInc.h deleted file mode 100644 index 56c7ef14d4..0000000000 --- a/vendor/cegui-0.4.0-custom/include/StdInc.h +++ /dev/null @@ -1,12 +0,0 @@ -// -// StdInc.h -// -// CEGUIBase PCH -// - -#include "CEGUI.h" -#include -#include -#define MTA_CLIENT -#define WITH_ALLOC_TRACKING 0 // Doesn't work with CEGUI due to name clashes -#include "..\..\..\Shared\sdk\SharedUtil.h" diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBase.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBase.h deleted file mode 100644 index ad19caee2e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBase.h +++ /dev/null @@ -1,341 +0,0 @@ -/************************************************************************ - filename: CEGUIButtonBase.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for ButtonBase widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIButtonBase_h_ -#define _CEGUIButtonBase_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIButtonBaseProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for all the 'button' type widgets (push button, radio button, check-box, etc) -*/ -class CEGUIEXPORT ButtonBase : public Window -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - // default colours for text label rendering - static const colour DefaultNormalLabelColour; //!< Default colour used when rendering label text in normal state. - static const colour DefaultHoverLabelColour; //!< Default colour used when rendering label text in hover / highlight state. - static const colour DefaultPushedLabelColour; //!< Default colour used when rendering label text in pushed state. - static const colour DefaultDisabledLabelColour; //!< Default colour used when rendering label text in disabled state. - - - /************************************************************************* - Accessor type functions - *************************************************************************/ - /*! - \brief - return true if user is hovering over this widget (or it's pushed and user is not over it for highlight) - - \return - true if the user is hovering or if the button is pushed and the mouse is not over the button. Otherwise return false. - */ - bool isHovering(void) const {return d_hovering;} - - - /*! - \brief - Return true if the button widget is in the pushed state. - - \return - true if the button-type widget is pushed, false if the widget is not pushed. - */ - bool isPushed(void) const {return d_pushed;} - - - /*! - \brief - return text label colour used for normal rendering - - \return - colour value that is used for the label text when rendering in the normal state. - */ - colour getNormalTextColour(void) const {return d_normalColour;} - - - /*! - \brief - return text label colour used for hover / highlight rendering - - \return - colour value that is used for the label text when rendering in the hover / highlighted states. - */ - colour getHoverTextColour(void) const {return d_hoverColour;} - - - /*! - \brief - return text label colour used for pushed rendering - - \return - colour value that is used for the label text when rendering in the pushed state. - */ - colour getPushedTextColour(void) const {return d_pushedColour;} - - - /*! - \brief - return text label colour used for disabled rendering - - \return - colour value that is used for the label text when rendering in the disabled state. - */ - colour getDisabledTextColour(void) const {return d_disabledColour;} - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the colour to use for the label text when rendering in the normal state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setNormalTextColour(const colour& colour); - - - /*! - \brief - Set the colour to use for the label text when rendering in the hover / highlighted states. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setHoverTextColour(const colour& colour); - - - /*! - \brief - Set the colour to use for the label text when rendering in the pushed state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setPushedTextColour(const colour& colour); - - - /*! - \brief - Set the colour to use for the label text when rendering in the disabled state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setDisabledTextColour(const colour& colour); - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for ButtonBase objects - */ - ButtonBase(const String& type, const String& name); - - - /*! - \brief - Destructor for ButtonBase objects - */ - virtual ~ButtonBase(void); - - -protected: - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onMouseLeaves(MouseEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Update the internal state of the widget with the mouse at the given position. - - \param mouse_pos - Point object describing, in screen pixel co-ordinates, the location of the mouse cursor. - - \return - Nothing - */ - void updateInternalState(const Point& mouse_pos); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ButtonBase") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Rendering Functions - *************************************************************************/ - /*! - \brief - Perform the rendering for this widget. - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawSelf(float z); - - - /*! - \brief - Render the button-type widget in it's 'normal' state - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawNormal(float z) = 0; - - - /*! - \brief - Render the button-type widget in it's 'hover' (highlighted) state - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawHover(float z) {drawNormal(z);} - - - /*! - \brief - Render the button-type widget in it's 'pushed' state - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawPushed(float z) {drawNormal(z);} - - - /*! - \brief - Render the button-type widget in it's 'disabled' state - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawDisabled(float z) {drawNormal(z);} - - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_pushed; //!< true when widget is pushed - bool d_hovering; //!< true when the button is in 'hover' state and requires the hover rendering. - - // common rendering setting data - colour d_normalColour; //!< Colour used for label text when rendering in normal state - colour d_hoverColour; //!< Colour used for label text when rendering in highlighted state - colour d_pushedColour; //!< Colour used for label text when rendering in pushed state - colour d_disabledColour; //!< Colour used for label text when rendering in disabled state - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ButtonBaseProperties::NormalTextColour d_normalTextColourProperty; - static ButtonBaseProperties::HoverTextColour d_hoverTextColourProperty; - static ButtonBaseProperties::PushedTextColour d_pushedTextColourProperty; - static ButtonBaseProperties::DisabledTextColour d_disabledTextColourProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addButtonBaseProperties( bool bCommon = true ); -protected: - void addUncommonProperties( void ) { __super::addUncommonProperties(); addButtonBaseProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIButtonBase_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBaseProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBaseProperties.h deleted file mode 100644 index 3561c6ecd1..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIButtonBaseProperties.h +++ /dev/null @@ -1,156 +0,0 @@ -/************************************************************************ - filename: CEGUIButtonBaseProperties.h - created: 9/7/2004 - author: Paul D Turner - - purpose: Interface to properties for button base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIButtonBaseProperties_h_ -#define _CEGUIButtonBaseProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ButtonBaseProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the ButtonBase class -*/ -namespace ButtonBaseProperties -{ -/*! -\brief - Property to access the normal text colour. - - This property offers access to the colour value to be used for rendering the button caption text for the normal state. - - \par Usage: - - Name: NormalTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class NormalTextColour : public Property -{ -public: - NormalTextColour() : Property( - "NormalTextColour", - "Property to get/set the colour to use when rendering label text for normal state. Value is \"aarrggbb\" (hex).", - "FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the hover / highlight text colour. - - This property offers access to the colour value to be used for rendering the button caption text for the hover or highlight state. - - \par Usage: - - Name: HoverTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class HoverTextColour : public Property -{ -public: - HoverTextColour() : Property( - "HoverTextColour", - "Property to get/set the colour to use when rendering label text for hover/highlight state. Value is \"aarrggbb\" (hex).", - "FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the pushed text colour. - - This property offers access to the colour value to be used for rendering the button caption text for the pushed state. - - \par Usage: - - Name: PushedTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class PushedTextColour : public Property -{ -public: - PushedTextColour() : Property( - "PushedTextColour", - "Property to get/set the colour to use when rendering label text for pushed state. Value is \"aarrggbb\" (hex).", - "FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the disabled text colour. - - This property offers access to the colour value to be used for rendering the button caption text for the disabled state. - - \par Usage: - - Name: DisabledTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class DisabledTextColour : public Property -{ -public: - DisabledTextColour() : Property( - "DisabledTextColour", - "Property to get/set the colour to use when rendering label text for disabled state. Value is \"aarrggbb\" (hex).", - "FF7F7F7F") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of ButtonBaseProperties namespace section - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIButtonBaseProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUICheckbox.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUICheckbox.h deleted file mode 100644 index fabf5f3327..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUICheckbox.h +++ /dev/null @@ -1,179 +0,0 @@ -/************************************************************************ - filename: CEGUICheckbox.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Checkbox Widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUICheckbox_h_ -#define _CEGUICheckbox_h_ - -#include "CEGUIBase.h" -#include "elements/CEGUIButtonBase.h" -#include "elements/CEGUICheckboxProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class providing logic for Check-box widgets -*/ -class CEGUIEXPORT Checkbox : public ButtonBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventCheckStateChanged; //!< The check-state of the widget has changed. - - - /************************************************************************* - Accessor Functions - *************************************************************************/ - /*! - \brief - return true if the check-box is selected (has the checkmark) - - \return - true if the widget is selected and has the check-mark, false if the widget - is not selected and does not have the check-mark. - */ - bool isSelected(void) const {return d_selected;} - - - /************************************************************************* - Manipulator Functions - *************************************************************************/ - /*! - \brief - set whether the check-box is selected or not - - \param select - true to select the widget and give it the check-mark. false to de-select the widget and - remove the check-mark. - - \return - Nothing. - */ - void setSelected(bool select); - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for Checkbox class. - */ - Checkbox(const String& type, const String& name); - - - /*! - \brief - Destructor for Checkbox class. - */ - virtual ~Checkbox(void); - - -protected: - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - event triggered internally when state of check-box changes - */ - virtual void onSelectStateChange(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseButtonUp(MouseEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add check-box specific events - */ - void addCheckboxEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addCheckboxEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Checkbox") return true; - return ButtonBase::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_selected; //!< true if check-box is selected (has checkmark) - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static CheckboxProperties::Selected d_selectedProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addCheckboxProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addCheckboxProperties(false); } -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUICheckbox_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUICheckboxProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUICheckboxProperties.h deleted file mode 100644 index 8d8ee1aa31..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUICheckboxProperties.h +++ /dev/null @@ -1,75 +0,0 @@ -/************************************************************************ - filename: CEGUICheckboxProperties.h - created: 9/7/2004 - author: Paul D Turner - - purpose: Interface to properties for the Checkbox class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUICheckboxProperties_h_ -#define _CEGUICheckboxProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of CheckboxProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Checkbox class -*/ -namespace CheckboxProperties -{ -/*! -\brief - Property to access the selected state of the check box. - - This property offers access to the select state for the Checkbox object. - - \par Usage: - - Name: Selected - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the check box is selected (has check mark). - - "False" to indicate the check box is not selected (does not have check mark). -*/ -class Selected : public Property -{ -public: - Selected() : Property( - "Selected", - "Property to get/set the selected state of the Checkbox. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of CheckboxProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUICheckboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIComboDropList.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIComboDropList.h deleted file mode 100644 index c7c9461e76..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIComboDropList.h +++ /dev/null @@ -1,205 +0,0 @@ -/************************************************************************ - filename: CEGUIComboDropList.h - created: 13/6/2004 - author: Paul D Turner - - purpose: Interface for the Combobox Drop-List widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIComboDropList_h_ -#define _CEGUIComboDropList_h_ - -#include "elements/CEGUIListbox.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for the combo box drop down list. This is a specialisation of the Listbox class. -*/ -class CEGUIEXPORT ComboDropList : public Listbox -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // Event names - static const String EventListSelectionAccepted; //!< Event fired when the user confirms the selection by clicking the mouse. - - - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Set whether the drop-list is 'armed' for selection. - - \note - This setting is not exclusively under client control; the ComboDropList will auto-arm in - response to certain left mouse button events. This is also dependant upon the autoArm - setting of the ComboDropList. - - \param setting - - true to arm the box; items will be highlighted and the next left button up event - will cause dismissal and possible item selection. - - - false to disarm the box; items will not be highlighted or selected until the box is armed. - - \return - Nothing. - */ - void setArmed(bool setting) { d_armed = setting; } - - - /*! - \brief - Return the 'armed' state of the ComboDropList. - - \return - - true if the box is armed; items will be highlighted and the next left button up event - will cause dismissal and possible item selection. - - - false if the box is not armed; items will not be highlighted or selected until the box is armed. - */ - bool isArmed(void) const { return d_armed; } - - - /*! - \brief - Set the mode of operation for the ComboDropList. - - \param setting - - true if the ComboDropList auto-arms when the mouse enters the box. - - false if the user must click to arm the box. - - \return - Nothing. - */ - void setAutoArmEnabled(bool setting) { d_autoArm = setting; } - - - /*! - \brief - returns the mode of operation for the drop-list - - \return - - true if the ComboDropList auto-arms when the mouse enters the box. - - false if the user must click to arm the box. - */ - bool isAutoArmEnabled(void) const { return d_autoArm; } - - - /************************************************************************* - Constructor & Destructor - *************************************************************************/ - /*! - \brief - Constructor for ComboDropList base class - */ - ComboDropList(const String& type, const String& name); - - - /*! - \brief - Destructor for ComboDropList base class - */ - virtual ~ComboDropList(void); - - -protected: - /*! - \brief - Add drop-list specific events - */ - void addComboDropListEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addComboDropListEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ComboDropList") return true; - return Listbox::testClassName_impl(class_name); - } - - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - Handler for when list selection is confirmed. - */ - void onListSelectionAccepted(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event handling - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onActivated(ActivationEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_autoArm; //!< true if the box auto-arms when the mouse enters it. - bool d_armed; //!< true when item selection has been armed. -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIComboDropList_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUICombobox.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUICombobox.h deleted file mode 100644 index 6183cd375f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUICombobox.h +++ /dev/null @@ -1,1084 +0,0 @@ -/************************************************************************ - filename: CEGUICombobox.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Combobox widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUICombobox_h_ -#define _CEGUICombobox_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIComboboxProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for the Combobox widget -*/ -class CEGUIEXPORT Combobox : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Constants - *************************************************************************/ - // event names from edit box - static const String EventReadOnlyModeChanged; //!< The read-only mode for the edit box has been changed. - static const String EventValidationStringChanged; //!< The validation string has been changed. - static const String EventMaximumTextLengthChanged; //!< The maximum allowable string length has been changed. - static const String EventTextInvalidated; //!< Some operation has made the current text invalid with regards to the validation string. - static const String EventInvalidEntryAttempted; //!< The user attempted to modify the text in a way that would have made it invalid. - static const String EventCaratMoved; //!< The text carat (insert point) has changed. - static const String EventTextSelectionChanged; //!< The current text selection has changed. - static const String EventEditboxFull; //!< The number of characters in the edit box has reached the current maximum. - static const String EventTextAccepted; //!< The user has accepted the current text by pressing Return, Enter, or Tab. - - // event names from list box - static const String EventListContentsChanged; //!< Event triggered when the contents of the list is changed. - static const String EventListSelectionChanged; //!< Event triggered when there is a change to the currently selected item(s). - static const String EventSortModeChanged; //!< Event triggered when the sort mode setting changes. - static const String EventVertScrollbarModeChanged; //!< Event triggered when the vertical scroll bar 'force' setting changes. - static const String EventHorzScrollbarModeChanged; //!< Event triggered when the horizontal scroll bar 'force' setting changes. - - // events we produce / generate ourselves - static const String EventDropListDisplayed; //!< Event triggered when the drop-down list is displayed - static const String EventDropListRemoved; //!< Event triggered when the drop-down list is removed / hidden. - static const String EventListSelectionAccepted; //!< Event triggered when the user accepts a selection from the drop-down list - - - /*! - \brief - get the combobox chidren - lil_Toady: That are custom functions i added - - \param - none - - \return - children - */ - - Editbox* getEditBox(void) {return d_editbox;} - ComboDropList* getDropList(void) {return d_droplist;} - PushButton* getPushButton(void) {return d_button;} - - /*! - \brief - check if the given position would hit this window. - - \param position - Point object describing the position to check in screen pixels - - \return - true if \a position 'hits' this Window, else false. - */ - virtual bool isHit(const Point& position) const {return false;} - - - /*! - \brief - returns the mode of operation for the combo box. - - \return - - true if the user can show the list and select an item with a single mouse click. - - false if the user must click to show the list and then click again to select an item. - */ - bool getSingleClickEnabled(void) const; - - - /*! - \brief - returns true if the drop down list is visible. - - \return - true if the drop down list is visible, false otherwise. - */ - bool isDropDownListVisible(void) const; - - - /************************************************************************* - Editbox Accessors - *************************************************************************/ - /*! - \brief - return true if the Editbox has input focus. - - \return - true if the Editbox has keyboard input focus, false if the Editbox does not have keyboard input focus. - */ - bool hasInputFocus(void) const; - - - /*! - \brief - return true if the Editbox is read-only. - - \return - true if the Editbox is read only and can't be edited by the user, false if the Editbox is not - read only and may be edited by the user. - */ - bool isReadOnly(void) const; - - - /*! - \brief - return true if the Editbox text is valid given the currently set validation string. - - \note - It is possible to programmatically set 'invalid' text for the Editbox by calling setText. This has certain - implications since if invalid text is set, whatever the user types into the box will be rejected when the input - is validated. - - \note - Validation is performed by means of a regular expression. If the text matches the regex, the text is said to have passed - validation. If the text does not match with the regex then the text fails validation. - - \return - true if the current Editbox text passes validation, false if the text does not pass validation. - */ - bool isTextValid(void) const; - - - /*! - \brief - return the currently set validation string - - \note - Validation is performed by means of a regular expression. If the text matches the regex, the text is said to have passed - validation. If the text does not match with the regex then the text fails validation. - - \return - String object containing the current validation regex data - */ - const String& getValidationString(void) const; - - - /*! - \brief - return the current position of the carat. - - \return - Index of the insert carat relative to the start of the text. - */ - size_t getCaratIndex(void) const; - - - /*! - \brief - return the current selection start point. - - \return - Index of the selection start point relative to the start of the text. If no selection is defined this function returns - the position of the carat. - */ - size_t getSelectionStartIndex(void) const; - - - /*! - \brief - return the current selection end point. - - \return - Index of the selection end point relative to the start of the text. If no selection is defined this function returns - the position of the carat. - */ - size_t getSelectionEndIndex(void) const; - - - /*! - \brief - return the length of the current selection (in code points / characters). - - \return - Number of code points (or characters) contained within the currently defined selection. - */ - size_t getSelectionLength(void) const; - - - /*! - \brief - return the maximum text length set for this Editbox. - - \return - The maximum number of code points (characters) that can be entered into this Editbox. - - \note - Depending on the validation string set, the actual length of text that can be entered may be less than the value - returned here (it will never be more). - */ - size_t getMaxTextLength(void) const; - - - /*! - \brief - return the currently set colour to be used for rendering Editbox text in the - normal, unselected state. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getNormalTextColour(void) const; - - - /*! - \brief - return the currently set colour to be used for rendering the Editbox text when within the - selected region. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getSelectedTextColour(void) const; - - - /*! - \brief - return the currently set colour to be used for rendering the Editbox selection highlight - when the Editbox is active. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getNormalSelectBrushColour(void) const; - - - /*! - \brief - return the currently set colour to be used for rendering the Editbox selection highlight - when the Editbox is inactive. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getInactiveSelectBrushColour(void) const; - - - /************************************************************************* - List Accessors - *************************************************************************/ - /*! - \brief - Return number of items attached to the list box - - \return - the number of items currently attached to this list box. - */ - size_t getItemCount(void) const; - - - /*! - \brief - Return a pointer to the currently selected item. - - \return - Pointer to a ListboxItem based object that is the selected item in the list. will return NULL if - no item is selected. - */ - ListboxItem* getSelectedItem(void) const; - - - /*! - \brief - Return the item at index position \a index. - - \param index - Zero based index of the item to be returned. - - \return - Pointer to the ListboxItem at index position \a index in the list box. - - \exception InvalidRequestException thrown if \a index is out of range. - */ - ListboxItem* getListboxItemFromIndex(size_t index) const; - - - /*! - \brief - Return the index of ListboxItem \a item - - \param item - Pointer to a ListboxItem whos zero based index is to be returned. - - \return - Zero based index indicating the position of ListboxItem \a item in the list box. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - size_t getItemIndex(const ListboxItem* item) const; - - - /*! - \brief - return whether list sorting is enabled - - \return - true if the list is sorted, false if the list is not sorted - */ - bool isSortEnabled(void) const; - - - /*! - \brief - return whether the string at index position \a index is selected - - \param index - Zero based index of the item to be examined. - - \return - true if the item at \a index is selected, false if the item at \a index is not selected. - - \exception InvalidRequestException thrown if \a index is out of range. - */ - bool isItemSelected(size_t index) const; - - - /*! - \brief - Search the list for an item with the specified text - - \param text - String object containing the text to be searched for. - - \param start_item - ListboxItem where the search is to begin, the search will not include \a item. If \a item is - NULL, the search will begin from the first item in the list. - - \return - Pointer to the first ListboxItem in the list after \a item that has text matching \a text. If - no item matches the criteria NULL is returned. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - ListboxItem* findItemWithText(const String& text, const ListboxItem* start_item); - - - /*! - \brief - Return whether the specified ListboxItem is in the List - - \return - true if ListboxItem \a item is in the list, false if ListboxItem \a item is not in the list. - */ - bool isListboxItemInList(const ListboxItem* item) const; - - - /*! - \brief - Return whether the vertical scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isVertScrollbarAlwaysShown(void) const; - - - /*! - \brief - Return whether the horizontal scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isHorzScrollbarAlwaysShown(void) const; - - - /************************************************************************* - Combobox Manipulators - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Show the drop-down list - - \return - Nothing - */ - void showDropList(void); - - - /*! - \brief - Hide the drop-down list - - \return - Nothing. - */ - void hideDropList(void); - - - /*! - \brief - Set the mode of operation for the combo box. - - \param setting - - true if the user should be able to show the list and select an item with a single mouse click. - - false if the user must click to show the list and then click again to select an item. - - \return - Nothing. - */ - void setSingleClickEnabled(bool setting); - - - /************************************************************************* - Editbox Manipulators - *************************************************************************/ - /*! - \brief - Specify whether the Editbox is read-only. - - \param setting - true if the Editbox is read only and can't be edited by the user, false if the Editbox is not - read only and may be edited by the user. - - \return - Nothing. - */ - void setReadOnly(bool setting); - - - /*! - \brief - Set the text validation string. - - \note - Validation is performed by means of a regular expression. If the text matches the regex, the text is said to have passed - validation. If the text does not match with the regex then the text fails validation. - - \param validation_string - String object containing the validation regex data to be used. - - \return - Nothing. - */ - void setValidationString(const String& validation_string); - - - /*! - \brief - Set the current position of the carat. - - \param carat_pos - New index for the insert carat relative to the start of the text. If the value specified is greater than the - number of characters in the Editbox, the carat is positioned at the end of the text. - - \return - Nothing. - */ - void setCaratIndex(size_t carat_pos); - - - /*! - \brief - Define the current selection for the Editbox - - \param start_pos - Index of the starting point for the selection. If this value is greater than the number of characters in the Editbox, the - selection start will be set to the end of the text. - - \param end_pos - Index of the ending point for the selection. If this value is greater than the number of characters in the Editbox, the - selection start will be set to the end of the text. - - \return - Nothing. - */ - void setSelection(size_t start_pos, size_t end_pos); - - - /*! - \brief - set the maximum text length for this Editbox. - - \param max_len - The maximum number of code points (characters) that can be entered into this Editbox. - - \note - Depending on the validation string set, the actual length of text that can be entered may be less than the value - set here (it will never be more). - - \return - Nothing. - */ - void setMaxTextLength(size_t max_len); - - - /*! - \brief - Set the colour to be used for rendering Editbox text in the normal, unselected state. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setNormalTextColour(colour col); - - - /*! - \brief - Set the colour to be used for rendering the Editbox text when within the - selected region. - - \return - colour value describing the ARGB colour that is currently set. - */ - void setSelectedTextColour(colour col); - - - /*! - \brief - Set the colour to be used for rendering the Editbox selection highlight - when the Editbox is active. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setNormalSelectBrushColour(colour col); - - - /*! - \brief - Set the colour to be used for rendering the Editbox selection highlight - when the Editbox is inactive. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setInactiveSelectBrushColour(colour col); - - - /*! - \brief - Activate the edit box component of the Combobox. - - \return - Nothing. - */ - void activateEditbox(void); - - - /************************************************************************* - List Manipulators - *************************************************************************/ - /*! - \brief - Remove all items from the list. - - Note that this will cause 'AutoDelete' items to be deleted. - */ - void resetList(void); - - - /*! - \brief - Add the given ListboxItem to the list. - - \param item - Pointer to the ListboxItem to be added to the list. Note that it is the passed object that is added to the - list, a copy is not made. If this parameter is NULL, nothing happens. - - \return - Nothing. - */ - void addItem(ListboxItem* item); - - - /*! - \brief - Insert an item into the list box after a specified item already in the list. - - Note that if the list is sorted, the item may not end up in the requested position. - - \param item - Pointer to the ListboxItem to be inserted. Note that it is the passed object that is added to the - list, a copy is not made. If this parameter is NULL, nothing happens. - - \param position - Pointer to a ListboxItem that \a item is to be inserted after. If this parameter is NULL, the item is - inserted at the start of the list. - - \return - Nothing. - */ - void insertItem(ListboxItem* item, const ListboxItem* position); - - - /*! - \brief - Removes the given item from the list box. - - \param item - Pointer to the ListboxItem that is to be removed. If \a item is not attached to this list box then nothing - will happen. - - \return - Nothing. - */ - void removeItem(const ListboxItem* item); - - - /*! - \brief - Clear the selected state for all items. - - \return - Nothing. - */ - void clearAllSelections(void); - - - /*! - \brief - Set whether the list should be sorted. - - \param setting - true if the list should be sorted, false if the list should not be sorted. - - \return - Nothing. - */ - void setSortingEnabled(bool setting); - - - /*! - \brief - Set whether the vertical scroll bar should always be shown. - - \param setting - true if the vertical scroll bar should be shown even when it is not required. false if the vertical - scroll bar should only be shown when it is required. - - \return - Nothing. - */ - void setShowVertScrollbar(bool setting); - - - /*! - \brief - Set whether the horizontal scroll bar should always be shown. - - \param setting - true if the horizontal scroll bar should be shown even when it is not required. false if the horizontal - scroll bar should only be shown when it is required. - - \return - Nothing. - */ - void setShowHorzScrollbar(bool setting); - - - /*! - \brief - Set the select state of an attached ListboxItem. - - This is the recommended way of selecting and deselecting items attached to a list box as it respects the - multi-select mode setting. It is possible to modify the setting on ListboxItems directly, but that approach - does not respect the settings of the list box. - - \param item - The ListboxItem to be affected. This item must be attached to the list box. - - \param state - true to select the item, false to de-select the item. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - void setItemSelectState(ListboxItem* item, bool state); - - - /*! - \brief - Set the select state of an attached ListboxItem. - - This is the recommended way of selecting and deselecting items attached to a list box as it respects the - multi-select mode setting. It is possible to modify the setting on ListboxItems directly, but that approach - does not respect the settings of the list box. - - \param item_index - The zero based index of the ListboxItem to be affected. This must be a valid index (0 <= index < getItemCount()) - - \param state - true to select the item, false to de-select the item. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a item_index is out of range for the list box - */ - void setItemSelectState(size_t item_index, bool state); - - - /*! - \brief - Causes the list box to update it's internal state after changes have been made to one or more - attached ListboxItem objects. - - Client code must call this whenever it has made any changes to ListboxItem objects already attached to the - list box. If you are just adding items, or removed items to update them prior to re-adding them, there is - no need to call this method. - - \return - Nothing. - */ - void handleUpdatedListItemData(void); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for Combobox base class - */ - Combobox(const String& type, const String& name); - - - /*! - \brief - Destructor for Combobox base class - */ - virtual ~Combobox(void); - - -protected: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Add combo box specific events - */ - void addComboboxEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addComboboxEvents(false); } - - - /*! - \brief - Create, initialise, and return a pointer to an Editbox widget to be used as part - of this Combobox. - - \return - Pointer to an Editbox derived class. - */ - virtual Editbox* createEditbox(const String& name) const = 0; - - - /*! - \brief - Create, initialise, and return a pointer to a PushButton widget to be used as part - of this Combobox. - - \return - Pointer to a PushButton derived class. - */ - virtual PushButton* createPushButton(const String& name) const = 0; - - - /*! - \brief - Create, initialise, and return a pointer to a ComboDropList widget to be used as part - of this Combobox. - - \return - Pointer to a ComboDropList derived class. - */ - virtual ComboDropList* createDropList(const String& name) const = 0; - - - /*! - \brief - Handler function for button clicks. - */ - bool button_PressHandler(const EventArgs& e); - - - /*! - \brief - Handler for selections made in the drop-list - */ - bool droplist_SelectionAcceptedHandler(const EventArgs& e); - - - /*! - \brief - Handler for when drop-list hides itself - */ - bool droplist_HiddenHandler(const EventArgs& e); - - - /*! - \brief - Mouse button down handler attached to edit box - */ - bool editbox_MouseDownHandler(const EventArgs& e); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Combobox") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Handlers to relay child widget events so they appear to come from us - *************************************************************************/ - bool editbox_ReadOnlyChangedHandler(const EventArgs& e); - bool editbox_ValidationStringChangedHandler(const EventArgs& e); - bool editbox_MaximumTextLengthChangedHandler(const EventArgs& e); - bool editbox_TextInvalidatedEventHandler(const EventArgs& e); - bool editbox_InvalidEntryAttemptedHandler(const EventArgs& e); - bool editbox_CaratMovedHandler(const EventArgs& e); - bool editbox_TextSelectionChangedHandler(const EventArgs& e); - bool editbox_EditboxFullEventHandler(const EventArgs& e); - bool editbox_TextAcceptedEventHandler(const EventArgs& e); - bool editbox_TextChangedEventHandler(const EventArgs& e); - bool listbox_ListContentsChangedHandler(const EventArgs& e); - bool listbox_ListSelectionChangedHandler(const EventArgs& e); - bool listbox_SortModeChangedHandler(const EventArgs& e); - bool listbox_VertScrollModeChangedHandler(const EventArgs& e); - bool listbox_HorzScrollModeChangedHandler(const EventArgs& e); - - - /************************************************************************* - New Events for Combobox - *************************************************************************/ - /*! - \brief - Handler called internally when the read only state of the Combobox's Editbox has been changed. - */ - virtual void onReadOnlyChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the Combobox's Editbox validation string has been changed. - */ - virtual void onValidationStringChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the Combobox's Editbox maximum text length is changed. - */ - virtual void onMaximumTextLengthChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the Combobox's Editbox text has been invalidated. - */ - virtual void onTextInvalidatedEvent(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when an invalid entry was attempted in the Combobox's Editbox. - */ - virtual void onInvalidEntryAttempted(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the carat in the Comboxbox's Editbox moves. - */ - virtual void onCaratMoved(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the selection within the Combobox's Editbox changes. - */ - virtual void onTextSelectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the maximum length is reached for text in the Combobox's Editbox. - */ - virtual void onEditboxFullEvent(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the text in the Combobox's Editbox is accepted (by various means). - */ - virtual void onTextAcceptedEvent(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the Combobox's Drop-down list contents are changed. - */ - virtual void onListContentsChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the selection within the Combobox's drop-down list changes - (this is not the 'final' accepted selection, just the currently highlighted item). - */ - virtual void onListSelectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called fired internally when the sort mode for the Combobox's drop-down list is changed. - */ - virtual void onSortModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the 'force' setting for the vertical scrollbar within the Combobox's - drop-down list is changed. - */ - virtual void onVertScrollbarModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the 'force' setting for the horizontal scrollbar within the Combobox's - drop-down list is changed. - */ - virtual void onHorzScrollbarModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the Combobox's drop-down list has been displayed. - */ - virtual void onDropListDisplayed(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the Combobox's drop-down list has been hidden. - */ - virtual void onDroplistRemoved(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the user has confirmed a selection within the Combobox's drop-down list. - */ - virtual void onListSelectionAccepted(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event handlers - *************************************************************************/ - virtual void onFontChanged(WindowEventArgs& e); - virtual void onTextChanged(WindowEventArgs& e); - virtual void onActivated(ActivationEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - Editbox* d_editbox; //!< Editbox widget sub-component. - ComboDropList* d_droplist; //!< ComboDropList widget sub-component. - PushButton* d_button; //!< PushButton widget sub-component. - bool d_singleClickOperation; //!< true if user can show and select from list in a single click. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ComboboxProperties::ReadOnly d_readOnlyProperty; - static ComboboxProperties::ValidationString d_validationStringProperty; - static ComboboxProperties::CaratIndex d_caratIndexProperty; - static ComboboxProperties::EditSelectionStart d_selStartProperty; - static ComboboxProperties::EditSelectionLength d_selLengthProperty; - static ComboboxProperties::MaxEditTextLength d_maxTextLengthProperty; - static ComboboxProperties::NormalEditTextColour d_normalTextColourProperty; - static ComboboxProperties::SelectedEditTextColour d_selectedTextColourProperty; - static ComboboxProperties::ActiveEditSelectionColour d_activeSelectionColourProperty; - static ComboboxProperties::InactiveEditSelectionColour d_inactiveSelectionColourProperty; - static ComboboxProperties::SortList d_sortProperty; - static ComboboxProperties::ForceVertScrollbar d_forceVertProperty; - static ComboboxProperties::ForceHorzScrollbar d_forceHorzProperty; - static ComboboxProperties::SingleClickMode d_singleClickOperationProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addComboboxProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addComboboxProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUICombobox_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIComboboxProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIComboboxProperties.h deleted file mode 100644 index 805cfb4e0c..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIComboboxProperties.h +++ /dev/null @@ -1,403 +0,0 @@ -/************************************************************************ - filename: CEGUIComboboxProperties.h - created: 11/7/2004 - author: Paul D Turner - - purpose: Interface to Combobox property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIComboboxProperties_h_ -#define _CEGUIComboboxProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ComboboxProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Combobox class -*/ -namespace ComboboxProperties -{ -/*! -\brief - Property to access the read-only setting of the edit box. - - \par Usage: - - Name: ReadOnly - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the edit box is read-only. - - "False" to indicate the edit box is not read-only (text may be edited by user). -*/ -class ReadOnly : public Property -{ -public: - ReadOnly() : Property( - "ReadOnly", - "Property to get/set the read-only setting for the Editbox. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the string used for regular expression validation of the edit box text. - - \par Usage: - - Name: ValidationString - - Format: "[text]" - - \par Where: - - [Text] is the string used for validating text entry. -*/ -class ValidationString : public Property -{ -public: - ValidationString() : Property( - "ValidationString", - "Property to get/set the validation string Editbox. Value is a text string.", - ".*") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current carat index. - - \par Usage: - - Name: CaratIndex - - Format: "[uint]" - - \par Where: - - [uint] is the zero based index of the carat position within the text. -*/ -class CaratIndex : public Property -{ -public: - CaratIndex() : Property( - "CaratIndex", - "Property to get/set the current carat index. Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current selection start index. - - \par Usage: - - Name: EditSelectionStart - - Format: "[uint]" - - \par Where: - - [uint] is the zero based index of the selection start position within the text. -*/ -class EditSelectionStart : public Property -{ -public: - EditSelectionStart() : Property( - "EditSelectionStart", - "Property to get/set the zero based index of the selection start position within the text. Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current selection length. - - \par Usage: - - Name: EditSelectionLength - - Format: "[uint]" - - \par Where: - - [uint] is the length of the selection (as a count of the number of code points selected). -*/ -class EditSelectionLength : public Property -{ -public: - EditSelectionLength() : Property( - "EditSelectionLength", - "Property to get/set the length of the selection (as a count of the number of code points selected). Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the maximum text length for the edit box. - - \par Usage: - - Name: MaxEditTextLength - - Format: "[uint]" - - \par Where: - - [uint] is the maximum allowed text length (as a count of code points). -*/ -class MaxEditTextLength : public Property -{ -public: - MaxEditTextLength() : Property( - "MaxEditTextLength", - "Property to get/set the the maximum allowed text length (as a count of code points). Value is \"[uint]\".", - "1073741824") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the normal, unselected, text colour used for rendering text. - - \par Usage: - - Name: NormalEditTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class NormalEditTextColour : public Property -{ -public: - NormalEditTextColour() : Property( - "NormalEditTextColour", - "Property to get/set the normal, unselected, text colour used for rendering text. Value is \"aarrggbb\" (hex).", - "00FFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering text within the selection area. - - \par Usage: - - Name: SelectedEditTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class SelectedEditTextColour : public Property -{ -public: - SelectedEditTextColour() : Property( - "SelectedEditTextColour", - "Property to get/set the colour used for rendering text within the selection area. Value is \"aarrggbb\" (hex).", - "00000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering the selection highlight when the edit box is active. - - \par Usage: - - Name: ActiveEditSelectionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class ActiveEditSelectionColour : public Property -{ -public: - ActiveEditSelectionColour() : Property( - "ActiveEditSelectionColour", - "Property to get/set the colour used for rendering the selection highlight when the edit box is active. Value is \"aarrggbb\" (hex).", - "006060FF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering the selection highlight when the edit box is inactive. - - \par Usage: - - Name: InactiveEditSelectionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class InactiveEditSelectionColour : public Property -{ -public: - InactiveEditSelectionColour() : Property( - "InactiveEditSelectionColour", - "Property to get/set the colour used for rendering the selection highlight when the edit box is inactive. Value is \"aarrggbb\" (hex).", - "00808080") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the sort setting of the list box. - - \par Usage: - - Name: SortList - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the list items should be sorted. - - "False" to indicate the list items should not be sorted. -*/ -class SortList : public Property -{ -public: - SortList() : Property( - "SortList", - "Property to get/set the sort setting of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'always show' setting for the vertical scroll bar of the list box. - - \par Usage: - - Name: ForceVertScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the vertical scroll bar will always be shown. - - "False" to indicate that the vertical scroll bar will only be shown when it is needed. -*/ -class ForceVertScrollbar : public Property -{ -public: - ForceVertScrollbar() : Property( - "ForceVertScrollbar", - "Property to get/set the 'always show' setting for the vertical scroll bar of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'always show' setting for the horizontal scroll bar of the list box. - - \par Usage: - - Name: ForceHorzScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the horizontal scroll bar will always be shown. - - "False" to indicate that the horizontal scroll bar will only be shown when it is needed. -*/ -class ForceHorzScrollbar : public Property -{ -public: - ForceHorzScrollbar() : Property( - "ForceHorzScrollbar", - "Property to get/set the 'always show' setting for the horizontal scroll bar of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'single click mode' setting for the combo box. - - \par Usage: - - Name: SingleClickMode - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the box will operate in single click mode - - "False" to indicate that the box will not operate in single click mode -*/ -class SingleClickMode : public Property -{ -public: - SingleClickMode() : Property( - "SingleClickMode", - "Property to get/set the 'single click mode' setting for the combo box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of ComboboxProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIComboboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainer.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainer.h deleted file mode 100644 index 3002f858b8..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainer.h +++ /dev/null @@ -1,503 +0,0 @@ -/************************************************************************ - filename: CEGUIDragContainer.h - created: 14/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIDragContainer_h_ -#define _CEGUIDragContainer_h_ - -#include "CEGUIWindow.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIDragContainerProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Generic drag & drop enabled window class - */ - class CEGUIEXPORT DragContainer : public Window - { - public: - /************************************************************************* - Constants - *************************************************************************/ - static const String WidgetTypeName; //!< Type name for DragContainer. - static const String EventNamespace; //!< Namespace for global events - static const String EventDragStarted; //!< Name of the event fired when the user begins dragging the thumb. - static const String EventDragEnded; //!< Name of the event fired when the user releases the thumb. - static const String EventDragPositionChanged; //!< Event fired when the drag position has changed. - static const String EventDragEnabledChanged; //!< Event fired when dragging is enabled or disabled. - static const String EventDragAlphaChanged; //!< Event fired when the alpha value used when dragging is changed. - static const String EventDragMouseCursorChanged;//!< Event fired when the mouse cursor used when dragging is changed. - static const String EventDragThresholdChanged; //!< Event fired when the drag pixel threshold is changed. - static const String EventDragDropTargetChanged; //!< Event fired when the drop target changes. - - /************************************************************************* - Object Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for DragContainer objects - */ - DragContainer(const String& type, const String& name); - - /*! - \brief - Destructor for DragContainer objects - */ - virtual ~DragContainer(void); - - /************************************************************************* - Public Interface to DragContainer - *************************************************************************/ - /*! - \brief - Return whether dragging is currently enabled for this DragContainer. - - \return - - true if dragging is enabled and the DragContainer may be dragged. - - false if dragging is disabled and the DragContainer may not be dragged. - */ - bool isDraggingEnabled(void) const; - - /*! - \brief - Set whether dragging is currently enabled for this DragContainer. - - \param setting - - true to enable dragging so that the DragContainer may be dragged. - - false to disabled dragging so that the DragContainer may not be dragged. - - \return - Nothing. - */ - void setDraggingEnabled(bool setting); - - /*! - \brief - Return whether the DragContainer is currently being dragged. - - \return - - true if the DragContainer is being dragged. - - false if te DragContainer is not being dragged. - */ - bool isBeingDragged(void) const; - - /*! - \brief - Return the current drag threshold in pixels. - - The drag threshold is the number of pixels that the mouse must be - moved with the left button held down in order to commence a drag - operation. - - \return - float value indicating the current drag threshold value. - */ - float getPixelDragThreshold(void) const; - - /*! - \brief - Set the current drag threshold in pixels. - - The drag threshold is the number of pixels that the mouse must be - moved with the left button held down in order to commence a drag - operation. - - \param pixels - float value indicating the new drag threshold value. - - \return - Nothing. - */ - void setPixelDragThreshold(float pixels); - - /*! - \brief - Return the alpha value that will be set on the DragContainer while a drag operation is - in progress. - - \return - Current alpha value to use whilst dragging. - */ - float getDragAlpha(void) const; - - /*! - \brief - Set the alpha value to be set on the DragContainer when a drag operation is - in progress. - - This method can be used while a drag is in progress to update the alpha. Note that - the normal setAlpha method does not affect alpha while a drag is in progress, but - once the drag operation has ended, any value set via setAlpha will be restored. - - \param alpha - Alpha value to use whilst dragging. - - \return - Nothing. - */ - void setDragAlpha(float alpha); - - /*! - \brief - Return the Image currently set to be used for the mouse cursor when a - drag operation is in progress. - - \return - Image object currently set to be used as the mouse cursor when dragging. - */ - const Image* getDragCursorImage(void) const; - - /*! - \brief - Set the Image to be used for the mouse cursor when a drag operation is - in progress. - - This method may be used during a drag operation to update the current mouse - cursor image. - - \param image - Image object to be used as the mouse cursor while dragging. - - \return - Nothing. - */ - void setDragCursorImage(const Image* image); - - /*! - \brief - Set the Image to be used for the mouse cursor when a drag operation is - in progress. - - This method may be used during a drag operation to update the current mouse - cursor image. - - \param image - One of the MouseCursorImage enumerated values. - - \return - Nothing. - */ - void setDragCursorImage(MouseCursorImage image); - - /*! - \brief - Set the Image to be used for the mouse cursor when a drag operation is - in progress. - - This method may be used during a drag operation to update the current mouse - cursor image. - - \param imageset - String holding the name of the Imageset that contains the Image to be used. - - \param image - Image defined for the Imageset \a imageset to be used as the mouse cursor - when dragging. - - \return - Nothing. - - \exception UnknownObjectException thrown if either \a imageset or \a image are unknown. - */ - void setDragCursorImage(const String& imageset, const String& image); - - /*! - \brief - Return the Window object that is the current drop target for the DragContainer. - - The drop target for a DragContainer is basically the Window that the DragContainer - is within while being dragged. The drop target may be 0 to indicate no target. - - \return - Pointer to a Window object that contains the DragContainer whilst being dragged, or - 0 to indicate no current target. - */ - Window* getCurrentDropTarget(void) const; - - protected: - /************************************************************************* - Protected Implementation Methods - *************************************************************************/ - /*! - \brief - Adds events specific to the DragContainer base class. - - \return - Nothing. - */ - void addDragContainerEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addDragContainerEvents(false); } - - /*! - \brief - Return whether the required minimum movement threshold before initiating dragging - has been exceeded. - - \param local_mouse - Mouse position as a pixel offset from the top-left corner of this window. - - \return - - true if the threshold has been exceeded and dragging should be initiated. - - false if the threshold has not been exceeded. - */ - bool isDraggingThresholdExceeded(const Point& local_mouse); - - /*! - \brief - Initialise the required states to put the window into dragging mode. - - \return - Nothing. - */ - void initialiseDragging(void); - - /*! - \brief - Update state for window dragging. - - \param local_mouse - Mouse position as a pixel offset from the top-left corner of this window. - - \return - Nothing. - */ - void doDragging(const Point& local_mouse); - - /*! - \brief - Method to update mouse cursor image - */ - void updateActiveMouseCursor(void) const; - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"DragContainer") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation of abstract methods in Window - *************************************************************************/ - void drawSelf(float z); - - /************************************************************************* - Overrides of methods in Window - *************************************************************************/ - - /************************************************************************* - Overrides for Event handler methods - *************************************************************************/ - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onMouseMove(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onAlphaChanged(WindowEventArgs& e); - virtual void onClippingChanged(WindowEventArgs& e);/*Window::drawSelf(z);*/ - - /************************************************************************* - New Event handler methods - *************************************************************************/ - /*! - \brief - Method called when dragging commences - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onDragStarted(WindowEventArgs& e); - - /*! - \brief - Method called when dragging ends. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onDragEnded(WindowEventArgs& e); - - /*! - \brief - Method called when the dragged object position is changed. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onDragPositionChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the dragging state is enabled or disabled - \param e - WindowEventArgs object. - \return - Nothing. - */ - virtual void onDragEnabledChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the alpha value to use when dragging is changed. - \param e - WindowEventArgs object. - \return - Nothing. - */ - virtual void onDragAlphaChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the mouse cursor to use when dragging is changed. - \param e - WindowEventArgs object. - \return - Nothing. - */ - virtual void onDragMouseCursorChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the movement threshold required to trigger dragging is changed. - \param e - WindowEventArgs object. - \return - Nothing. - */ - virtual void onDragThresholdChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the current drop target of this DragContainer changes. - \note - This event fires just prior to the target field being changed. The default implementation - changes the drop target, you can examine the old and new targets before calling the default - implementation to make the actual change (and fire appropriate events for the Window objects - involved). - \param e - DragDropEventArgs object initialised as follows: - - dragDropItem is initialised to the DragContainer triggering the event (typically 'this'). - - window is initialised to point to the Window which will be the new drop target. - \return - Nothing. - */ - virtual void onDragDropTargetChanged(DragDropEventArgs& e); - - /************************************************************************* - Data - *************************************************************************/ - bool d_draggingEnabled; //!< True when dragging is enabled. - bool d_leftMouseDown; //!< True when left mouse button is down. - bool d_dragging; //!< true when being dragged. - Point d_dragPoint; //!< point we are being dragged at. - Point d_startPosition; //!< position prior to dragging. - float d_dragThreshold; //!< Pixels mouse must move before dragging commences. - float d_dragAlpha; //!< Alpha value to set when dragging. - float d_storedAlpha; //!< Alpha value to re-set when dragging ends. - bool d_storedClipState; //!< Parent clip state to re-set. - Window* d_dropTarget; //!< Target window for possible drop operation. - const Image* d_dragCursorImage; //!< Image to use for mouse cursor when dragging. - - private: - /************************************************************************* - Static properties for the Spinner widget - *************************************************************************/ - static DragContainerProperties::DragAlpha d_dragAlphaProperty; - static DragContainerProperties::DragCursorImage d_dragCursorImageProperty; - static DragContainerProperties::DraggingEnabled d_dragEnabledProperty; - static DragContainerProperties::DragThreshold d_dragThresholdProperty; - - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - Adds properties specific to the DragContainer base class. - - \return - Nothing. - */ - void addDragContainerProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addDragContainerProperties(false); } - }; - - /*! - \brief - Factory class for producing DragContainer windows - */ - class DragContainerFactory : public WindowFactory - { - public: - DragContainerFactory(void) : WindowFactory(DragContainer::WidgetTypeName) { } - ~DragContainerFactory(void){} - - Window* createWindow(const String& name) - { - DragContainer* wnd = new DragContainer(d_type, name); - return wnd; - } - - void destroyWindow(Window* window) - { - if (window->getType() == d_type) - delete window; - } - - }; - - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIDragContainer_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainerProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainerProperties.h deleted file mode 100644 index 67b420d385..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIDragContainerProperties.h +++ /dev/null @@ -1,138 +0,0 @@ -/************************************************************************ - filename: CEGUIDragContainerProperties.h - created: 15/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIDragContainerProperties_h_ -#define _CEGUIDragContainerProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of DragContainerProperties namespace section -namespace DragContainerProperties -{ - /*! - \brief - Property to access the state of the dragging enabled setting. - - \par Usage: - - Name: DraggingEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate that dragging is enabled. - - "False" to indicate that dragging is disabled. - */ - class DraggingEnabled : public Property - { - public: - DraggingEnabled() : Property( - "DraggingEnabled", - "Property to get/set the state of the dragging enabled setting for the DragContainer. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the dragging alpha value. - - \par Usage: - - Name: DragAlpha - - Format: "[float]". - - \par Where: - - [float] represents the alpha value to set when dragging. - */ - class DragAlpha : public Property - { - public: - DragAlpha() : Property( - "DragAlpha", - "Property to get/set the dragging alpha value. Value is a float.", - "0.500000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the dragging threshold value. - - \par Usage: - - Name: DragThreshold - - Format: "[float]". - - \par Where: - - [float] represents the movement threshold (in pixels) which must be exceeded to commence dragging. - */ - class DragThreshold : public Property - { - public: - DragThreshold() : Property( - "DragThreshold", - "Property to get/set the dragging threshold value. Value is a float.", - "8.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the dragging mouse cursor setting. - - This property offers access to the mouse cursor image used when dragging the DragContainer. - - \par Usage: - - Name: DragCursorImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. - */ - class DragCursorImage : public Property - { - public: - DragCursorImage() : Property( - "DragCursorImage", - "Property to get/set the mouse cursor image used when dragging. Value should be \"set: image:\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} // End of DragContainerProperties namespace section -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIDragContainerProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIEditbox.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIEditbox.h deleted file mode 100644 index e5648804f5..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIEditbox.h +++ /dev/null @@ -1,717 +0,0 @@ -/************************************************************************ - filename: CEGUIEditbox.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Editbox widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIEditbox_h_ -#define _CEGUIEditbox_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIEditboxProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -// forward declare implementation data type -struct RegexValidator; - - -/*! -\brief - Base class for an Editbox widget -*/ -class CEGUIEXPORT Editbox : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // default colours - static const argb_t DefaultNormalTextColour; //!< Colour applied to normal unselected text. - static const argb_t DefaultSelectedTextColour; //!< Colour applied to selected text. - static const argb_t DefaultNormalSelectionColour; //!< Colour applied to normal selection brush. - static const argb_t DefaultInactiveSelectionColour; //!< Colour applied to selection brush when widget is inactive. - - - /************************************************************************* - Event name constants - *************************************************************************/ - static const String EventReadOnlyModeChanged; //!< The read-only mode for the edit box has been changed. - static const String EventMaskedRenderingModeChanged; //!< The masked rendering mode (password mode) has been changed. - static const String EventMaskCodePointChanged; //!< The code point (character) to use for masked text has been changed. - static const String EventValidationStringChanged; //!< The validation string has been changed. - static const String EventMaximumTextLengthChanged; //!< The maximum allowable string length has been changed. - static const String EventTextInvalidated; //!< Some operation has made the current text invalid with regards to the validation string. - static const String EventInvalidEntryAttempted; //!< The user attempted to modify the text in a way that would have made it invalid. - static const String EventCaratMoved; //!< The text carat (insert point) has changed. - static const String EventTextSelectionChanged; //!< The current text selection has changed. - static const String EventEditboxFull; //!< The number of characters in the edit box has reached the current maximum. - static const String EventTextAccepted; //!< The user has accepted the current text by pressing Return, Enter, or Tab. - - - /************************************************************************* - Accessor Functions - *************************************************************************/ - /*! - \brief - return true if the Editbox has input focus. - - \return - true if the Editbox has keyboard input focus, false if the Editbox does not have keyboard input focus. - */ - bool hasInputFocus(void) const; - - - /*! - \brief - return true if the Editbox is read-only. - - \return - true if the Editbox is read only and can't be edited by the user, false if the Editbox is not - read only and may be edited by the user. - */ - bool isReadOnly(void) const {return d_readOnly;} - - - /*! - \brief - return true if the text for the Editbox will be rendered masked. - - \return - true if the Editbox text will be rendered masked using the currently set mask code point, false if the Editbox - text will be rendered as plain text. - */ - bool isTextMasked(void) const {return d_maskText;} - - - /*! - \brief - return true if the Editbox text is valid given the currently set validation string. - - \note - It is possible to programmatically set 'invalid' text for the Editbox by calling setText. This has certain - implications since if invalid text is set, whatever the user types into the box will be rejected when the input - is validated. - - \note - Validation is performed by means of a regular expression. If the text matches the regex, the text is said to have passed - validation. If the text does not match with the regex then the text fails validation. - - \return - true if the current Editbox text passes validation, false if the text does not pass validation. - */ - bool isTextValid(void) const; - - - /*! - \brief - return the currently set validation string - - \note - Validation is performed by means of a regular expression. If the text matches the regex, the text is said to have passed - validation. If the text does not match with the regex then the text fails validation. - - \return - String object containing the current validation regex data - */ - const String& getValidationString(void) const {return d_validationString;} - - - /*! - \brief - return the current position of the carat. - - \return - Index of the insert carat relative to the start of the text. - */ - size_t getCaratIndex(void) const {return d_caratPos;} - - - /*! - \brief - return the current selection start point. - - \return - Index of the selection start point relative to the start of the text. If no selection is defined this function returns - the position of the carat. - */ - size_t getSelectionStartIndex(void) const; - - - /*! - \brief - return the current selection end point. - - \return - Index of the selection end point relative to the start of the text. If no selection is defined this function returns - the position of the carat. - */ - size_t getSelectionEndIndex(void) const; - - - /*! - \brief - return the length of the current selection (in code points / characters). - - \return - Number of code points (or characters) contained within the currently defined selection. - */ - size_t getSelectionLength(void) const; - - - /*! - \brief - return the utf32 code point used when rendering masked text. - - \return - utf32 code point value representing the Unicode code point that will be rendered instead of the Editbox text - when rendering in masked mode. - */ - utf32 getMaskCodePoint(void) const {return d_maskCodePoint;} - - - /*! - \brief - return the maximum text length set for this Editbox. - - \return - The maximum number of code points (characters) that can be entered into this Editbox. - - \note - Depending on the validation string set, the actual length of text that can be entered may be less than the value - returned here (it will never be more). - */ - size_t getMaxTextLength(void) const {return d_maxTextLen;} - - - /*! - \brief - return the currently set colour to be used for rendering Editbox text in the - normal, unselected state. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getNormalTextColour(void) const {return d_normalTextColour;} - - - /*! - \brief - return the currently set colour to be used for rendering the Editbox text when within the - selected region. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getSelectedTextColour(void) const {return d_selectTextColour;} - - - /*! - \brief - return the currently set colour to be used for rendering the Editbox selection highlight - when the Editbox is active. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getNormalSelectBrushColour(void) const {return d_selectBrushColour;} - - - /*! - \brief - return the currently set colour to be used for rendering the Editbox selection highlight - when the Editbox is inactive. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getInactiveSelectBrushColour(void) const {return d_inactiveSelectBrushColour;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Specify whether the Editbox is read-only. - - \param setting - true if the Editbox is read only and can't be edited by the user, false if the Editbox is not - read only and may be edited by the user. - - \return - Nothing. - */ - void setReadOnly(bool setting); - - - /*! - \brief - Specify whether the text for the Editbox will be rendered masked. - - \param setting - true if the Editbox text should be rendered masked using the currently set mask code point, false if the Editbox - text should be rendered as plain text. - - \return - Nothing. - */ - void setTextMasked(bool setting); - - - /*! - \brief - Set the text validation string. - - \note - Validation is performed by means of a regular expression. If the text matches the regex, the text is said to have passed - validation. If the text does not match with the regex then the text fails validation. - - \param validation_string - String object containing the validation regex data to be used. - - \return - Nothing. - */ - void setValidationString(const String& validation_string); - - - /*! - \brief - Set the current position of the carat. - - \param carat_pos - New index for the insert carat relative to the start of the text. If the value specified is greater than the - number of characters in the Editbox, the carat is positioned at the end of the text. - - \return - Nothing. - */ - void setCaratIndex(size_t carat_pos); - - - /*! - \brief - Define the current selection for the Editbox - - \param start_pos - Index of the starting point for the selection. If this value is greater than the number of characters in the Editbox, the - selection start will be set to the end of the text. - - \param end_pos - Index of the ending point for the selection. If this value is greater than the number of characters in the Editbox, the - selection end will be set to the end of the text. - - \return - Nothing. - */ - void setSelection(size_t start_pos, size_t end_pos); - - - /*! - \brief - set the utf32 code point used when rendering masked text. - - \param code_point - utf32 code point value representing the Unicode code point that should be rendered instead of the Editbox text - when rendering in masked mode. - - \return - Nothing. - */ - void setMaskCodePoint(utf32 code_point); - - - /*! - \brief - set the maximum text length for this Editbox. - - \param max_len - The maximum number of code points (characters) that can be entered into this Editbox. - - \note - Depending on the validation string set, the actual length of text that can be entered may be less than the value - set here (it will never be more). - - \return - Nothing. - */ - void setMaxTextLength(size_t max_len); - - - /*! - \brief - Set the colour to be used for rendering Editbox text in the normal, unselected state. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setNormalTextColour(const colour& col); - - - /*! - \brief - Set the colour to be used for rendering the Editbox text when within the - selected region. - - \return - colour value describing the ARGB colour that is currently set. - */ - void setSelectedTextColour(const colour& col); - - - /*! - \brief - Set the colour to be used for rendering the Editbox selection highlight - when the Editbox is active. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setNormalSelectBrushColour(const colour& col); - - - /*! - \brief - Set the colour to be used for rendering the Editbox selection highlight - when the Editbox is inactive. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setInactiveSelectBrushColour(const colour& col); - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for Editbox class. - */ - Editbox(const String& type, const String& name); - - - /*! - \brief - Destructor for Editbox class. - */ - virtual ~Editbox(void); - - -protected: - /************************************************************************* - Implementation functions - *************************************************************************/ - /*! - \brief - Add edit box specific events - */ - void addEditboxEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addEditboxEvents(false); } - - - /*! - \brief - Return the text code point index that is rendered closest to screen position \a pt. - - \param pt - Point object describing a position on the screen in pixels. - - \return - Code point index into the text that is rendered closest to screen position \a pt. - */ - virtual size_t getTextIndexFromPosition(const Point& pt) const = 0; - - - /*! - \brief - Clear the current selection setting - */ - void clearSelection(void); - - - /*! - \brief - Erase the currently selected text. - - \param modify_text - when true, the actual text will be modified. When false, everything is done except erasing the characters. - */ - void eraseSelectedText(bool modify_text = true); - - - /*! - \brief - return true if the given string matches the validation regular expression. - */ - bool isStringValid(const String& str) const; - - - - /*! - \brief - Processing for backspace key - */ - void handleBackspace(void); - - - /*! - \brief - Processing for Delete key - */ - void handleDelete(void); - - - /*! - \brief - Processing to move carat one character left - */ - void handleCharLeft(uint sysKeys); - - - /*! - \brief - Processing to move carat one word left - */ - void handleWordLeft(uint sysKeys); - - - /*! - \brief - Processing to move carat one character right - */ - void handleCharRight(uint sysKeys); - - - /*! - \brief - Processing to move carat one word right - */ - void handleWordRight(uint sysKeys); - - - /*! - \brief - Processing to move carat to the start of the text. - */ - void handleHome(uint sysKeys); - - - /*! - \brief - Processing to move carat to the end of the text - */ - void handleEnd(uint sysKeys); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Editbox") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - Event fired internally when the read only state of the Editbox has been changed - */ - virtual void onReadOnlyChanged(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the masked rendering mode (password mode) has been changed - */ - virtual void onMaskedRenderingModeChanged(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the code point to use for masked rendering has been changed. - */ - virtual void onMaskCodePointChanged(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the validation string is changed. - */ - virtual void onValidationStringChanged(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the maximum text length for the edit box is changed. - */ - virtual void onMaximumTextLengthChanged(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when something has caused the current text to now fail validation - - This can be caused by changing the validation string or setting a maximum length that causes the - current text to be truncated. - */ - virtual void onTextInvalidatedEvent(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the user attempted to make a change to the edit box that would - have caused it to fail validation. - */ - virtual void onInvalidEntryAttempted(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the carat (insert point) position changes. - */ - virtual void onCaratMoved(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the current text selection changes. - */ - virtual void onTextSelectionChanged(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the edit box text has reached the set maximum length. - */ - virtual void onEditboxFullEvent(WindowEventArgs& e); - - - /*! - \brief - Event fired internally when the user accepts the edit box text by pressing Return, Enter, or Tab. - */ - virtual void onTextAcceptedEvent(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onMouseDoubleClicked(MouseEventArgs& e); - virtual void onMouseTripleClicked(MouseEventArgs& e); - virtual void onMouseMove(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onCharacter(KeyEventArgs& e); - virtual void onKeyDown(KeyEventArgs& e); - virtual void onTextChanged(WindowEventArgs& e); - - - /************************************************************************* - Implementation data - *************************************************************************/ - bool d_readOnly; //!< True if the editbox is in read-only mode - bool d_maskText; //!< True if the editbox text should be rendered masked. - utf32 d_maskCodePoint; //!< Code point to use when rendering masked text. - size_t d_maxTextLen; //!< Maximum number of characters for this Editbox. - size_t d_caratPos; //!< Position of the carat / insert-point. - size_t d_selectionStart; //!< Start of selection area. - size_t d_selectionEnd; //!< End of selection area. - String d_validationString; //!< Copy of validation reg-ex string. - RegexValidator* d_validator; //!< RegEx String used for validation of text. - bool d_dragging; //!< true when a selection is being dragged. - size_t d_dragAnchorIdx; //!< Selection index for drag selection anchor point. - - // basic rendering colours - colour d_normalTextColour; //!< Text colour used normally. - colour d_selectTextColour; //!< Text colour used when text is highlighted - colour d_selectBrushColour; //!< Colour to apply to the selection brush. - colour d_inactiveSelectBrushColour; //!< Colour to apply to the selection brush when widget is inactive / read-only. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static EditboxProperties::ReadOnly d_readOnlyProperty; - static EditboxProperties::MaskText d_maskTextProperty; - static EditboxProperties::MaskCodepoint d_maskCodepointProperty; - static EditboxProperties::ValidationString d_validationStringProperty; - static EditboxProperties::CaratIndex d_caratIndexProperty; - static EditboxProperties::SelectionStart d_selectionStartProperty; - static EditboxProperties::SelectionLength d_selectionLengthProperty; - static EditboxProperties::MaxTextLength d_maxTextLengthProperty; - static EditboxProperties::NormalTextColour d_normalTextColourProperty; - static EditboxProperties::SelectedTextColour d_selectedTextColourProperty; - static EditboxProperties::ActiveSelectionColour d_activeSelectionColourProperty; - static EditboxProperties::InactiveSelectionColour d_inactiveSelectionColourProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addEditboxProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addEditboxProperties(false); } -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIEditbox_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIEditboxProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIEditboxProperties.h deleted file mode 100644 index fd8ebf3022..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIEditboxProperties.h +++ /dev/null @@ -1,355 +0,0 @@ -/************************************************************************ - filename: CEGUIEditboxProperties.h - created: 9/7/2004 - author: Paul D Turner - - purpose: Interface to Properties for Editbox class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIEditboxProperties_h_ -#define _CEGUIEditboxProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of EditboxProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Editbox class -*/ -namespace EditboxProperties -{ -/*! -\brief - Property to access the read-only setting of the edit box. - - This property offers access to the read-only setting for the Editbox object. - - \par Usage: - - Name: ReadOnly - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the edit box is read-only. - - "False" to indicate the edit box is not read-only (text may be edited by user). -*/ -class ReadOnly : public Property -{ -public: - ReadOnly() : Property( - "ReadOnly", - "Property to get/set the read-only setting for the Editbox. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the mask text setting of the edit box. - - This property offers access to the mask text setting for the Editbox object. - - \par Usage: - - Name: MaskText - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the text should be masked. - - "False" to indicate the text should not be masked. -*/ -class MaskText : public Property -{ -public: - MaskText() : Property( - "MaskText", - "Property to get/set the mask text setting for the Editbox. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the mask text setting of the edit box. - - This property offers access to the mask text setting for the Editbox object. - - \par Usage: - - Name: MaskCodepoint - - Format: "[uint]" - - \par Where: - - [uint] is the Unicode utf32 value of the codepoint used for masking text. -*/ -class MaskCodepoint : public Property -{ -public: - MaskCodepoint() : Property( - "MaskCodepoint", - "Property to get/set the utf32 codepoint value used for masking text. Value is \"[uint]\".", - "42") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the string used for regular expression validation of the edit box text. - - \par Usage: - - Name: ValidationString - - Format: "[text]" - - \par Where: - - [Text] is the string used for validating text entry. -*/ -class ValidationString : public Property -{ -public: - ValidationString() : Property( - "ValidationString", - "Property to get/set the validation string Editbox. Value is a text string.", - ".*") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current carat index. - - \par Usage: - - Name: CaratIndex - - Format: "[uint]" - - \par Where: - - [uint] is the zero based index of the carat position within the text. -*/ -class CaratIndex : public Property -{ -public: - CaratIndex() : Property( - "CaratIndex", - "Property to get/set the current carat index. Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current selection start index. - - \par Usage: - - Name: SelectionStart - - Format: "[uint]" - - \par Where: - - [uint] is the zero based index of the selection start position within the text. -*/ -class SelectionStart : public Property -{ -public: - SelectionStart() : Property( - "SelectionStart", - "Property to get/set the zero based index of the selection start position within the text. Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current selection length. - - \par Usage: - - Name: SelectionLength - - Format: "[uint]" - - \par Where: - - [uint] is the length of the selection (as a count of the number of code points selected). -*/ -class SelectionLength : public Property -{ -public: - SelectionLength() : Property( - "SelectionLength", - "Property to get/set the length of the selection (as a count of the number of code points selected). Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the maximum text length for the edit box. - - \par Usage: - - Name: MaxTextLength - - Format: "[uint]" - - \par Where: - - [uint] is the maximum allowed text length (as a count of code points). -*/ -class MaxTextLength : public Property -{ -public: - MaxTextLength() : Property( - "MaxTextLength", - "Property to get/set the the maximum allowed text length (as a count of code points). Value is \"[uint]\".", - "1073741824") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the normal, unselected, text colour used for rendering text. - - \par Usage: - - Name: NormalTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class NormalTextColour : public Property -{ -public: - NormalTextColour() : Property( - "NormalTextColour", - "Property to get/set the normal, unselected, text colour used for rendering text. Value is \"aarrggbb\" (hex).", - "FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering text within the selection area. - - \par Usage: - - Name: SelectedTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class SelectedTextColour : public Property -{ -public: - SelectedTextColour() : Property( - "SelectedTextColour", - "Property to get/set the colour used for rendering text within the selection area. Value is \"aarrggbb\" (hex).", - "FF000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering the selection highlight when the edit box is active. - - \par Usage: - - Name: ActiveSelectionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class ActiveSelectionColour : public Property -{ -public: - ActiveSelectionColour() : Property( - "ActiveSelectionColour", - "Property to get/set the colour used for rendering the selection highlight when the edit box is active. Value is \"aarrggbb\" (hex).", - "FF6060FF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering the selection highlight when the edit box is inactive. - - \par Usage: - - Name: InactiveSelectionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class InactiveSelectionColour : public Property -{ -public: - InactiveSelectionColour() : Property( - "InactiveSelectionColour", - "Property to get/set the colour used for rendering the selection highlight when the edit box is inactive. Value is \"aarrggbb\" (hex).", - "FF808080") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of EditboxProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIEditboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindow.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindow.h deleted file mode 100644 index bede2d62fc..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindow.h +++ /dev/null @@ -1,799 +0,0 @@ -/************************************************************************ - filename: CEGUIFrameWindow.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for FrameWindow -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFrameWindow_h_ -#define _CEGUIFrameWindow_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIFrameWindowProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Abstract base class for a movable, sizable, window with a title-bar and a frame. -*/ -class CEGUIEXPORT FrameWindow : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // additional event names for this window - static const String EventRollupToggled; //!< Fired when the rollup (shade) state of the window changes - static const String EventCloseClicked; //!< Fired when the close button for the window is clicked. - - // other bits - static const float DefaultSizingBorderSize; //!< Default size for the sizing border (in pixels) - - - /*! - \brief - Enumeration that defines the set of possible locations for the mouse on a frame windows sizing border. - */ - enum SizingLocation { - SizingNone, //!< Position is not a sizing location. - SizingTopLeft, //!< Position will size from the top-left. - SizingTopRight, //!< Position will size from the top-right. - SizingBottomLeft, //!< Position will size from the bottom left. - SizingBottomRight, //!< Position will size from the bottom right. - SizingTop, //!< Position will size from the top. - SizingLeft, //!< Position will size from the left. - SizingBottom, //!< Position will size from the bottom. - SizingRight //!< Position will size from the right. - }; - - /*! - \brief - Initialises the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Return whether this window is sizable. Note that this requires that the window have an enabled frame and that sizing itself is enabled - - \return - true if the window can be sized, false if the window can not be sized - */ - bool isSizingEnabled(void) const {return d_sizingEnabled && isFrameEnabled();} - - - /*! - \brief - Return whether the frame for this window is enabled. - - \return - true if the frame for this window is enabled, false if the frame for this window is disabled. - */ - bool isFrameEnabled(void) const {return d_frameEnabled;} - - - /*! - \brief - Return whether the title bar for this window is enabled. - - \return - true if the window has a title bar and it is enabled, false if the window has no title bar or if the title bar is disabled. - */ - bool isTitleBarEnabled(void) const {return (d_titlebar != NULL) && !((Window*)d_titlebar)->isDisabled();} - - - /*! - \brief - Return whether this close button for this window is enabled. - - \return - true if the window has a close button and it is enabled, false if the window either has no close button or if the close button is disabled. - */ - bool isCloseButtonEnabled(void) const {return (d_closeButton != NULL) && !((Window*)d_closeButton)->isDisabled();} - - - /*! - \brief - Return whether roll up (a.k.a shading) is enabled for this window. - - \return - true if roll up is enabled, false if roll up is disabled. - */ - bool isRollupEnabled(void) const {return d_rollupEnabled;} - - - /*! - \brief - Return whether the window is currently rolled up (a.k.a shaded). - - \return - true if the window is rolled up, false if the window is not rolled up. - */ - bool isRolledup(void) const {return d_rolledup;} - - - /*! - \brief - Return the thickness of the sizing border. - - \return - float value describing the thickness of the sizing border in screen pixels. - */ - float getSizingBorderThickness(void) const {return d_borderSize;} - - - /*! - \brief - Enables or disables sizing for this window. - - \param setting - set to true to enable sizing (also requires frame to be enabled), or false to disable sizing. - - \return - nothing - */ - void setSizingEnabled(bool setting); - - - /*! - \brief - Enables or disables the frame for this window. - - \param setting - set to true to enable the frame for this window, or false to disable the frame for this window. - - \return - Nothing. - */ - void setFrameEnabled(bool setting); - - - /*! - \brief - Enables or disables the title bar for the frame window. - - \param setting - set to true to enable the title bar (if one is attached), or false to disable the title bar. - - \return - Nothing. - */ - void setTitleBarEnabled(bool setting); - - - /*! - \brief - Enables or disables the close button for the frame window. - - \param setting - Set to true to enable the close button (if one is attached), or false to disable the close button. - - \return - Nothing. - */ - void setCloseButtonEnabled(bool setting); - - - /*! - \brief - Enables or disables roll-up (shading) for this window. - - \param setting - Set to true to enable roll-up for the frame window, or false to disable roll-up. - - \return - Nothing. - */ - void setRollupEnabled(bool setting); - - - /*! - \brief - Toggles the state of the window between rolled-up (shaded) and normal sizes. This requires roll-up to be enabled. - - \return - Nothing - */ - void toggleRollup(void); - - - /*! - \brief - Set the size of the sizing border for this window. - - \param pixels - float value specifying the thickness for the sizing border in screen pixels. - - \return - Nothing. - */ - void setSizingBorderThickness(float pixels) {d_borderSize = pixels;} - - - /*! - \brief - Set the font to use for the title bar text - - \param name - String object holding the name of the font to use. - - \return - Nothing. - */ - void setTitlebarFont(const String& name); - - - /*! - \brief - Set the font to use for the title bar text - - \param font - Pointer to the font to use. - - \return - Nothing. - */ - void setTitlebarFont(Font* font); - - - /*! - \brief - Move the window by the pixel offsets specified in \a offset. - - This is intended for internal system use - it is the method by which the title bar moves the frame window. - - \param offset - Vector2 object containing the offsets to apply (offsets are in screen pixels). - - \return - Nothing. - */ - void offsetPixelPosition(const Vector2& offset); - - - /*! - \brief - Return whether this FrameWindow can be moved by dragging the title bar. - - \return - true if the Window will move when the user drags the title bar, false if the window will not move. - */ - bool isDragMovingEnabled(void) const {return d_dragMovable;} - - - /*! - \brief - Set whether this FrameWindow can be moved by dragging the title bar. - - \param setting - true if the Window should move when the user drags the title bar, false if the window should not move. - - \return - Nothing. - */ - void setDragMovingEnabled(bool setting); - - - /*! - \brief - Return the font being used for the title bar text - - \return - Pointer to the Font being used for the TitleBar on this FrameWindow. - */ - const Font* getTitlebarFont(void) const; - - - /*! - \brief - Return the current colour used for rendering the caption text - - \return - colour value that specifies the colour used when rendering the title bar caption text. - */ - colour getCaptionColour(void) const; - - - /*! - \brief - Sets the colour to be used for rendering the caption text. - - \param col - colour value that specifies the colour to be used when rendering the title bar caption text. - - \return - Nothing. - */ - void setCaptionColour(colour col); - - /*! - \brief - Return a pointer to the currently set Image to be used for the north-south - sizing mouse cursor. - - \return - Pointer to an Image object, or 0 for none. - */ - const Image* getNSSizingCursorImage() const; - - /*! - \brief - Return a pointer to the currently set Image to be used for the east-west - sizing mouse cursor. - - \return - Pointer to an Image object, or 0 for none. - */ - const Image* getEWSizingCursorImage() const; - - /*! - \brief - Return a pointer to the currently set Image to be used for the northwest-southeast - sizing mouse cursor. - - \return - Pointer to an Image object, or 0 for none. - */ - const Image* getNWSESizingCursorImage() const; - - /*! - \brief - Return a pointer to the currently set Image to be used for the northeast-southwest - sizing mouse cursor. - - \return - Pointer to an Image object, or 0 for none. - */ - const Image* getNESWSizingCursorImage() const; - - /*! - \brief - Set the Image to be used for the north-south sizing mouse cursor. - - \param image - Pointer to an Image object, or 0 for none. - - \return - Nothing. - */ - void setNSSizingCursorImage(const Image* image); - - /*! - \brief - Set the Image to be used for the east-west sizing mouse cursor. - - \param image - Pointer to an Image object, or 0 for none. - - \return - Nothing. - */ - void setEWSizingCursorImage(const Image* image); - - /*! - \brief - Set the Image to be used for the northwest-southeast sizing mouse cursor. - - \param image - Pointer to an Image object, or 0 for none. - - \return - Nothing. - */ - void setNWSESizingCursorImage(const Image* image); - - /*! - \brief - Set the Image to be used for the northeast-southwest sizing mouse cursor. - - \param image - Pointer to an Image object, or 0 for none. - - \return - Nothing. - */ - void setNESWSizingCursorImage(const Image* image); - - /*! - \brief - Set the image to be used for the north-south sizing mouse cursor. - - \param imageset - String holding the name of the Imageset containing the Image to be used. - - \param image - String holding the name of the Image to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if either \a imageset or \a image refer to non-existant entities. - */ - void setNSSizingCursorImage(const String& imageset, const String& image); - - /*! - \brief - Set the image to be used for the east-west sizing mouse cursor. - - \param imageset - String holding the name of the Imageset containing the Image to be used. - - \param image - String holding the name of the Image to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if either \a imageset or \a image refer to non-existant entities. - */ - void setEWSizingCursorImage(const String& imageset, const String& image); - - /*! - \brief - Set the image to be used for the northwest-southeast sizing mouse cursor. - - \param imageset - String holding the name of the Imageset containing the Image to be used. - - \param image - String holding the name of the Image to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if either \a imageset or \a image refer to non-existant entities. - */ - void setNWSESizingCursorImage(const String& imageset, const String& image); - - /*! - \brief - Set the image to be used for the northeast-southwest sizing mouse cursor. - - \param imageset - String holding the name of the Imageset containing the Image to be used. - - \param image - String holding the name of the Image to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if either \a imageset or \a image refer to non-existant entities. - */ - void setNESWSizingCursorImage(const String& imageset, const String& image); - - // overridden from Window class - bool isHit(const Point& position) const { return Window::isHit(position) && !d_rolledup; } - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for FrameWindow objects. - */ - FrameWindow(const String& name, const String& type); - - /*! - \brief - Destructor for FramwWindow objects. - */ - virtual ~FrameWindow(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Create a control based upon the Titlebar base class to be used as the title bar for this window. - - \param name - String object holding the name that must be used when creating the titlebar. - - \return - Pointer to an object who's class derives from Titlebar - */ - virtual Titlebar* createTitlebar(const String& name) const = 0; - - - /*! - \brief - Create a control based upon the PushButton base class, to be used at the close button for the window. - - \param name - String object holding the name that must be used when creating the close button. - - \return - Pointer to an object who's class derives from PushButton. - */ - virtual PushButton* createCloseButton(const String& name) const = 0; - - - /*! - \brief - move the window's left edge by 'delta'. The rest of the window does not move, thus this changes the size of the Window. - - \param delta - float value that specifies the amount to move the window edge, and in which direction. Positive values make window smaller. - */ - void moveLeftEdge(float delta); - - - /*! - \brief - move the window's right edge by 'delta'. The rest of the window does not move, thus this changes the size of the Window. - - \param delta - float value that specifies the amount to move the window edge, and in which direction. Positive values make window larger. - */ - void moveRightEdge(float delta); - - - /*! - \brief - move the window's top edge by 'delta'. The rest of the window does not move, thus this changes the size of the Window. - - \param delta - float value that specifies the amount to move the window edge, and in which direction. Positive values make window smaller. - */ - void moveTopEdge(float delta); - - - /*! - \brief - move the window's bottom edge by 'delta'. The rest of the window does not move, thus this changes the size of the Window. - - \param delta - float value that specifies the amount to move the window edge, and in which direction. Positive values make window larger. - */ - void moveBottomEdge(float delta); - - - /*! - \brief - check local pixel co-ordinate point 'pt' and return one of the - SizingLocation enumerated values depending where the point falls on - the sizing border. - - \param pt - Point object describing, in pixels, the window relative offset to check. - - \return - One of the SizingLocation enumerated values that describe which part of - the sizing border that \a pt corresponded to, if any. - */ - SizingLocation getSizingBorderAtPoint(const Point& pt) const; - - - /*! - \brief - return true if given SizingLocation is on left edge. - - \param loc - SizingLocation value to be checked. - - \return - true if \a loc is on the left edge. false if \a loc is not on the left edge. - */ - bool isLeftSizingLocation(SizingLocation loc) const {return ((loc == SizingLeft) || (loc == SizingTopLeft) || (loc == SizingBottomLeft));} - - - /*! - \brief - return true if given SizingLocation is on right edge. - - \param loc - SizingLocation value to be checked. - - \return - true if \a loc is on the right edge. false if \a loc is not on the right edge. - */ - bool isRightSizingLocation(SizingLocation loc) const {return ((loc == SizingRight) || (loc == SizingTopRight) || (loc == SizingBottomRight));} - - - /*! - \brief - return true if given SizingLocation is on top edge. - - \param loc - SizingLocation value to be checked. - - \return - true if \a loc is on the top edge. false if \a loc is not on the top edge. - */ - bool isTopSizingLocation(SizingLocation loc) const {return ((loc == SizingTop) || (loc == SizingTopLeft) || (loc == SizingTopRight));} - - - /*! - \brief - return true if given SizingLocation is on bottom edge. - - \param loc - SizingLocation value to be checked. - - \return - true if \a loc is on the bottom edge. false if \a loc is not on the bottom edge. - */ - bool isBottomSizingLocation(SizingLocation loc) const {return ((loc == SizingBottom) || (loc == SizingBottomLeft) || (loc == SizingBottomRight));} - - - /*! - \brief - Add frame window specific events - */ - void addFrameWindowEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addFrameWindowEvents(false); } - - - /*! - \brief - Method to respond to close button click events and fire our close event - */ - bool closeClickHandler(const EventArgs& e); - - - /*! - \brief - Set the appropriate mouse cursor for the given window-relative pixel point. - */ - void setCursorForPoint(const Point& pt) const; - - - /*! - \brief - Return a Rect that describes, in window relative pixel co-ordinates, the outer edge of the sizing area for this window. - */ - virtual Rect getSizingRect(void) const {return Rect(0, 0, getAbsoluteWidth(), getAbsoluteHeight());} - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"FrameWindow") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - New events for Frame Windows - *************************************************************************/ - /*! - \brief - Event generated internally whenever the roll-up / shade state of the window - changes. - */ - virtual void onRollupToggled(WindowEventArgs& e); - - - /*! - \brief - Event generated internally whenever the close button is clicked. - */ - virtual void onCloseClicked(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onTextChanged(WindowEventArgs& e); - virtual void onActivated(ActivationEventArgs& e); - virtual void onDeactivated(ActivationEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - // frame data - bool d_frameEnabled; //!< true if window frame should be drawn. - - // window roll-up data - bool d_rollupEnabled; //!< true if roll-up of window is allowed. - bool d_rolledup; //!< true if window is rolled up. - - // drag-sizing data - bool d_sizingEnabled; //!< true if sizing is enabled for this window. - bool d_beingSized; //!< true if window is being sized. - float d_borderSize; //!< thickness of the sizing border around this window - Point d_dragPoint; //!< point window is being dragged at. - - // composite controls - Titlebar* d_titlebar; //!< points to the title bar widget. - PushButton* d_closeButton; //!< points to close button widget. - - // images for cursor when on sizing border - const Image* d_nsSizingCursor; //!< North/South sizing cursor image. - const Image* d_ewSizingCursor; //!< East/West sizing cursor image. - const Image* d_nwseSizingCursor; //!< North-West/South-East cursor image. - const Image* d_neswSizingCursor; //!< North-East/South-West cursor image. - - bool d_dragMovable; //!< true if the window will move when dragged by the title bar. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static FrameWindowProperties::SizingEnabled d_sizingEnabledProperty; - static FrameWindowProperties::FrameEnabled d_frameEnabledProperty; - static FrameWindowProperties::TitlebarEnabled d_titlebarEnabledProperty; - static FrameWindowProperties::CloseButtonEnabled d_closeButtonEnabledProperty; - static FrameWindowProperties::RollUpState d_rollUpStateProperty; - static FrameWindowProperties::RollUpEnabled d_rollUpEnabledProperty; - static FrameWindowProperties::DragMovingEnabled d_dragMovingEnabledProperty; - static FrameWindowProperties::SizingBorderThickness d_sizingBorderThicknessProperty; - static FrameWindowProperties::TitlebarFont d_titlebarFontProperty; - static FrameWindowProperties::CaptionColour d_captionColourProperty; - static FrameWindowProperties::NSSizingCursorImage d_nsSizingCursorProperty; - static FrameWindowProperties::EWSizingCursorImage d_ewSizingCursorProperty; - static FrameWindowProperties::NWSESizingCursorImage d_nwseSizingCursorProperty; - static FrameWindowProperties::NESWSizingCursorImage d_neswSizingCursorProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addFrameWindowProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addFrameWindowProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFrameWindow_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindowProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindowProperties.h deleted file mode 100644 index f7b66c64f7..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIFrameWindowProperties.h +++ /dev/null @@ -1,391 +0,0 @@ -/************************************************************************ - filename: CEGUIFrameWindowProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface to properties for FrameWIndow class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFrameWindowProperties_h_ -#define _CEGUIFrameWindowProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of FrameWindowProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the FrameWindow class -*/ -namespace FrameWindowProperties -{ -/*! -\brief - Property to access the state of the sizable setting for the FrameWindow. - - \par Usage: - - Name: SizingEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the window will be user re-sizable. - - "False" to indicate the window will not be re-sizable by the user. -*/ -class SizingEnabled : public Property -{ -public: - SizingEnabled() : Property( - "SizingEnabled", - "Property to get/set the state of the sizable setting for the FrameWindow. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for whether the window frame will be displayed. - - \par Usage: - - Name: FrameEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the windows frame should be displayed. - - "False" to indicate the windows frame should not be displayed. -*/ -class FrameEnabled : public Property -{ -public: - FrameEnabled() : Property( - "FrameEnabled", - "Property to get/set the setting for whether the window frame will be displayed. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for whether the window title-bar will be enabled (or displayed depending upon choice of final widget type). - - \par Usage: - - Name: TitlebarEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the windows title bar should be enabled (and/or visible) - - "False" to indicate the windows title bar should be disabled (and/or hidden) -*/ -class TitlebarEnabled : public Property -{ -public: - TitlebarEnabled() : Property( - "TitlebarEnabled", - "Property to get/set the setting for whether the window title-bar will be enabled (or displayed depending upon choice of final widget type). Value is either \"True\" or \"False\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for whether the window close button will be enabled (or displayed depending upon choice of final widget type). - - \par Usage: - - Name: CloseButtonEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the windows close button should be enabled (and/or visible) - - "False" to indicate the windows close button should be disabled (and/or hidden) -*/ -class CloseButtonEnabled : public Property -{ -public: - CloseButtonEnabled() : Property( - "CloseButtonEnabled", - "Property to get/set the setting for whether the window close button will be enabled (or displayed depending upon choice of final widget type). Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for whether the user is able to roll-up / shade the window. - - \par Usage: - - Name: RollUpEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the user can roll-up / shade the window. - - "False" to indicate the user can not roll-up / shade the window. -*/ -class RollUpEnabled : public Property -{ -public: - RollUpEnabled() : Property( - "RollUpEnabled", - "Property to get/set the setting for whether the user is able to roll-up / shade the window. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the roll-up / shade state of the window. - - \par Usage: - - Name: RollUpState - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the window is / should be rolled-up. - - "False" to indicate the window is not / should not be rolled up -*/ -class RollUpState : public Property -{ -public: - RollUpState() : Property( - "RollUpState", - "Property to get/set the roll-up / shade state of the window. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for whether the user may drag the window around by its title bar. - - \par Usage: - - Name: DragMovingEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the window may be repositioned by the user via dragging. - - "False" to indicate the window may not be repositioned by the user. -*/ -class DragMovingEnabled : public Property -{ -public: - DragMovingEnabled() : Property( - "DragMovingEnabled", - "Property to get/set the setting for whether the user may drag the window around by its title bar. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for the sizing border thickness. - - \par Usage: - - Name: SizingBorderThickness - - Format: "[float]". - - \par Where: - - [float] is the size of the invisible sizing border in screen pixels. -*/ -class SizingBorderThickness : public Property -{ -public: - SizingBorderThickness() : Property( - "SizingBorderThickness", - "Property to get/set the setting for the sizing border thickness. Value is a float specifying the border thickness in pixels.", - "8.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the Font set for the windows title bar. - - \par Usage: - - Name: TitlebarFont - - Format: "[text]". - - \par Where: - - [text] is the name of the Font to assign for this windows title bar. The Font specified must already be loaded. -*/ -class TitlebarFont : public Property -{ -public: - TitlebarFont() : Property( - "TitlebarFont", - "Property to get/set the Font set for the windows title bar. Value is the name of the font to use (must be loaded already).", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to colour used for rendering the caption text. - - \par Usage: - - Name: CaptionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class CaptionColour : public Property -{ -public: - CaptionColour() : Property( - "CaptionColour", - "Property to get/set the colour used for rendering the caption text. Value is \"aarrggbb\" (hex).", - "FF000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the N-S (up-down) sizing cursor image - - \par Usage: - - Name: NSSizingCursorImage - - Format: "set: image:". - -*/ -class NSSizingCursorImage : public Property -{ -public: - NSSizingCursorImage() : Property( - "NSSizingCursorImage", - "Property to get/set the N-S (up-down) sizing cursor image for the FramwWindow. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the E-W (left/right) sizing cursor image - - \par Usage: - - Name: EWSizingCursorImage - - Format: "set: image:". - -*/ -class EWSizingCursorImage : public Property -{ -public: - EWSizingCursorImage() : Property( - "EWSizingCursorImage", - "Property to get/set the E-W (left-right) sizing cursor image for the FramwWindow. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the NW-SE diagonal sizing cursor image - - \par Usage: - - Name: NWSESizingCursorImage - - Format: "set: image:". - -*/ -class NWSESizingCursorImage : public Property -{ -public: - NWSESizingCursorImage() : Property( - "NWSESizingCursorImage", - "Property to get/set the NW-SE diagonal sizing cursor image for the FramwWindow. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the NE-SW diagonal sizing cursor image - - \par Usage: - - Name: NESWSizingCursorImage - - Format: "set: image:". - -*/ -class NESWSizingCursorImage : public Property -{ -public: - NESWSizingCursorImage() : Property( - "NESWSizingCursorImage", - "Property to get/set the NE-SW diagonal sizing cursor image for the FramwWindow. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of FrameWindowProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFrameWindowProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIGUISheet.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIGUISheet.h deleted file mode 100644 index 189f9b6b4b..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIGUISheet.h +++ /dev/null @@ -1,172 +0,0 @@ -/************************************************************************ - filename: CEGUIGUISheet.h - created: 5/6/2004 - author: Paul D Turner - - purpose: Interface to a default window -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIGUISheet_h_ -#define _CEGUIGUISheet_h_ - -#include "CEGUIWindow.h" -#include "CEGUIWindowFactory.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Window class intended to be used as a simple, generic Window. - - This class does no rendering and so appears totally transparent. This window defaults - to position 0.0f, 0.0f with a size of 1.0f x 1.0f. - - /note - The C++ name of this class has been retained for backward compatibility reasons. The intended usage of - this window type has now been extended beyond that of a gui-sheet or root window. -*/ -class CEGUIEXPORT GUISheet : public Window -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - // type name for this widget - static const String WidgetTypeName; //!< The unique typename of this widget - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for GUISheet windows. - */ - GUISheet(const String& type, const String& name) : Window(type, name) {} - - - /*! - \brief - Destructor for GUISheet windows. - */ - virtual ~GUISheet(void) {} - - -protected: - /*! - \brief - Perform the actual rendering for this Window. - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawSelf(float z) {} - - - /*! - \brief - overridden initialise member to set-up our default state. - */ - void initialise(void) - { - Window::initialise(); - - setMaximumSize(Size(1.0f, 1.0f)); - setSize(Size(1.0f, 1.0f)); - } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"GUISheet") return true; - return Window::testClassName_impl(class_name); - } -}; - - -/*! -\brief - Factory class for producing default windows -*/ -class GUISheetFactory : public WindowFactory -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - GUISheetFactory(void) : WindowFactory(GUISheet::WidgetTypeName) { } - ~GUISheetFactory(void){} - - - /*! - \brief - Create a new Window object of whatever type this WindowFactory produces. - - \param name - A unique name that is to be assigned to the newly created Window object - - \return - Pointer to the new Window object. - */ - Window* createWindow(const String& name) - { - return new GUISheet(d_type, name); - } - - - /*! - \brief - Destroys the given Window object. - - \param window - Pointer to the Window object to be destroyed. - - \return - Nothing. - */ - virtual void destroyWindow(Window* window) { if (window->getType() == d_type) delete window; } -}; - -/*! -\brief - typedef for DefaultWindow, which is the new name for GUISheet. -*/ -typedef GUISheet DefaultWindow; - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIGUISheet_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemEntry.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemEntry.h deleted file mode 100644 index 1977ef1381..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemEntry.h +++ /dev/null @@ -1,127 +0,0 @@ -/************************************************************************ - filename: CEGUIItemEntry.h - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Interface to base class for ItemEntry widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIItemEntry_h_ -#define _CEGUIItemEntry_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for item type widgets. -*/ -class CEGUIEXPORT ItemEntry : public Window -{ -public: - /************************************************************************* - Abstract Implementation Functions (must be provided by derived class) - *************************************************************************/ - /*! - \brief - Return the "optimal" size for the item - - \return - Size describing the size in pixel that this ItemEntry's content requires - for non-clipped rendering - */ - virtual Size getItemPixelSize(void) = 0; - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for ItemEntry objects - */ - ItemEntry(const String& type, const String& name); - - - /*! - \brief - Destructor for ItemEntry objects - */ - virtual ~ItemEntry(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add itementry specific events - */ - void addItemEntryEvents(void); - - - /*! - \brief - Perform the actual rendering for this Window. - - \return - Nothing - */ - virtual void populateRenderCahce() {}; - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ItemEntry") return true; - return Window::testClassName_impl(class_name); - } - -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - - -#endif // end of guard _CEGUIItemEntry_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBase.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBase.h deleted file mode 100644 index 983b37ab47..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBase.h +++ /dev/null @@ -1,430 +0,0 @@ -/************************************************************************ - filename: CEGUIItemListBase.h - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on original Listbox code by Paul D Turner) - - purpose: Interface to base class for ItemListBase widgets -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIItemListBase_h_ -#define _CEGUIItemListBase_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIItemListBaseProperties.h" -#include "elements/CEGUIItemEntry.h" - -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for item list widgets. -*/ -class CEGUIEXPORT ItemListBase : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // event names - static const String EventListContentsChanged; //!< Event triggered when the contents of the list is changed. - - - /************************************************************************* - Accessor Methods - *************************************************************************/ - /*! - \brief - Return number of items attached to the list - - \return - the number of items currently attached to this list. - */ - size_t getItemCount(void) const {return d_listItems.size();} - - - /*! - \brief - Return the item at index position \a index. - - \param index - Zero based index of the item to be returned. - - \return - Pointer to the ItemEntry at index position \a index in the list. - - \exception InvalidRequestException thrown if \a index is out of range. - */ - ItemEntry* getItemFromIndex(size_t index) const; - - - /*! - \brief - Return the index of ItemEntry \a item - - \param item - Pointer to a ItemEntry whos zero based index is to be returned. - - \return - Zero based index indicating the position of ItemEntry \a item in the list. - - \exception InvalidRequestException thrown if \a item is not attached to this list. - */ - size_t getItemIndex(const ItemEntry* item) const; - - - /*! - \brief - Search the list for an item with the specified text - - \param text - String object containing the text to be searched for. - - \param start_item - ItemEntry where the search is to begin, the search will not include \a item. If \a item is - NULL, the search will begin from the first item in the list. - - \return - Pointer to the first ItemEntry in the list after \a item that has text matching \a text. If - no item matches the criteria NULL is returned. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - ItemEntry* findItemWithText(const String& text, const ItemEntry* start_item); - - - /*! - \brief - Return whether the specified ItemEntry is in the List - - \return - true if ItemEntry \a item is in the list, false if ItemEntry \a item is not in the list. - */ - bool isItemInList(const ItemEntry* item) const; - - - /*! - \brief - Return wheter this window is automatically resized to fit its content. - - \return - true if automatic resizing is enabled, false if it is disabled. - */ - bool isAutoResizeEnabled() const {return d_autoResize;} - - - /************************************************************************* - Manipulator Methods - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Remove all items from the list. - - Note that this will cause 'AutoDelete' items to be deleted. - */ - void resetList(void); - - - /*! - \brief - Add the given ItemEntry to the list. - - \param item - Pointer to the ItemEntry to be added to the list. Note that it is the passed object that is added to the - list, a copy is not made. If this parameter is NULL, nothing happens. - - \return - Nothing. - */ - void addItem(ItemEntry* item); - - - /*! - \brief - Insert an item into the list after a specified item already in the list. - - Note that if the list is sorted, the item may not end up in the requested position. - - \param item - Pointer to the ItemEntry to be inserted. Note that it is the passed object that is added to the - list, a copy is not made. If this parameter is NULL, nothing happens. - - \param position - Pointer to a ItemEntry that \a item is to be inserted after. If this parameter is NULL, the item is - inserted at the start of the list. - - \return - Nothing. - */ - void insertItem(ItemEntry* item, const ItemEntry* position); - - - /*! - \brief - Removes the given item from the list. If the item is has the auto delete state set, the item will be deleted. - - \param item - Pointer to the ItemEntry that is to be removed. If \a item is not attached to this list then nothing - will happen. - - \return - Nothing. - */ - void removeItem(ItemEntry* item); - - - /*! - \brief - Causes the list to update it's internal state after changes have been made to one or more - attached ItemEntry objects. - - Client code must call this whenever it has made any changes to ItemEntry objects already attached to the - list. If you are just adding items, or removed items to update them prior to re-adding them, there is - no need to call this method. - - \return - Nothing. - */ - void handleUpdatedItemData(void); - - - /*! - \brief - Set whether or not this ItemListBase widget should automatically resize to fit its content. - - \param setting - Boolean value that if true enables automatic resizing, if false disables automatic resizing. - - \return - Nothing. - */ - void setAutoResizeEnabled(bool setting); - - - /*! - \brief - Resize the ItemListBase to exactly fit the content that is attached to it. - Return a Rect object describing, in un-clipped pixels, the window relative area - that is to be used for rendering items. - - \return - Nothing - */ - virtual void sizeToContent(void) {sizeToContent_impl();} - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for ItemListBase base class. - */ - ItemListBase(const String& type, const String& name); - - - /*! - \brief - Destructor for ItemListBase base class. - */ - virtual ~ItemListBase(void); - - -protected: - /************************************************************************* - Abstract Implementation Functions (must be provided by derived class) - *************************************************************************/ - /*! - \brief - Resize the ItemListBase to exactly fit the content that is attached to it. - Return a Rect object describing, in un-clipped pixels, the window relative area - that is to be used for rendering items. - - \return - Nothing - */ - virtual void sizeToContent_impl(void) = 0; - - - /*! - \brief - Returns the Size in unclipped pixels of the content attached to this ItemListBase that is attached to it. - - \return - Nothing. - */ - virtual Size getContentSize() = 0; - - - /*! - \brief - Return a Rect object describing, in un-clipped pixels, the window relative area - that is to be used for rendering list items. - - \return - Rect object describing the window relative area of the that is to be used for rendering - the items. - */ - virtual Rect getItemRenderArea(void) const = 0; - - - /*! - \brief - Setup size and position for the item widgets attached to this ItemListBase - - \return - Nothing. - */ - virtual void layoutItemWidgets() = 0; - - - /*! - \brief - Perform the actual rendering for this Window. - - \return - Nothing - */ - virtual void populateRenderCache() = 0; - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add list box specific events - */ - void addItemListBaseEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addItemListBaseEvents(false); } - - - /*! - \brief - Remove all items from the list. - - \note - Note that this will cause 'AutoDelete' items to be deleted. - - \return - - true if the list contents were changed. - - false if the list contents were not changed (list already empty). - */ - bool resetList_impl(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ItemListBase") return true; - return Window::testClassName_impl(class_name); - } - - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - Handler called internally when the list contents are changed - */ - virtual void onListContentsChanged(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event handlers - *************************************************************************/ - virtual void onSized(WindowEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::vector ItemEntryList; - ItemEntryList d_listItems; //!< list of items in the list. - - // boolean telling if this ItemListBase widget should automatically resize to fit its content. - bool d_autoResize; - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ItemListBaseProperties::AutoResizeEnabled d_autoResizeEnabledProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addItemListBaseProperties( bool bCommon = true ); -protected: - void addUncommonProperties( void ) { __super::addUncommonProperties(); addItemListBaseProperties(false); } -private: - - /*! - \brief - Add given window to child list at an appropriate position - */ - virtual void addChild_impl(Window* wnd); -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIItemListBase_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBaseProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBaseProperties.h deleted file mode 100644 index 12bf75a069..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIItemListBaseProperties.h +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************ - filename: CEGUIItemListBaseProperties.h - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIItemListBaseProperties_h_ -#define _CEGUIItemListBaseProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ItemListBaseProperties namespace section -namespace ItemListBaseProperties -{ - /*! - \brief - Property to access the state of the auto resize enabled setting. - - \par Usage: - - Name: AutoResizeEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate that auto resizing is enabled. - - "False" to indicate that auto resizing is disabled. - */ - class AutoResizeEnabled : public Property - { - public: - AutoResizeEnabled() : Property( - "AutoResizeEnabled", - "Property to get/set the state of the auto resizing enabled setting for the ItemListBase. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} // End of ItemListBaseProperties namespace section -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIItemListBaseProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeader.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeader.h deleted file mode 100644 index ef0e3c4c75..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeader.h +++ /dev/null @@ -1,883 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeader.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for ListHeader widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListHeader_h_ -#define _CEGUIListHeader_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIListHeaderSegment.h" -#include "elements/CEGUIListHeaderProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - EventArgs class used for segment move (sequence changed) events. -*/ -class CEGUIEXPORT HeaderSequenceEventArgs : public WindowEventArgs -{ -public: - HeaderSequenceEventArgs(Window* wnd, uint old_idx, uint new_idx) : WindowEventArgs(wnd), d_oldIdx(old_idx), d_newIdx(new_idx) {}; - - uint d_oldIdx; //!< The original column index of the segment that has moved. - uint d_newIdx; //!< The new column index of the segment that has moved. -}; - - -/*! -\brief - Base class for the multi column list header widget. -*/ -class CEGUIEXPORT ListHeader : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // Event names - static const String EventSortColumnChanged; //!< Event fired when the current sort column changes. - static const String EventSortDirectionChanged; //!< Event fired when the sort direction changes. - static const String EventSegmentSized; //!< Event fired when a segment has been sized by the user (e.window is the segment). - static const String EventSegmentClicked; //!< Event fired when a segment has been clicked by the user (e.window is the segment). - static const String EventSplitterDoubleClicked; //!< Event fired when a segment splitter has been double-clicked. (e.window is the segment). - static const String EventSegmentSequenceChanged; //!< Event fired when the order of the segments has changed. ('e' is a HeaderSequenceEventArgs&) - static const String EventSegmentAdded; //!< Event fired when a segment is added to the header. - static const String EventSegmentRemoved; //!< Event fired when a segment is removed from the header. - static const String EventSortSettingChanged; //!< Event fired when setting that controls user modification to sort configuration changes. - static const String EventDragMoveSettingChanged; //!< Event fired when setting that controls user drag & drop of segments changes. - static const String EventDragSizeSettingChanged; //!< Event fired when setting that controls user sizing of segments changes. - static const String EventSegmentRenderOffsetChanged; //!< Event fired when the rendering offset for the segments changes. - - // values - static const float ScrollSpeed; //!< Speed to scroll at when dragging outside header. - static const float MinimumSegmentPixelWidth; //!< Miniumum width of a segment in pixels. - - - /************************************************************************* - Accessor Methods - *************************************************************************/ - /*! - \brief - Return the number of columns or segments attached to the header. - - \return - uint value equal to the number of columns / segments currently in the header. - */ - uint getColumnCount(void) const; - - - /*! - \brief - Return the ListHeaderSegment object for the specified column - - \param column - zero based column index of the ListHeaderSegment to be returned. - - \return - ListHeaderSegment object at the requested index. - - \exception InvalidRequestException thrown if column is out of range. - */ - ListHeaderSegment& getSegmentFromColumn(uint column) const; - - - /*! - \brief - Return the ListHeaderSegment object with the specified ID. - - \param id - id code of the ListHeaderSegment to be returned. - - \return - ListHeaderSegment object with the ID \a id. If more than one segment has the same ID, only the first one will - ever be returned. - - \exception InvalidRequestException thrown if no segment with the requested ID is attached. - */ - ListHeaderSegment& getSegmentFromID(uint id) const; - - - /*! - \brief - Return the ListHeaderSegment that is marked as being the 'sort key' segment. There must be at least one segment - to successfully call this method. - - \return - ListHeaderSegment object which is the sort-key segment. - - \exception InvalidRequestException thrown if no segments are attached to the ListHeader. - */ - ListHeaderSegment& getSortSegment(void) const; - - - /*! - \brief - Return the zero based column index of the specified segment. - - \param segment - ListHeaderSegment whos zero based index is to be returned. - - \return - Zero based column index of the ListHeaderSegment \a segment. - - \exception InvalidRequestException thrown if \a segment is not attached to this ListHeader. - */ - uint getColumnFromSegment(const ListHeaderSegment& segment) const; - - - /*! - \brief - Return the zero based column index of the segment with the specified ID. - - \param id - ID code of the segment whos column index is to be returned. - - \return - Zero based column index of the first ListHeaderSegment whos ID matches \a id. - - \exception InvalidRequestException thrown if no attached segment has the requested ID. - */ - uint getColumnFromID(uint id) const; - - - /*! - \brief - Return the zero based index of the current sort column. There must be at least one segment/column to successfully call this - method. - - \return - Zero based column index that is the current sort column. - - \exception InvalidRequestException thrown if there are no segments / columns in this ListHeader. - */ - uint getSortColumn(void) const; - - - /*! - \brief - Return the zero based column index of the segment with the specified text. - - \param text - String object containing the text to be searched for. - - \return - Zero based column index of the segment with the specified text. - - \exception InvalidRequestException thrown if no attached segments have the requested text. - */ - uint getColumnWithText(const String& text) const; - - - /*! - \brief - Return the pixel offset to the given ListHeaderSegment. - - \param segment - ListHeaderSegment object that the offset to is to be returned. - - \return - The number of pixels up-to the begining of the ListHeaderSegment described by \a segment. - - \exception InvalidRequestException thrown if \a segment is not attached to the ListHeader. - */ - float getPixelOffsetToSegment(const ListHeaderSegment& segment) const; - - - /*! - \brief - Return the pixel offset to the ListHeaderSegment at the given zero based column index. - - \param column - Zero based column index of the ListHeaderSegment whos pixel offset it to be returned. - - \return - The number of pixels up-to the begining of the ListHeaderSegment located at zero based column - index \a column. - - \exception InvalidRequestException thrown if \a column is out of range. - */ - float getPixelOffsetToColumn(uint column) const; - - - /*! - \brief - Return the total pixel width of all attached segments. - - \return - Sum of the pixel widths of all attached ListHeaderSegment objects. - */ - float getTotalSegmentsPixelExtent(void) const; - - - /*! - \brief - Return the pixel width of the specified column. - - \param column - Zero based column index of the segment whos pixel width is to be returned. - - \return - Pixel width of the ListHeaderSegment at the zero based column index specified by \a column. - - \exception InvalidRequestException thrown if \a column is out of range. - */ - float getColumnPixelWidth(uint column) const; - - - /*! - \brief - Return the currently set sort direction. - - \return - One of the ListHeaderSegment::SortDirection enumerated values specifying the current sort direction. - */ - ListHeaderSegment::SortDirection getSortDirection(void) const; - - - /*! - \brief - Return whether user manipulation of the sort column & direction are enabled. - - \return - true if the user may interactively modify the sort column and direction. false if the user may not - modify the sort column and direction (these can still be set programmatically). - */ - bool isSortingEnabled(void) const; - - - /*! - \brief - Return whether the user may size column segments. - - \return - true if the user may interactively modify the width of column segments, false if they may not. - */ - bool isColumnSizingEnabled(void) const; - - - /*! - \brief - Return whether the user may modify the order of the segments. - - \return - true if the user may interactively modify the order of the column segments, false if they may not. - */ - bool isColumnDraggingEnabled(void) const; - - - /*! - \brief - Return the current segment offset value. This value is used to implement scrolling of the header segments within - the ListHeader area. - - \return - float value specifying the current segment offset value in whatever metrics system is active for the ListHeader. - */ - float getSegmentOffset(void) const {return d_segmentOffset;} - - - /************************************************************************* - Manipulator Methods - *************************************************************************/ - /*! - \brief - Set whether user manipulation of the sort column and direction is enabled. - - \param setting - - true to allow interactive user manipulation of the sort column and direction. - - false to disallow interactive user manipulation of the sort column and direction. - - \return - Nothing. - */ - void setSortingEnabled(bool setting); - - - /*! - \brief - Set the current sort direction. - - \param direction - One of the ListHeaderSegment::SortDirection enumerated values indicating the sort direction to be used. - - \return - Nothing. - */ - void setSortDirection(ListHeaderSegment::SortDirection direction); - - - /*! - \brief - Set the column segment to be used as the sort column. - - \param segment - ListHeaderSegment object indicating the column to be sorted. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a segment is not attached to this ListHeader. - */ - void setSortSegment(const ListHeaderSegment& segment); - - - /*! - \brief - Set the column to be used as the sort column. - - \param column - Zero based column index indicating the column to be sorted. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a column is out of range for this ListHeader. - */ - void setSortColumn(uint column); - - - /*! - \brief - Set the column to to be used for sorting via its ID code. - - \param id - ID code of the column segment that is to be used as the sort column. - - \return - Nothing. - - \exception InvalidRequestException thrown if no segment with ID \a id is attached to the ListHeader. - */ - void setSortColumnFromID(uint id); - - - /*! - \brief - Set whether columns may be sized by the user. - - \param setting - - true to indicate that the user may interactively size segments. - - false to indicate that the user may not interactively size segments. - - \return - Nothing. - */ - void setColumnSizingEnabled(bool setting); - - - /*! - \brief - Set whether columns may be reordered by the user via drag and drop. - - \param setting - - true to indicate the user may change the order of the column segments via drag and drop. - - false to indicate the user may not change the column segment order. - - \return - Nothing. - */ - void setColumnDraggingEnabled(bool setting); - - - /*! - \brief - Add a new column segment to the end of the header. - - \param text - String object holding the initial text for the new segment - - \param id - Client specified ID code to be assigned to the new segment. - - \param width - Initial width of the new segment using the relative metrics system - - \return - Nothing. - */ - void addColumn(const String& text, uint id, float width); - - - /*! - \brief - Insert a new column segment at the specified position. - - \param text - String object holding the initial text for the new segment - - \param id - Client specified ID code to be assigned to the new segment. - - \param width - Initial width of the new segment using the relative metrics system - - \param position - Zero based column index indicating the desired position for the new column. If this is greater than - the current number of columns, the new segment is added to the end if the header. - - \return - Nothing. - */ - void insertColumn(const String& text, uint id, float width, uint position); - - - /*! - \brief - Insert a new column segment at the specified position. - - \param text - String object holding the initial text for the new segment - - \param id - Client specified ID code to be assigned to the new segment. - - \param width - Initial width of the new segment using the relative metrics system - - \param position - ListHeaderSegment object indicating the insert position for the new segment. The new segment will be - inserted before the segment indicated by \a position. - - \return - Nothing. - - \exception InvalidRequestException thrown if ListHeaderSegment \a position is not attached to the ListHeader. - */ - void insertColumn(const String& text, uint id, float width, const ListHeaderSegment& position); - - - /*! - \brief - Removes a column segment from the ListHeader. - - \param column - Zero based column index indicating the segment to be removed. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a column is out of range. - */ - void removeColumn(uint column); - - - /*! - \brief - Remove the specified segment from the ListHeader. - - \param segment - ListHeaderSegment object that is to be removed from the ListHeader. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a segment is not attached to this ListHeader. - */ - void removeSegment(const ListHeaderSegment& segment); - - - /*! - \brief - Moves a column segment into a new position. - - \param column - Zero based column index indicating the column segment to be moved. - - \param position - Zero based column index indicating the new position for the segment. If this is greater than the current number of segments, - the segment is moved to the end of the header. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a column is out of range for this ListHeader. - */ - void moveColumn(uint column, uint position); - - - /*! - \brief - Move a column segment to a new position. - - \param column - Zero based column index indicating the column segment to be moved. - - \param position - ListHeaderSegment object indicating the new position for the segment. The segment at \a column - will be moved behind segment \a position (that is, segment \a column will appear to the right of - segment \a position). - - \return - Nothing. - - \exception InvalidRequestException thrown if \a column is out of range for this ListHeader, or if \a position - is not attached to this ListHeader. - */ - void moveColumn(uint column, const ListHeaderSegment& position); - - - /*! - \brief - Moves a segment into a new position. - - \param segment - ListHeaderSegment object that is to be moved. - - \param position - Zero based column index indicating the new position for the segment. If this is greater than the current number of segments, - the segment is moved to the end of the header. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a segment is not attached to this ListHeader. - */ - void moveSegment(const ListHeaderSegment& segment, uint position); - - - /*! - \brief - Move a segment to a new position. - - \param segment - ListHeaderSegment object that is to be moved. - - \param position - ListHeaderSegment object indicating the new position for the segment. The segment \a segment - will be moved behind segment \a position (that is, segment \a segment will appear to the right of - segment \a position). - - \return - Nothing. - - \exception InvalidRequestException thrown if either \a segment or \a position are not attached to this ListHeader. - */ - void moveSegment(const ListHeaderSegment& segment, const ListHeaderSegment& position); - - - /*! - \brief - Set the current base segment offset. (This implements scrolling of the header segments within - the header area). - - \param offset - New base offset for the first segment. The segments will of offset to the left by the amount specified. - \a offset should be specified using the active metrics system for the ListHeader. - - \return - Nothing. - */ - void setSegmentOffset(float offset); - - - /*! - \brief - Set the pixel width of the specified column. - - \param column - Zero based column index of the segment whos pixel width is to be set. - - \param width - float value specifying the new pixel width to set for the ListHeaderSegment at the zero based column - index specified by \a column. - - \return - Nothing - - \exception InvalidRequestException thrown if \a column is out of range. - */ - void setColumnPixelWidth(uint column, float width); - - - /*! - \brief - Set the column title of the specified column. - - \param column - Column index for set title with in. - - \param title - const char specifying the new title to set for the ListHeaderSegment at the zero based column - index specified by \a column. - - \return - Nothing - */ - void setColumnTitle(uint column, const char *title); - - - /*! - \brief - Get the column title of the specified column. - - \param column - Column index for get title with in. - - \return - String with column title - */ - const char* getColumnTitle(uint column); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for the list header base class. - */ - ListHeader(const String& type, const String& name); - - - /*! - \brief - Destructor for the list header base class. - */ - virtual ~ListHeader(void); - - -protected: - /************************************************************************* - Abstract Implementation Methods - *************************************************************************/ - /*! - \brief - Create and return a pointer to a new ListHeaderSegment based object. - - \param name - String object holding the name that should be given to the new Window. - - \return - Pointer to an ListHeaderSegment based object of whatever type is appropriate for - this ListHeader. - */ - virtual ListHeaderSegment* createNewSegment(const String& name) const = 0; - - - /*! - \brief - Cleanup and destroy the given ListHeaderSegment that was created via the - createNewSegment method. - - \param segment - Pointer to a ListHeaderSegment based object to be destroyed. - - \return - Nothing. - */ - virtual void destroyListSegment(ListHeaderSegment* segment) const = 0; - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Create initialise and return a ListHeaderSegment object, with all events subscribed and ready to use. - */ - ListHeaderSegment* createInitialisedSegment(const String& text, uint id, float width); - - - /*! - \brief - Layout the attached segments - */ - void layoutSegments(void); - - - /*! - \brief - Add ListHeader specific events - */ - void addListHeaderEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addListHeaderEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ListHeader") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - New List header event handlers - *************************************************************************/ - /*! - \brief - Handler called when the sort column is changed. - */ - virtual void onSortColumnChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the sort direction is changed. - */ - virtual void onSortDirectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when a segment is sized by the user. e.window points to the segment. - */ - virtual void onSegmentSized(WindowEventArgs& e); - - - /*! - \brief - Handler called when a segment is clicked by the user. e.window points to the segment. - */ - virtual void onSegmentClicked(WindowEventArgs& e); - - - /*! - \brief - Handler called when a segment splitter / sizer is double-clicked. e.window points to the segment. - */ - virtual void onSplitterDoubleClicked(WindowEventArgs& e); - - - /*! - \brief - Handler called when the segment / column order changes. - */ - virtual void onSegmentSequenceChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when a new segment is added to the header. - */ - virtual void onSegmentAdded(WindowEventArgs& e); - - - /*! - \brief - Handler called when a segment is removed from the header. - */ - virtual void onSegmentRemoved(WindowEventArgs& e); - - - /*! - \brief - Handler called then setting that controls the users ability to modify the search column & direction changes. - */ - virtual void onSortSettingChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the setting that controls the users ability to drag and drop segments changes. - */ - virtual void onDragMoveSettingChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the setting that controls the users ability to size segments changes. - */ - virtual void onDragSizeSettingChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the base rendering offset for the segments (scroll position) changes. - */ - virtual void onSegmentOffsetChanged(WindowEventArgs& e); - - - /************************************************************************* - handlers for events we subscribe to from segments - *************************************************************************/ - bool segmentSizedHandler(const EventArgs& e); - bool segmentMovedHandler(const EventArgs& e); - bool segmentClickedHandler(const EventArgs& e); - bool segmentDoubleClickHandler(const EventArgs& e); - bool segmentDragHandler(const EventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::vector SegmentList; - SegmentList d_segments; //!< Attached segment windows in header order. - ListHeaderSegment* d_sortSegment; //!< Pointer to the segment that is currently set as the sork-key, - bool d_sizingEnabled; //!< true if segments can be sized by the user. - bool d_sortingEnabled; //!< true if the sort criteria modifications by user are enabled (no sorting is actuall done) - bool d_movingEnabled; //!< true if drag & drop moving of columns / segments is enabled. - uint d_uniqueIDNumber; //!< field used to create unique names. - float d_segmentOffset; //!< Base offset used to layout the segments (allows scrolling within the window area) - ListHeaderSegment::SortDirection d_sortDir; //!< Brief copy of the current sort direction. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ListHeaderProperties::SortSettingEnabled d_sortSettingProperty; - static ListHeaderProperties::ColumnsSizable d_sizableProperty; - static ListHeaderProperties::ColumnsMovable d_movableProperty; - static ListHeaderProperties::SortColumnID d_sortColumnIDProperty; - static ListHeaderProperties::SortDirection d_sortDirectionProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addHeaderProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addHeaderProperties(false); } -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIListHeader_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderProperties.h deleted file mode 100644 index 7c46445a8c..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderProperties.h +++ /dev/null @@ -1,177 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeaderProperties.h - created: 11/7/2004 - author: Paul D Turner - - purpose: Interface to the properties for the ListHeader class. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListHeaderProperties_h_ -#define _CEGUIListHeaderProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ListHeaderProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the ListHeader class -*/ -namespace ListHeaderProperties -{ -/*! -\brief - Property to access the setting for user sizing of the column headers. - - \par Usage: - - Name: ColumnsSizable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the column headers can be sized by the user. - - "False" to indicate the column headers can not be sized by the user. -*/ -class ColumnsSizable : public Property -{ -public: - ColumnsSizable() : Property( - "ColumnsSizable", - "Property to get/set the setting for user sizing of the column headers. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for user moving of the column headers. - - \par Usage: - - Name: ColumnsMovable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the column headers can be moved by the user. - - "False" to indicate the column headers can not be moved by the user. -*/ -class ColumnsMovable : public Property -{ -public: - ColumnsMovable() : Property( - "ColumnsMovable", - "Property to get/set the setting for user moving of the column headers. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for user modification of the sort column & direction. - - \par Usage: - - Name: SortSettingEnabled - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the user may modify the sort column and direction by clicking the header segments. - - "False" to indicate the user may not modify the sort column or direction. -*/ -class SortSettingEnabled : public Property -{ -public: - SortSettingEnabled() : Property( - "SortSettingEnabled", - "Property to get/set the setting for for user modification of the sort column & direction. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the sort direction setting of the list header. - - \par Usage: - - Name: SortDirection - - Format: "[text]" - - \par Where [Text] is one of: - - "Ascending" - - "Descending" - - "None" -*/ -class SortDirection : public Property -{ -public: - SortDirection() : Property( - "SortDirection", - "Property to get/set the sort direction setting of the header. Value is the text of one of the SortDirection enumerated value names.", - "None") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current sort column (via ID code). - - \par Usage: - - Name: SortColumnID - - Format: "[uint]". - - \par Where: - - [uint] is any unsigned integer value. -*/ -class SortColumnID : public Property -{ -public: - SortColumnID() : Property( - "SortColumnID", - "Property to get/set the current sort column (via ID code). Value is an unsigned integer number.", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of ListHeaderProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListHeaderProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegment.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegment.h deleted file mode 100644 index 54ad048ea1..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegment.h +++ /dev/null @@ -1,444 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeaderSegment.h - created: 15/6/2004 - author: Paul D Turner - - purpose: Interface to list header segment class. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListHeaderSegment_h_ -#define _CEGUIListHeaderSegment_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIListHeaderSegmentProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for list header segment window -*/ -class CEGUIEXPORT ListHeaderSegment : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // Event names - static const String EventSegmentClicked; //!< Event fired when the segment is clicked. - static const String EventSplitterDoubleClicked; //!< Event fired when the sizer/splitter is double-clicked. - static const String EventSizingSettingChanged; //!< Event fired when the sizing setting changes. - static const String EventSortDirectionChanged; //!< Event fired when the sort direction value changes. - static const String EventMovableSettingChanged; //!< Event fired when the movable setting changes. - static const String EventSegmentDragStart; //!< Event fired when the segment has started to be dragged. - static const String EventSegmentDragStop; //!< Event fired when segment dragging has stopped (via mouse release). - static const String EventSegmentDragPositionChanged; //!< Event fired when the segment drag position has changed. - static const String EventSegmentSized; //!< Event fired when the segment is sized. - static const String EventClickableSettingChanged; //!< Event fired when the clickable state of the segment changes. - - // Defaults - static const float DefaultSizingArea; //!< Default size of the sizing area. - static const float SegmentMoveThreshold; //!< Amount the mouse must be dragged before drag-moving is initiated. - - - /************************************************************************* - Enumerated types - *************************************************************************/ - /*! - \brief - Enumeration of possible values for sorting direction used with ListHeaderSegment classes - */ - enum SortDirection - { - None, //!< Items under this segment should not be sorted. - Ascending, //!< Items under this segment should be sorted in ascending order. - Descending //!< Items under this segment should be sorted in descending order. - }; - - - /************************************************************************* - Accessor Methods - *************************************************************************/ - /*! - \brief - Return whether this segment can be sized. - - \return - true if the segment can be horizontally sized, false if the segment can not be horizontally sized. - */ - bool isSizingEnabled(void) const {return d_sizingEnabled;} - - - /*! - \brief - Return the current sort direction set for this segment. - - Note that this has no impact on the way the segment functions (aside from the possibility - of varied rendering). This is intended as a 'helper setting' to classes that make use of - the ListHeaderSegment objects. - - \return - One of the SortDirection enumerated values indicating the current sort direction set for this - segment. - */ - SortDirection getSortDirection(void) const {return d_sortDir;} - - - /*! - \brief - Return whether drag moving is enabled for this segment. - - \return - true if the segment can be drag moved, false if the segment can not be drag moved. - */ - bool isDragMovingEnabled(void) const {return d_movingEnabled;} - - - /*! - \brief - Return the current drag move position offset (in pixels relative to the top-left corner of the segment). - - \return - Point object describing the drag move offset position. - */ - const Point& getDragMoveOffset(void) const {return d_dragPosition;} - - - /*! - \brief - Return whether the segment is clickable. - - \return - true if the segment can be clicked, false of the segment can not be clicked (so no highlighting or events will happen). - */ - bool isClickable(void) const {return d_allowClicks;} - - - /************************************************************************* - Manipulator Methods - *************************************************************************/ - /*! - \brief - Set whether this segment can be sized. - - \param setting - true if the segment may be horizontally sized, false if the segment may not be horizontally sized. - - \return - Nothing. - */ - void setSizingEnabled(bool setting); - - - /*! - \brief - Set the current sort direction set for this segment. - - Note that this has no impact on the way the segment functions (aside from the possibility - of varied rendering). This is intended as a 'helper setting' to classes that make use of - the ListHeaderSegment objects. - - \param sort_dir - One of the SortDirection enumerated values indicating the current sort direction set for this - segment. - - \return - Nothing - */ - void setSortDirection(SortDirection sort_dir); - - - /*! - \brief - Set whether drag moving is allowed for this segment. - - \param setting - true if the segment may be drag moved, false if the segment may not be drag moved. - - \return - Nothing. - */ - void setDragMovingEnabled(bool setting); - - - /*! - \brief - Set whether the segment is clickable. - - \param setting - true if the segment may be clicked, false of the segment may not be clicked (so no highlighting or events will happen). - - \return - Nothing. - */ - void setClickable(bool setting); - - - /************************************************************************* - Construction & Destruction - *************************************************************************/ - /*! - \brief - Constructor for list header segment base class - */ - ListHeaderSegment(const String& type, const String& name); - - - /*! - \brief - Destructor for list header segment base class. - */ - virtual ~ListHeaderSegment(void); - - -protected: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Add list header segment specific events - */ - void addHeaderSegmentEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addHeaderSegmentEvents(false); } - - - /*! - \brief - Update state for drag sizing. - - \param local_mouse - Mouse position as a pixel offset from the top-left corner of this window. - - \return - Nothing. - */ - void doDragSizing(const Point& local_mouse); - - - /*! - \brief - Update state for drag moving. - - \param local_mouse - Mouse position as a pixel offset from the top-left corner of this window. - - \return - Nothing. - */ - void doDragMoving(const Point& local_mouse); - - - /*! - \brief - Initialise the required states to put the widget into drag-moving mode. - */ - void initDragMoving(void); - - - /*! - \brief - Initialise the required states when we are hovering over the sizing area. - */ - void initSizingHoverState(void); - - - /*! - \brief - Initialise the required states when we are hovering over the main segment area. - */ - void initSegmentHoverState(void); - - - /*! - \brief - Return whether the required minimum movement threshold before initiating drag-moving - has been exceeded. - - \param local_mouse - Mouse position as a pixel offset from the top-left corner of this window. - - \return - true if the threshold has been exceeded and drag-moving should be initiated, or false - if the threshold has not been exceeded. - */ - bool isDragMoveThresholdExceeded(const Point& local_mouse); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ListHeaderSegment") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - New Event Handlers - *************************************************************************/ - /*! - \brief - Handler called when segment is clicked. - */ - virtual void onSegmentClicked(WindowEventArgs& e); - - - /*! - \brief - Handler called when the sizer/splitter is double-clicked. - */ - virtual void onSplitterDoubleClicked(WindowEventArgs& e); - - - /*! - \brief - Handler called when sizing setting changes. - */ - virtual void onSizingSettingChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the sort direction value changes. - */ - virtual void onSortDirectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the drag-movable setting is changed. - */ - virtual void onMovableSettingChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the user starts dragging the segment. - */ - virtual void onSegmentDragStart(WindowEventArgs& e); - - - /*! - \brief - Handler called when the user stops dragging the segment (releases mouse button) - */ - virtual void onSegmentDragStop(WindowEventArgs& e); - - - /*! - \brief - Handler called when the drag position changes. - */ - virtual void onSegmentDragPositionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the segment is sized. - */ - virtual void onSegmentSized(WindowEventArgs& e); - - - /*! - \brief - Handler called when the clickable setting for the segment changes - */ - virtual void onClickableSettingChanged(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event Handlers - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onMouseDoubleClicked(MouseEventArgs& e); - virtual void onMouseLeaves(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - const Image* d_sizingMouseCursor; //!< Image to use for mouse when sizing (typically set by derived class). - const Image* d_movingMouseCursor; //!< Image to use for mouse when moving (typically set by derived class). - - float d_splitterSize; //!< pixel width of the sizing area. - bool d_splitterHover; //!< True if the mouse is over the splitter - - bool d_dragSizing; //!< true when we are being sized. - Point d_dragPoint; //!< point we are being dragged at when sizing or moving. - - SortDirection d_sortDir; //!< Direction for sorting (used for deciding what icon to display). - - bool d_segmentHover; //!< true when the mouse is within the segment area (and not in sizing area). - bool d_segmentPushed; //!< true when the left mouse button has been pressed within the confines of the segment. - bool d_sizingEnabled; //!< true when sizing is enabled for this segment. - bool d_movingEnabled; //!< True when drag-moving is enabled for this segment; - bool d_dragMoving; //!< true when segment is being drag moved. - Point d_dragPosition; //!< position of dragged segment. - bool d_allowClicks; //!< true if the segment can be clicked. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ListHeaderSegmentProperties::Clickable d_clickableProperty; - static ListHeaderSegmentProperties::Dragable d_dragableProperty; - static ListHeaderSegmentProperties::Sizable d_sizableProperty; - static ListHeaderSegmentProperties::SortDirection d_sortDirectionProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addHeaderSegmentProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addHeaderSegmentProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIListHeaderSegment_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegmentProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegmentProperties.h deleted file mode 100644 index 0697ea2597..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListHeaderSegmentProperties.h +++ /dev/null @@ -1,152 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeaderSegmentProperties.h - created: 11/7/2004 - author: Paul D Turner - - purpose: Interface to properties for ListHeaderSegment class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListHeaderSegmentProperties_h_ -#define _CEGUIListHeaderSegmentProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ListHeaderSegmentProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the ListHeaderSegment class -*/ -namespace ListHeaderSegmentProperties -{ -/*! -\brief - Property to access the sizable setting of the header segment. - - \par Usage: - - Name: Sizable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the segment can be sized by the user. - - "False" to indicate the segment can not be sized by the user. -*/ -class Sizable : public Property -{ -public: - Sizable() : Property( - "Sizable", - "Property to get/set the sizable setting of the header segment. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the click-able setting of the header segment. - - \par Usage: - - Name: Clickable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the segment can be clicked by the user. - - "False" to indicate the segment can not be clicked by the user. -*/ -class Clickable : public Property -{ -public: - Clickable() : Property( - "Clickable", - "Property to get/set the click-able setting of the header segment. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the drag-able setting of the header segment. - - \par Usage: - - Name: Dragable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the segment can be dragged by the user. - - "False" to indicate the segment can not be dragged by the user. -*/ -class Dragable : public Property -{ -public: - Dragable() : Property( - "Dragable", - "Property to get/set the drag-able setting of the header segment. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the sort direction setting of the header segment. - - \par Usage: - - Name: SortDirection - - Format: "[text]" - - \par Where [Text] is one of: - - "Ascending" - - "Descending" - - "None" -*/ -class SortDirection : public Property -{ -public: - SortDirection() : Property( - "SortDirection", - "Property to get/set the sort direction setting of the header segment. Value is the text of one of the SortDirection enumerated value names.", - "None") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of ListHeaderSegmentProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListHeaderSegmentProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListbox.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListbox.h deleted file mode 100644 index 0f013d057d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListbox.h +++ /dev/null @@ -1,744 +0,0 @@ -/************************************************************************ - filename: CEGUIListbox.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Listbox widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListbox_h_ -#define _CEGUIListbox_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIListboxProperties.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for standard Listbox widget. -*/ -class CEGUIEXPORT Listbox : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // event names - static const String EventListContentsChanged; //!< Event triggered when the contents of the list is changed. - static const String EventSelectionChanged; //!< Event triggered when there is a change to the currently selected item(s). - static const String EventSortModeChanged; //!< Event triggered when the sort mode setting changes. - static const String EventMultiselectModeChanged; //!< Event triggered when the multi-select mode setting changes. - static const String EventVertScrollbarModeChanged; //!< Event triggered when the vertical scroll bar 'force' setting changes. - static const String EventHorzScrollbarModeChanged; //!< Event triggered when the horizontal scroll bar 'force' setting changes. - - - /************************************************************************* - Accessor Methods - *************************************************************************/ - /*! - \brief - Return number of items attached to the list box - - \return - the number of items currently attached to this list box. - */ - size_t getItemCount(void) const {return d_listItems.size();} - - - /*! - \brief - Return the number of selected items in the list box. - - \return - Total number of attached items that are in the selected state. - */ - size_t getSelectedCount(void) const; - - - /*! - \brief - Return a pointer to the first selected item. - - \return - Pointer to a ListboxItem based object that is the first selected item in the list. will return NULL if - no item is selected. - */ - ListboxItem* getFirstSelectedItem(void) const; - - - /*! - \brief - Return a pointer to the next selected item after item \a start_item - - \param start_item - Pointer to the ListboxItem where the search for the next selected item is to begin. If this - parameter is NULL, the search will begin with the first item in the list box. - - \return - Pointer to a ListboxItem based object that is the next selected item in the list after - the item specified by \a start_item. Will return NULL if no further items were selected. - - \exception InvalidRequestException thrown if \a start_item is not attached to this list box. - */ - ListboxItem* getNextSelected(const ListboxItem* start_item) const; - - - /*! - \brief - Return the item at index position \a index. - - \param index - Zero based index of the item to be returned. - - \return - Pointer to the ListboxItem at index position \a index in the list box. - - \exception InvalidRequestException thrown if \a index is out of range. - */ - ListboxItem* getListboxItemFromIndex(size_t index) const; - - - /*! - \brief - Return the index of ListboxItem \a item - - \param item - Pointer to a ListboxItem whos zero based index is to be returned. - - \return - Zero based index indicating the position of ListboxItem \a item in the list box. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - size_t getItemIndex(const ListboxItem* item) const; - - - /*! - \brief - return whether list sorting is enabled - - \return - true if the list is sorted, false if the list is not sorted - */ - bool isSortEnabled(void) const {return d_sorted;} - - /*! - \brief - return whether multi-select is enabled - - \return - true if multi-select is enabled, false if multi-select is not enabled. - */ - bool isMultiselectEnabled(void) const {return d_multiselect;} - - bool isItemTooltipsEnabled(void) const {return d_itemTooltips;} - - /*! - \brief - return whether the string at index position \a index is selected - - \param index - Zero based index of the item to be examined. - - \return - true if the item at \a index is selected, false if the item at \a index is not selected. - - \exception InvalidRequestException thrown if \a index is out of range. - */ - bool isItemSelected(size_t index) const; - - - /*! - \brief - Search the list for an item with the specified text - - \param text - String object containing the text to be searched for. - - \param start_item - ListboxItem where the search is to begin, the search will not include \a item. If \a item is - NULL, the search will begin from the first item in the list. - - \return - Pointer to the first ListboxItem in the list after \a item that has text matching \a text. If - no item matches the criteria NULL is returned. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - ListboxItem* findItemWithText(const String& text, const ListboxItem* start_item); - - - /*! - \brief - Return whether the specified ListboxItem is in the List - - \return - true if ListboxItem \a item is in the list, false if ListboxItem \a item is not in the list. - */ - bool isListboxItemInList(const ListboxItem* item) const; - - - /*! - \brief - Return whether the vertical scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isVertScrollbarAlwaysShown(void) const; - - - /*! - \brief - Return whether the horizontal scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isHorzScrollbarAlwaysShown(void) const; - - - /************************************************************************* - Manipulator Methods - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Remove all items from the list. - - Note that this will cause 'AutoDelete' items to be deleted. - */ - void resetList(void); - - - /*! - \brief - Add the given ListboxItem to the list. - - \param item - Pointer to the ListboxItem to be added to the list. Note that it is the passed object that is added to the - list, a copy is not made. If this parameter is NULL, nothing happens. - - \return - Nothing. - */ - void addItem(ListboxItem* item); - - - /*! - \brief - Insert an item into the list box after a specified item already in the list. - - Note that if the list is sorted, the item may not end up in the requested position. - - \param item - Pointer to the ListboxItem to be inserted. Note that it is the passed object that is added to the - list, a copy is not made. If this parameter is NULL, nothing happens. - - \param position - Pointer to a ListboxItem that \a item is to be inserted after. If this parameter is NULL, the item is - inserted at the start of the list. - - \return - Nothing. - - \exception InvalidRequestException thrown if no ListboxItem \a position is attached to this list box. - */ - void insertItem(ListboxItem* item, const ListboxItem* position); - - - /*! - \brief - Removes the given item from the list box. If the item is has the auto delete state set, the item will be deleted. - - \param item - Pointer to the ListboxItem that is to be removed. If \a item is not attached to this list box then nothing - will happen. - - \return - Nothing. - */ - void removeItem(const ListboxItem* item); - - - /*! - \brief - Clear the selected state for all items. - - \return - Nothing. - */ - void clearAllSelections(void); - - - /*! - \brief - Set whether the list should be sorted. - - \param setting - true if the list should be sorted, false if the list should not be sorted. - - \return - Nothing. - */ - void setSortingEnabled(bool setting); - - - /*! - \brief - Set whether the list should allow multiple selections or just a single selection - - \param setting - true if the widget should allow multiple items to be selected, false if the widget should only allow - a single selection. - - \return - Nothing. - */ - void setMultiselectEnabled(bool setting); - - - /*! - \brief - Set whether the vertical scroll bar should always be shown. - - \param setting - true if the vertical scroll bar should be shown even when it is not required. false if the vertical - scroll bar should only be shown when it is required. - - \return - Nothing. - */ - void setShowVertScrollbar(bool setting); - - - /*! - \brief - Set whether the horizontal scroll bar should always be shown. - - \param setting - true if the horizontal scroll bar should be shown even when it is not required. false if the horizontal - scroll bar should only be shown when it is required. - - \return - Nothing. - */ - void setShowHorzScrollbar(bool setting); - - void setItemTooltipsEnabled(bool setting); - /*! - \brief - Set the select state of an attached ListboxItem. - - This is the recommended way of selecting and deselecting items attached to a list box as it respects the - multi-select mode setting. It is possible to modify the setting on ListboxItems directly, but that approach - does not respect the settings of the list box. - - \param item - The ListboxItem to be affected. This item must be attached to the list box. - - \param state - true to select the item, false to de-select the item. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - void setItemSelectState(ListboxItem* item, bool state); - - - /*! - \brief - Set the select state of an attached ListboxItem. - - This is the recommended way of selecting and deselecting items attached to a list box as it respects the - multi-select mode setting. It is possible to modify the setting on ListboxItems directly, but that approach - does not respect the settings of the list box. - - \param item_index - The zero based index of the ListboxItem to be affected. This must be a valid index (0 <= index < getItemCount()) - - \param state - true to select the item, false to de-select the item. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a item_index is out of range for the list box - */ - void setItemSelectState(size_t item_index, bool state); - - - /*! - \brief - Causes the list box to update it's internal state after changes have been made to one or more - attached ListboxItem objects. - - Client code must call this whenever it has made any changes to ListboxItem objects already attached to the - list box. If you are just adding items, or removed items to update them prior to re-adding them, there is - no need to call this method. - - \return - Nothing. - */ - void handleUpdatedItemData(void); - - - /*! - \brief - Ensure the item at the specified index is visible within the list box. - - \param item_index - Zero based index of the item to be made visible in the list box. If this value is out of range, the - list is always scrolled to the bottom. - - \return - Nothing. - */ - void ensureItemIsVisible(size_t item_index); - - - /*! - \brief - Ensure the item at the specified index is visible within the list box. - - \param item - Pointer to the ListboxItem to be made visible in the list box. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a item is not attached to this list box. - */ - void ensureItemIsVisible(const ListboxItem* item); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for Listbox base class. - */ - Listbox(const String& type, const String& name); - - - /*! - \brief - Destructor for Listbox base class. - */ - virtual ~Listbox(void); - - -protected: - /************************************************************************* - Abstract Implementation Functions (must be provided by derived class) - *************************************************************************/ - /*! - \brief - Return a Rect object describing, in un-clipped pixels, the window relative area - that is to be used for rendering list items. - - \return - Rect object describing the area of the Window to be used for rendering - list box items. - */ - virtual Rect getListRenderArea(void) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as vertical scroll bar - - \param name - String holding the name to be given to the created widget component. - - \return - Pointer to a Scrollbar to be used for scrolling the list vertically. - */ - virtual Scrollbar* createVertScrollbar(const String& name) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as horizontal scroll bar - - \param name - String holding the name to be given to the created widget component. - - \return - Pointer to a Scrollbar to be used for scrolling the list horizontally. - */ - virtual Scrollbar* createHorzScrollbar(const String& name) const = 0; - - - /*! - \brief - Perform caching of the widget control frame and other 'static' areas. This - method should not render the actual items. Note that the items are typically - rendered to layer 3, other layers can be used for rendering imagery behind and - infront of the items. - - \return - Nothing. - */ - virtual void cacheListboxBaseImagery() = 0; - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add list box specific events - */ - void addListboxEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addListboxEvents(false); } - - - /*! - \brief - display required integrated scroll bars according to current state of the list box and update their values. - */ - void configureScrollbars(void); - - /*! - \brief - select all strings between positions \a start and \a end. (inclusive) - including \a end. - */ - void selectRange(size_t start, size_t end); - - - /*! - \brief - Return the sum of all item heights - */ - float getTotalItemsHeight(void) const; - - - /*! - \brief - Return the width of the widest item - */ - float getWidestItemWidth(void) const; - - - /*! - \brief - Clear the selected state for all items (implementation) - - \return - true if some selections were cleared, false nothing was changed. - */ - bool clearAllSelections_impl(void); - - - /*! - \brief - Return the ListboxItem under the given window local pixel co-ordinate. - - \return - ListboxItem that is under window pixel co-ordinate \a pt, or NULL if no - item is under that position. - */ - ListboxItem* getItemAtPoint(const Point& pt) const; - - - /*! - \brief - Remove all items from the list. - - \note - Note that this will cause 'AutoDelete' items to be deleted. - - \return - - true if the list contents were changed. - - false if the list contents were not changed (list already empty). - */ - bool resetList_impl(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Listbox") return true; - return Window::testClassName_impl(class_name); - } - - /*! - \brief - Internal handler that is triggered when the user interacts with the scrollbars. - */ - bool handle_scrollChange(const EventArgs& args); - - // overridden from Window base class. - void populateRenderCache(); - - - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - Handler called internally when the list contents are changed - */ - virtual void onListContentsChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the currently selected item or items changes. - */ - virtual void onSelectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the sort mode setting changes. - */ - virtual void onSortModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the multi-select mode setting changes. - */ - virtual void onMultiselectModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the forced display of the vertical scroll bar setting changes. - */ - virtual void onVertScrollbarModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called internally when the forced display of the horizontal scroll bar setting changes. - */ - virtual void onHorzScrollbarModeChanged(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event handlers - *************************************************************************/ - virtual void onSized(WindowEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseWheel(MouseEventArgs& e); - virtual void onMouseMove(MouseEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::vector LBItemList; - bool d_sorted; //!< true if list is sorted - bool d_multiselect; //!< true if multi-select is enabled - bool d_forceVertScroll; //!< true if vertical scrollbar should always be displayed - bool d_forceHorzScroll; //!< true if horizontal scrollbar should always be displayed - bool d_itemTooltips; //!< true if each item should have an individual tooltip - Scrollbar* d_vertScrollbar; //!< vertical scroll-bar widget - Scrollbar* d_horzScrollbar; //!< horizontal scroll-bar widget - LBItemList d_listItems; //!< list of items in the list box. - ListboxItem* d_lastSelected; //!< holds pointer to the last selected item (used in range selections) - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ListboxProperties::Sort d_sortProperty; - static ListboxProperties::MultiSelect d_multiSelectProperty; - static ListboxProperties::ForceVertScrollbar d_forceVertProperty; - static ListboxProperties::ForceHorzScrollbar d_forceHorzProperty; - static ListboxProperties::ItemTooltips d_itemTooltipsProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addListboxProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addListboxProperties(false); } -}; - - -/*! -\brief - Helper function used in sorting to compare two list box item text strings - via the ListboxItem pointers and return if \a a is less than \a b. -*/ -bool lbi_less(const ListboxItem* a, const ListboxItem* b); - - -/*! -\brief - Helper function used in sorting to compare two list box item text strings - via the ListboxItem pointers and return if \a a is greater than \a b. -*/ -bool lbi_greater(const ListboxItem* a, const ListboxItem* b); - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIListbox_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxImageItem.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxImageItem.h deleted file mode 100644 index 5759a0ff7f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxImageItem.h +++ /dev/null @@ -1,127 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxImageItem.h - created: 25/2/2006 - author: C E Etheredge - - purpose: Interface for list box image items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListboxImageItem_h_ -#define _CEGUIListboxImageItem_h_ -#include "elements/CEGUIListboxItem.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class used for textual items in a list box. -*/ -class CEGUIEXPORT ListboxImageItem : public ListboxItem -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - static const colour DefaultTextColour; //!< Default text colour. - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - base class constructor - */ - ListboxImageItem(const Image* image, uint item_id = 0, void* item_data = NULL, bool disabled = false, bool auto_delete = true); - - - /*! - \brief - base class destructor - */ - virtual ~ListboxImageItem(void) {} - - - /************************************************************************* - Accessor methods - *************************************************************************/ - /*! - \brief - Return a pointer to the image being used by this ListboxImageItem - - \return - Image to be used for rendering this item - */ - const Image* getImage(void) const; - - - /************************************************************************* - Manipulator methods - *************************************************************************/ - /*! - \brief - Set the image to be used by this ListboxImageItem - - \param font - Image to be used for rendering this item - - \return - Nothing - */ - void setImage(const Image* image) {d_bSizeChanged |= (d_image != image); d_image = image;} - - - /************************************************************************* - Operators - *************************************************************************/ - /*! - \brief - Less-than operator, compares item texts. - */ - virtual bool operator<(const ListboxItem& rhs) const; - - - /*! - \brief - Greater-than operator, compares item texts. - */ - virtual bool operator>(const ListboxItem& rhs) const; - - - /************************************************************************* - Required implementations of pure virtuals from the base class. - *************************************************************************/ - Size getPixelSize(void); - void draw(const Vector3& position, float alpha, const Rect& clipper) const; - void draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const; - -protected: - /************************************************************************* - Implementation Data - *************************************************************************/ - const Image* d_image; //!< Rendered image; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListboxImageItem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxItem.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxItem.h deleted file mode 100644 index 1d77067b52..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxItem.h +++ /dev/null @@ -1,451 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxItem.h - created: 8/6/2004 - author: Paul D Turner - - purpose: Interface to base class for list items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListboxItem_h_ -#define _CEGUIListboxItem_h_ - -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIColourRect.h" -#include "CEGUIRenderCache.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for list box items -*/ -class CEGUIEXPORT ListboxItem -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - static const colour DefaultSelectionColour; //!< Default selection brush colour. - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - base class constructor - */ - ListboxItem(const String& text, uint item_id = 0, void* item_data = NULL, bool disabled = false, bool auto_delete = true); - - - /*! - \brief - base class destructor - */ - virtual ~ListboxItem(void) {} - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - return the text string set for this list box item. - - Note that even if the item does not render text, the text string can still be useful, since it - is used for sorting list box items. - - \return - String object containing the current text for the list box item. - */ - const String& getText(bool bidified=false) const {return bidified ? d_itemText : d_itemText_raw;} - const String& getSortText(void) const {return d_itemSortText.empty () ? d_itemText_raw : d_itemSortText;} - const String& getTooltipText(void) const {return d_tooltipText;} - - /*! - \brief - Return the current ID assigned to this list box item. - - Note that the system does not make use of this value, client code can assign any meaning it - wishes to the ID. - - \return - ID code currently assigned to this list box item - */ - uint getID(void) const {return d_itemID;} - - - /*! - \brief - Return the pointer to any client assigned user data attached to this lis box item. - - Note that the system does not make use of this data, client code can assign any meaning it - wishes to the attached data. - - \return - Pointer to the currently assigned user data. - */ - void* getUserData(void) const {return d_itemData;} - - - /*! - \brief - return whether this item is selected. - - \return - true if the item is selected, false if the item is not selected. - */ - bool isSelected(void) const {return d_selected;} - - - /*! - \brief - return whether this item is disabled. - - \return - true if the item is disabled, false if the item is enabled. - */ - bool isDisabled(void) const {return d_disabled;} - - - /*! - \brief - return whether this item will be automatically deleted when the list box it is attached to - is destroyed, or when the item is removed from the list box. - - \return - true if the item object will be deleted by the system when the list box it is attached to is - destroyed, or when the item is removed from the list. false if client code must destroy the - item after it is removed from the list. - */ - bool isAutoDeleted(void) const {return d_autoDelete;} - - - /*! - \brief - Get the owner window for this ListboxItem. - - The owner of a ListboxItem is typically set by the list box widgets when an item is added or inserted. - - \return - Ponter to the window that is considered the owner of this ListboxItem. - */ - const Window* getOwnerWindow(const Window* owner) {return d_owner;} - - - /*! - \brief - Return the current colours used for selection highlighting. - - \return - ColourRect object describing the currently set colours - */ - ColourRect getSelectionColours(void) const {return d_selectCols;} - - - /*! - \brief - Return the current selection highlighting brush. - - \return - Pointer to the Image object currently used for selection highlighting. - */ - const Image* getSelectionBrushImage(void) const {return d_selectBrush;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - set the text string for this list box item. - - Note that even if the item does not render text, the text string can still be useful, since it - is used for sorting list box items. - - \param text - String object containing the text to set for the list box item. - - \return - Nothing. - */ - void setText(const String& text, const char* sortText); - - void setTooltipText(const String& text) {d_tooltipText = text;} - - /*! - \brief - Set the ID assigned to this list box item. - - Note that the system does not make use of this value, client code can assign any meaning it - wishes to the ID. - - \param item_id - ID code to be assigned to this list box item - - \return - Nothing. - */ - void setID(uint item_id) {d_itemID = item_id;} - - - /*! - \brief - Set the client assigned user data attached to this lis box item. - - Note that the system does not make use of this data, client code can assign any meaning it - wishes to the attached data. - - \param item_data - Pointer to the user data to attach to this list item. - - \return - Nothing. - */ - void setUserData(void* item_data) {d_itemData = item_data;} - - - /*! - \brief - set whether this item is selected. - - \param setting - true if the item is selected, false if the item is not selected. - - \return - Nothing. - */ - void setSelected(bool setting) {if(d_disabled==false){d_selected = setting;}} - - - /*! - \brief - set whether this item is disabled. - - \param setting - true if the item is disabled, false if the item is enabled. - - \return - Nothing. - */ - void setDisabled(bool setting) {d_disabled = setting;} - - /*! - \brief - Set whether this item will be automatically deleted when the list box it is attached to - is destroyed, or when the item is removed from the list box. - - \param setting - true if the item object should be deleted by the system when the list box it is attached to is - destroyed, or when the item is removed from the list. false if client code will destroy the - item after it is removed from the list. - - \return - Nothing. - */ - void setAutoDeleted(bool setting) {d_autoDelete = setting;} - - - /*! - \brief - Set the owner window for this ListboxItem. This is called by all the list box widgets when - an item is added or inserted. - - \param owner - Ponter to the window that should be considered the owner of this ListboxItem. - - \return - Nothing - */ - void setOwnerWindow(const Window* owner) {d_owner = owner;} - - - /*! - \brief - Set the colours used for selection highlighting. - - \param cols - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setSelectionColours(const ColourRect& cols) {d_selectCols = cols;} - - - /*! - \brief - Set the colours used for selection highlighting. - - \param top_left_colour - Colour (as ARGB value) to be applied to the top-left corner of the selection area. - - \param top_right_colour - Colour (as ARGB value) to be applied to the top-right corner of the selection area. - - \param bottom_left_colour - Colour (as ARGB value) to be applied to the bottom-left corner of the selection area. - - \param bottom_right_colour - Colour (as ARGB value) to be applied to the bottom-right corner of the selection area. - - \return - Nothing. - */ - void setSelectionColours(colour top_left_colour, colour top_right_colour, colour bottom_left_colour, colour bottom_right_colour); - - - /*! - \brief - Set the colours used for selection highlighting. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setSelectionColours(colour col) {setSelectionColours(col, col, col, col);} - - - /*! - \brief - Set the selection highlighting brush image. - - \param image - Pointer to the Image object to be used for selection highlighting. - - \return - Nothing. - */ - void setSelectionBrushImage(const Image* image) {d_selectBrush = image;} - - - /*! - \brief - Set the selection highlighting brush image. - - \param imageset - Name of the imagest containing the image to be used. - - \param image - Name of the image to be used - - \return - Nothing. - */ - void setSelectionBrushImage(const String& imageset, const String& image); - - - /************************************************************************* - Abstract portion of interface - *************************************************************************/ - /*! - \brief - Return the rendered pixel size of this list box item. - - \return - Size object describing the size of the list box item in pixels. - */ - virtual Size getPixelSize(void) = 0; - - - /*! - \brief - Draw the list box item in its current state - - \param position - Vecor3 object describing the upper-left corner of area that should be rendered in to for the draw operation. - - \param alpha - Alpha value to be used when rendering the item (between 0.0f and 1.0f). - - \param clipper - Rect object describing the clipping rectangle for the draw operation. - - \return - Nothing. - */ - virtual void draw(const Vector3& position, float alpha, const Rect& clipper) const = 0; - - virtual void draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const = 0; - - /************************************************************************* - Operators - *************************************************************************/ - /*! - \brief - Less-than operator, compares item texts. - */ - virtual bool operator<(const ListboxItem& rhs) const {return getSortText() < rhs.getSortText();} - - - /*! - \brief - Greater-than operator, compares item texts. - */ - virtual bool operator>(const ListboxItem& rhs) const {return getSortText() > rhs.getSortText();} - - -protected: - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - Return a ColourRect object describing the colours in \a cols after having their alpha - component modulated by the value \a alpha. - */ - ColourRect getModulateAlphaColourRect(const ColourRect& cols, float alpha) const; - - - /*! - \brief - Return a colour value describing the colour specified by \a col after having its alpha - component modulated by the value \a alpha. - */ - colour calculateModulatedAlphaColour(colour col, float alpha) const; - - - /************************************************************************* - Implementation Data - *************************************************************************/ - String d_itemText; //!< Text for this list box item. If not rendered, this is still used for list sorting. - String d_itemText_raw; //!< Non bidified text - String d_itemSortText; // Used for sorting if not empty - String d_tooltipText; //!< Text for the individual tooltip of this item - uint d_itemID; //!< ID code assigned by client code. This has no meaning within the GUI system. - void* d_itemData; //!< Pointer to some client code data. This has no meaning within the GUI system. - bool d_selected; //!< true if this item is selected. false if the item is not selected. - bool d_disabled; //!< true if this item is disabled. false if the item is not disabled. - bool d_autoDelete; //!< true if the system should destroy this item, false if client code will destroy the item. - bool d_bSizeChanged; - const Window* d_owner; //!< Pointer to the window that owns this item. - ColourRect d_selectCols; //!< Colours used for selection highlighting. - const Image* d_selectBrush; //!< Image used for rendering selection. - Size d_savedPixelSize; -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListboxItem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxNumberItem.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxNumberItem.h deleted file mode 100644 index 08ba228b73..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxNumberItem.h +++ /dev/null @@ -1,202 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxNumberItem.h - created: 25/2/2006 - author: C E Etheredge - - purpose: Interface for list box text items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListboxNumberItem_h_ -#define _CEGUIListboxNumberItem_h_ -#include "elements/CEGUIListboxItem.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class used for textual items in a list box. -*/ -class CEGUIEXPORT ListboxNumberItem : public ListboxItem -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - static const colour DefaultTextColour; //!< Default text colour. - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - base class constructor - */ - ListboxNumberItem(const String& text, uint item_id = 0, void* item_data = NULL, bool disabled = false, bool auto_delete = true); - - - /*! - \brief - base class destructor - */ - virtual ~ListboxNumberItem(void) {} - - - /************************************************************************* - Accessor methods - *************************************************************************/ - /*! - \brief - Return a pointer to the font being used by this ListboxNumberItem - - This method will try a number of places to find a font to be used. If no font can be - found, NULL is returned. - - \return - Font to be used for rendering this item - */ - const Font* getFont(void) const; - - - /*! - \brief - Return the current colours used for text rendering. - - \return - ColourRect object describing the currently set colours - */ - ColourRect getTextColours(void) const {return d_textCols;} - - - /************************************************************************* - Manipulator methods - *************************************************************************/ - /*! - \brief - Set the font to be used by this ListboxNumberItem - - \param font - Font to be used for rendering this item - - \return - Nothing - */ - void setFont(const Font* font) {d_bSizeChanged |= (d_font != font); d_font = font;} - - - /*! - \brief - Set the font to be used by this ListboxNumberItem - - \param font_name - String object containing the name of the Font to be used for rendering this item - - \return - Nothing - */ - void setFont(const String& font_name); - - - /*! - \brief - Set the colours used for text rendering. - - \param cols - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setTextColours(const ColourRect& cols) {d_textCols = cols;} - - - /*! - \brief - Set the colours used for text rendering. - - \param top_left_colour - Colour (as ARGB value) to be applied to the top-left corner of each text glyph rendered. - - \param top_right_colour - Colour (as ARGB value) to be applied to the top-right corner of each text glyph rendered. - - \param bottom_left_colour - Colour (as ARGB value) to be applied to the bottom-left corner of each text glyph rendered. - - \param bottom_right_colour - Colour (as ARGB value) to be applied to the bottom-right corner of each text glyph rendered. - - \return - Nothing. - */ - void setTextColours(colour top_left_colour, colour top_right_colour, colour bottom_left_colour, colour bottom_right_colour); - - - /*! - \brief - Set the colours used for text rendering. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setTextColours(colour col) {setTextColours(col, col, col, col);} - - - /************************************************************************* - Operators - *************************************************************************/ - /*! - \brief - Less-than operator, compares item texts. - */ - virtual bool operator<(const ListboxItem& rhs) const; - - - /*! - \brief - Greater-than operator, compares item texts. - */ - virtual bool operator>(const ListboxItem& rhs) const; - - - /************************************************************************* - Required implementations of pure virtuals from the base class. - *************************************************************************/ - Size getPixelSize(void); - void draw(const Vector3& position, float alpha, const Rect& clipper) const; - void draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const; - -protected: - /************************************************************************* - Implementation Data - *************************************************************************/ - ColourRect d_textCols; //!< Colours used for rendering the text. - const Font* d_font; //!< Font used for rendering text. -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListboxNumberItem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxProperties.h deleted file mode 100644 index 9bae0ccf9e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxProperties.h +++ /dev/null @@ -1,175 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxProperties.h - created: 11/7/2004 - author: Paul D Turner - - purpose: Interface to Listbox property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListboxProperties_h_ -#define _CEGUIListboxProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ListboxProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Listbox class -*/ -namespace ListboxProperties -{ -/*! -\brief - Property to access the sort setting of the list box. - - \par Usage: - - Name: Sort - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the list items should be sorted. - - "False" to indicate the list items should not be sorted. -*/ -class Sort : public Property -{ -public: - Sort() : Property( - "Sort", - "Property to get/set the sort setting of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the multi-select setting of the list box. - - \par Usage: - - Name: MultiSelect - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that multiple items may be selected. - - "False" to indicate that only a single item may be selected. -*/ -class MultiSelect : public Property -{ -public: - MultiSelect() : Property( - "MultiSelect", - "Property to get/set the multi-select setting of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'always show' setting for the vertical scroll bar of the list box. - - \par Usage: - - Name: ForceVertScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the vertical scroll bar will always be shown. - - "False" to indicate that the vertical scroll bar will only be shown when it is needed. -*/ -class ForceVertScrollbar : public Property -{ -public: - ForceVertScrollbar() : Property( - "ForceVertScrollbar", - "Property to get/set the 'always show' setting for the vertical scroll bar of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'always show' setting for the horizontal scroll bar of the list box. - - \par Usage: - - Name: ForceHorzScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the horizontal scroll bar will always be shown. - - "False" to indicate that the horizontal scroll bar will only be shown when it is needed. -*/ -class ForceHorzScrollbar : public Property -{ -public: - ForceHorzScrollbar() : Property( - "ForceHorzScrollbar", - "Property to get/set the 'always show' setting for the horizontal scroll bar of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief -Property to access the show item tooltips setting of the list box. - -\par Usage: -- Name: ItemTooltips -- Format: "[text]" - -\par Where [Text] is: -- "True" to indicate that the tooltip of the list box will be set by the item below the mouse pointer -- "False" to indicate that the list box has a static tooltip. -*/ -class ItemTooltips : public Property -{ -public: - ItemTooltips() : Property( - "ItemTooltips", - "Property to access the show item tooltips setting of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of ListboxProperties namespace section - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIListboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxTextItem.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxTextItem.h deleted file mode 100644 index 4cce25913d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIListboxTextItem.h +++ /dev/null @@ -1,185 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxTextItem.h - created: 12/6/2004 - author: Paul D Turner - - purpose: Interface for list box text items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIListboxTextItem_h_ -#define _CEGUIListboxTextItem_h_ -#include "elements/CEGUIListboxItem.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Class used for textual items in a list box. -*/ -class CEGUIEXPORT ListboxTextItem : public ListboxItem -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - static const colour DefaultTextColour; //!< Default text colour. - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - base class constructor - */ - ListboxTextItem(const String& text, uint item_id = 0, void* item_data = NULL, bool disabled = false, bool auto_delete = true); - - - /*! - \brief - base class destructor - */ - virtual ~ListboxTextItem(void) {} - - - /************************************************************************* - Accessor methods - *************************************************************************/ - /*! - \brief - Return a pointer to the font being used by this ListboxTextItem - - This method will try a number of places to find a font to be used. If no font can be - found, NULL is returned. - - \return - Font to be used for rendering this item - */ - const Font* getFont(void) const; - - - /*! - \brief - Return the current colours used for text rendering. - - \return - ColourRect object describing the currently set colours - */ - ColourRect getTextColours(void) const {return d_textCols;} - - - /************************************************************************* - Manipulator methods - *************************************************************************/ - /*! - \brief - Set the font to be used by this ListboxTextItem - - \param font - Font to be used for rendering this item - - \return - Nothing - */ - void setFont(const Font* font) {d_bSizeChanged |= (d_font != font); d_font = font;} - - - /*! - \brief - Set the font to be used by this ListboxTextItem - - \param font_name - String object containing the name of the Font to be used for rendering this item - - \return - Nothing - */ - void setFont(const String& font_name); - - - /*! - \brief - Set the colours used for text rendering. - - \param cols - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setTextColours(const ColourRect& cols) {d_textCols = cols;} - - - /*! - \brief - Set the colours used for text rendering. - - \param top_left_colour - Colour (as ARGB value) to be applied to the top-left corner of each text glyph rendered. - - \param top_right_colour - Colour (as ARGB value) to be applied to the top-right corner of each text glyph rendered. - - \param bottom_left_colour - Colour (as ARGB value) to be applied to the bottom-left corner of each text glyph rendered. - - \param bottom_right_colour - Colour (as ARGB value) to be applied to the bottom-right corner of each text glyph rendered. - - \return - Nothing. - */ - void setTextColours(colour top_left_colour, colour top_right_colour, colour bottom_left_colour, colour bottom_right_colour); - - - /*! - \brief - Set the colours used for text rendering. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setTextColours(colour col) {setTextColours(col, col, col, col);} - - - /************************************************************************* - Required implementations of pure virtuals from the base class. - *************************************************************************/ - Size getPixelSize(void); - void draw(const Vector3& position, float alpha, const Rect& clipper) const; - void draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const; - -protected: - /************************************************************************* - Implementation Data - *************************************************************************/ - ColourRect d_textCols; //!< Colours used for rendering the text. - const Font* d_font; //!< Font used for rendering text. -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListboxTextItem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBase.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBase.h deleted file mode 100644 index 9fecfc6c32..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBase.h +++ /dev/null @@ -1,299 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuBase.h - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Interface to base class for MenuBase widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMenuBase_h_ -#define _CEGUIMenuBase_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIMenuBaseProperties.h" -#include "elements/CEGUIItemListBase.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Abstract base class for menus. -*/ -class CEGUIEXPORT MenuBase : public ItemListBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Constants - *************************************************************************/ - static const colour DefaultBackgroundColour; //!< Default background colour - - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventPopupOpened; //!< A MenuItem attached to this menu opened a PopupMenu - static const String EventPopupClosed; //!< A MenuItem attached to this menu opened a PopupMenu - - - /************************************************************************* - Accessor type functions - *************************************************************************/ - /*! - \brief - Get the item spacing for this menu. - - \return - A float value with the current item spacing for this menu - */ - float getItemSpacing(void) const {return d_itemSpacing;} - - - /*! - \brief - Get the horizontal padding for this menu's items. - - \return - A float value with the current horizontal padding for this menu's items. - */ - float getHorzPadding(void) const {return d_horzPadding;} - - - /*! - \brief - Get the vertical padding for this menu's items. - - \return - A float value with the current vertical padding for this menu's items. - */ - float getVertPadding(void) const {return d_vertPadding;} - - - /*! - \brief - Get the border width for this menu. - - \return - A float value with the current border width for this menu. - */ - float getBorderWidth(void) const {return d_borderWidth;} - - - /*! - \brief - Get the ColourRect with the colours used for rendering the background of this menu. - - \return - A ColourRect with the colours used for rendering the background of this menu. - */ - const ColourRect& getBackgroundColours(void) const {return d_backgroundColours;} - - - /*! - \brief - Return whether this menu allows multiple popup menus to open at the same time. - - \return - true if this menu allows multiple popup menus to be opened simultaneously. false if not - */ - bool isMultiplePopupsAllowed(void) const {return d_allowMultiplePopups;} - - - /*! - \brief - Get currently opened MenuItem in this menu. Returns NULL if menu item is open. - - \return - Pointer to the MenuItem currently open. - */ - MenuItem* getPopupMenuItem(void) const {return d_popup;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the item spacing for this menu. - */ - void setItemSpacing(float spacing) {d_itemSpacing=spacing;handleUpdatedItemData();} - - - /*! - \brief - Set the horizontal padding for this menu's items. - */ - void setHorzPadding(float padding) {d_horzPadding=padding;handleUpdatedItemData();} - - - /*! - \brief - Set the vertical padding for this menu's items. - */ - void setVertPadding(float padding) {d_vertPadding=padding;handleUpdatedItemData();} - - - /*! - \brief - Set the border width for this menu. - */ - void setBorderWidth(float border) {d_borderWidth=border;handleUpdatedItemData();} - - - /*! - \brief - Set the background colours to used when rendereing this menu. - */ - void setBackgroundColours(const ColourRect& cr) {d_backgroundColours=cr;} - - - /*! - \brief - Change the currently open MenuItem in this menu. - - \param item - Pointer to a MenuItem to open or NULL to close any opened. - */ - void changePopupMenuItem(MenuItem* item); - - - /*! - \brief - Set whether this menu allows multiple popup menus to opened simultaneously. - */ - void setAllowMultiplePopups(bool setting) {d_allowMultiplePopups=setting;} - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for MenuBase objects - */ - MenuBase(const String& type, const String& name); - - - /*! - \brief - Destructor for MenuBase objects - */ - virtual ~MenuBase(void); - - -protected: - /************************************************************************* - New Event Handlers - *************************************************************************/ - /*! - \brief - handler invoked internally when the a MenuItem attached to this menu opens its popup. - */ - virtual void onPopupOpened(WindowEventArgs& e); - - - /*! - \brief - handler invoked internally when the a MenuItem attached to this menu closes its popup. - */ - virtual void onPopupClosed(WindowEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add MenuBase specific events - */ - void addMenuBaseEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addMenuBaseEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"MenuBase") return true; - return ItemListBase::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_itemSpacing; //!< The spacing in pixels between items. - float d_horzPadding; //!< The width in pixels that is added to the left and right of each item. - float d_vertPadding; //!< The height in pixels that is added to the top and bottom of each item. - float d_borderWidth; //!< The width in pixels of the border around the entire content of this menu. - - ColourRect d_backgroundColours; //!< The colours used when rendering the background of this menu. - - MenuItem* d_popup; //!< The currently open MenuItem. NULL if no item is open. If multiple popups are allowed, this means nothing. - bool d_allowMultiplePopups; //!< true if multiple popup menus are allowed smultaneously. false if not. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static MenuBaseProperties::ItemSpacing d_itemSpacingProperty; - static MenuBaseProperties::HorzPadding d_horzPaddingProperty; - static MenuBaseProperties::VertPadding d_vertPaddingProperty; - static MenuBaseProperties::BorderWidth d_borderWidthProperty; - static MenuBaseProperties::BackgroundColours d_backgroundColoursProperty; - static MenuBaseProperties::AllowMultiplePopups d_allowMultiplePopupsProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addMenuBaseProperties( bool bCommon = true ); -protected: - void addUncommonProperties( void ) { __super::addUncommonProperties(); addMenuBaseProperties(false); } -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIMenuBase_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBaseProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBaseProperties.h deleted file mode 100644 index 443c1d8f5c..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuBaseProperties.h +++ /dev/null @@ -1,189 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuBaseProperties.h - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMenuBaseProperties_h_ -#define _CEGUIMenuBaseProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ItemListBaseProperties namespace section -namespace MenuBaseProperties -{ - -/*! -\brief - Property to access the item spacing of the menu. - - \par Usage: - - Name: ItemSpacing - - Format: "[float]". - - \par Where: - - [float] represents the item spacing of the menu. -*/ -class ItemSpacing : public Property -{ -public: - ItemSpacing() : Property( - "ItemSpacing", - "Property to get/set the item spacing of the menu. Value is a float.", - "10.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the horz padding value of the menu. - - \par Usage: - - Name: HorzPadding - - Format: "[float]". - - \par Where: - - [float] represents the horz padding of the slider. -*/ -class HorzPadding : public Property -{ -public: - HorzPadding() : Property( - "HorzPadding", - "Property to get/set the horizontal padding of the menu. Value is a float.", - "3.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the vert padding value of the menu. - -\par Usage: - - Name: VertPadding - - Format: "[float]". - -\par Where: - - [float] represents the vert padding of the slider. -*/ -class VertPadding : public Property -{ -public: - VertPadding() : Property( - "VertPadding", - "Property to get/set the vertical padding of the menu. Value is a float.", - "3.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the border width of the menu. - -\par Usage: - - Name: BorderWidth - - Format: "[float]". - -\par Where: - - [float] represents the border width of the slider. -*/ -class BorderWidth : public Property -{ -public: - BorderWidth() : Property( - "BorderWidth", - "Property to get/set the border width of the menu. Value is a float.", - "5.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the background colours of the menu. - -\par Usage: - - Name: BackgroundColours - - Format: "tl:aarrggbb tr:aarrggbb bl:aarrggbb br:aarrggbb". - -\par Where: - - aarrggbb is the ARGB colour value to be used for each corner of the ColourRect -*/ -class BackgroundColours : public Property -{ -public: - BackgroundColours() : Property( - "BackgroundColours", - "Property to get/set the background colours of the menu. Value is a ColourRect.", - "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the state of the allow multiple popups setting. - - \par Usage: - - Name: AllowMultiplePopups - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate that auto resizing is enabled. - - "False" to indicate that auto resizing is disabled. -*/ -class AllowMultiplePopups : public Property -{ -public: - AllowMultiplePopups() : Property( - "AllowMultiplePopups", - "Property to get/set the state of the allow multiple popups setting for the menu. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of MenuBaseProperties namespace section -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIMenuBaseProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItem.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItem.h deleted file mode 100644 index db77c74e13..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItem.h +++ /dev/null @@ -1,411 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuItem.h - created: 2/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Interface to base class for MenuItem widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMenuItem_h_ -#define _CEGUIMenuItem_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUITextItem.h" -#include "elements/CEGUIMenuItemProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for menu items. -*/ -class CEGUIEXPORT MenuItem : public TextItem -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Constants - *************************************************************************/ - // default colours for rendering - - static const colour DefaultHoverColour; //!< Default colour used when rendering in hover / highlight state. - static const colour DefaultPushedColour; //!< Default colour used when rendering in pushed state. - static const colour DefaultOpenedColour; //!< Default colour used when rendering in opended state. - static const colour DefaultNormalTextColour; //!< Default colour used when rendering the text in normal state. - static const colour DefaultDisabledTextColour; //!< Default colour used when rendering the text in disabled state. - - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventClicked; //!< The menuitem was clicked. - - - /************************************************************************* - Accessor type functions - *************************************************************************/ - /*! - \brief - return true if user is hovering over this widget (or it's pushed and user is not over it for highlight) - - \return - true if the user is hovering or if the button is pushed and the mouse is not over the button. Otherwise return false. - */ - bool isHovering(void) const {return d_hovering;} - - - /*! - \brief - Return true if the button widget is in the pushed state. - - \return - true if the button-type widget is pushed, false if the widget is not pushed. - */ - bool isPushed(void) const {return d_pushed;} - - - /*! - \brief - return text label colour used for hover / highlight rendering - - \return - colour value that is used for the label text when rendering in the hover / highlighted states. - */ - colour getHoverColour(void) const {return d_hoverColour;} - - - /*! - \brief - return text label colour used for pushed rendering - - \return - colour value that is used for the label text when rendering in the pushed state. - */ - colour getPushedColour(void) const {return d_pushedColour;} - - - /*! - \brief - return text label colour used for opened rendering - - \return - colour value that is used for the label text when rendering in the opened state. - */ - colour getOpenedColour(void) const {return d_openedColour;} - - - /*! - \brief - return text label colour used for normal rendering - - \return - colour value that is used for the label text when rendering in the normal state. - */ - colour getNormalTextColour(void) const {return d_normalTextColour;} - - - /*! - \brief - return text label colour used for disabled rendering - - \return - colour value that is used for the label text when rendering in the disabled state. - */ - colour getDisabledTextColour(void) const {return d_disabledTextColour;} - - - /*! - \brief - Get the PopupMenu that is currently attached to this MenuItem. - - \return - A pointer to the currently attached PopupMenu. Null is there is no PopupMenu attached. - */ - PopupMenu* getPopupMenu(void) const {return d_popup;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the colour to use when rendering in the hover / highlighted states. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setHoverColour(const colour& colour); - - - /*! - \brief - Set the colour to use when rendering in the pushed state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setPushedColour(const colour& colour); - - - /*! - \brief - Set the colour to use when rendering in the opened state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setOpenedColour(const colour& colour); - - - /*! - \brief - Set the colour to use for the label text when rendering in the normal state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setNormalTextColour(const colour& colour); - - - /*! - \brief - Set the colour to use for the label text when rendering in the disabled state. - - \param colour - colour value specifying the colour to be used. - - \return - Nothing. - */ - void setDisabledTextColour(const colour& colour); - - - /*! - \brief - Set the popup menu for this item. - - \param popup - popupmenu window to attach to this item - - \return - Nothing. - */ - void setPopupMenu(PopupMenu* popup); - - - /*! - \brief - Opens the PopupMenu. - */ - void openPopupMenu(void); - - - /*! - \brief - Closes the PopupMenu. - - \param notify - true if the parent menubar is to be notified of the close. - - \return - Nothing. - */ - void closePopupMenu(bool notify=true); - - - /*! - \brief - Toggles the PopupMenu. - - \return - true if the popup was opened. false if it was closed. - */ - bool togglePopupMenu(void); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for MenuItem objects - */ - MenuItem(const String& type, const String& name); - - - /*! - \brief - Destructor for MenuItem objects - */ - virtual ~MenuItem(void); - - -protected: - /************************************************************************* - New Event Handlers - *************************************************************************/ - /*! - \brief - handler invoked internally when the MenuItem is clicked. - */ - virtual void onClicked(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onMouseLeaves(MouseEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Update the internal state of the widget with the mouse at the given position. - - \param mouse_pos - Point object describing, in screen pixel co-ordinates, the location of the mouse cursor. - - \return - Nothing - */ - void updateInternalState(const Point& mouse_pos); - - - /*! - \brief - Add menuitem specific events - */ - void addMenuItemEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addMenuItemEvents(false); } - - - /*! - \brief - Recursive function that closes all popups down the hierarcy starting with this one. - - \return - Nothing. - */ - void closeAllMenuItemPopups(); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"MenuItem") return true; - return TextItem::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Rendering Functions - *************************************************************************/ - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_pushed; //!< true when widget is pushed - bool d_hovering; //!< true when the button is in 'hover' state and requires the hover rendering. - bool d_opened; //!< true when the menu item's popup menu is opened. - - // common rendering setting data - colour d_hoverColour; //!< Colour used when rendering in highlighted state - colour d_pushedColour; //!< Colour used when rendering in pushed state - colour d_openedColour; //!< Colour used when rendering in opened state - colour d_normalTextColour; //!< Colour used for the text when rendering in normal state - colour d_disabledTextColour; //!< Colour used for the text when rendering in disabled state - - PopupMenu* d_popup; //!< PopupMenu that this item displays when activated. - - bool d_popupWasClosed; //!< Used internally to determine if a popup was just closed on a Clicked event - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static MenuItemProperties::HoverColour d_hoverColourProperty; - static MenuItemProperties::PushedColour d_pushedColourProperty; - static MenuItemProperties::OpenedColour d_openedColourProperty; - static MenuItemProperties::NormalTextColour d_normalTextColourProperty; - static MenuItemProperties::DisabledTextColour d_disabledTextColourProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addMenuItemProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addMenuItemProperties(false); } - - - /*! - \brief - Add given window to child list at an appropriate position - */ - virtual void addChild_impl(Window* wnd); -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - - -#endif // end of guard _CEGUIMenuItem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItemProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItemProperties.h deleted file mode 100644 index 7469482edb..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenuItemProperties.h +++ /dev/null @@ -1,164 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuItemProperties.h - created: 8/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMenuItemProperties_h_ -#define _CEGUIMenuItemProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of MenuItemProperties namespace section -namespace MenuItemProperties -{ - -/*! -\brief - Property to access the hover colour of the item. - - \par Usage: - - Name: HoverColour - - Format: "[aarrggbb]". - - \par Where: - - [aarrggbb] represents the hover colour of the item. -*/ -class HoverColour : public Property -{ -public: - HoverColour() : Property( - "HoverColour", - "Property to get/set the hover colour of the item. Value is a colour.", - "00FFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the pushed colour of the item. - - \par Usage: - - Name: PushedColour - - Format: "[aarrggbb]". - - \par Where: - - [aarrggbb] represents the pushed colour of the item. -*/ -class PushedColour : public Property -{ -public: - PushedColour() : Property( - "PushedColour", - "Property to get/set the pushed colour of the item. Value is a colour.", - "00FFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the opened colour of the item. - - \par Usage: - - Name: OpenedColour - - Format: "[aarrggbb]". - - \par Where: - - [aarrggbb] represents the opened colour of the item. -*/ -class OpenedColour : public Property -{ -public: - OpenedColour() : Property( - "OpenedColour", - "Property to get/set the opened colour of the item. Value is a colour.", - "00EFEFEF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the normal text colour of the item. - - \par Usage: - - Name: NormalTextColour - - Format: "[aarrggbb]". - - \par Where: - - [aarrggbb] represents the normal text colour of the item. -*/ -class NormalTextColour : public Property -{ -public: - NormalTextColour() : Property( - "NormalTextColour", - "Property to get/set the normal text colour of the item. Value is a colour.", - "00FFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the disabled text colour of the item. - - \par Usage: - - Name: DisabledTextColour - - Format: "[aarrggbb]". - - \par Where: - - [aarrggbb] represents the disabled text colour of the item. -*/ -class DisabledTextColour : public Property -{ -public: - DisabledTextColour() : Property( - "DisabledTextColour", - "Property to get/set the disabled text colour of the item. Value is a colour.", - "007F7F7F") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of MenuItemProperties namespace section -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIMenuItemProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenubar.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenubar.h deleted file mode 100644 index 2655c653af..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMenubar.h +++ /dev/null @@ -1,119 +0,0 @@ -/************************************************************************ - filename: CEGUIMenubar.h - created: 27/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Interface to base class for Menubar widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMenubar_h_ -#define _CEGUIMenubar_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIMenuBase.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for menu bars. -*/ -class CEGUIEXPORT Menubar : public MenuBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for Menubar objects - */ - Menubar(const String& type, const String& name); - - - /*! - \brief - Destructor for Menubar objects - */ - virtual ~Menubar(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Setup size and position for the item widgets attached to this Menubar - - \return - Nothing. - */ - virtual void layoutItemWidgets(); - - - /*! - \brief - Resizes the menubar to exactly fit the content that is attached to it. - - \return - Nothing. - */ - virtual Size getContentSize(); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Menubar") return true; - return MenuBase::testClassName_impl(class_name); - } - -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIMenubar_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnList.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnList.h deleted file mode 100644 index 17ad586735..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnList.h +++ /dev/null @@ -1,1643 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiColumnList.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for MultiColumnList widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMultiColumnList_h_ -#define _CEGUIMultiColumnList_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "CEGUIListHeader.h" -#include "elements/CEGUIMultiColumnListProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Simple grid index structure. -*/ -struct CEGUIEXPORT MCLGridRef -{ - MCLGridRef(uint r, uint c) : row(r), column(c) {} - - uint row; //!< Zero based row index. - uint column; //!< Zero based column index. - - // operators - MCLGridRef& operator=(const MCLGridRef& rhs); - bool operator<(const MCLGridRef& rhs) const; - bool operator<=(const MCLGridRef& rhs) const; - bool operator>(const MCLGridRef& rhs) const; - bool operator>=(const MCLGridRef& rhs) const; - bool operator==(const MCLGridRef& rhs) const; - bool operator!=(const MCLGridRef& rhs) const; -}; - - -/*! -\brief - Base class for the multi column list widget. -*/ -class CEGUIEXPORT MultiColumnList : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // Event names - static const String EventSelectionModeChanged; //!< Event fired when the selection mode for the list box changes. - static const String EventNominatedSelectColumnChanged;//!< Event fired when the nominated select column changes. - static const String EventNominatedSelectRowChanged; //!< Event fired when the nominated select row changes. - static const String EventVertScrollbarModeChanged; //!< Event fired when the vertical scroll bar 'force' setting changes. - static const String EventHorzScrollbarModeChanged; //!< Event fired when the horizontal scroll bar 'force' setting changes. - static const String EventSelectionChanged; //!< Event fired when the current selection(s) within the list box changes. - static const String EventListContentsChanged; //!< Event fired when the contents of the list box changes. - static const String EventSortColumnChanged; //!< Event fired when the sort column changes. - static const String EventSortDirectionChanged; //!< Event fired when the sort direction changes. - static const String EventListColumnSized; //!< Event fired when the width of a column in the list changes. - static const String EventListColumnMoved; //!< Event fired when the column order changes. - - - /************************************************************************* - Enumerations - *************************************************************************/ - /*! - \brief - Enumerated values for the selection modes possible with a Multi-column list - */ - enum SelectionMode - { - RowSingle, // Any single row may be selected. All items in the row are selected. - RowMultiple, // Multiple rows may be selected. All items in the row are selected. - CellSingle, // Any single cell may be selected. - CellMultiple, // Multiple cells bay be selected. - NominatedColumnSingle, // Any single item in a nominated column may be selected. - NominatedColumnMultiple, // Multiple items in a nominated column may be selected. - ColumnSingle, // Any single column may be selected. All items in the column are selected. - ColumnMultiple, // Multiple columns may be selected. All items in the column are selected. - NominatedRowSingle, // Any single item in a nominated row may be selected. - NominatedRowMultiple // Multiple items in a nominated row may be selected. - }; - - - /************************************************************************* - Accessor Methods - *************************************************************************/ - /*! - \brief - Return whether user manipulation of the sort column and direction are enabled. - - \return - true if the user may interactively modify the sort column and direction. false if the user may not - modify the sort column and direction (these can still be set programmatically). - */ - bool isUserSortControlEnabled(void) const; - - - /*! - \brief - Return whether the user may size column segments. - - \return - true if the user may interactively modify the width of columns, false if they may not. - */ - bool isUserColumnSizingEnabled(void) const; - - - /*! - \Added to MTA by Talidan - Return whether a specific column is sizable - \return - true if the user may interactively modify the width of column, false if they may not. - */ - bool isUserColumnSegmentSizingEnabled(uint col_idx) const; - - /*! - \brief - Return whether the user may modify the order of the columns. - - \return - true if the user may interactively modify the order of the columns, false if they may not. - */ - bool isUserColumnDraggingEnabled(void) const; - - - /*! - \brief - Return the number of columns in the multi-column list - - \return - uint value equal to the number of columns in the list. - */ - uint getColumnCount(void) const; - - - /*! - \brief - Return the number of rows in the multi-column list. - - \return - uint value equal to the number of rows currently in the list. - */ - uint getRowCount(void) const; - - - /*! - \brief - Return the zero based index of the current sort column. There must be at least one column to successfully call this - method. - - \return - Zero based column index that is the current sort column. - - \exception InvalidRequestException thrown if there are no columns in this multi column list. - */ - uint getSortColumn(void) const; - - - /*! - \brief - Return the zero based column index of the column with the specified ID. - - \param col_id - ID code of the column whos index is to be returned. - - \return - Zero based column index of the first column whos ID matches \a col_id. - - \exception InvalidRequestException thrown if no attached column has the requested ID. - */ - uint getColumnWithID(uint col_id) const; - - - /*! - \brief - Return the zero based index of the column whos header text matches the specified text. - - \param text - String object containing the text to be searched for. - - \return - Zero based column index of the column whos header has the specified text. - - \exception InvalidRequestException thrown if no columns header has the requested text. - */ - uint getColumnWithHeaderText(const String& text) const; - - - /*! - \brief - Return the total width of all column headers. - - \return - Sum total of all the column header widths in whichever metrics system is active. - */ - float getTotalColumnHeadersWidth(void) const; - - - /*! - \brief - Return the width of the specified column header (and therefore the column itself). - - \param col_idx - Zero based column index of the column whos width is to be returned. - - \return - Width of the column header at the zero based column index specified by \a col_idx, in whichever is the active metrics system. - - \exception InvalidRequestException thrown if \a column is out of range. - */ - float getColumnHeaderWidth(uint col_idx) const; - - - /*! - \brief - Return the currently set sort direction. - - \return - One of the ListHeaderSegment::SortDirection enumerated values specifying the current sort direction. - */ - ListHeaderSegment::SortDirection getSortDirection(void) const; - - - /*! - \brief - Return the ListHeaderSegment object for the specified column - - \param col_idx - zero based index of the column whos ListHeaderSegment is to be returned. - - \return - ListHeaderSegment object for the column at the requested index. - - \exception InvalidRequestException thrown if \a col_idx is out of range. - */ - ListHeaderSegment& getHeaderSegmentForColumn(uint col_idx) const; - - - /*! - \brief - Return the zero based index of the Row that contains \a item. - - \param item - Pointer to the ListboxItem that the row index is to returned for. - - \return - Zero based index of the row that contains ListboxItem \a item. - - \exception InvalidRequestException thrown if \a item is not attached to the list box. - */ - uint getItemRowIndex(const ListboxItem* item) const; - - - /*! - \brief - Return the current zero based index of the column that contains \a item. - - \param item - Pointer to the ListboxItem that the column index is to returned for. - - \return - Zero based index of the column that contains ListboxItem \a item. - - \exception InvalidRequestException thrown if \a item is not attached to the list box. - */ - uint getItemColumnIndex(const ListboxItem* item) const; - - - /*! - \brief - Return the grid reference for \a item. - - \param item - Pointer to the ListboxItem whos current grid reference is to be returned. - - \return - MCLGridRef object describing the current grid reference of ListboxItem \a item. - - \exception InvalidRequestException thrown if \a item is not attached to the list box. - */ - MCLGridRef getItemGridReference(const ListboxItem* item) const; - - - /*! - \brief - Return a pointer to the ListboxItem at the specified grid reference. - - \param grid_ref - MCLGridRef object that describes the position of the ListboxItem to be returned. - - \return - Pointer to the ListboxItem at grid reference \a grid_ref. - - \exception InvalidRequestException thrown if \a grid_ref is invalid for this list box. - */ - ListboxItem* getItemAtGridReference(const MCLGridRef& grid_ref) const; - - - /*! - \brief - return whether ListboxItem \a item is attached to the column at index \a col_idx. - - \param item - Pointer to the ListboxItem to look for. - - \param col_idx - Zero based index of the column that is to be searched. - - \return - - true if \a item is attached to list box column \a col_idx. - - false if \a item is not attached to list box column \a col_idx. - - \exception InvalidRequestException thrown if \a col_idx is out of range. - */ - bool isListboxItemInColumn(const ListboxItem* item, uint col_idx) const; - - - /*! - \brief - return whether ListboxItem \a item is attached to the row at index \a row_idx. - - \param item - Pointer to the ListboxItem to look for. - - \param row_idx - Zero based index of the row that is to be searched. - - \return - - true if \a item is attached to list box row \a row_idx. - - false if \a item is not attached to list box row \a row_idx. - - \exception InvalidRequestException thrown if \a row_idx is out of range. - */ - bool isListboxItemInRow(const ListboxItem* item, uint row_idx) const; - - - /*! - \brief - return whether ListboxItem \a item is attached to the list box. - - \param item - Pointer to the ListboxItem to look for. - - \return - - true if \a item is attached to list box. - - false if \a item is not attached to list box. - */ - bool isListboxItemInList(const ListboxItem* item) const; - - - /*! - \brief - Return the ListboxItem in column \a col_idx that has the text string \a text. - - \param text - String object containing the text to be searched for. - - \param col_idx - Zero based index of the column to be searched. - - \param start_item - Pointer to the ListboxItem where the exclusive search is to start, or NULL to search from the top of the column. - - \return - Pointer to the first ListboxItem in column \a col_idx, after \a start_item, that has the string \a text. - - \exception InvalidRequestException thrown if \a start_item is not attached to the list box, or if \a col_idx is out of range. - */ - ListboxItem* findColumnItemWithText(const String& text, uint col_idx, const ListboxItem* start_item) const; - - - /*! - \brief - Return the ListboxItem in row \a row_idx that has the text string \a text. - - \param text - String object containing the text to be searched for. - - \param row_idx - Zero based index of the row to be searched. - - \param start_item - Pointer to the ListboxItem where the exclusive search is to start, or NULL to search from the start of the row. - - \return - Pointer to the first ListboxItem in row \a row_idx, after \a start_item, that has the string \a text. - - \exception InvalidRequestException thrown if \a start_item is not attached to the list box, or if \a row_idx is out of range. - */ - ListboxItem* findRowItemWithText(const String& text, uint row_idx, const ListboxItem* start_item) const; - - - /*! - \brief - Return the ListboxItem that has the text string \a text. - - \note - List box searching progresses across the columns in each row. - - \param text - String object containing the text to be searched for. - - \param start_item - Pointer to the ListboxItem where the exclusive search is to start, or NULL to search the whole list box. - - \return - Pointer to the first ListboxItem, after \a start_item, that has the string \a text. - - \exception InvalidRequestException thrown if \a start_item is not attached to the list box. - */ - ListboxItem* findListItemWithText(const String& text, const ListboxItem* start_item) const; - - - /*! - \brief - Return a pointer to the first selected ListboxItem attached to this list box. - - \note - List box searching progresses across the columns in each row. - - \return - Pointer to the first ListboxItem attached to this list box that is selected, or NULL if no item is selected. - */ - ListboxItem* getFirstSelectedItem(void) const; - - - /*! - \brief - Return a pointer to the next selected ListboxItem after \a start_item. - - \note - List box searching progresses across the columns in each row. - - \param start_item - Pointer to the ListboxItem where the exclusive search is to start, or NULL to search the whole list box. - - \return - Pointer to the first selected ListboxItem attached to this list box, after \a start_item, or NULL if no item is selected. - - \exception InvalidRequestException thrown if \a start_item is not attached to the list box. - */ - ListboxItem* getNextSelected(const ListboxItem* start_item) const; - - - /*! - \brief - Return the number of selected ListboxItems attached to this list box. - - return - uint value equal to the number of ListboxItems attached to this list box that are currently selected. - */ - uint getSelectedCount(void) const; - - - /*! - \brief - Return whether the ListboxItem at \a grid_ref is selected. - - \param grid_ref - MCLGridRef object describing the grid reference that is to be examined. - - \return - - true if there is a ListboxItem at \a grid_ref and it is selected. - - false if there is no ListboxItem at \a grid_ref, or if the item is not selected. - - \exception InvalidRequestException thrown if \a grid_ref contains an invalid grid position. - */ - bool isItemSelected(const MCLGridRef& grid_ref) const; - - - /*! - \brief - Return the ID of the currently set nominated selection column to be used when in one of the NominatedColumn* - selection modes. - - \note - You should only ever call this when getColumnCount() returns > 0. - - \return - ID code of the nominated selection column. - */ - uint getNominatedSelectionColumnID(void) const; - - - /*! - \brief - Return the index of the currently set nominated selection column to be used when in one of the NominatedColumn* - selection modes. - - \return - Zero based index of the nominated selection column. - */ - uint getNominatedSelectionColumn(void) const; - - - /*! - \brief - Return the index of the currently set nominated selection row to be used when in one of the NominatedRow* - selection modes. - - \return - Zero based index of the nominated selection column. - */ - uint getNominatedSelectionRow(void) const; - - // Return the range of visible rows - void getVisibleRowRange(int &first, int& last) const; - - /*! - \brief - Return the currently set selection mode. - - \return - One of the MultiColumnList::SelectionMode enumerated values specifying the current selection mode. - */ - MultiColumnList::SelectionMode getSelectionMode(void) const; - - - /*! - \brief - Return whether the vertical scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isVertScrollbarAlwaysShown(void) const; - - - /*! - \brief - Return whether the horizontal scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isHorzScrollbarAlwaysShown(void) const; - - - /*! - \brief - Return the ID code assigned to the requested column. - - \param col_idx - Zero based index of the column whos ID code is to be returned. - - \return - Current ID code assigned to the column at the requested index. - - \exception InvalidRequestException thrown if \a col_idx is out of range - */ - uint getColumnID(uint col_idx) const; - - - /*! - \brief - Return the ID code assigned to the requested row. - - \param row_idx - Zero based index of the row who's ID code is to be returned. - - \return - Current ID code assigned to the row at the requested index. - - \exception InvalidRequestException thrown if \a row_idx is out of range - */ - uint getRowID(uint row_idx) const; - - - /*! - \brief - Return the zero based row index of the row with the specified ID. - - \param row_id - ID code of the row who's index is to be returned. - - \return - Zero based row index of the first row who's ID matches \a row_id. - - \exception InvalidRequestException thrown if no row has the requested ID. - */ - uint getRowWithID(uint row_id) const; - - - /************************************************************************* - Manipulator Methods - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Remove all items from the list. - - Note that this will cause 'AutoDelete' items to be deleted. - */ - void resetList(void); - - - /*! - \brief - Add a column to the list box. - - \param text - String object containing the text label for the column header. - - \param col_id - ID code to be assigned to the column header. - - \param width - Initial width to be set for the column using the active metrics mode for this window. - - \return - Nothing. - */ - void addColumn(const String& text, uint col_id, float width); - - - /*! - \brief - Insert a new column in the list. - - \param text - String object containing the text label for the column header. - - \param col_id - ID code to be assigned to the column header. - - \param width - Initial width to be set for the column using the active metrics mode for this window. - - \param position - Zero based index where the column is to be inserted. If this is greater than the current - number of columns, the new column is inserted at the end. - - \return - Nothing. - */ - void insertColumn(const String& text, uint col_id, float width, uint position); - - - /*! - \brief - Removes a column from the list box. This will cause any ListboxItem using the autoDelete option in the column to be deleted. - - \param col_idx - Zero based index of the column to be removed. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a col_idx is invalid. - */ - void removeColumn(uint col_idx); - - - /*! - \brief - Removes a column from the list box. This will cause any ListboxItem using the autoDelete option in the column to be deleted. - - \param col_id - ID code of the column to be deleted. - - \return - Nothing. - - \exception InvalidRequestException thrown if no column with \a col_id is available on this list box. - */ - void removeColumnWithID(uint col_id); - - - /*! - \brief - Move the column at index \a col_idx so it is at index \a position. - - \param col_idx - Zero based index of the column to be moved. - - \param position - Zero based index of the new position for the column. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a col_idx is invalid. - */ - void moveColumn(uint col_idx, uint position); - - - /*! - \brief - Move the column with ID \a col_id so it is at index \a position. - - \param col_id - ID code of the column to be moved. - - \param position - Zero based index of the new position for the column. - - \return - Nothing. - - \exception InvalidRequestException thrown if no column with \a col_id is available on this list box. - */ - void moveColumnWithID(uint col_id, uint position); - - - /*! - \brief - Add an empty row to the list box. - - \param row_id - ID code to be assigned to the new row. - - \note - If the list is being sorted, the new row will appear at an appropriate position according to the sorting being - applied. If no sorting is being done, the new row will appear at the bottom of the list. - - \return - Initial zero based index of the new row. - */ - uint addRow(uint row_id = 0, bool fast = false); - - - /*! - \brief - Add a row to the list box, and set the item in the column with ID \a col_id to \a item. - - \note - If the list is being sorted, the new row will appear at an appropriate position according to the sorting being - applied. If no sorting is being done, the new row will appear at the bottom of the list. - - \param item - Pointer to a ListboxItem to be used as the initial contents for the column with ID \a col_id. - - \param col_id - ID code of the column whos initial item is to be set to \a item. - - \param row_id - ID code to be assigned to the new row. - - \return - Initial zero based index of the new row. - - \exception InvalidRequestException thrown if no column with the specified ID is attached to the list box. - */ - uint addRow(ListboxItem* item, uint col_id, uint row_id = 0, bool fast = false); - - - /*! - \brief - Insert an empty row into the list box. - - \note - If the list is being sorted, the new row will appear at an appropriate position according to the sorting being - applied. If no sorting is being done, the new row will appear at the specified index. - - \param row_idx - Zero based index where the row should be inserted. If this is greater than the current number of rows, the row is - appended to the list. - - \param row_id - ID code to be assigned to the new row. - - \return - Zero based index where the row was actually inserted. - */ - uint insertRow(uint row_idx, uint row_id = 0); - - - /*! - \brief - Insert a row into the list box, and set the item in the column with ID \a col_id to \a item. - - \note - If the list is being sorted, the new row will appear at an appropriate position according to the sorting being - applied. If no sorting is being done, the new row will appear at the specified index. - - \param item - Pointer to a ListboxItem to be used as the initial contents for the column with ID \a col_id. - - \param col_id - ID code of the column whos initial item is to be set to \a item. - - \param row_idx - Zero based index where the row should be inserted. If this is greater than the current number of rows, the row is - appended to the list. - - \param row_id - ID code to be assigned to the new row. - - \return - Zero based index where the row was actually inserted. - - \exception InvalidRequestException thrown if no column with the specified ID is attached to the list box. - */ - uint insertRow(ListboxItem* item, uint col_id, uint row_idx, uint row_id = 0); - - - /*! - \brief - Remove the list box row with index \a row_idx. Any ListboxItem in row \a row_idx using autoDelete mode will be deleted. - - \param row_idx - Zero based index of the row to be removed. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a row_idx is invalid. - */ - void removeRow(uint row_idx); - - - /*! - \brief - Set the ListboxItem for grid reference \a position. - - \param item - Pointer to the ListboxItem to be set at \a position. - - \param position - MCLGridRef describing the grid reference of the item to be set. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a position contains an invalid grid reference. - */ - void setItem(ListboxItem* item, const MCLGridRef& position, bool fast = false); - - - /* - Added by eAi for MTA - */ - void forceUpdate(); - - /*! - \brief - Set the ListboxItem for the column with ID \a col_id in row \a row_idx. - - \param item - Pointer to the ListboxItem to be set into the list. - - \param col_id - ID code of the column to receive \a item. - - \param row_idx - Zero based index of the row to receive \a item. - - \return - Nothing. - - \exception InvalidRequestException thrown if no column with ID \a col_id exists, or of \a row_idx is out of range. - */ - void setItem(ListboxItem* item, uint col_id, uint row_idx, bool fast = false); - - - /*! - \brief - Set the selection mode for the list box. - - \param sel_mode - One of the MultiColumnList::SelectionMode enumerated values specifying the selection mode to be used. - - \return - Nothing. - - \exception InvalidRequestException thrown if the value specified for \a sel_mode is invalid. - */ - void setSelectionMode(MultiColumnList::SelectionMode sel_mode); - - - /*! - \brief - Set the column to be used for the NominatedColumn* selection modes. - - \param col_id - ID code of the column to be used in NominatedColumn* selection modes. - - \return - Nothing. - - \exception InvalidRequestException thrown if no column has ID code \a col_id. - */ - void setNominatedSelectionColumnID(uint col_id); - - - /*! - \brief - Set the column to be used for the NominatedColumn* selection modes. - - \param col_idx - zero based index of the column to be used in NominatedColumn* selection modes. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a col_idx is out of range. - */ - void setNominatedSelectionColumn(uint col_idx); - - - /*! - \brief - Set the row to be used for the NominatedRow* selection modes. - - \param row_idx - zero based index of the row to be used in NominatedRow* selection modes. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a row_idx is out of range. - */ - void setNominatedSelectionRow(uint row_idx); - - - /*! - \brief - Set the sort direction to be used. - - \param direction - One of the ListHeaderSegment::SortDirection enumerated values specifying the sort direction to be used. - - \return - Nothing. - */ - void setSortDirection(ListHeaderSegment::SortDirection direction); - - - /*! - \brief - Set the column to be used as the sort key. - - \param col_idx - Zero based index of the column to use as the key when sorting the list items. - - \return - Nothing. - - \exception InvalidRequestException thrown if col_idx is out of range. - */ - void setSortColumn(uint col_idx); - - - /*! - \brief - Set the column to be used as the sort key. - - \param col_id - ID code of the column to use as the key when sorting the list items. - - \return - Nothing. - - \exception InvalidRequestException thrown if col_id is invalid for this list box. - */ - void setSortColumnByID(uint col_id); - - - /*! - \brief - Set whether the vertical scroll bar should always be shown, or just when needed. - - \param setting - - true to have the vertical scroll bar shown at all times. - - false to have the vertical scroll bar appear only when needed. - - \return - Nothing. - */ - void setShowVertScrollbar(bool setting); - - - /*! - \brief - Set whether the horizontal scroll bar should always be shown, or just when needed. - - \param setting - - true to have the horizontal scroll bar shown at all times. - - false to have the horizontal scroll bar appear only when needed. - - \return - Nothing. - */ - void setShowHorzScrollbar(bool setting); - - - /*! - \brief - Removed the selected state from any currently selected ListboxItem attached to the list. - - \return - Nothing. - */ - void clearAllSelections(void); - - - /*! - \brief - Sets or clears the selected state of the given ListboxItem which must be attached to the list. - - \note - Depending upon the current selection mode, this may cause other items to be selected, other - items to be deselected, or for nothing to actually happen at all. - - \param item - Pointer to the attached ListboxItem to be affected. - - \param state - - true to put the ListboxItem into the selected state. - - false to put the ListboxItem into the de-selected state. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a item is not attached to the list box. - */ - void setItemSelectState(ListboxItem* item, bool state); - - - /*! - \brief - Sets or clears the selected state of the ListboxItem at the given grid reference. - - \note - Depending upon the current selection mode, this may cause other items to be selected, other - items to be deselected, or for nothing to actually happen at all. - - \param grid_ref - MCLGridRef object describing the position of the item to be affected. - - \param state - - true to put the ListboxItem into the selected state. - - false to put the ListboxItem into the de-selected state. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a grid_ref is invalid for this list box. - */ - void setItemSelectState(const MCLGridRef& grid_ref, bool state); - - - /*! - \brief - Inform the list box that one or more attached ListboxItems have been externally modified, and - the list should re-sync its internal state and refresh the display as needed. - - \return - Nothing. - */ - void handleUpdatedItemData(void); - - - /*! - \brief - Set the width of the specified column header (and therefore the column itself). - - \param col_idx - Zero based column index of the column whos width is to be set. - - \param width - float value specifying the new width for the column using the active metrics system. - - \param relative - *Added by Talidan for MTA* specifies whether the measurement is relative or absolute - - \return - Nothing. - - \exception InvalidRequestException thrown if \a column is out of range. - */ - void setColumnHeaderWidth(uint col_idx, float width, bool relative = true); - - /*! - \brief - Set the title of the specified column header (and therefore the column itself). - - \param col_idx - Zero based column index of the column whos width is to be set. - - \param title - const chart value specifying the new title for the column. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a column is out of range. - */ - - void setColumnHeaderTitle(uint col_idx, const char* title); - - /*! - \brief - Get the title of the specified column header (and therefore the column itself). - - \param col_idx - Zero based column index of the column whos width is to be get. - - \return - const char with column title - - */ - - const char* getColumnHeaderTitle(uint col_idx); - - /*! - \brief - Set whether user manipulation of the sort column and direction are enabled. - - \param setting - - true if the user may interactively modify the sort column and direction. - - false if the user may not modify the sort column and direction (these can still be set programmatically). - - \return - Nothing. - */ - void setUserSortControlEnabled(bool setting); - - - /*! - \brief - Set whether the user may size column segments. - - \param setting - - true if the user may interactively modify the width of columns. - - false if the user may not change the width of the columns. - - \return - Nothing. - */ - void setUserColumnSizingEnabled(bool setting); - - /*! - \Added to MTA by Talidan - Set whether the user may size a specific column segment - - \param setting - -col_idx: Zero based column index of the column whos width is to be set. - -setting: true if the user may interactively modify the width of columns. false if the user may not change the width of the columns. - \return - Nothing - */ - void setUserColumnSegmentSizingEnabled(uint col_idx, bool setting); - - /*! - \brief - Set whether the user may modify the order of the columns. - - \param setting - - true if the user may interactively modify the order of the columns. - - false if the user may not modify the order of the columns. - */ - void setUserColumnDraggingEnabled(bool setting); - - - /*! - \brief - Automatically determines the "best fit" size for the specified column and sets - the column width to the same. - - \param col_idx - Zero based index of the column to be sized. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a col_idx is out of range. - */ - void autoSizeColumnHeader(uint col_idx); - - - /*! - \brief - Set the ID code assigned to a given row. - - \param row_idx - Zero based index of the row who's ID code is to be set. - - \param row_id - ID code to be assigned to the row at the requested index. - - \return - Nothing. - - \exception InvalidRequestException thrown if \a row_idx is out of range - */ - void setRowID(uint row_idx, uint row_id); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for the Multi-column list base class - */ - MultiColumnList(const String& type, const String& name); - - - /*! - \brief - Destructor for the multi-column list base class. - */ - virtual ~MultiColumnList(void); - - -public: - /************************************************************************* - Implementation Functions (abstract interface) - *************************************************************************/ - /*! - \brief - Return a Rect object describing, in un-clipped pixels, the window relative area - that is to be used for rendering list items. - - \return - Rect object describing the area of the Window to be used for rendering - list box items. - */ - virtual Rect getListRenderArea(void) const = 0; - - - /*! - \brief - create and return a pointer to a ListHeaer widget for use as the column headers. - - \param name - String holding the name to be assigned to the created component. - - \return - Pointer to a ListHeader based object. - */ - virtual ListHeader* createListHeader(const String& name) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as vertical scroll bar - - \param name - String holding the name to be assigned to the created component. - - \return - Pointer to a Scrollbar to be used for scrolling the list vertically. - */ - virtual Scrollbar* createVertScrollbar(const String& name) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as horizontal scroll bar - - \param name - String holding the name to be assigned to the created component. - - \return - Pointer to a Scrollbar to be used for scrolling the list horizontally. - */ - virtual Scrollbar* createHorzScrollbar(const String& name) const = 0; - - - /*! - \brief - Perform rendering of the widget control frame and other 'static' areas. This - method should not render the actual items. Note that the items are typically - rendered to layer 3, other layers can be used for rendering imagery behind and - infront of the items. - - \return - Nothing. - */ - virtual void cacheListboxBaseImagery() = 0; - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add multi column list box specific events - */ - void addMultiColumnListboxEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addMultiColumnListboxEvents(false); } - - // overridden from base class. - virtual void populateRenderCache(); - - - /*! - \brief - display required integrated scroll bars according to current state of the list box and update their values. - */ - void configureScrollbars(void); - - - /*! - \brief - select all strings between positions \a start and \a end. (inclusive). Returns true if something was modified. - */ - bool selectRange(const MCLGridRef& start, const MCLGridRef& end); - - - /*! - \brief - Return the sum of all row heights - */ - float getTotalRowsHeight(void) const; - - - /*! - \brief - Return the width of the widest item in the given column - */ - float getWidestColumnItemWidth(uint col_idx) const; - - - /*! - \brief - Return the height of the highest item in the given row. - */ - float getHighestRowItemHeight(uint row_idx) const; - - - /*! - \brief - Clear the selected state for all items (implementation) - - \return - true if some selections were cleared, false nothing was changed. - */ - bool clearAllSelections_impl(void); - - - /*! - \brief - Return the ListboxItem under the given window local pixel co-ordinate. - - \return - ListboxItem that is under window pixel co-ordinate \a pt, or NULL if no - item is under that position. - */ - ListboxItem* getItemAtPoint(const Point& pt) const; - - - /*! - \brief - Set select state for the given item. This appropriately selects other - items depending upon the select mode. Returns true if something is - changed, else false. - */ - bool setItemSelectState_impl(const MCLGridRef grid_ref, bool state); - - - /*! - \brief - Set select state for all items in the given row - */ - void setSelectForItemsInRow(uint row_idx, bool state); - - - /*! - \brief - Set select state for all items in the given column - */ - void setSelectForItemsInColumn(uint col_idx, bool state); - - - /*! - \brief - Move the column at index \a col_idx so it is at index \a position. Implementation version which does not move the - header segment (since that may have already happened). - - \exception InvalidRequestException thrown if \a col_idx is invalid. - */ - void moveColumn_impl(uint col_idx, uint position); - - - /*! - \brief - Remove all items from the list. - - \note - Note that this will cause 'AutoDelete' items to be deleted. - - \return - - true if the list contents were changed. - - false if the list contents were not changed (list already empty). - */ - bool resetList_impl(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"MultiColumnList") return true; - return Window::testClassName_impl(class_name); - } - - // overrides function in base class. - int writePropertiesXML(OutStream& out_stream) const; - - /************************************************************************* - New event handlers for multi column list - *************************************************************************/ - /*! - \brief - Handler called when the selection mode of the list box changes - */ - virtual void onSelectionModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the nominated selection column changes - */ - virtual void onNominatedSelectColumnChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the nominated selection row changes. - */ - virtual void onNominatedSelectRowChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the vertical scroll bar 'force' mode is changed. - */ - virtual void onVertScrollbarModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the horizontal scroll bar 'force' mode is changed. - */ - virtual void onHorzScrollbarModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the current selection changes. - */ - virtual void onSelectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the list contents is changed. - */ - virtual void onListContentsChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the sort column changes. - */ - virtual void onSortColumnChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the sort direction changes. - */ - virtual void onSortDirectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when a column is sized. - */ - virtual void onListColumnSized(WindowEventArgs& e); - - - /*! - \brief - Handler called when the column order is changed. - */ - virtual void onListColumnMoved(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event handlers - *************************************************************************/ - virtual void onSized(WindowEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseWheel(MouseEventArgs& e); - - - /************************************************************************* - Handlers for subscribed events - *************************************************************************/ - bool handleHeaderScroll(const EventArgs& e); - bool handleHeaderSegMove(const EventArgs& e); - bool handleColumnSizeChange(const EventArgs& e); - bool handleHorzScrollbar(const EventArgs& e); - bool handleVertScrollbar(const EventArgs& e); - bool handleSortColumnChange(const EventArgs& e); - bool handleSortDirectionChange(const EventArgs& e); - bool handleHeaderSegDblClick(const EventArgs& e); - - /*! - \brief - Struct used internally to represent a row in the list and also to ease - sorting of the rows. - */ - struct ListRow - { - typedef std::vector RowItems; - RowItems d_items; - uint d_sortColumn; - uint d_rowID; - - // operators - ListboxItem* const& operator[](uint idx) const {return d_items[idx];} - ListboxItem*& operator[](uint idx) {return d_items[idx];} - bool operator<(const ListRow& rhs) const; - bool operator>(const ListRow& rhs) const; - }; - - - /*! - \brief - std algorithm predicate used for sorting in descending order - */ - static bool pred_descend(const ListRow& a, const ListRow& b); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - // component widgets and settings. - Scrollbar* d_vertScrollbar; //!< vertical scroll-bar widget - Scrollbar* d_horzScrollbar; //!< horizontal scroll-bar widget - ListHeader* d_header; //!< The ListHeader attached to this multi-column list. - bool d_forceVertScroll; //!< true if vertical scrollbar should always be displayed - bool d_forceHorzScroll; //!< true if horizontal scrollbar should always be displayed - - // selection abilities. - SelectionMode d_selectMode; //!< Holds selection mode (represented by settings below). - uint d_nominatedSelectCol; //!< Nominated column for single column selection. - uint d_nominatedSelectRow; //!< Nominated row for single row selection. - bool d_multiSelect; //!< Allow multiple selections. - bool d_fullRowSelect; //!< All items in a row are selected. - bool d_fullColSelect; //!< All items in a column are selected. - bool d_useNominatedRow; //!< true if we use a nominated row to select. - bool d_useNominatedCol; //!< true if we use a nominated col to select. - ListboxItem* d_lastSelected; //!< holds pointer to the last selected item (used in range selections) - - // storage of items in the list box. - typedef std::vector ListItemGrid; - ListItemGrid d_grid; //!< Holds the list box data. - - uint d_firstVisibleRow; - uint d_lastVisibleRow; - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static MultiColumnListProperties::ColumnsMovable d_columnsMovableProperty; - static MultiColumnListProperties::ColumnsSizable d_columnsSizableProperty; - static MultiColumnListProperties::ForceHorzScrollbar d_forceHorzScrollProperty; - static MultiColumnListProperties::ForceVertScrollbar d_forceVertScrollProperty; - static MultiColumnListProperties::NominatedSelectionColumnID d_nominatedSelectColProperty; - static MultiColumnListProperties::NominatedSelectionRow d_nominatedSelectRowProperty; - static MultiColumnListProperties::SelectionMode d_selectModeProperty; - static MultiColumnListProperties::SortColumnID d_sortColumnIDProperty; - static MultiColumnListProperties::SortDirection d_sortDirectionProperty; - static MultiColumnListProperties::SortSettingEnabled d_sortSettingProperty; - static MultiColumnListProperties::ColumnHeader d_columnHeaderProperty; - static MultiColumnListProperties::RowCount d_rowCountProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addMultiColumnListProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addMultiColumnListProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIMultiColumnList_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnListProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnListProperties.h deleted file mode 100644 index 1557cba838..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiColumnListProperties.h +++ /dev/null @@ -1,362 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiColumnListProperties.h - created: 11/7/2004 - author: Paul D Turner - - purpose: Interface to multi-column list properties. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMultiColumnListProperties_h_ -#define _CEGUIMultiColumnListProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of MultiColumnListProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the MultiColumnList class -*/ -namespace MultiColumnListProperties -{ -/*! -\brief - Property to access the setting for user sizing of the column headers. - - \par Usage: - - Name: ColumnsSizable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the column headers can be sized by the user. - - "False" to indicate the column headers can not be sized by the user. -*/ -class ColumnsSizable : public Property -{ -public: - ColumnsSizable() : Property( - "ColumnsSizable", - "Property to get/set the setting for user sizing of the column headers. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for user moving of the column headers. - - \par Usage: - - Name: ColumnsMovable - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the column headers can be moved by the user. - - "False" to indicate the column headers can not be moved by the user. -*/ -class ColumnsMovable : public Property -{ -public: - ColumnsMovable() : Property( - "ColumnsMovable", - "Property to get/set the setting for user moving of the column headers. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for user modification of the sort column & direction. - - \par Usage: - - Name: SortSettingEnabled - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the user may modify the sort column and direction by clicking the header segments. - - "False" to indicate the user may not modify the sort column or direction. -*/ -class SortSettingEnabled : public Property -{ -public: - SortSettingEnabled() : Property( - "SortSettingEnabled", - "Property to get/set the setting for for user modification of the sort column & direction. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the sort direction setting of the list. - - \par Usage: - - Name: SortDirection - - Format: "[text]" - - \par Where [Text] is one of: - - "Ascending" - - "Descending" - - "None" -*/ -class SortDirection : public Property -{ -public: - SortDirection() : Property( - "SortDirection", - "Property to get/set the sort direction setting of the list. Value is the text of one of the SortDirection enumerated value names.", - "None") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current sort column (via ID code). - - \par Usage: - - Name: SortColumnID - - Format: "[uint]". - - \par Where: - - [uint] is any unsigned integer value. -*/ -class SortColumnID : public Property -{ -public: - SortColumnID() : Property( - "SortColumnID", - "Property to get/set the current sort column (via ID code). Value is an unsigned integer number.", - "0", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the nominated selection column (via ID). - - \par Usage: - - Name: NominatedSelectionColumnID - - Format: "[uint]". - - \par Where: - - [uint] is any unsigned integer value representing the ID code of the column to be used. -*/ -class NominatedSelectionColumnID : public Property -{ -public: - NominatedSelectionColumnID() : Property( - "NominatedSelectionColumnID", - "Property to get/set the nominated selection column (via ID). Value is an unsigned integer number.", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the nominated selection row. - - \par Usage: - - Name: NominatedSelectionRow - - Format: "[uint]". - - \par Where: - - [uint] is any unsigned integer value representing the index of the row to be used. -*/ -class NominatedSelectionRow : public Property -{ -public: - NominatedSelectionRow() : Property( - "NominatedSelectionRow", - "Property to get/set the nominated selection row. Value is an unsigned integer number.", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'always show' setting for the vertical scroll bar of the list box. - - \par Usage: - - Name: ForceVertScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the vertical scroll bar will always be shown. - - "False" to indicate that the vertical scroll bar will only be shown when it is needed. -*/ -class ForceVertScrollbar : public Property -{ -public: - ForceVertScrollbar() : Property( - "ForceVertScrollbar", - "Property to get/set the 'always show' setting for the vertical scroll bar of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the 'always show' setting for the horizontal scroll bar of the list box. - - \par Usage: - - Name: ForceHorzScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the horizontal scroll bar will always be shown. - - "False" to indicate that the horizontal scroll bar will only be shown when it is needed. -*/ -class ForceHorzScrollbar : public Property -{ -public: - ForceHorzScrollbar() : Property( - "ForceHorzScrollbar", - "Property to get/set the 'always show' setting for the horizontal scroll bar of the list box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the selection mode setting of the list. - - \par Usage: - - Name: SelectionMode - - Format: "[text]" - - \par Where [Text] is one of: - - "RowSingle" - - "RowMultiple" - - "CellSingle" - - "CellMultiple" - - "NominatedColumnSingle" - - "NominatedColumnMultiple" - - "ColumnSingle" - - "ColumnMultiple" - - "NominatedRowSingle" - - "NominatedRowMultiple" -*/ -class SelectionMode : public Property -{ -public: - SelectionMode() : Property( - "SelectionMode", - "Property to get/set the selection mode setting of the list. Value is the text of one of the SelectionMode enumerated value names.", - "RowSingle") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access a column. - - \par Usage: - - Name: ColumnHeader - - Format: "text:[caption] width:[float] id:[uint]" - - \par where: - - [caption] is the column header caption text. - - [float] is the width of the column. - - [uint] is the unique ID for the column. -*/ -class ColumnHeader : public Property -{ -public: - ColumnHeader() : Property( - "ColumnHeader", - "Property to set up a column (there is no getter for this property)", - "", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the number of rows in the list (read-only) - - \par Usage: - - Name: RowCount - - Format: "" (property is read-only). -*/ -class RowCount : public Property -{ -public: - RowCount() : Property( - "RowCount", - "Property to access the number of rows in the list (read only)", - "", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of MultiColumnListProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIMultiColumnListProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditbox.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditbox.h deleted file mode 100644 index 33a1a19067..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditbox.h +++ /dev/null @@ -1,795 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiLineEditbox.h - created: 30/6/2004 - author: Paul D Turner - - purpose: Interface to the Multi-lien edit box base class. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMultiLineEditbox_h_ -#define _CEGUIMultiLineEditbox_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "CEGUIFont.h" -#include "elements/CEGUIMultiLineEditboxProperties.h" - -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for the multi-line edit box widget. -*/ -class CEGUIEXPORT MultiLineEditbox : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // event names - static const String EventReadOnlyModeChanged; //!< The read-only mode for the edit box has been changed. - static const String EventWordWrapModeChanged; //!< The word wrap mode of the text box has been changed. - static const String EventMaximumTextLengthChanged; //!< The maximum allowable string length has been changed. - static const String EventCaratMoved; //!< The text carat (insert point) has changed. - static const String EventTextSelectionChanged; //!< The current text selection has changed. - static const String EventEditboxFull; //!< The number of characters in the edit box has reached the current maximum. - static const String EventVertScrollbarModeChanged; //!< Event triggered when the vertical scroll bar 'force' setting changes. - static const String EventHorzScrollbarModeChanged; //!< Event triggered when the horizontal scroll bar 'force' setting changes. - - // default colours - static const argb_t DefaultNormalTextColour; //!< Colour applied to normal unselected text. - static const argb_t DefaultSelectedTextColour; //!< Colour applied to selected text. - static const argb_t DefaultNormalSelectionColour; //!< Colour applied to normal selection brush. - static const argb_t DefaultInactiveSelectionColour; //!< Colour applied to selection brush when widget is inactive. - - - /************************************************************************* - Accessor Functions - *************************************************************************/ - /*! - \brief - return true if the edit box has input focus. - - \return - - true if the edit box has keyboard input focus. - - false if the edit box does not have keyboard input focus. - */ - bool hasInputFocus(void) const; - - - /*! - \brief - return true if the edit box is read-only. - - \return - - true if the edit box is read only and can't be edited by the user. - - false if the edit box is not read only and may be edited by the user. - */ - bool isReadOnly(void) const {return d_readOnly;} - - - /*! - \brief - return the current position of the carat. - - \return - Index of the insert carat relative to the start of the text. - */ - size_t getCaratIndex(void) const {return d_caratPos;} - - - /*! - \brief - return the current selection start point. - - \return - Index of the selection start point relative to the start of the text. If no selection is defined this function returns - the position of the carat. - */ - size_t getSelectionStartIndex(void) const; - - - /*! - \brief - return the current selection end point. - - \return - Index of the selection end point relative to the start of the text. If no selection is defined this function returns - the position of the carat. - */ - size_t getSelectionEndIndex(void) const; - - - /*! - \brief - return the length of the current selection (in code points / characters). - - \return - Number of code points (or characters) contained within the currently defined selection. - */ - size_t getSelectionLength(void) const; - - - /*! - \brief - return the maximum text length set for this edit box. - - \return - The maximum number of code points (characters) that can be entered into this edit box. - */ - size_t getMaxTextLength(void) const {return d_maxTextLen;} - - - /*! - \brief - return the currently set colour to be used for rendering edit box text in the - normal, unselected state. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getNormalTextColour(void) const {return d_normalTextColour;} - - - /*! - \brief - return the currently set colour to be used for rendering the edit box text when within the - selected region. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getSelectedTextColour(void) const {return d_selectTextColour;} - - - /*! - \brief - return the currently set colour to be used for rendering the edit box selection highlight - when the edit box is active. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getNormalSelectBrushColour(void) const {return d_selectBrushColour;} - - - /*! - \brief - return the currently set colour to be used for rendering the edit box selection highlight - when the edit box is inactive. - - \return - colour value describing the ARGB colour that is currently set. - */ - colour getInactiveSelectBrushColour(void) const {return d_inactiveSelectBrushColour;} - - - /*! - \brief - Return whether the text in the edit box will be word-wrapped. - - \return - - true if the text will be word-wrapped at the edges of the widget frame. - - false if text will not be word-wrapped (a scroll bar will be used to access long text lines). - */ - bool isWordWrapped(void) const; - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Specify whether the edit box is read-only. - - \param setting - - true if the edit box is read only and can't be edited by the user. - - false if the edit box is not read only and may be edited by the user. - - \return - Nothing. - */ - void setReadOnly(bool setting); - - - /*! - \brief - Set the current position of the carat. - - \param carat_pos - New index for the insert carat relative to the start of the text. If the value specified is greater than the - number of characters in the edit box, the carat is positioned at the end of the text. - - \return - Nothing. - */ - void setCaratIndex(size_t carat_pos); - - - /*! - \brief - Define the current selection for the edit box - - \param start_pos - Index of the starting point for the selection. If this value is greater than the number of characters in the edit box, the - selection start will be set to the end of the text. - - \param end_pos - Index of the ending point for the selection. If this value is greater than the number of characters in the edit box, the - selection start will be set to the end of the text. - - \return - Nothing. - */ - void setSelection(size_t start_pos, size_t end_pos); - - - /*! - \brief - set the maximum text length for this edit box. - - \param max_len - The maximum number of code points (characters) that can be entered into this Editbox. - - \return - Nothing. - */ - void setMaxTextLength(size_t max_len); - - - /*! - \brief - Set the colour to be used for rendering edit box text in the normal, unselected state. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setNormalTextColour(const colour& col); - - - /*! - \brief - Set the colour to be used for rendering the edit box text when within the - selected region. - - \return - colour value describing the ARGB colour that is currently set. - */ - void setSelectedTextColour(const colour& col); - - - /*! - \brief - Set the colour to be used for rendering the edit box selection highlight - when the edit box is active. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setNormalSelectBrushColour(const colour& col); - - - /*! - \brief - Set the colour to be used for rendering the edit box selection highlight - when the edit box is inactive. - - \param col - colour value describing the ARGB colour that is to be used. - - \return - Nothing. - */ - void setInactiveSelectBrushColour(const colour& col); - - - /*! - \brief - Scroll the view so that the current carat position is visible. - */ - void ensureCaratIsVisible(void); - - - /*! - \brief - Set whether the text will be word wrapped or not. - - \param setting - - true if the text should word-wrap at the edges of the text box. - - false if the text should not wrap, but a scroll bar should be used. - - \return - Nothing. - */ - void setWordWrapping(bool setting); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for the MultiLineEditbox base class. - */ - MultiLineEditbox(const String& type, const String& name); - - - /*! - \brief - Destructor for the MultiLineEditbox base class. - */ - virtual ~MultiLineEditbox(void); - - -public: - /************************************************************************* - Implementation Methods (abstract) - *************************************************************************/ - /*! - \brief - Return a Rect object describing, in un-clipped pixels, the window relative area - that the text should be rendered in to. - - \return - Rect object describing the area of the Window to be used for rendering text. - */ - virtual Rect getTextRenderArea(void) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as vertical scroll bar - - \param name - String holding the name to be assigned to the component. - - \return - Pointer to a Scrollbar to be used for scrolling vertically. - */ - virtual Scrollbar* createVertScrollbar(const String& name) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as horizontal scroll bar - - \param name - String holding the name to be assigned to the component. - - \return - Pointer to a Scrollbar to be used for scrolling horizontally. - */ - virtual Scrollbar* createHorzScrollbar(const String& name) const = 0; - - - /*! - \brief - Perform rendering of the widget control frame and other 'static' areas. This - method should not render the actual text. Note that the text will be rendered - to layer 4 and the selection brush to layer 3, other layers can be used for - rendering imagery behind and infront of the text & selection.. - - \return - Nothing. - */ - virtual void cacheEditboxBaseImagery() = 0; - - - /*! - \brief - Render the carat. - - \return - Nothing - */ - virtual void cacheCaratImagery(const Rect& textArea) = 0; - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Add multi-line edit box specific events - */ - void addMultiLineEditboxEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addMultiLineEditboxEvents(false); } - - - /*! - \brief - Render text lines. - */ - void cacheTextLines(const Rect& dest_area); - - - /*! - \brief - Format the text into lines as needed by the current formatting options. - */ - void formatText(void); - - - /*! - \brief - Return the length of the next token in String \a text starting at index \a start_idx. - - \note - Any single whitespace character is one token, any group of other characters is a token. - - \return - The code point length of the token. - */ - size_t getNextTokenLength(const String& text, size_t start_idx) const; - - - virtual void populateRenderCache(); - - - /*! - \brief - display required integrated scroll bars according to current state of the edit box and update their values. - */ - void configureScrollbars(void); - - - /*! - \brief - Return the text code point index that is rendered closest to screen position \a pt. - - \param pt - Point object describing a position on the screen in pixels. - - \return - Code point index into the text that is rendered closest to screen position \a pt. - */ - size_t getTextIndexFromPosition(const Point& pt) const; - - - /*! - \brief - Return the line number a given index falls on with the current formatting. Will return last line - if index is out of range. - */ - size_t getLineNumberFromIndex(size_t index) const; - - - /*! - \brief - Clear the current selection setting - */ - void clearSelection(void); - - - /*! - \brief - Erase the currently selected text. - - \param modify_text - when true, the actual text will be modified. When false, everything is done except erasing the characters. - */ - void eraseSelectedText(bool modify_text = true); - - - /*! - \brief - Processing for backspace key - */ - void handleBackspace(void); - - - /*! - \brief - Processing for Delete key - */ - void handleDelete(void); - - - /*! - \brief - Processing to move carat one character left - */ - void handleCharLeft(uint sysKeys); - - - /*! - \brief - Processing to move carat one word left - */ - void handleWordLeft(uint sysKeys); - - - /*! - \brief - Processing to move carat one character right - */ - void handleCharRight(uint sysKeys); - - - /*! - \brief - Processing to move carat one word right - */ - void handleWordRight(uint sysKeys); - - - /*! - \brief - Processing to move carat to the start of the text. - */ - void handleDocHome(uint sysKeys); - - - /*! - \brief - Processing to move carat to the end of the text - */ - void handleDocEnd(uint sysKeys); - - - /*! - \brief - Processing to move carat to the start of the current line. - */ - void handleLineHome(uint sysKeys); - - - /*! - \brief - Processing to move carat to the end of the current line - */ - void handleLineEnd(uint sysKeys); - - - /*! - \brief - Processing to move carat up a line. - */ - void handleLineUp(uint sysKeys); - - - /*! - \brief - Processing to move carat down a line. - */ - void handleLineDown(uint sysKeys); - - - /*! - \brief - Processing to insert a new line / paragraph. - */ - void handleNewLine(uint sysKeys); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if ((class_name==(const utf8*)"MultiLineEditBox") || - (class_name==(const utf8*)"MultiLineEditbox")) - { - return true; - } - - return Window::testClassName_impl(class_name); - } - - /*! - \brief - Internal handler that is triggered when the user interacts with the scrollbars. - */ - bool handle_scrollChange(const EventArgs& args); - - - /************************************************************************* - New event handlers - *************************************************************************/ - /*! - \brief - Handler called when the read-only state of the edit box changes - */ - void onReadOnlyChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the word wrap mode for the the edit box changes - */ - void onWordWrapModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the maximum text length for the edit box changes - */ - void onMaximumTextLengthChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the carat moves. - */ - void onCaratMoved(WindowEventArgs& e); - - - /*! - \brief - Handler called when the text selection changes - */ - void onTextSelectionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when the edit box is full - */ - void onEditboxFullEvent(WindowEventArgs& e); - - - /*! - \brief - Handler called when the 'always show' setting for the vertical scroll bar changes. - */ - void onVertScrollbarModeChanged(WindowEventArgs& e); - - - /*! - \brief - Handler called when 'always show' setting for the horizontal scroll bar changes. - */ - void onHorzScrollbarModeChanged(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onMouseDoubleClicked(MouseEventArgs& e); - virtual void onMouseTripleClicked(MouseEventArgs& e); - virtual void onMouseMove(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onCharacter(KeyEventArgs& e); - virtual void onKeyDown(KeyEventArgs& e); - virtual void onTextChanged(WindowEventArgs& e); - virtual void onSized(WindowEventArgs& e); - virtual void onMouseWheel(MouseEventArgs& e); - - - /************************************************************************* - Implementation struct - *************************************************************************/ - /*! - \brief - struct used to store information about a formatted line within the - paragraph. - */ - struct LineInfo - { - size_t d_startIdx; //!< Starting index for this line. - size_t d_length; //!< Code point length of this line. - float d_extent; //!< Rendered extent of this line. - }; - - - /************************************************************************* - Implementation data - *************************************************************************/ - bool d_readOnly; //!< true if the edit box is in read-only mode - size_t d_maxTextLen; //!< Maximum number of characters for this Editbox. - size_t d_caratPos; //!< Position of the carat / insert-point. - size_t d_selectionStart; //!< Start of selection area. - size_t d_selectionEnd; //!< End of selection area. - bool d_dragging; //!< true when a selection is being dragged. - size_t d_dragAnchorIdx; //!< Selection index for drag selection anchor point. - - typedef std::vector LineList; //!< Type for collection of LineInfos. - static String d_lineBreakChars; //!< Holds what we consider to be line break characters. - bool d_wordWrap; //!< true when formatting uses word-wrapping. - LineList d_lines; //!< Holds the lines for the current formatting. - float d_widestExtent; //!< Holds the extent of the widest line as calculated in the last formatting pass. - - // component widgets - Scrollbar* d_vertScrollbar; //!< Points to the vertical scroll bar widget. - Scrollbar* d_horzScrollbar; //!< Points to the horizontal scroll bar widget. - bool d_forceVertScroll; //!< true if vertical scrollbar should always be displayed - bool d_forceHorzScroll; //!< true if horizontal scrollbar should always be displayed - - // images - const Image* d_selectionBrush; //!< Image to use as the selection brush (should be set by derived class). - - // basic rendering colours - colour d_normalTextColour; //!< Text colour used normally. - colour d_selectTextColour; //!< Text colour used when text is highlighted - colour d_selectBrushColour; //!< Colour to apply to the selection brush. - colour d_inactiveSelectBrushColour; //!< Colour to apply to the selection brush when widget is inactive / read-only. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static MultiLineEditboxProperties::ReadOnly d_readOnlyProperty; - static MultiLineEditboxProperties::WordWrap d_wordWrapProperty; - static MultiLineEditboxProperties::CaratIndex d_caratIndexProperty; - static MultiLineEditboxProperties::SelectionStart d_selectionStartProperty; - static MultiLineEditboxProperties::SelectionLength d_selectionLengthProperty; - static MultiLineEditboxProperties::MaxTextLength d_maxTextLengthProperty; - static MultiLineEditboxProperties::NormalTextColour d_normalTextColourProperty; - static MultiLineEditboxProperties::SelectedTextColour d_selectedTextColourProperty; - static MultiLineEditboxProperties::ActiveSelectionColour d_activeSelectionColourProperty; - static MultiLineEditboxProperties::InactiveSelectionColour d_inactiveSelectionColourProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addMultiLineEditboxProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addMultiLineEditboxProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIMultiLineEditbox_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditboxProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditboxProperties.h deleted file mode 100644 index 2e6f6b4fae..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIMultiLineEditboxProperties.h +++ /dev/null @@ -1,300 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiLineEditboxProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface to properties for the MultiLineEditbox class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIMultiLineEditboxProperties_h_ -#define _CEGUIMultiLineEditboxProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of MultiLineEditboxProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the MultiLineEditbox class -*/ -namespace MultiLineEditboxProperties -{ -/*! -\brief - Property to access the read-only setting of the edit box. - - \par Usage: - - Name: ReadOnly - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the edit box is read-only. - - "False" to indicate the edit box is not read-only (text may be edited by user). -*/ -class ReadOnly : public Property -{ -public: - ReadOnly() : Property( - "ReadOnly", - "Property to get/set the read-only setting for the edit box. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the word-wrap setting of the edit box. - - \par Usage: - - Name: WordWrap - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the text should be word-wrapped. - - "False" to indicate the text should not be word-wrapped. -*/ -class WordWrap : public Property -{ -public: - WordWrap() : Property( - "WordWrap", - "Property to get/set the word-wrap setting of the edit box. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current carat index. - - \par Usage: - - Name: CaratIndex - - Format: "[uint]" - - \par Where: - - [uint] is the zero based index of the carat position within the text. -*/ -class CaratIndex : public Property -{ -public: - CaratIndex() : Property( - "CaratIndex", - "Property to get/set the current carat index. Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current selection start index. - - \par Usage: - - Name: SelectionStart - - Format: "[uint]" - - \par Where: - - [uint] is the zero based index of the selection start position within the text. -*/ -class SelectionStart : public Property -{ -public: - SelectionStart() : Property( - "SelectionStart", - "Property to get/set the zero based index of the selection start position within the text. Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the current selection length. - - \par Usage: - - Name: SelectionLength - - Format: "[uint]" - - \par Where: - - [uint] is the length of the selection (as a count of the number of code points selected). -*/ -class SelectionLength : public Property -{ -public: - SelectionLength() : Property( - "SelectionLength", - "Property to get/set the length of the selection (as a count of the number of code points selected). Value is \"[uint]\".", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the maximum text length for the edit box. - - \par Usage: - - Name: MaxTextLength - - Format: "[uint]" - - \par Where: - - [uint] is the maximum allowed text length (as a count of code points). -*/ -class MaxTextLength : public Property -{ -public: - MaxTextLength() : Property( - "MaxTextLength", - "Property to get/set the the maximum allowed text length (as a count of code points). Value is \"[uint]\".", - "1073741824") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the normal, unselected, text colour used for rendering text. - - \par Usage: - - Name: NormalTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class NormalTextColour : public Property -{ -public: - NormalTextColour() : Property( - "NormalTextColour", - "Property to get/set the normal, unselected, text colour used for rendering text. Value is \"aarrggbb\" (hex).", - "FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering text within the selection area. - - \par Usage: - - Name: SelectedTextColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class SelectedTextColour : public Property -{ -public: - SelectedTextColour() : Property( - "SelectedTextColour", - "Property to get/set the colour used for rendering text within the selection area. Value is \"aarrggbb\" (hex).", - "FF000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering the selection highlight when the edit box is active. - - \par Usage: - - Name: ActiveSelectionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class ActiveSelectionColour : public Property -{ -public: - ActiveSelectionColour() : Property( - "ActiveSelectionColour", - "Property to get/set the colour used for rendering the selection highlight when the edit box is active. Value is \"aarrggbb\" (hex).", - "FF6060FF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the colour used for rendering the selection highlight when the edit box is inactive. - - \par Usage: - - Name: InactiveSelectionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class InactiveSelectionColour : public Property -{ -public: - InactiveSelectionColour() : Property( - "InactiveSelectionColour", - "Property to get/set the colour used for rendering the selection highlight when the edit box is inactive. Value is \"aarrggbb\" (hex).", - "FF808080") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of MultiLineEditboxProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIMultiLineEditboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenu.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenu.h deleted file mode 100644 index ffd76eacbb..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenu.h +++ /dev/null @@ -1,228 +0,0 @@ -/************************************************************************ - filename: CEGUIPopupMenu.h - created: 27/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Interface to base class for PopupMenu widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIPopupMenu_h_ -#define _CEGUIPopupMenu_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIPopupMenuProperties.h" -#include "elements/CEGUIMenuBase.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for popup menus -*/ -class CEGUIEXPORT PopupMenu : public MenuBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Accessor type functions - *************************************************************************/ - /*! - \brief - Get the fade in time for this popup menu. - - \return - The time in seconds that it takes for the popup to fade in. - 0 if fading is disabled. - */ - float getFadeInTime(void) const {return d_fadeInTime;} - - - /*! - \brief - Get the fade out time for this popup menu. - - \return - The time in seconds that it takes for the popup to fade out. - 0 if fading is disabled. - */ - float getFadeOutTime(void) const {return d_fadeOutTime;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the fade in time for this popup menu. - - \param fadetime - The time in seconds that it takes for the popup to fade in. - If this parameter is zero, fading is disabled. - */ - void setFadeInTime(float fadetime) {d_fadeInTime=fadetime;} - - - /*! - \brief - Set the fade out time for this popup menu. - - \param fadetime - The time in seconds that it takes for the popup to fade out. - If this parameter is zero, fading is disabled. - */ - void setFadeOutTime(float fadetime) {d_fadeOutTime=fadetime;} - - /*! - \brief - Tells the popup menu to open. - */ - void openPopupMenu(void); - - - /*! - \brief - Tells the popup menu to close. - */ - void closePopupMenu(void); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for PopupMenu objects - */ - PopupMenu(const String& type, const String& name); - - - /*! - \brief - Destructor for PopupMenu objects - */ - virtual ~PopupMenu(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Perform actual update processing for this Window. - - \param elapsed - float value indicating the number of seconds elapsed since the last update call. - - \return - Nothing. - */ - virtual void updateSelf(float elapsed); - - - /*! - \brief - Setup size and position for the item widgets attached to this Listbox - - \return - Nothing. - */ - virtual void layoutItemWidgets(void); - - - /*! - \brief - Resizes the popup menu to exactly fit the content that is attached to it. - - \return - Nothing. - */ - virtual Size getContentSize(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"PopupMenu") return true; - return MenuBase::testClassName_impl(class_name); - } - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onAlphaChanged(WindowEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_origAlpha; //!< The original alpha of this window. - - float d_fadeElapsed; //!< The time in seconds this popup menu has been fading. - float d_fadeOutTime; //!< The time in seconds it takes for this popup menu to fade out. - float d_fadeInTime; //!< The time in seconds it takes for this popup menu to fade in. - bool d_fading; //!< true if this popup menu is fading in/out. false if not - bool d_fadingOut; //!< true if this popup menu is fading out. false if fading in. - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static PopupMenuProperties::FadeInTime d_fadeInTimeProperty; - static PopupMenuProperties::FadeOutTime d_fadeOutTimeProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addPopupMenuProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addPopupMenuProperties(false); } -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - - -#endif // end of guard _CEGUIPopupMenu_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenuProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenuProperties.h deleted file mode 100644 index e5ad6a1880..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPopupMenuProperties.h +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************************************ - filename: CEGUIPopupMenuProperties.h - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIPopupMenuProperties_h_ -#define _CEGUIPopupMenuProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ItemListBaseProperties namespace section -namespace PopupMenuProperties -{ - -/*! -\brief - Property to access the fade in time in seconds of the menu bar. - - \par Usage: - - Name: FadeInTime - - Format: "[float]". - - \par Where: - - [float] represents the fade in time in seconds of the menu bar. -*/ -class FadeInTime : public Property -{ -public: - FadeInTime() : Property( - "FadeInTime", - "Property to get/set the fade in time in seconds of the menu bar. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the fade out time in seconds of the menu bar. - - \par Usage: - - Name: FadeOutTime - - Format: "[float]". - - \par Where: - - [float] represents the fade out time in seconds of the menu bar. -*/ -class FadeOutTime : public Property -{ -public: - FadeOutTime() : Property( - "FadeOutTime", - "Property to get/set the fade out time in seconds of the menu bar. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of PopupMenuProperties namespace section -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIPopupMenuProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBar.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBar.h deleted file mode 100644 index 60d8f418cd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBar.h +++ /dev/null @@ -1,224 +0,0 @@ -/************************************************************************ - filename: CEGUIProgressBar.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for ProgressBar widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIProgressBar_h_ -#define _CEGUIProgressBar_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIProgressBarProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for progress bars. -*/ -class CEGUIEXPORT ProgressBar : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Event name constants - *************************************************************************/ - static const String EventProgressChanged; //!< Event fired whenever the progress value changes. - static const String EventProgressDone; //!< Event fired when the progress bar reaches 100%. - - - /************************************************************************ - Accessor Functions - ************************************************************************/ - /*! - \brief - return the current progress value - */ - float getProgress(void) const {return d_progress;} - - /*! - \brief - return the current step size - */ - float getStep(void) const {return d_step;} - - - /************************************************************************* - Manipulator Functions - *************************************************************************/ - /*! - \brief - set the current progress. - - \param progress - The level of progress to set. If this value is >1.0f (100%) progress will be limited to 1.0f. - - \return - Nothing. - */ - void setProgress(float progress); - - - /*! - \brief - set the size of the 'step' in percentage points (default is 0.01f or 1%). - - \param step - Amount to increase the progress by each time the step method is called. - - \return - Nothing. - */ - void setStepSize(float step_val) {d_step = step_val;} - - - /*! - \brief - cause the progress to step - - The amount the progress bar will step can be changed by calling the setStepSize method. The - default step size is 0.01f which is equal to 1%. - - \return - Nothing. - */ - void step(void) {setProgress(d_progress + d_step);} - - - /*! - \brief - Modify the progress level by a specified delta. - - \param delta - amount to adjust the progress by. Whatever this value is, the progress of the bar will be kept - within the range: 0.0f <= progress <= 1.0f. - - \return - Nothing. - */ - void adjustProgress(float delta) {setProgress(d_progress + delta);} - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for ProgressBar class - */ - ProgressBar(const String& type, const String& name); - - - /*! - \brief - Destructor for ProgressBar - */ - virtual ~ProgressBar(void); - - -protected: - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - Add progress bar specific events to the window - */ - void addProgressBarEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addProgressBarEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ProgressBar") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Event handlers for progress bar specific events - *************************************************************************/ - /*! - \brief - event triggered when progress changes - */ - virtual void onProgressChanged(WindowEventArgs& e); - - - /*! - \brief - event triggered when progress reaches 100% - */ - virtual void onProgressDone(WindowEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_progress; //!< current progress (from 0.0f to 1.0f) - float d_step; //!< amount to 'step' progress by on a call to step() - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ProgressBarProperties::CurrentProgress d_currentProgressProperty; - static ProgressBarProperties::StepSize d_stepSizeProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addProgressBarProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addProgressBarProperties(false); } -}; - - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIProgressBar_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBarProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBarProperties.h deleted file mode 100644 index 52190ebfce..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIProgressBarProperties.h +++ /dev/null @@ -1,98 +0,0 @@ -/************************************************************************ - filename: CEGUIProgressBarProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface to properties for the ProgressBar class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIProgressBarProperties_h_ -#define _CEGUIProgressBarProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ProgressBarProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the ProgressBar class -*/ -namespace ProgressBarProperties -{ -/*! -\brief - Property to access the current progress of the progress bar. - - \par Usage: - - Name: CurrentProgress - - Format: "[float]". - - \par Where: - - [float] is the current progress of the bar expressed as a value between 0 and 1. -*/ -class CurrentProgress : public Property -{ -public: - CurrentProgress() : Property( - "CurrentProgress", - "Property to get/set the current progress of the progress bar. Value is a float value between 0.0 and 1.0 specifying the progress.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the step size setting for the progress bar. - - \par Usage: - - Name: StepSize - - Format: "[float]". - - \par Where: - - [float] is the size of the invisible sizing border in screen pixels. -*/ -class StepSize : public Property -{ -public: - StepSize() : Property( - "StepSize", - "Property to get/set the step size setting for the progress bar. Value is a float value.", - "0.010000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of ProgressBarProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIProgressBarProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButton.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButton.h deleted file mode 100644 index 26173398f5..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButton.h +++ /dev/null @@ -1,338 +0,0 @@ -/************************************************************************ - filename: CEGUIPushButton.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for PushButton widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIPushButton_h_ -#define _CEGUIPushButton_h_ - -#include "CEGUIBase.h" -#include "elements/CEGUIButtonBase.h" -#include "elements/CEGUIPushButtonProperties.h" -#include "CEGUIRenderableImage.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class to provide logic for push button type widgets. -*/ -class CEGUIEXPORT PushButton : public ButtonBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventClicked; //!< The button was clicked. - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for base PushButton class - */ - PushButton(const String& type, const String& name); - - - /*! - \brief - Destructor for PushButton class - */ - virtual ~PushButton(void); - - /************************************************************************* - Common Public Interface - *************************************************************************/ - /*! - \brief - return whether or not rendering of the standard imagery is enabled. - - \return - true if the standard button imagery will be rendered, false if no standard rendering will be performed. - */ - bool isStandardImageryEnabled(void) const; - - - /*! - \brief - Return whether of not custom button image areas are auto-scaled to the size of the button. - - \return - true if client specified custom image areas are re-sized when the button size changes. false if image areas will - remain unchanged when the button is sized. - */ - bool isCustomImageryAutoSized(void) const; - - /*! - \brief - returns a pointer to a read-only RenderableImage object holding the details - of the image set to render for the button in the normal state, or 0 if no - image is currently set for this state. - - \return - Pointer to a const RenderableImage object with all the details for the image. - */ - const RenderableImage* getNormalImage(void) const; - - /*! - \brief - returns a pointer to a read-only RenderableImage object holding the details - of the image set to render for the button in the highlighted state, or 0 if no - image is currently set for this state. - - \return - Pointer to a const RenderableImage object with all the details for the image. - */ - const RenderableImage* getHoverImage(void) const; - - /*! - \brief - returns a pointer to a read-only RenderableImage object holding the details - of the image set to render for the button in the pushed state, or 0 if no - image is currently set for this state. - - \return - Pointer to a const RenderableImage object with all the details for the image. - */ - const RenderableImage* getPushedImage(void) const; - - /*! - \brief - returns a pointer to a read-only RenderableImage object holding the details - of the image set to render for the button in the disabled state, or 0 if no - image is currently set for this state. - - \return - Pointer to a const RenderableImage object with all the details for the image. - */ - const RenderableImage* getDisabledImage(void) const; - - /*! - \brief - get the offset that is used to shift of the text in the x-direction - this is useful if the button-images are not symmetrical and the - text shouldn't be completely centered - - \return - the offset relative to the button-size - */ - float getTextXOffset(void) const; - - /*! - \brief - set whether or not to render the standard imagery for the button - - \param setting - true to have the standard button imagery drawn, false to have no standard imagery drawn. - - \return - Nothing. - */ - void setStandardImageryEnabled(bool setting); - - /*! - \brief - Set whether to auto re-size custom image areas when the button is sized. - - \param setting - true to have custom image areas auto-sized. false to have system leave image areas untouched. - - \return - Nothing. - */ - void setCustomImageryAutoSized(bool setting); - - /*! - \brief - set the details of the image to render for the button in the normal state. - - \param image - RenderableImage object with all the details for the image. Note that an internal copy of the Renderable image is made and - ownership of \a image remains with client code. If this parameter is NULL, rendering of an image for this button state is - disabled. - - \return - Nothing. - */ - void setNormalImage(const RenderableImage* image); - - /*! - \brief - set the details of the image to render for the button in the highlighted state. - - \param image - RenderableImage object with all the details for the image. Note that an internal copy of the Renderable image is made and - ownership of \a image remains with client code. If this parameter is NULL, rendering of an image for this button state is - disabled. - - \return - Nothing. - */ - void setHoverImage(const RenderableImage* image); - - /*! - \brief - set the details of the image to render for the button in the pushed state. - - \param image - RenderableImage object with all the details for the image. Note that an internal copy of the Renderable image is made and - ownership of \a image remains with client code. If this parameter is NULL, rendering of an image for this button state is - disabled. - - \return - Nothing. - */ - void setPushedImage(const RenderableImage* image); - - /*! - \brief - set the details of the image to render for the button in the disabled state. - - \param image - RenderableImage object with all the details for the image. Note that an internal copy of the Renderable image is made and - ownership of \a image remains with client code. If this parameter is NULL, rendering of an image for this button state is - disabled. - - \return - Nothing. - */ - void setDisabledImage(const RenderableImage* image); - - /*! - \brief - set the offset to use for a shift of the text in the x-direction - this is useful if the button-images are not symmetrical and the - text shouldn't be completely centered - - \param offset - The offset to use. This is relative to the button-width - - \return - Nothing. - */ - void setTextXOffset(float offset); - -protected: - /************************************************************************* - New Event Handlers - *************************************************************************/ - /*! - \brief - handler invoked internally when the button is clicked. - */ - virtual void onClicked(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event Handlers - *************************************************************************/ - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onSized(WindowEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add button specific events - */ - void addPushButtonEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addPushButtonEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"PushButton") return true; - return ButtonBase::testClassName_impl(class_name); - } - - - /************************************************************************* - Data Fields - *************************************************************************/ - // flags stating which imagery is to be rendered and how. - bool d_autoscaleImages; //!< when true custom images will be scaled to the same size as the button - bool d_useStandardImagery; //!< true if button standard imagery should be drawn. - bool d_useNormalImage; //!< true if an image should be drawn for the normal state. - bool d_useHoverImage; //!< true if an image should be drawn for the highlighted state. - bool d_usePushedImage; //!< true if an image should be drawn for the pushed state. - bool d_useDisabledImage; //!< true if an image should be drawn for the disabled state. - - // button RenderableImage objects - RenderableImage d_normalImage; //!< RenderableImage used when rendering an image in the normal state. - RenderableImage d_hoverImage; //!< RenderableImage used when rendering an image in the highlighted state. - RenderableImage d_pushedImage; //!< RenderableImage used when rendering an image in the pushed state. - RenderableImage d_disabledImage; //!< RenderableImage used when rendering an image in the disabled state. - - //text-offset - float d_textXOffset; //!< offset applied to the x co-ordinate of the text label. - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static PushButtonProperties::NormalImage d_normalImageProperty; - static PushButtonProperties::PushedImage d_pushedImageProperty; - static PushButtonProperties::HoverImage d_hoverImageProperty; - static PushButtonProperties::DisabledImage d_disabledImageProperty; - static PushButtonProperties::UseStandardImagery d_useStandardImageryProperty; - static PushButtonProperties::TextXOffset d_textXOffsetProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addPushButtonProperties( bool bCommon = true ); -protected: - void addUncommonProperties( void ) { __super::addUncommonProperties(); addPushButtonProperties(false); } -}; - - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIPushButton_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButtonProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButtonProperties.h deleted file mode 100644 index b8c2b95650..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIPushButtonProperties.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************ - filename: CEGUIPushButtonProperties.h - created: 22/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIPushButtonProperties_h_ -#define _CEGUIPushButtonProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of PushButtonProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties - interface for the PushButton class -*/ -namespace PushButtonProperties -{ - -/*! -\brief - Property to access the normal image of the button - - \par Usage: - - Name: NormalImage - - Format: "set: image:". - -*/ -class NormalImage : public Property -{ -public: - NormalImage() : Property( - "NormalImage", - "Property to get/set the normal image for the PushButton widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the pushed image of the button - - \par Usage: - - Name: PushedImage - - Format: "set: image:". - -*/ -class PushedImage : public Property -{ -public: - PushedImage() : Property( - "PushedImage", - "Property to get/set the pushed image for the PushButton widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the hover image of the button - - \par Usage: - - Name: HoverImage - - Format: "set: image:". - -*/ -class HoverImage : public Property -{ -public: - HoverImage() : Property( - "HoverImage", - "Property to get/set the hover image for the PushButton widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the disabled image of the button - - \par Usage: - - Name: DisabledImage - - Format: "set: image:". - -*/ -class DisabledImage : public Property -{ -public: - DisabledImage() : Property( - "DisabledImage", - "Property to get/set the disabled image for the PushButton widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access whether to use the standard images or the supplied custom ones - - \par Usage: - - Name: UseStandardImagery - - Format: "True|False". - -*/ -class UseStandardImagery : public Property -{ -public: - UseStandardImagery() : Property( - "UseStandardImagery", - "Property to get/set whether to use the standard imagery for the PushButton widget. Value should be \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access an offset that is used to shift the text in the x-direction. - - \par Usage: - - Name: UseStandardImagery - - Format: "". - - \par - where is a float value specifying the offset relative to the button-size - -*/ -class TextXOffset : public Property -{ -public: - TextXOffset() : Property( - "TextXOffset", - "Property to get/set a relative x offset for the button's text", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} - -} -#endif diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButton.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButton.h deleted file mode 100644 index 66837174f3..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButton.h +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************************************ - filename: CEGUIRadioButton.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for RadioButton widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRadioButton_h_ -#define _CEGUIRadioButton_h_ - -#include "CEGUIBase.h" -#include "elements/CEGUIButtonBase.h" -#include "elements/CEGUIRadioButtonProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class to provide the logic for Radio Button widgets. - -*/ -class CEGUIEXPORT RadioButton : public ButtonBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventSelectStateChanged; //!< The selected state of the widget has changed. - - - /************************************************************************* - Accessor Functions - *************************************************************************/ - /*! - \brief - return true if the radio button is selected (has the checkmark) - - \return - true if this widget is selected, false if the widget is not selected. - */ - bool isSelected(void) const {return d_selected;} - - - /*! - \brief - return the groupID assigned to this radio button - - \return - ulong value that identifies the Radio Button group this widget belongs to. - */ - ulong getGroupID(void) const {return d_groupID;} - - - /*! - \brief - Return a pointer to the RadioButton object within the same group as this RadioButton, that - is currently selected. - - \return - Pointer to the RadioButton object that is the RadioButton within the same group as this RadioButton, - and is attached to the same parent window as this RadioButton, that is currently selected. - Returns NULL if no button within the group is selected, or if 'this' is not attached to a parent window. - */ - RadioButton* getSelectedButtonInGroup(void) const; - - - /************************************************************************* - Manipulator Functions - *************************************************************************/ - /*! - \brief - set whether the radio button is selected or not - - \param select - true to put the radio button in the selected state, false to put the radio button in the - deselected state. If changing to the selected state, any previously selected radio button - within the same group is automatically deselected. - - \return - Nothing. - */ - void setSelected(bool select); - - - /*! - \brief - set the groupID for this radio button - - \param group - ulong value specifying the radio button group that this widget belongs to. - - \return - Nothing. - */ - void setGroupID(ulong group); - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - RadioButton(const String& type, const String& name); - virtual ~RadioButton(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add radio button specific events - */ - void addRadioButtonEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addRadioButtonEvents(false); } - - - /*! - \brief - Deselect any selected radio buttons attached to the same parent within the same group - (but not do not deselect 'this'). - */ - void deselectOtherButtonsInGroup(void) const; - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"RadioButton") return true; - return ButtonBase::testClassName_impl(class_name); - } - - - /************************************************************************* - New Radio Button Events - *************************************************************************/ - /*! - \brief - event triggered internally when the select state of the button changes. - */ - virtual void onSelectStateChanged(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event handlers - *************************************************************************/ - virtual void onMouseButtonUp(MouseEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_selected; // true when radio button is selected (has checkmark) - ulong d_groupID; // radio button group ID - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static RadioButtonProperties::Selected d_selectedProperty; - static RadioButtonProperties::GroupID d_groupIDProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addRadioButtonProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addRadioButtonProperties(false); } -}; - - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIRadioButton_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButtonProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButtonProperties.h deleted file mode 100644 index 6113c287b8..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIRadioButtonProperties.h +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************************************ - filename: CEGUIRadioButtonProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface to properties for RadioButton class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIRadioButtonProperties_h_ -#define _CEGUIRadioButtonProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of RadioButtonProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the RadioButton class -*/ -namespace RadioButtonProperties -{ -/*! -\brief - Property to access the selected state of the RadioButton. - - \par Usage: - - Name: Selected - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the radio button is selected. - - "False" to indicate the radio button is not selected. -*/ -class Selected : public Property -{ -public: - Selected() : Property( - "Selected", - "Property to get/set the selected state of the RadioButton. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the radio button group ID. - - \par Usage: - - Name: GroupID - - Format: "[uint]". - - \par Where: - - [uint] is any unsigned integer value. -*/ -class GroupID : public Property -{ -public: - GroupID() : Property( - "GroupID", - "Property to get/set the radio button group ID. Value is an unsigned integer number.", - "0") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of RadioButtonProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIRadioButtonProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePane.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePane.h deleted file mode 100644 index 68096f5f0f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePane.h +++ /dev/null @@ -1,583 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollablePane.h - created: 1/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScrollablePane_h_ -#define _CEGUIScrollablePane_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIScrollablePaneProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Base class for the ScrollablePane widget. - - The ScrollablePane widget allows child windows to be attached which cover an area - larger than the ScrollablePane itself and these child windows can be scrolled into - view using the scrollbars of the scrollable pane. - */ - class CEGUIEXPORT ScrollablePane : public Window - { - public: - /************************************************************************* - Constants - *************************************************************************/ - static const String EventNamespace; //!< Namespace for global events - static const String EventContentPaneChanged; //!< Event fired when an area on the content pane has been updated. - static const String EventVertScrollbarModeChanged; //!< Event triggered when the vertical scroll bar 'force' setting changes. - static const String EventHorzScrollbarModeChanged; //!< Event triggered when the horizontal scroll bar 'force' setting changes. - static const String EventAutoSizeSettingChanged; //!< Event fired when the auto size setting changes. - static const String EventContentPaneScrolled; //!< Event fired when the pane gets scrolled. - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for the ScrollablePane base class. - */ - ScrollablePane(const String& type, const String& name); - - /*! - \brief - Destructor for the ScrollablePane base class. - */ - ~ScrollablePane(void); - - /************************************************************************* - Public interface - *************************************************************************/ - /*! - \brief - Returns a pointer to the window holding the pane contents. - - The purpose of this is so that attached windows may be inspected, - client code may not modify the returned window in any way. - - \return - Pointer to the ScrolledContainer that is acting as the container for the - scrollable pane content. The returned window is const, client code should - not modify the ScrolledContainer settings directly. - */ - const ScrolledContainer* getContentPane(void) const; - - /*! - \brief - Return whether the vertical scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isVertScrollbarAlwaysShown(void) const; - /*! - \brief - Set whether the vertical scroll bar should always be shown. - - \param setting - - true if the vertical scroll bar should be shown even when it is not required. - - false if the vertical scroll bar should only be shown when it is required. - - \return - Nothing. - */ - void setShowVertScrollbar(bool setting); - - /*! - \brief - Return whether the horizontal scroll bar is always shown. - - \return - - true if the scroll bar will always be shown even if it is not required. - - false if the scroll bar will only be shown when it is required. - */ - bool isHorzScrollbarAlwaysShown(void) const; - - /*! - \brief - Set whether the horizontal scroll bar should always be shown. - - \param setting - - true if the horizontal scroll bar should be shown even when it is not required. - - false if the horizontal scroll bar should only be shown when it is required. - - \return - Nothing. - */ - void setShowHorzScrollbar(bool setting); - - /*! - \brief - Return whether the content pane is auto sized. - - \return - - true to indicate the content pane will automatically resize itself. - - false to indicate the content pane will not automatically resize itself. - */ - bool isContentPaneAutoSized(void) const; - - /*! - \brief - Set whether the content pane should be auto-sized. - - \param setting - - true to indicate the content pane should automatically resize itself. - - false to indicate the content pane should not automatically resize itself. - - \return - Nothing. - */ - void setContentPaneAutoSized(bool setting); - - /*! - \brief - Return the current content pane area for the ScrollablePane. - - \return - Rect object that details the current pixel extents of the content - pane attached to this ScrollablePane. - */ - const Rect& getContentPaneArea(void) const; - - /*! - \brief - Set the current content pane area for the ScrollablePane. - - \note - If the ScrollablePane is configured to auto-size the content pane - this call will have no effect. - - \param area - Rect object that details the pixel extents to use for the content - pane attached to this ScrollablePane. - - \return - Nothing. - */ - void setContentPaneArea(const Rect& area); - - /*! - \brief - Returns the horizontal scrollbar step size as a fraction of one - complete view page. - - \return - float value specifying the step size where 1.0f would be the width of - the viewing area. - */ - float getHorizontalStepSize(void) const; - - /*! - \brief - Sets the horizontal scrollbar step size as a fraction of one - complete view page. - - \param step - float value specifying the step size, where 1.0f would be the width of - the viewing area. - - \return - Nothing. - */ - void setHorizontalStepSize(float step); - - /*! - \brief - Returns the horizontal scrollbar overlap size as a fraction of one - complete view page. - - \return - float value specifying the overlap size where 1.0f would be the width of - the viewing area. - */ - float getHorizontalOverlapSize(void) const; - - /*! - \brief - Sets the horizontal scrollbar overlap size as a fraction of one - complete view page. - - \param overlap - float value specifying the overlap size, where 1.0f would be the width of - the viewing area. - - \return - Nothing. - */ - void setHorizontalOverlapSize(float overlap); - - /*! - \brief - Returns the horizontal scroll position as a fraction of the - complete scrollable width. - - \return - float value specifying the scroll position. - */ - float getHorizontalScrollPosition(void) const; - - /*! - \brief - Sets the horizontal scroll position as a fraction of the - complete scrollable width. - - \param position - float value specifying the new scroll position. - - \return - Nothing. - */ - void setHorizontalScrollPosition(float position); - - /*! - \brief - Returns the vertical scrollbar step size as a fraction of one - complete view page. - - \return - float value specifying the step size where 1.0f would be the height of - the viewing area. - */ - float getVerticalStepSize(void) const; - - /*! - \brief - Sets the vertical scrollbar step size as a fraction of one - complete view page. - - \param step - float value specifying the step size, where 1.0f would be the height of - the viewing area. - - \return - Nothing. - */ - void setVerticalStepSize(float step); - - /*! - \brief - Returns the vertical scrollbar overlap size as a fraction of one - complete view page. - - \return - float value specifying the overlap size where 1.0f would be the height of - the viewing area. - */ - float getVerticalOverlapSize(void) const; - - /*! - \brief - Sets the vertical scrollbar overlap size as a fraction of one - complete view page. - - \param overlap - float value specifying the overlap size, where 1.0f would be the height of - the viewing area. - - \return - Nothing. - */ - void setVerticalOverlapSize(float overlap); - - /*! - \brief - Returns the vertical scroll position as a fraction of the - complete scrollable height. - - \return - float value specifying the scroll position. - */ - float getVerticalScrollPosition(void) const; - - /*! - \brief - Sets the vertical scroll position as a fraction of the - complete scrollable height. - - \param position - float value specifying the new scroll position. - - \return - Nothing. - */ - void setVerticalScrollPosition(float position); - - /************************************************************************* - Overridden from Window - *************************************************************************/ - void initialise(void); - - protected: - /************************************************************************* - Abstract interface - *************************************************************************/ - /*! - \brief - Create a Scrollbar based widget to be used as the horizontal scrollbar. - - \param name - String object holding the name that must be used when creating the widget. - - \return - Scrollbar based object. - */ - virtual Scrollbar* createHorizontalScrollbar(const String& name) const = 0; - - /*! - \brief - Create a Scrollbar based widget to be used as the vertical scrollbar. - - \param name - String object holding the name that must be used when creating the widget. - - \return - Scrollbar based object. - */ - virtual Scrollbar* createVerticalScrollbar(const String& name) const = 0; - - /*! - \brief - Return a Rect that described the pane's viewable area, relative - to this Window, in pixels. - - \return - Rect object describing the ScrollablePane's viewable area. - */ - virtual Rect getViewableArea(void) const = 0; - - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Add ScrollablePane specific events - */ - void addScrollablePaneEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addScrollablePaneEvents(false); } - - /*! - \brief - display required integrated scroll bars according to current size of - the ScrollablePane view area and the size of the attached ScrolledContainer. - */ - void configureScrollbars(void); - - /*! - \brief - Return whether the vertical scrollbar is needed. - - \return - - true if the scrollbar is either needed or forced via setting. - - false if the scrollbar should not be shown. - */ - bool isVertScrollbarNeeded(void) const; - - /*! - \brief - Return whether the horizontal scrollbar is needed. - - \return - - true if the scrollbar is either needed or forced via setting. - - false if the scrollbar should not be shown. - */ - bool isHorzScrollbarNeeded(void) const; - - /*! - \brief - Update the content container position according to the current - state of the widget (like scrollbar positions, etc). - */ - void updateContainerPosition(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ScrollablePane") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Event triggers - *************************************************************************/ - /*! - \brief - Event trigger method called when some pane content has changed size - or location. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onContentPaneChanged(WindowEventArgs& e); - - /*! - \brief - Event trigger method called when the setting that controls whether the - vertical scrollbar is always shown or not, is changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onVertScrollbarModeChanged(WindowEventArgs& e); - - /*! - \brief - Event trigger method called when the setting that controls whether the - horizontal scrollbar is always shown or not, is changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onHorzScrollbarModeChanged(WindowEventArgs& e); - - /*! - \brief - Notification method called whenever the setting that controls whether - the content pane is automatically sized is changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onAutoSizeSettingChanged(WindowEventArgs& e); - - /*! - \brief - Notification method called whenever the content pane is scrolled via - changes in the scrollbar positions. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onContentPaneScrolled(WindowEventArgs& e); - - /************************************************************************* - Event handler methods - *************************************************************************/ - /*! - \brief - Handler method which gets subscribed to the scrollbar position change - events. - */ - bool handleScrollChange(const EventArgs& e); - - /*! - \brief - Handler method which gets subscribed to the ScrolledContainer content - change events. - */ - bool handleContentAreaChange(const EventArgs& e); - - /*! - \brief - Handler method which gets subscribed to the ScrolledContainer auto-size - setting changes. - */ - bool handleAutoSizePaneChanged(const EventArgs& e); - - /************************************************************************* - Overridden from Window - *************************************************************************/ - void addChild_impl(Window* wnd); - void removeChild_impl(Window* wnd); - void onSized(WindowEventArgs& e); - void onMouseWheel(MouseEventArgs& e); - - /************************************************************************* - Data fields - *************************************************************************/ - bool d_forceVertScroll; //!< true if vertical scrollbar should always be displayed - bool d_forceHorzScroll; //!< true if horizontal scrollbar should always be displayed - Rect d_contentRect; //!< holds content area so we can track changes. - float d_vertStep; //!< vertical scroll step fraction. - float d_vertOverlap; //!< vertical scroll overlap fraction. - float d_horzStep; //!< horizontal scroll step fraction. - float d_horzOverlap; //!< horizontal scroll overlap fraction. - - // component widgets - Scrollbar* d_vertScrollbar; //!< Scrollbar widget used for vertical scrolling. - Scrollbar* d_horzScrollbar; //!< Scrollbar widget used for horizontal scrolling. - ScrolledContainer* d_container; //!< ScrolledContainer widget holding the attached widgets. - - private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ScrollablePaneProperties::ForceHorzScrollbar d_horzScrollbarProperty; - static ScrollablePaneProperties::ForceVertScrollbar d_vertScrollbarProperty; - static ScrollablePaneProperties::ContentPaneAutoSized d_autoSizedProperty; - static ScrollablePaneProperties::ContentArea d_contentAreaProperty; - static ScrollablePaneProperties::HorzStepSize d_horzStepProperty; - static ScrollablePaneProperties::HorzOverlapSize d_horzOverlapProperty; - static ScrollablePaneProperties::HorzScrollPosition d_horzScrollPositionProperty; - static ScrollablePaneProperties::VertStepSize d_vertStepProperty; - static ScrollablePaneProperties::VertOverlapSize d_vertOverlapProperty; - static ScrollablePaneProperties::VertScrollPosition d_vertScrollPositionProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addScrollablePaneProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addScrollablePaneProperties(false); } - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIScrollablePane_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePaneProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePaneProperties.h deleted file mode 100644 index 52ee7ebe40..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollablePaneProperties.h +++ /dev/null @@ -1,293 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollablePaneProperties.h - created: 3/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScrollablePaneProperties_h_ -#define _CEGUIScrollablePaneProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ScrollablePaneProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the ScrollablePane class -*/ -namespace ScrollablePaneProperties -{ - /*! - \brief - Property to access the setting which controls whether the content pane is automatically - resized according to the size and position of attached content. - - \par Usage: - - Name: ContentPaneAutoSized - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the pane should automatically resize itself. - - "False" to indicate the pane should not automatically resize itself. - */ - class ContentPaneAutoSized : public Property - { - public: - ContentPaneAutoSized() : Property( - "ContentPaneAutoSized", - "Property to get/set the setting which controls whether the content pane will auto-size itself. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the current content pane area rectangle (as window relative pixels). - - \par Usage: - - Name: ContentArea - - Format: "l:[float] t:[float] r:[float] b:[float]". - - \par Where: - - l:[float] specifies the position of the left edge of the area as a floating point number. - - t:[float] specifies the position of the top edge of the area as a floating point number. - - r:[float] specifies the position of the right edge of the area as a floating point number. - - b:[float] specifies the position of the bottom edge of the area as a floating point number. - */ - class ContentArea : public Property - { - public: - ContentArea() : Property( - "ContentArea", - "Property to get/set the current content area rectangle of the content pane. Value is \"l:[float] t:[float] r:[float] b:[float]\" (where l is left, t is top, r is right, and b is bottom).", - "l:0.000000 t:0.000000 r:0.000000 b:0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the setting which controls whether the vertical scroll bar will - always be displayed, or only displayed when it is required. - - \par Usage: - - Name: ForceVertScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the vertical scroll bar will always be shown. - - "False" to indicate that the vertical scroll bar will only be shown when it is needed. - */ - class ForceVertScrollbar : public Property - { - public: - ForceVertScrollbar() : Property( - "ForceVertScrollbar", - "Property to get/set the setting which controls whether the vertical scroll bar is aways shown. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - - /*! - \brief - Property to access the setting which controls whether the horizontal scroll bar will - always be displayed, or only displayed when it is required. - - \par Usage: - - Name: ForceHorzScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate that the horizontal scroll bar will always be shown. - - "False" to indicate that the horizontal scroll bar will only be shown when it is needed. - */ - class ForceHorzScrollbar : public Property - { - public: - ForceHorzScrollbar() : Property( - "ForceHorzScrollbar", - "Property to get/set the setting which controls whether the horizontal scroll bar is aways shown. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the step size for the horizontal Scrollbar. - - \par Usage: - - Name: HorzStepSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the increase/decrease button step for the horizontal scrollbar (as a fraction of 1 page). - */ - class HorzStepSize : public Property - { - public: - HorzStepSize() : Property( - "HorzStepSize", - "Property to get/set the step size for the horizontal Scrollbar. Value is a float.", - "0.100000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the overlap size for the horizontal Scrollbar. - - \par Usage: - - Name: HorzOverlapSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the per-page overlap (as a fraction of one page). - */ - class HorzOverlapSize : public Property - { - public: - HorzOverlapSize() : Property( - "HorzOverlapSize", - "Property to get/set the overlap size for the horizontal Scrollbar. Value is a float.", - "0.010000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the scroll position of the horizontal Scrollbar. - - \par Usage: - - Name: HorzScrollPosition - - Format: "[float]". - - \par Where: - - [float] specifies the current scroll position / value of the horizontal Scrollbar (as a fraction of the whole). - */ - class HorzScrollPosition : public Property - { - public: - HorzScrollPosition() : Property( - "HorzScrollPosition", - "Property to get/set the scroll position of the horizontal Scrollbar as a fraction. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the step size for the vertical Scrollbar. - - \par Usage: - - Name: VertStepSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the increase/decrease button step for the vertical scrollbar (as a fraction of 1 page). - */ - class VertStepSize : public Property - { - public: - VertStepSize() : Property( - "VertStepSize", - "Property to get/set the step size for the vertical Scrollbar. Value is a float.", - "0.100000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the overlap size for the vertical Scrollbar. - - \par Usage: - - Name: VertOverlapSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the per-page overlap (as a fraction of one page). - */ - class VertOverlapSize : public Property - { - public: - VertOverlapSize() : Property( - "VertOverlapSize", - "Property to get/set the overlap size for the vertical Scrollbar. Value is a float.", - "0.010000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the scroll position of the vertical Scrollbar. - - \par Usage: - - Name: VertScrollPosition - - Format: "[float]". - - \par Where: - - [float] specifies the current scroll position / value of the vertical Scrollbar (as a fraction of the whole). - */ - class VertScrollPosition : public Property - { - public: - VertScrollPosition() : Property( - "VertScrollPosition", - "Property to get/set the scroll position of the vertical Scrollbar as a fraction. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} // End of ScrollablePaneProperties namespace section -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIScrollablePaneProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbar.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbar.h deleted file mode 100644 index 00d1136ece..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbar.h +++ /dev/null @@ -1,515 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollbar.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Scrollbar widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScrollbar_h_ -#define _CEGUIScrollbar_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIScrollbarProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base scroll bar class. - - This base class for scroll bars does not have any idea of direction - a derived class would - add whatever meaning is appropriate according to what that derived class - represents to the user. -*/ -class CEGUIEXPORT Scrollbar : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - /************************************************************************* - Event name constants - *************************************************************************/ - static const String EventScrollPositionChanged; //!< Name of the event fired when the scroll bar position value changes - static const String EventThumbTrackStarted; //!< Name of the event fired when the user begins dragging the thumb. - static const String EventThumbTrackEnded; //!< Name of the event fired when the user releases the thumb. - static const String EventScrollConfigChanged; //!< Name of the event fired when the scroll bar configuration data changes. - - - /************************************************************************* - Accessor functions - *************************************************************************/ - /*! - \brief - Return the size of the document or data. - - The document size should be thought of as the total size of the data that - is being scrolled through (the number of lines in a text file for example). - - \note - The returned value has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \return - float value specifying the currently set document size. - */ - float getDocumentSize(void) const {return d_documentSize;} - - - /*! - \brief - Return the page size for this scroll bar. - - The page size is typically the amount of data that can be displayed at one - time. This value is also used when calculating the amount the position will - change when you click either side of the scroll bar thumb - the amount the - position changes will is (pageSize - overlapSize). - - \note - The returned value has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \return - float value specifying the currently set page size. - */ - float getPageSize(void) const {return d_pageSize;} - - - /*! - \brief - Return the step size for this scroll bar. - - The step size is typically a single unit of data that can be displayed, this is the - amount the position will change when you click either of the arrow buttons on the - scroll bar. (this could be 1 for a single line of text, for example). - - \note - The returned value has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \return - float value specifying the currently set step size. - */ - float getStepSize(void) const {return d_stepSize;} - - - /*! - \brief - Return the overlap size for this scroll bar. - - The overlap size is the amount of data from the end of a 'page' that will - remain visible when the position is moved by a page. This is usually used - so that the user keeps some context of where they were within the document's - data when jumping a page at a time. - - \note - The returned value has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \return - float value specifying the currently set overlap size. - */ - float getOverlapSize(void) const {return d_overlapSize;} - - - /*! - \brief - Return the current position of scroll bar within the document. - - The range of the scroll bar is from 0 to the size of the document minus the - size of a page (0 <= position <= (documentSize - pageSize)). - - \note - The returned value has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \return - float value specifying the current position of the scroll bar within its - document. - */ - float getScrollPosition(void) const {return d_position;} - - - /************************************************************************* - Manipulator Commands - *************************************************************************/ - /*! - \brief - Initialises the Scrollbar object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Set the size of the document or data. - - The document size should be thought of as the total size of the data that - is being scrolled through (the number of lines in a text file for example). - - \note - The value set has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \param document_size - float value specifying the document size. - - \return - Nothing. - */ - void setDocumentSize(float document_size); - - - /*! - \brief - Set the page size for this scroll bar. - - The page size is typically the amount of data that can be displayed at one - time. This value is also used when calculating the amount the position will - change when you click either side of the scroll bar thumb - the amount the - position changes will is (pageSize - overlapSize). - - \note - The value set has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \param page_size - float value specifying the page size. - - \return - Nothing. - */ - void setPageSize(float page_size); - - - /*! - \brief - Set the step size for this scroll bar. - - The step size is typically a single unit of data that can be displayed, this is the - amount the position will change when you click either of the arrow buttons on the - scroll bar. (this could be 1 for a single line of text, for example). - - \note - The value set has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \param step_size - float value specifying the step size. - - \return - Nothing. - */ - void setStepSize(float step_size); - - - /*! - \brief - Set the overlap size for this scroll bar. - - The overlap size is the amount of data from the end of a 'page' that will - remain visible when the position is moved by a page. This is usually used - so that the user keeps some context of where they were within the document's - data when jumping a page at a time. - - \note - The value set has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \param overlap_size - float value specifying the overlap size. - - \return - Nothing. - */ - void setOverlapSize(float overlap_size); - - - /*! - \brief - Set the current position of scroll bar within the document. - - The range of the scroll bar is from 0 to the size of the document minus the - size of a page (0 <= position <= (documentSize - pageSize)), any attempt to - set the position outside this range will be adjusted so that it falls within - the legal range. - - \note - The returned value has no meaning within the Gui system, it is left up to the - application to assign appropriate values for the application specific use of - the scroll bar. - - \param position - float value specifying the position of the scroll bar within its - document. - - \return - Nothing. - */ - void setScrollPosition(float position); - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for Scrollbar objects - */ - Scrollbar(const String& type, const String& name); - - - /*! - \brief - Destructor for Scrollbar objects - */ - virtual ~Scrollbar(void); - - -protected: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Add scroll bar specific events - */ - void addScrollbarEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addScrollbarEvents(false); } - - - /*! - \brief - create a PushButton based widget to use as the increase button for this scroll bar. - - \param name - String holding the name that must be passed when creating the component widget. - */ - virtual PushButton* createIncreaseButton(const String& name) const = 0; - - - /*! - \brief - create a PushButton based widget to use as the decrease button for this scroll bar. - - \param name - String holding the name that must be passed when creating the component widget. - */ - virtual PushButton* createDecreaseButton(const String& name) const = 0; - - - /*! - \brief - create a Thumb based widget to use as the thumb for this scroll bar. - - \param name - String holding the name that must be passed when creating the component widget. - */ - virtual Thumb* createThumb(const String& name) const = 0; - - - /*! - \brief - update the size and location of the thumb to properly represent the current state of the scroll bar - */ - virtual void updateThumb(void) = 0; - - - /*! - \brief - return value that best represents current scroll bar position given the current location of the thumb. - - \return - float value that, given the thumb widget position, best represents the current position for the scroll bar. - */ - virtual float getValueFromThumb(void) const = 0; - - - /*! - \brief - Given window location \a pt, return a value indicating what change should be - made to the scroll bar. - - \param pt - Point object describing a pixel position in window space. - - \return - - -1 to indicate scroll bar position should be moved to a lower value. - - 0 to indicate scroll bar position should not be changed. - - +1 to indicate scroll bar position should be moved to a higher value. - */ - virtual float getAdjustDirectionFromPoint(const Point& pt) const = 0; - - - /*! - \brief - handler function for when thumb moves. - */ - bool handleThumbMoved(const EventArgs& e); - - - /*! - \brief - handler function for when the increase button is clicked. - */ - bool handleIncreaseClicked(const EventArgs& e); - - - /*! - \brief - handler function for when the decrease button is clicked. - */ - bool handleDecreaseClicked(const EventArgs& e); - - - /*! - \brief - handler function for when thumb tracking begins - */ - bool handleThumbTrackStarted(const EventArgs& e); - - - /*! - \brief - handler function for when thumb tracking begins - */ - bool handleThumbTrackEnded(const EventArgs& e); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Scrollbar") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - New event handlers for slider widget - *************************************************************************/ - /*! - \brief - Handler triggered when the scroll position changes - */ - virtual void onScrollPositionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the user begins to drag the scroll bar thumb. - */ - virtual void onThumbTrackStarted(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the scroll bar thumb is released - */ - virtual void onThumbTrackEnded(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the scroll bar data configuration changes - */ - virtual void onScrollConfigChanged(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseWheel(MouseEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_documentSize; //!< The size of the document / data being scrolled thorugh. - float d_pageSize; //!< The size of a single 'page' of data. - float d_stepSize; //!< Step size used for increase / decrease button clicks. - float d_overlapSize; //!< Amount of overlap when jumping by a page. - float d_position; //!< Current scroll position. - - // Pointers to the controls that make up the scroll bar - Thumb* d_thumb; //!< widget used to represent the 'thumb' of the scroll bar. - PushButton* d_increase; //!< Widget used for the increase button of the scroll bar. - PushButton* d_decrease; //!< Widget used for the decrease button of the scroll bar. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ScrollbarProperties::DocumentSize d_documentSizeProperty; - static ScrollbarProperties::PageSize d_pageSizeProperty; - static ScrollbarProperties::StepSize d_stepSizeProperty; - static ScrollbarProperties::OverlapSize d_overlapSizeProperty; - static ScrollbarProperties::ScrollPosition d_scrollPositionProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addScrollbarProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addScrollbarProperties(false); } -}; - - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIScrollbar_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbarProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbarProperties.h deleted file mode 100644 index 9809704f74..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrollbarProperties.h +++ /dev/null @@ -1,171 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollbarProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface for Scrollbar properties -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScrollbarProperties_h_ -#define _CEGUIScrollbarProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ScrollbarProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Scrollbar class -*/ -namespace ScrollbarProperties -{ -/*! -\brief - Property to access the document size for the Scrollbar. - - \par Usage: - - Name: DocumentSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the document being scrolled (as defined by the client code). -*/ -class DocumentSize : public Property -{ -public: - DocumentSize() : Property( - "DocumentSize", - "Property to get/set the document size for the Scrollbar. Value is a float.", - "1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the page size for the Scrollbar. - - \par Usage: - - Name: PageSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the visible page (as defined by the client code). -*/ -class PageSize : public Property -{ -public: - PageSize() : Property( - "PageSize", - "Property to get/set the page size for the Scrollbar. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the step size for the Scrollbar. - - \par Usage: - - Name: StepSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the increase/decrease button step (as defined by the client code). -*/ -class StepSize : public Property -{ -public: - StepSize() : Property( - "StepSize", - "Property to get/set the step size for the Scrollbar. Value is a float.", - "1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the overlap size for the Scrollbar. - - \par Usage: - - Name: OverlapSize - - Format: "[float]". - - \par Where: - - [float] specifies the size of the per-page overlap (as defined by the client code). -*/ -class OverlapSize : public Property -{ -public: - OverlapSize() : Property( - "OverlapSize", - "Property to get/set the overlap size for the Scrollbar. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief - Property to access the scroll position of the Scrollbar. - - \par Usage: - - Name: ScrollPosition - - Format: "[float]". - - \par Where: - - [float] specifies the current scroll position / value of the Scrollbar. -*/ -class ScrollPosition : public Property -{ -public: - ScrollPosition() : Property( - "ScrollPosition", - "Property to get/set the scroll position of the Scrollbar. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of ScrollbarProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIScrollbarProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainer.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainer.h deleted file mode 100644 index 1a4cf728a0..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainer.h +++ /dev/null @@ -1,273 +0,0 @@ -/************************************************************************ - filename: CEGUIScrolledContainer.h - created: 1/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScrolledContainer_h_ -#define _CEGUIScrolledContainer_h_ - -#include "CEGUIWindow.h" -#include "CEGUIWindowFactory.h" -#include "elements/CEGUIScrolledContainerProperties.h" -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Helper container window class which is used in the implementation of the - ScrollablePane widget class. - */ - class CEGUIEXPORT ScrolledContainer : public Window - { - public: - /************************************************************************* - Constants - *************************************************************************/ - static const String WidgetTypeName; //!< Type name for ScrolledContainer. - static const String EventNamespace; //!< Namespace for global events - static const String EventContentChanged; //!< Event fired whenever some child changes. - static const String EventAutoSizeSettingChanged; //!< Event fired when the autosize setting changes. - - /************************************************************************* - Object construction and destruction - *************************************************************************/ - /*! - \brief - Constructor for ScrolledContainer objects. - */ - ScrolledContainer(const String& type, const String& name); - - /*! - \brief - Destructor for ScrolledContainer objects. - */ - ~ScrolledContainer(void); - - /************************************************************************* - Public interface methods - *************************************************************************/ - /*! - \brief - Return whether the content pane is auto sized. - - \return - - true to indicate the content pane will automatically resize itself. - - false to indicate the content pane will not automatically resize itself. - */ - bool isContentPaneAutoSized(void) const; - - /*! - \brief - Set whether the content pane should be auto-sized. - - \param setting - - true to indicate the content pane should automatically resize itself. - - false to indicate the content pane should not automatically resize itself. - - \return - Nothing. - */ - void setContentPaneAutoSized(bool setting); - - /*! - \brief - Return the current content pane area for the ScrolledContainer. - - \return - Rect object that details the current pixel extents of the content - pane represented by this ScrolledContainer. - */ - const Rect& getContentArea(void) const; - - /*! - \brief - Set the current content pane area for the ScrolledContainer. - - \note - If the ScrolledContainer is configured to auto-size the content pane - this call will have no effect. - - \param area - Rect object that details the pixel extents to use for the content - pane represented by this ScrolledContainer. - - \return - Nothing. - */ - void setContentArea(const Rect& area); - - /*! - \brief - Return the current extents of the attached content. - - \return - Rect object that describes the pixel extents of the attached - child windows. This is effectively the smallest bounding box - that could contain all the attached windows. - */ - Rect getChildExtentsArea(void) const; - - protected: - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - Adds events for this widget type. - */ - void addScrolledContainerEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addScrolledContainerEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"ScrolledContainer") return true; - return Window::testClassName_impl(class_name); - } - - /************************************************************************* - Implementation of abstract methods from Window - *************************************************************************/ - void drawSelf(float z) {}; - - /************************************************************************* - Event trigger methods. - *************************************************************************/ - /*! - \brief - Notification method called whenever the content size may have changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onContentChanged(WindowEventArgs& e); - - /*! - \brief - Notification method called whenever the setting that controls whether - the content pane is automatically sized is changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onAutoSizeSettingChanged(WindowEventArgs& e); - - /************************************************************************* - Event callbacks - *************************************************************************/ - /*! - \brief - Method which receives notifications about child windows being moved. - */ - bool handleChildSized(const EventArgs& e); - - /*! - \brief - Method which receives notifications about child windows being sized. - */ - bool handleChildMoved(const EventArgs& e); - - /************************************************************************* - Overridden from Window. - *************************************************************************/ - Rect getUnclippedInnerRect(void) const; - void onChildAdded(WindowEventArgs& e); - void onChildRemoved(WindowEventArgs& e); - void onParentSized(WindowEventArgs& e); - - /************************************************************************* - Data fields - *************************************************************************/ - typedef std::multimap ConnectionTracker; - ConnectionTracker d_eventConnections; //!< Tracks event connections we make. - Rect d_contentArea; //!< Holds extents of the content pane. - bool d_autosizePane; //!< true if the pane auto-sizes itself. - - private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ScrolledContainerProperties::ContentPaneAutoSized d_autoSizedProperty; - static ScrolledContainerProperties::ContentArea d_contentAreaProperty; - static ScrolledContainerProperties::ChildExtentsArea d_childExtentsAreaProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addScrolledContainerProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addScrolledContainerProperties(false); } - }; - - /*! - \brief - Factory class for producing ScrolledContainer windows - */ - class ScrolledContainerFactory : public WindowFactory - { - public: - ScrolledContainerFactory(void) : WindowFactory(ScrolledContainer::WidgetTypeName) { } - ~ScrolledContainerFactory(void){} - - Window* createWindow(const String& name) - { - ScrolledContainer* wnd = new ScrolledContainer(d_type, name); - return wnd; - } - - void destroyWindow(Window* window) - { - if (window->getType() == d_type) - delete window; - } - - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIScrolledContainer_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainerProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainerProperties.h deleted file mode 100644 index 783a423cad..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIScrolledContainerProperties.h +++ /dev/null @@ -1,123 +0,0 @@ -/************************************************************************ - filename: CEGUIScrolledContainerProperties.h - created: 3/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIScrolledContainerProperties_h_ -#define _CEGUIScrolledContainerProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ScrolledContainerProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the ScrolledContainer class -*/ -namespace ScrolledContainerProperties -{ - /*! - \brief - Property to access the setting which controls whether the content pane is automatically - resized according to the size and position of attached content. - - \par Usage: - - Name: ContentPaneAutoSized - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the pane should automatically resize itself. - - "False" to indicate the pane should not automatically resize itself. - */ - class ContentPaneAutoSized : public Property - { - public: - ContentPaneAutoSized() : Property( - "ContentPaneAutoSized", - "Property to get/set the setting which controls whether the content pane will auto-size itself. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the current content pane area rectangle (as window relative pixels). - - \par Usage: - - Name: ContentArea - - Format: "l:[float] t:[float] r:[float] b:[float]". - - \par Where: - - l:[float] specifies the position of the left edge of the area as a floating point number. - - t:[float] specifies the position of the top edge of the area as a floating point number. - - r:[float] specifies the position of the right edge of the area as a floating point number. - - b:[float] specifies the position of the bottom edge of the area as a floating point number. - */ - class ContentArea : public Property - { - public: - ContentArea() : Property( - "ContentArea", - "Property to get/set the current content area rectangle of the content pane. Value is \"l:[float] t:[float] r:[float] b:[float]\" (where l is left, t is top, r is right, and b is bottom).", - "l:0.000000 t:0.000000 r:0.000000 b:0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property offering read-only access to the current content extents rectangle (as window relative pixels). - - \par Usage: - - Name: ChildExtentsArea - - Format: "l:[float] t:[float] r:[float] b:[float]". - - \par Where: - - l:[float] specifies the position of the left edge of the area as a floating point number. - - t:[float] specifies the position of the top edge of the area as a floating point number. - - r:[float] specifies the position of the right edge of the area as a floating point number. - - b:[float] specifies the position of the bottom edge of the area as a floating point number. - */ - class ChildExtentsArea : public Property - { - public: - ChildExtentsArea() : Property( - "ChildExtentsArea", - "Property to get the current content extents rectangle. Value is \"l:[float] t:[float] r:[float] b:[float]\" (where l is left, t is top, r is right, and b is bottom).", - "l:0.000000 t:0.000000 r:0.000000 b:0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} // End of ScrolledContainerProperties namespace section -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIScrolledContainerProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUISlider.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUISlider.h deleted file mode 100644 index faeb5957ab..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUISlider.h +++ /dev/null @@ -1,333 +0,0 @@ -/************************************************************************ - filename: CEGUISlider.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Slider widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISlider_h_ -#define _CEGUISlider_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUISliderProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for Slider widgets. - - The slider widget has a default range of 0.0f - 1.0f. This enables use of the slider value to scale - any value needed by way of a simple multiplication. -*/ -class CEGUIEXPORT Slider : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Event name constants - *************************************************************************/ - static const String EventValueChanged; //!< Event fired when the slider value changes. - static const String EventThumbTrackStarted; //!< Name of the event fired when the user begins dragging the thumb. - static const String EventThumbTrackEnded; //!< Name of the event fired when the user releases the thumb. - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - return the current slider value. - - \return - float value equal to the sliders current value. - */ - float getCurrentValue(void) const {return d_value;} - - - /*! - \brief - return the maximum value set for this widget - - \return - float value equal to the currently set maximum value for this slider. - */ - float getMaxValue(void) const {return d_maxValue;} - - - /*! - \brief - return the current click step setting for the slider. - - The click step size is the amount the slider value will be adjusted when the widget - is clicked wither side of the slider thumb. - - \return - float value representing the current click step setting. - */ - float getClickStep(void) const {return d_step;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Initialises the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - set the maximum value for the slider. Note that the minimum value is fixed at 0. - - \param maxVal - float value specifying the maximum value for this slider widget. - - \return - Nothing. - */ - void setMaxValue(float maxVal); - - - /*! - \brief - set the current slider value. - - \param value - float value specifying the new value for this slider widget. - - \return - Nothing. - */ - void setCurrentValue(float value); - - - /*! - \brief - set the current click step setting for the slider. - - The click step size is the amount the slider value will be adjusted when the widget - is clicked wither side of the slider thumb. - - \param step - float value representing the click step setting to use. - - \return - Nothing. - */ - void setClickStep(float step) {d_step = step;} - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Slider base class constructor - */ - Slider(const String& type, const String& name); - - - /*! - \brief - Slider base class destructor - */ - virtual ~Slider(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add slider specific events - */ - void addSliderEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addSliderEvents(false); } - - - /*! - \brief - create a Thumb based widget to use as the thumb for this slider. - - \param name - String containing the name to be assigned to the thumb upon creation. - */ - virtual Thumb* createThumb(const String& name) const = 0; - - - /*! - \brief - update the size and location of the thumb to properly represent the current state of the slider - */ - virtual void updateThumb(void) = 0; - - - /*! - \brief - return value that best represents current slider value given the current location of the thumb. - - \return - float value that, given the thumb widget position, best represents the current value for the slider. - */ - virtual float getValueFromThumb(void) const = 0; - - - /*! - \brief - Given window location \a pt, return a value indicating what change should be - made to the slider. - - \param pt - Point object describing a pixel position in window space. - - \return - - -1 to indicate slider should be moved to a lower setting. - - 0 to indicate slider should not be moved. - - +1 to indicate slider should be moved to a higher setting. - */ - virtual float getAdjustDirectionFromPoint(const Point& pt) const = 0; - - - /*! - \brief - handler function for when thumb moves. - */ - bool handleThumbMoved(const EventArgs& e); - - - /*! - \brief - handler function for when thumb tracking begins - */ - bool handleThumbTrackStarted(const EventArgs& e); - - - /*! - \brief - handler function for when thumb tracking begins - */ - bool handleThumbTrackEnded(const EventArgs& e); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Slider") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - New event handlers for slider widget - *************************************************************************/ - /*! - \brief - Handler triggered when the slider value changes - */ - virtual void onValueChanged(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the user begins to drag the slider thumb. - */ - virtual void onThumbTrackStarted(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the slider thumb is released - */ - virtual void onThumbTrackEnded(WindowEventArgs& e); - - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseWheel(MouseEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - float d_value; //!< current slider value - float d_maxValue; //!< slider maximum value (minimum is fixed at 0) - float d_step; //!< amount to adjust slider by when clicked (and not dragged). - - // Pointers to the controls that make up the slider - Thumb* d_thumb; //!< widget used to represent the 'thumb' of the slider. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static SliderProperties::CurrentValue d_currentValueProperty; - static SliderProperties::MaximumValue d_maximumValueProperty; - static SliderProperties::ClickStepSize d_clickStepSizeProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addSliderProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addSliderProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUISlider_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUISliderProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUISliderProperties.h deleted file mode 100644 index 65d0bdac07..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUISliderProperties.h +++ /dev/null @@ -1,122 +0,0 @@ -/************************************************************************ - filename: CEGUISliderProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface to properties for Slider class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISliderProperties_h_ -#define _CEGUISliderProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of SliderProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Slider class -*/ -namespace SliderProperties -{ -/*! -\brief - Property to access the current value of the slider. - - \par Usage: - - Name: CurrentValue - - Format: "[float]". - - \par Where: - - [float] represents the current value of the slider. -*/ -class CurrentValue : public Property -{ -public: - CurrentValue() : Property( - "CurrentValue", - "Property to get/set the current value of the slider. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the maximum value of the slider. - - \par Usage: - - Name: MaximumValue - - Format: "[float]". - - \par Where: - - [float] represents the maximum value of the slider. -*/ -class MaximumValue : public Property -{ -public: - MaximumValue() : Property( - "MaximumValue", - "Property to get/set the maximum value of the slider. Value is a float.", - "1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the click-step size for the slider. - - \par Usage: - - Name: ClickStepSize - - Format: "[float]". - - \par Where: - - [float] represents the click-step size slider (this is how much the value changes when the slider container is clicked). -*/ -class ClickStepSize : public Property -{ -public: - ClickStepSize() : Property( - "ClickStepSize", - "Property to get/set the click-step size for the slider. Value is a float.", - "0.010000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of SliderProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUISliderProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUISpinner.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUISpinner.h deleted file mode 100644 index e9da1cf44a..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUISpinner.h +++ /dev/null @@ -1,427 +0,0 @@ -/************************************************************************ - filename: CEGUISpinner.h - created: 3/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISpinner_h_ -#define _CEGUISpinner_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUISpinnerProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Base class for the Spinner widget. - - The spinner widget has a text area where numbers may be entered - and two buttons which may be used to increase or decrease the - value in the text area by a user specified amount. - */ - class CEGUIEXPORT Spinner : public Window - { - public: - /*! - \brief - Enumerated type specifying possible input and/or display modes for the spinner. - */ - enum TextInputMode - { - FloatingPoint, //!< Floating point decimal. - Integer, //!< Integer decimal. - Hexadecimal, //!< Hexadecimal. - Octal //!< Octal - }; - - /************************************************************************* - Events system constants - *************************************************************************/ - static const String EventNamespace; //!< Namespace for global events - static const String EventValueChanged; //!< Event fired when the spinner value changes. - static const String EventStepChanged; //!< Event fired when the step value changes. - static const String EventMaximumValueChanged; //!< Event fired when the maximum spinner value changes. - static const String EventMinimumValueChanged; //!< Event fired when the minimum spinner value changes. - static const String EventTextInputModeChanged; //!< Event fired when the input/display mode is changed. - - /************************************************************************* - Object Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for Spinner objects - */ - Spinner(const String& type, const String& name); - - /*! - \brief - Destructor for Spinner objects - */ - virtual ~Spinner(void); - - /*! - \brief - Initialises the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - void initialise(void); - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - Return the current spinner value. - - \return - current float value of the Spinner. - */ - float getCurrentValue(void) const; - - /*! - \brief - Return the current step value. - - \return - float step value. This is the value added to the spinner vaue when the - up / down buttons are clicked. - */ - float getStepSize(void) const; - - /*! - \brief - Return the current maximum limit value for the Spinner. - - \return - Maximum value that is allowed for the spinner. - */ - float getMaximumValue(void) const; - - /*! - \brief - Return the current minimum limit value for the Spinner. - - \return - Minimum value that is allowed for the spinner. - */ - float getMinimumValue(void) const; - - /*! - \brief - Return the current text input / display mode setting. - - \return - One of the TextInputMode enumerated values indicating the current - text input and display mode. - */ - TextInputMode getTextInputMode(void) const; - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the current spinner value. - - \param value - value to be assigned to the Spinner. - - \return - Nothing. - */ - void setCurrentValue(float value); - - /*! - \brief - Set the current step value. - - \param step - The value added to be the spinner value when the - up / down buttons are clicked. - - \return - Nothing. - */ - void setStepSize(float step); - - /*! - \brief - Set the spinner maximum value. - - \param maxValue - The maximum value to be allowed by the spinner. - - \return - Nothing. - */ - void setMaximumValue(float maxValue); - - /*! - \brief - Set the spinner minimum value. - - \param minVaue - The minimum value to be allowed by the spinner. - - \return - Nothing. - */ - void setMinimumValue(float minVaue); - - /*! - \brief - Set the spinner input / display mode. - - \param mode - One of the TextInputMode enumerated values indicating the text - input / display mode to be used by the spinner. - - \return - Nothing. - */ - void setTextInputMode(TextInputMode mode); - - protected: - /************************************************************************* - Constants - *************************************************************************/ - static const String FloatValidator; //!< Validator regex used for floating point mode. - static const String IntegerValidator; //!< Validator regex used for decimal integer mode. - static const String HexValidator; //!< Validator regex used for hexadecimal mode. - static const String OctalValidator; //!< Validator regex used for octal mode. - - /************************************************************************* - Protected Implementation Methods - *************************************************************************/ - /*! - \brief - Adds events specific to the Spinner base class. - - \return - Nothing. - */ - void addSpinnerEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addSpinnerEvents(false); } - - /*! - \brief - Returns the numerical representation of the current editbox text. - - \return - float value that is the numerical equivalent of the editbox text. - - \exception InvalidRequestException thrown if the text can not be converted. - */ - virtual float getValueFromText(void) const; - - /*! - \brief - Returns the textual representation of the current spinner value. - - \return - String object that is equivalent to the the numerical value of the spinner. - */ - virtual String getTextFromValue(void) const; - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Spinner") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Abstract Implementation methods - *************************************************************************/ - /*! - \brief - Creates a PushButton based widget that will be used for the increase - button component of the Spinner widget. - - \return - Pointer to a valid PushButton based object. - */ - virtual PushButton* createIncreaseButton(const String& name) const = 0; - - /*! - \brief - Creates a PushButton based widget that will be used for the decrease - button component of the Spinner widget. - - \return - Pointer to a valid PushButton based object. - */ - virtual PushButton* createDecreaseButton(const String& name) const = 0; - - /*! - \brief - Creates an Editbox based widget that will be used for the text input - area of the spinner widget. - - \return - Pointer to a valid Editbox based object. - */ - virtual Editbox* createEditbox(const String& name) const = 0; - - /************************************************************************* - Overrides for Event handler methods - *************************************************************************/ - virtual void onFontChanged(WindowEventArgs& e); - virtual void onTextChanged(WindowEventArgs& e); - virtual void onActivated(ActivationEventArgs& e); - - /************************************************************************* - New Event handler methods - *************************************************************************/ - /*! - \brief - Method called when the spinner value changes. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onValueChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the step value changes. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onStepChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the maximum value setting changes. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onMaximumValueChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the minimum value setting changes. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onMinimumValueChanged(WindowEventArgs& e); - - /*! - \brief - Method called when the text input/display mode is changed. - - \param e - WindowEventArgs object containing any relevant data. - - \return - Nothing. - */ - virtual void onTextInputModeChanged(WindowEventArgs& e); - - /************************************************************************* - Internal event listener methods - *************************************************************************/ - bool handleIncreaseButton(const EventArgs& e); - bool handleDecreaseButton(const EventArgs& e); - bool handleEditTextChange(const EventArgs& e); - - - /************************************************************************* - Data Fields - *************************************************************************/ - PushButton* d_increaseButton; //!< Pointer to the increase button widget. - PushButton* d_decreaseButton; //!< Pointer to the decrease button widget. - Editbox* d_editbox; //!< Pointer to the editbox widget. - - float d_stepSize; //!< Step size value used y the increase & decrease buttons. - float d_currentValue; //!< Numerical copy of the text in d_editbox. - float d_maxValue; //!< Maximum value for spinner. - float d_minValue; //!< Minimum value for spinner. - TextInputMode d_inputMode; //!< Current text display/input mode. - - private: - /************************************************************************* - Static properties for the Spinner widget - *************************************************************************/ - static SpinnerProperties::CurrentValue d_currentValueProperty; - static SpinnerProperties::StepSize d_stepSizeProperty; - static SpinnerProperties::MaximumValue d_maxValueProperty; - static SpinnerProperties::MinimumValue d_minValueProperty; - static SpinnerProperties::TextInputMode d_textInputModeProperty; - - /************************************************************************* - Private Implementation Methods - *************************************************************************/ - /*! - \brief - Adds properties supported by the Spinner class. - - \return - Nothing. - */ - void addSpinnerProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addSpinnerProperties(false); } - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUISpinner_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUISpinnerProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUISpinnerProperties.h deleted file mode 100644 index 6de1f92d5c..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUISpinnerProperties.h +++ /dev/null @@ -1,165 +0,0 @@ -/************************************************************************ - filename: CEGUISpinnerProperties.h - created: 7/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUISpinnerProperties_h_ -#define _CEGUISpinnerProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of SpinnerProperties namespace section -namespace SpinnerProperties -{ - /*! - \brief - Property to access the current value of the spinner. - - \par Usage: - - Name: CurrentValue - - Format: "[float]". - - \par Where: - - [float] represents the current value of the Spinner widget. - */ - class CurrentValue : public Property - { - public: - CurrentValue() : Property( - "CurrentValue", - "Property to get/set the current value of the spinner. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the step size of the spinner. - - \par Usage: - - Name: StepSize - - Format: "[float]". - - \par Where: - - [float] represents the current value of the Spinner widget. - */ - class StepSize : public Property - { - public: - StepSize() : Property( - "StepSize", - "Property to get/set the step size of the spinner. Value is a float.", - "1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the minimum value setting of the spinner. - - \par Usage: - - Name: MinimumValue - - Format: "[float]". - - \par Where: - - [float] represents the current minimum value of the Spinner widget. - */ - class MinimumValue : public Property - { - public: - MinimumValue() : Property( - "MinimumValue", - "Property to get/set the minimum value setting of the spinner. Value is a float.", - "-32768.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the maximum value setting of the spinner. - - \par Usage: - - Name: MaximumValue - - Format: "[float]". - - \par Where: - - [float] represents the current maximum value of the Spinner widget. - */ - class MaximumValue : public Property - { - public: - MaximumValue() : Property( - "MaximumValue", - "Property to get/set the maximum value setting of the spinner. Value is a float.", - "32767.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the TextInputMode setting. - - This property offers access the text display and input mode for the spinner. - - \par Usage: - - Name: TextInputMode - - Format: "[text]". - - \par Where [text] is: - - "FloatingPoint" for floating point decimal numbers. - - "Integer" for integer decimal numbers. - - "Hexadecimal" for hexadecimal numbers. - - "Octal" for octal numbers. - */ - class TextInputMode : public Property - { - public: - TextInputMode() : Property( - "TextInputMode", - "Property to get/set the TextInputMode setting for the spinner. Value is \"FloatingPoint\", \"Integer\", \"Hexadecimal\", or \"Octal\".", - "Integer") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} // End of SpinnerProperties namespace section -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUISpinnerProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStatic.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIStatic.h deleted file mode 100644 index b9098d6da0..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStatic.h +++ /dev/null @@ -1,455 +0,0 @@ -/************************************************************************ - filename: CEGUIStatic.h - created: 13/4/2004 - author: Paul D Turner - - purpose: Interface to base class for Static widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIStatic_h_ -#define _CEGUIStatic_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "CEGUIRenderableFrame.h" -#include "elements/CEGUIStaticProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for static widgets. -*/ -class CEGUIEXPORT Static : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - Return whether the frame for this static widget is enabled or disabled. - - \return - true if the frame is enabled and will be rendered. false is the frame is disabled and will not be rendered. - */ - bool isFrameEnabled(void) const {return d_frameEnabled;} - - - /*! - \brief - Return whether the background for this static widget is enabled to disabled. - - \return - true if the background is enabled and will be rendered. false if the background is disabled and will not be rendered. - */ - bool isBackgroundEnabled(void) const {return d_backgroundEnabled;} - - - /*! - \brief - Return a ColourRect object containing the colours used when rendering this widget. - - \return - ColourRect object initialised with the colours used when rendering the frame for this widget. - */ - ColourRect getFrameColours(void) const {return d_frameCols;} - - - /*! - \brief - Return a ColourRect object containing the colours used when rendering this widget. - - \return - ColourRect object initialised with the colours used when rendering the background for this widget. - */ - ColourRect getBackgroundColours(void) const {return d_backgroundCols;} - - - // overridden so derived classes are auto-clipped to within the inner area of the frame when it's active. - virtual Rect getUnclippedInnerRect(void) const; - - - /*! - \brief - Return the Image being used for the specified location of the frame. - - \param location - One of the FrameLocation enumerated values specifying the image to be returned. - - \return - Pointer to the Image object currently set for the frame location specified in \a location. May return NULL if no - Image is set for the requested position. - */ - const Image* getImageForFrameLocation(FrameLocation location) const; - - - /*! - \brief - Return the Image currently set as the background image for the widget. - - \return - Pointer to the Image object currently set as the background for this StaticWidget. May return NULL if - no Image is currently set. - */ - const Image* getBackgroundImage(void) const; - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Enable or disable rendering of the frame for this static widget. - - Frame imagery can be customised via the setFrameImages method. - - \param setting - true to enable rendering of a frame. false to disable rendering of a frame. - */ - void setFrameEnabled(bool setting); - - - /*! - \brief - specify the Image objects to use for each part of the frame. A NULL may be used to omit any part. - - \param topleft - Pointer to an Image object to render as the top-left corner of the frame. Specify NULL to omit this part of the frame. - - \param topright - Pointer to an Image object to render as the top-right corner of the frame. Specify NULL to omit this part of the frame. - - \param bottomleft - Pointer to an Image object to render as the bottom-left corner of the frame. Specify NULL to omit this part of the frame. - - \param bottomright - Pointer to an Image object to render as the bottom-right corner of the frame. Specify NULL to omit this part of the frame. - - \param left - Pointer to an Image object to render as the left edge of the frame. Specify NULL to omit this part of the frame. - - \param top - Pointer to an Image object to render as the top edge of the frame. Specify NULL to omit this part of the frame. - - \param right - Pointer to an Image object to render as the right edge of the frame. Specify NULL to omit this part of the frame. - - \param bottom - Pointer to an Image object to render as the bottom edge of the frame. Specify NULL to omit this part of the frame. - - \return - Nothing - */ - void setFrameImages(const Image* topleft, const Image* topright, const Image* bottomleft, const Image* bottomright, const Image* left, const Image* top, const Image* right, const Image* bottom); - - - /*! - \brief - Sets the colours to be applied when rendering the frame. - - \param colours - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setFrameColours(const ColourRect& colours); - - - /*! - \brief - Sets the colours to be applied when rendering the frame. - - \param top_left_colour - Colour to be applied to the top-left corner of each Image used in the frame. - - \param top_right_colour - Colour to be applied to the top-right corner of each Image used in the frame. - - \param bottom_left_colour - Colour to be applied to the bottom-left corner of each Image used in the frame. - - \param bottom_right_colour - Colour to be applied to the bottom-right corner of each Image used in the frame. - - \return - Nothing. - */ - void setFrameColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour); - - - /*! - \brief - Sets the colour to be applied when rendering the frame. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setFrameColours(const colour& col) {setFrameColours(col, col, col, col);} - - - /*! - \brief - Enable or disable rendering of the background for this static widget. - - \param setting - true to enable rendering of the background. false to disable rendering of the background. - */ - void setBackgroundEnabled(bool setting); - - - /*! - \brief - Set the image to use as the background for the static widget. - - \param image - Pointer to the Image object to be rendered. Can be NULL to specify no image is to be rendered. - - \return - Nothing. - */ - void setBackgroundImage(const Image* image); - - - /*! - \brief - Set the image to use as the background for the static widget. - - \param imageset - String object specifying the name of the Imageset that holds the required image. - - \param image - Name of the Image on the specified Imageset that is to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if Imageset \a imageset does not exist in the system or if \a imageset contains no Image named \a image. - */ - void setBackgroundImage(const String& imageset, const String& image); - - - /*! - \brief - Sets the colours to be applied when rendering the background. - - \param colours - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setBackgroundColours(const ColourRect& colours); - - - /*! - \brief - Sets the colours to be applied when rendering the background. - - \param top_left_colour - Colour to be applied to the top-left corner of the background. - - \param top_right_colour - Colour to be applied to the top-right corner of the background. - - \param bottom_left_colour - Colour to be applied to the bottom-left corner of the background. - - \param bottom_right_colour - Colour to be applied to the bottom-right corner of the background. - - \return - Nothing. - */ - void setBackgroundColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour); - - - /*! - \brief - Sets the colour to be applied when rendering the background. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setBackgroundColours(const colour& col) {setBackgroundColours(col, col, col, col);} - - - /*! - \brief - Set the Image to use for the specified location of the frame. - - \param location - One of the FrameLocation enumerated values specifying the image to be returned. - - \param image - Pointer to the Image to use for the frame location specified in \a location. May be NULL to indicate the - frame component is not required. - - \return - Nothing. - */ - void setImageForFrameLocation(FrameLocation location, const Image* image); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for static widget base class - */ - Static(const String& type, const String& name); - - - /*! - \brief - Destructor for static widget base class. - */ - virtual ~Static(void); - - -protected: - /************************************************************************* - Overridden from base class - *************************************************************************/ - virtual void populateRenderCache(); - - - /************************************************************************* - Event handling - *************************************************************************/ - virtual void onSized(WindowEventArgs& e); - virtual void onAlphaChanged(WindowEventArgs& e); - - - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - update the internal RenderableFrame with currently set colours and - alpha settings. - */ - void updateRenderableFrameColours(void); - - - /*! - \brief - return ARGB colour value \a col, with its alpha component modulated by the value specified in float \a alpha. - */ - colour calculateModulatedAlphaColour(const colour& col, float alpha) const; - - - /*! - \brief - This is used internally to indicate that the frame for the static widget has been modified, and as such - derived classes may need to adjust their layouts or reconfigure their rendering somehow. - \note - This does not currently fire an external event. - */ - virtual void onStaticFrameChanged(WindowEventArgs& e) {} - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Static") return true; - return Window::testClassName_impl(class_name); - } - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_frameEnabled; //!< True when the frame is enabled. - ColourRect d_frameCols; //!< Used to store frame colours. - RenderableFrame d_frame; //!< Frame object used for rendering a frame for the static element. - bool d_backgroundEnabled;//!< true when the background is enabled. - ColourRect d_backgroundCols; //!< Colours to use when drawing background. - const Image* d_background; //!< Image to use for widget background. - - // cache of frame edge sizes - float d_left_width; //!< Width of the left edge image for the current frame. - float d_right_width; //!< Width of the right edge image for the current frame. - float d_top_height; //!< Height of the top edge image for the current frame. - float d_bottom_height; //!< Height of the bottom edge image for the current frame. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static StaticProperties::FrameEnabled d_frameEnabledProperty; - static StaticProperties::BackgroundEnabled d_backgroundEnabledProperty; - static StaticProperties::FrameColours d_frameColoursProperty; - static StaticProperties::BackgroundColours d_backgroundColoursProperty; - static StaticProperties::BackgroundImage d_backgroundImageProperty; - static StaticProperties::TopLeftFrameImage d_topLeftFrameProperty; - static StaticProperties::TopRightFrameImage d_topRightFrameProperty; - static StaticProperties::BottomLeftFrameImage d_bottomLeftFrameProperty; - static StaticProperties::BottomRightFrameImage d_bottomRightFrameProperty; - static StaticProperties::LeftFrameImage d_leftFrameProperty; - static StaticProperties::RightFrameImage d_rightFrameProperty; - static StaticProperties::TopFrameImage d_topFrameProperty; - static StaticProperties::BottomFrameImage d_bottomFrameProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addStaticProperties( bool bCommon = true ); -protected: - void addUncommonProperties( void ) { __super::addUncommonProperties(); addStaticProperties(false); } -}; - - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIStatic_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImage.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImage.h deleted file mode 100644 index 366a955465..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImage.h +++ /dev/null @@ -1,344 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticImage.h - created: 4/6/2004 - author: Paul D Turner - - purpose: Interface for the static image widget. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIStaticImage_h_ -#define _CEGUIStaticImage_h_ - -#include "elements/CEGUIStatic.h" -#include "CEGUIRenderableImage.h" -#include "elements/CEGUIStaticImageProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Static image widget class. - - This base class performs it's own rendering. There is no need to override this widget to perform rendering - of static images. -*/ -class CEGUIEXPORT StaticImage : public Static -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Formatting Enumerations - *************************************************************************/ - /*! - \brief - Enumeration of horizontal formatting options for static image widgets - */ - enum HorzFormatting - { - LeftAligned, //!< Image will be rendered at it's natural width, with it's left edge aligned with the left edge of the widget. - RightAligned, //!< Image will be rendered at it's natural width, with it's right edge aligned with the right edge of the widget. - HorzCentred, //!< Image will be rendered at it's natural width, horizontally centred within the widget. - HorzStretched, //!< Image will be horizontally stretched to cover the entire width of the widget. - HorzTiled //!< Image will be tiled horizontally across the width of the widget. The rightmost tile may be clipped. - }; - - - /*! - \brief - Enumeration of vertical formatting options for a static image widgets - */ - enum VertFormatting - { - TopAligned, //!< Image will be rendered at it's natural height, with it's top edge aligned with the top edge of the widget. - BottomAligned, //!< Image will be rendered at it's natural height, with it's bottom edge aligned with the bottom edge of the widget. - VertCentred, //!< Image will be rendered at it's natural height, vertically centred within the widget. - VertStretched, //!< Image will be vertically stretched to cover the entire height of the widget. - VertTiled //!< Image will be tiled vertically down the height of the widget. The bottommost tile may be clipped. - }; - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for StaticImage widgets. - */ - StaticImage(const String& type, const String& name); - - - /*! - \brief - Destructor for StaticImage widgets. - */ - virtual ~StaticImage(void); - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - Return a pointer to the current image displayed by this static image widget. - - \return - Pointer to the Image object that is used to render this widget, or NULL for none. - */ - const Image* getImage(void) const {return d_image.getImage();} - - - /*! - \brief - Return a ColourRect object containing the colours used when rendering this widget. - - \return - ColourRect object initialised with the colours used when rendering the image for this widget. - */ - ColourRect getImageColours(void) const {return d_imageCols;} - - - /*! - \brief - Return the current horizontal formatting option set for this widget. - - \return - One of the StaticImage::HorzFormatting enumerated values specifying the horizontal formatting currently set. - */ - HorzFormatting getHorizontalFormatting(void) const {return (HorzFormatting)d_image.getHorzFormatting();} - - - /*! - \brief - Return the current vertical formatting option set for this widget. - - \return - One of the StaticImage::VertFormatting enumerated values specifying the vertical formatting currently set. - */ - VertFormatting getVerticalFormatting(void) const {return (VertFormatting)d_image.getVertFormatting();} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the Image object to be drawn by this widget. - - \param image - Pointer to the Image object to be rendered. Can be NULL to specify no image is to be rendered. - - \return - Nothing. - */ - void setImage(const Image* image); - - - /*! - \brief - Set the Image object to be drawn by this widget. - - \param imageset - String object specifying the name of the Imageset that holds the required image. - - \param image - Name of the Image on the specified Imageset that is to be used. - - \return - Nothing. - - \exception UnknownObjectException thrown if Imageset \a imageset does not exist in the system or if \a imageset contains no Image named \a image. - */ - void setImage(const String& imageset, const String& image); - - - /*! - \brief - Sets the colours to be applied when rendering the image. - - \param colours - ColourRect object describing the colours to be used. - - \return - Nothing. - */ - void setImageColours(const ColourRect& colours); - - - /*! - \brief - Sets the colours to be applied when rendering the image. - - \param top_left_colour - Colour to be applied to the top-left corner of each Image used in the image. - - \param top_right_colour - Colour to be applied to the top-right corner of each Image used in the image. - - \param bottom_left_colour - Colour to be applied to the bottom-left corner of each Image used in the image. - - \param bottom_right_colour - Colour to be applied to the bottom-right corner of each Image used in the image. - - \return - Nothing. - */ - void setImageColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour); - - - /*! - \brief - Sets the colour to be applied when rendering the image. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setImageColours(const colour& col) {setImageColours(col, col, col, col);} - - - /*! - \brief - Set the formatting required for the image. - - \param h_fmt - One of the HorzFormatting enumerated values specifying the formatting required. - - \param v_fmt - One of the VertFormatting enumerated values specifying the formatting required. - - \return - Nothing - */ - void setFormatting(HorzFormatting h_fmt, VertFormatting v_fmt); - - - /*! - \brief - Set the formatting required for the image. - - \param v_fmt - One of the VertFormatting enumerated values specifying the formatting required. - - \return - Nothing - */ - void setVerticalFormatting(VertFormatting v_fmt); - - - /*! - \brief - Set the formatting required for the image. - - \param h_fmt - One of the HorzFormatting enumerated values specifying the formatting required. - - \return - Nothing - */ - void setHorizontalFormatting(HorzFormatting h_fmt); - - -protected: - /************************************************************************* - Overridden from base class - *************************************************************************/ - virtual void populateRenderCache(); - - - /************************************************************************* - Event handling - *************************************************************************/ - virtual void onSized(WindowEventArgs& e); - virtual void onAlphaChanged(WindowEventArgs& e); - virtual void onStaticFrameChanged(WindowEventArgs& e); - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - update the internal RenderableImage with currently set colours and - alpha settings. - */ - void updateRenderableImageColours(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"StaticImage") return true; - return Static::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Data - *************************************************************************/ - RenderableImage d_image; //!< RenderableImage that does most of the work for us. - ColourRect d_imageCols; //!< Colours to use for the image. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static StaticImageProperties::Image d_imageProperty; - static StaticImageProperties::ImageColours d_imageColoursProperty; - static StaticImageProperties::VertFormatting d_vertFormattingProperty; - static StaticImageProperties::HorzFormatting d_horzFormattingProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addStaticImageProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addStaticImageProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIStaticImage_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImageProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImageProperties.h deleted file mode 100644 index b3ce53706e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticImageProperties.h +++ /dev/null @@ -1,160 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticImageProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface for StaticImage property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIStaticImageProperties_h_ -#define _CEGUIStaticImageProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of StaticImageProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the StaticImage class -*/ -namespace StaticImageProperties -{ -/*! -\brief - Property to access the image for the StaticImage widget. - - \par Usage: - - Name: Image - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class Image : public Property -{ -public: - Image() : Property( - "Image", - "Property to get/set the image for the StaticImage widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the image colours for the StaticImage widget. - - \par Usage: - - Name: ImageColours - - Format: "tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]". - - \par Where: - - tl:[aarrggbb] is the top-left colour value specified as ARGB (hex). - - tr:[aarrggbb] is the top-right colour value specified as ARGB (hex). - - bl:[aarrggbb] is the bottom-left colour value specified as ARGB (hex). - - br:[aarrggbb] is the bottom-right colour value specified as ARGB (hex). -*/ -class ImageColours : public Property -{ -public: - ImageColours() : Property( - "ImageColours", - "Property to get/set the text colours for the StaticImage widget. Value is \"tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]\".", - "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the horizontal formatting mode setting. - - \par Usage: - - Name: HorzFormatting - - Format: "[text]". - - \par Where [text] is one of: - - "LeftAligned" - - "RightAligned" - - "HorzCentred" - - "HorzStretched" - - "HorzTiled" -*/ -class HorzFormatting : public Property -{ -public: - HorzFormatting() : Property( - "HorzFormatting", - "Property to get/set the horizontal formatting mode. Value is one of the HorzFormatting strings.", - "HorzStretched") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the vertical formatting mode setting. - - \par Usage: - - Name: VertFormatting - - Format: "[text]". - - \par Where [text] is one of: - - "TopAligned" - - "BottomAligned" - - "VertCentred" - - "VertStretched" - - "VertTiled" -*/ -class VertFormatting : public Property -{ -public: - VertFormatting() : Property( - "VertFormatting", - "Property to get/set the vertical formatting mode. Value is one of the VertFormatting strings.", - "VertStretched") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of StaticImageProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIStaticImageProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticProperties.h deleted file mode 100644 index 19b9d23cac..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticProperties.h +++ /dev/null @@ -1,391 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface to properties for Static (base class) widget. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIStaticProperties_h_ -#define _CEGUIStaticProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of StaticProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Static (base) class -*/ -namespace StaticProperties -{ -/*! -\brief - Property to access the state of the frame enabled setting for the Static widget. - - \par Usage: - - Name: FrameEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate that the frame is enabled. - - "False" to indicate that the frame is disabled. -*/ -class FrameEnabled : public Property -{ -public: - FrameEnabled() : Property( - "FrameEnabled", - "Property to get/set the state of the frame enabled setting for the Static widget. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the state of the frame background setting for the Static widget. - - \par Usage: - - Name: BackgroundEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate that the background is enabled. - - "False" to indicate that the background is disabled. -*/ -class BackgroundEnabled : public Property -{ -public: - BackgroundEnabled() : Property( - "BackgroundEnabled", - "Property to get/set the state of the frame background setting for the Static widget. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the frame colours for the Static widget. - - \par Usage: - - Name: FrameColours - - Format: "tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]". - - \par Where: - - tl:[aarrggbb] is the top-left colour value specified as ARGB (hex). - - tr:[aarrggbb] is the top-right colour value specified as ARGB (hex). - - bl:[aarrggbb] is the bottom-left colour value specified as ARGB (hex). - - br:[aarrggbb] is the bottom-right colour value specified as ARGB (hex). -*/ -class FrameColours : public Property -{ -public: - FrameColours() : Property( - "FrameColours", - "Property to get/set the frame colours for the Static widget. Value is \"tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]\".", - "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the background colours for the Static widget. - - \par Usage: - - Name: BackgroundColours - - Format: "tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]". - - \par Where: - - tl:[aarrggbb] is the top-left colour value specified as ARGB (hex). - - tr:[aarrggbb] is the top-right colour value specified as ARGB (hex). - - bl:[aarrggbb] is the bottom-left colour value specified as ARGB (hex). - - br:[aarrggbb] is the bottom-right colour value specified as ARGB (hex). -*/ -class BackgroundColours : public Property -{ -public: - BackgroundColours() : Property( - "BackgroundColours", - "Property to get/set the background colours for the Static widget. Value is \"tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]\".", - "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the background image for the Static widget. - - \par Usage: - - Name: BackgroundImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class BackgroundImage : public Property -{ -public: - BackgroundImage() : Property( - "BackgroundImage", - "Property to get/set the background image for the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the top-left image for the frame of the Static widget. - - \par Usage: - - Name: TopLeftFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class TopLeftFrameImage : public Property -{ -public: - TopLeftFrameImage() : Property( - "TopLeftFrameImage", - "Property to get/set the top-left image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the top-right image for the frame of the Static widget. - - \par Usage: - - Name: TopRightFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class TopRightFrameImage : public Property -{ -public: - TopRightFrameImage() : Property( - "TopRightFrameImage", - "Property to get/set the top-right image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the bottom-left image for the frame of the Static widget. - - \par Usage: - - Name: BottomLeftFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class BottomLeftFrameImage : public Property -{ -public: - BottomLeftFrameImage() : Property( - "BottomLeftFrameImage", - "Property to get/set the bottom-left image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the bottom-right image for the frame of the Static widget. - - \par Usage: - - Name: BottomRightFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class BottomRightFrameImage : public Property -{ -public: - BottomRightFrameImage() : Property( - "BottomRightFrameImage", - "Property to get/set the bottom-right image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the left edge image for the frame of the Static widget. - - \par Usage: - - Name: LeftFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class LeftFrameImage : public Property -{ -public: - LeftFrameImage() : Property( - "LeftFrameImage", - "Property to get/set the left edge image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the right edge image for the frame of the Static widget. - - \par Usage: - - Name: RightFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class RightFrameImage : public Property -{ -public: - RightFrameImage() : Property( - "RightFrameImage", - "Property to get/set the right edge image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the top edge image for the frame of the Static widget. - - \par Usage: - - Name: TopFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class TopFrameImage : public Property -{ -public: - TopFrameImage() : Property( - "TopFrameImage", - "Property to get/set the top edge image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the bottom edge image for the frame of the Static widget. - - \par Usage: - - Name: BottomFrameImage - - Format: "set:[text] image:[text]". - - \par Where: - - set:[text] is the name of the Imageset containing the image. The Imageset name should not contain spaces. The Imageset specified must already be loaded. - - image:[text] is the name of the Image on the specified Imageset. The Image name should not contain spaces. -*/ -class BottomFrameImage : public Property -{ -public: - BottomFrameImage() : Property( - "BottomFrameImage", - "Property to get/set the bottom edge image for the frame of the Static widget. Value should be \"set:[imageset name] image:[image name]\".", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - - - -} // End of StaticProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIStaticProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticText.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticText.h deleted file mode 100644 index ce396d8820..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticText.h +++ /dev/null @@ -1,412 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticText.h - created: 4/6/2004 - author: Paul D Turner - - purpose: Defines interface for a static text widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIStaticText_h_ -#define _CEGUIStaticText_h_ - -#include "elements/CEGUIStatic.h" -#include "elements/CEGUIStaticTextProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for a static text widget. -*/ -class CEGUIEXPORT StaticText : public Static -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Formatting Enumerations - *************************************************************************/ - /*! - \brief - Enumeration of horizontal formatting options for static text widgets - */ - enum HorzFormatting - { - LeftAligned, //!< Text is output as a single line of text with the first character aligned with the left edge of the widget. - RightAligned, //!< Text is output as a single line of text with the last character aligned with the right edge of the widget. - HorzCentred, //!< Text is output as a single line of text horizontally centred within the widget. - HorzJustified, //!< Text is output as a single line of text with the first and last characters aligned with the edges of the widget. - WordWrapLeftAligned, //!< Text is output as multiple word-wrapped lines of text with the first character of each line aligned with the left edge of the widget. - WordWrapRightAligned, //!< Text is output as multiple word-wrapped lines of text with the last character of each line aligned with the right edge of the widget. - WordWrapCentred, //!< Text is output as multiple word-wrapped lines of text with each line horizontally centered within the widget. - WordWrapJustified //!< Text is output as multiple word-wrapped lines of text with the first and last characters of each line aligned with the edges of the widget. - }; - - - /*! - \brief - Enumeration of vertical formatting options for a static text widgets - */ - enum VertFormatting - { - TopAligned, //!< Text is output with the top of first line of text aligned with the top edge of the widget. - BottomAligned, //!< Text is output with the bottom of last line of text aligned with the bottom edge of the widget. - VertCentred //!< Text is output vertically centred within the widget. - }; - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for static text widgets. - */ - StaticText(const String& type, const String& name); - - - /*! - \brief - Destructor for static text widgets. - */ - virtual ~StaticText(void); - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - Return a ColourRect object containing the colours used when rendering this widget. - - \return - ColourRect object initialised with the colours used when rendering the text for this widget. - */ - ColourRect getTextColours(void) const {return d_textCols;} - - - /*! - \brief - Return the current horizontal formatting option set for this widget. - - \return - One of the StaticText::HorzFormatting enumerated values specifying the horizontal formatting currently set. - */ - HorzFormatting getHorizontalFormatting(void) const {return d_horzFormatting;} - - - /*! - \brief - Return the current vertical formatting option set for this widget. - - \return - One of the StaticText::VertFormatting enumerated values specifying the vertical formatting currently set. - */ - VertFormatting getVerticalFormatting(void) const {return d_vertFormatting;} - - - /*! - \brief - Return whether the vertical scroll bar is set to be shown if needed. - - \return - - true if the vertical scroll bar will be shown if needed (top or bottom aligned formatting only). - - false if the vertical scroll bar will never be shown (default behaviour). - */ - bool isVerticalScrollbarEnabled(void) const; - - - /*! - \brief - Return whether the horizontal scroll bar is set to be shown if needed. - - \return - - true if the horizontal scroll bar will be shown if needed (non-word wrapped, left or right aligned formatting only). - - false if the horizontal scroll bar will never be shown (default behaviour). - */ - bool isHorizontalScrollbarEnabled(void) const; - - - // overridden (again) so scroll bars are not clipped when they are active - virtual Rect getUnclippedInnerRect(void) const; - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - - /*! - \brief - Sets the colours to be applied when rendering the text. - - \param colours - ColourRect object describing the colours to be used for each text glyph rendered. - - \return - Nothing. - */ - void setTextColours(const ColourRect& colours); - - - /*! - \brief - Sets the colours to be applied when rendering the text. - - \param top_left_colour - Colour to be applied to the top-left corner of each text glyph rendered. - - \param top_right_colour - Colour to be applied to the top-right corner of each text glyph rendered. - - \param bottom_left_colour - Colour to be applied to the bottom-left corner of each text glyph rendered. - - \param bottom_right_colour - Colour to be applied to the bottom-right corner of each text glyph rendered. - - \return - Nothing. - */ - void setTextColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour); - - - /*! - \brief - Sets the colour to be applied when rendering the text. - - \param col - colour value to be used when rendering. - - \return - Nothing. - */ - void setTextColours(const colour& col) {setTextColours(col, col, col, col);} - - - /*! - \brief - Set the formatting required for the text. - - \param h_fmt - One of the HorzFormatting enumerated values specifying the formatting required. - - \param v_fmt - One of the VertFormatting enumerated values specifying the formatting required. - - \return - Nothing - */ - void setFormatting(HorzFormatting h_fmt, VertFormatting v_fmt); - - - /*! - \brief - Set the formatting required for the text. - - \param v_fmt - One of the VertFormatting enumerated values specifying the formatting required. - - \return - Nothing - */ - void setVerticalFormatting(VertFormatting v_fmt); - - - /*! - \brief - Set the formatting required for the text. - - \param h_fmt - One of the HorzFormatting enumerated values specifying the formatting required. - - \return - Nothing - */ - void setHorizontalFormatting(HorzFormatting h_fmt); - - - /*! - \brief - Set whether the vertical scroll bar will be shown if needed. - - \param setting - - true if the vertical scroll bar should be shown if needed (top or bottom aligned formatting only). - - false if the vertical scroll bar should never be shown (default behaviour). - */ - void setVerticalScrollbarEnabled(bool setting); - - - /*! - \brief - Set whether the horizontal scroll bar will be shown if needed. - - \param setting - - true if the horizontal scroll bar should be shown if needed (non-word wrapped, left or right aligned formatting only). - - false if the horizontal scroll bar should never be shown (default behaviour). - */ - void setHorizontalScrollbarEnabled(bool setting); - - -protected: - /************************************************************************* - Overridden from base class - *************************************************************************/ - virtual void populateRenderCache(); - - - /************************************************************************* - Overridden events - *************************************************************************/ - virtual void onTextChanged(WindowEventArgs& e); - virtual void onSized(WindowEventArgs& e); - virtual void onFontChanged(WindowEventArgs& e); - virtual void onMouseWheel(MouseEventArgs& e); - - - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - Return a Rect object describing, in un-clipped pixels, the window relative area - that the text should be rendered in to. - - \return - Rect object describing the area of the Window to be used for rendering text. - */ - virtual Rect getTextRenderArea(void) const; - - - /*! - \brief - display required integrated scroll bars according to current state of the edit box and update their values. - */ - void configureScrollbars(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"StaticText") return true; - return Static::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Methods (abstract) - *************************************************************************/ - /*! - \brief - create and return a pointer to a Scrollbar widget for use as vertical scroll bar - - \param name - String containing the name to be given to the created component. - - \return - Pointer to a Scrollbar to be used for scrolling vertically. - */ - virtual Scrollbar* createVertScrollbar(const String& name) const = 0; - - - /*! - \brief - create and return a pointer to a Scrollbar widget for use as horizontal scroll bar - - \param name - String containing the name to be given to the created component. - - \return - Pointer to a Scrollbar to be used for scrolling horizontally. - */ - virtual Scrollbar* createHorzScrollbar(const String& name) const = 0; - - - /************************************************************************* - Event subscribers - *************************************************************************/ - bool handleScrollbarChange(const EventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - HorzFormatting d_horzFormatting; //!< Horizontal formatting to be applied to the text. - VertFormatting d_vertFormatting; //!< Vertical formatting to be applied to the text. - ColourRect d_textCols; //!< Colours used when rendering the text. - Scrollbar* d_vertScrollbar; //!< Widget used as vertical scrollbar; - Scrollbar* d_horzScrollbar; //!< Widget used as horizontal scrollbar; - bool d_enableVertScrollbar; //!< true if vertical scroll bar is enabled. - bool d_enableHorzScrollbar; //!< true if horizontal scroll bar is enabled. - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static StaticTextProperties::TextColours d_textColoursProperty; - static StaticTextProperties::VertFormatting d_vertFormattingProperty; - static StaticTextProperties::HorzFormatting d_horzFormattingProperty; - static StaticTextProperties::VertScrollbar d_vertScrollbarProperty; - static StaticTextProperties::HorzScrollbar d_horzScrollbarProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addStaticTextProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addStaticTextProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIStaticText_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticTextProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticTextProperties.h deleted file mode 100644 index 629a4f2bd4..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIStaticTextProperties.h +++ /dev/null @@ -1,186 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticTextProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface for properties for the StaticText class. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIStaticTextProperties_h_ -#define _CEGUIStaticTextProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of StaticTextProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the StaticText class -*/ -namespace StaticTextProperties -{ -/*! -\brief - Property to access the text colours for the StaticText widget. - - \par Usage: - - Name: TextColours - - Format: "tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]". - - \par Where: - - tl:[aarrggbb] is the top-left colour value specified as ARGB (hex). - - tr:[aarrggbb] is the top-right colour value specified as ARGB (hex). - - bl:[aarrggbb] is the bottom-left colour value specified as ARGB (hex). - - br:[aarrggbb] is the bottom-right colour value specified as ARGB (hex). -*/ -class TextColours : public Property -{ -public: - TextColours() : Property( - "TextColours", - "Property to get/set the text colours for the StaticText widget. Value is \"tl:[aarrggbb] tr:[aarrggbb] bl:[aarrggbb] br:[aarrggbb]\".", - "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the horizontal formatting mode setting. - - \par Usage: - - Name: HorzFormatting - - Format: "[text]". - - \par Where [text] is one of: - - "LeftAligned" - - "RightAligned" - - "HorzCentred" - - "HorzJustified" - - "WordWrapLeftAligned" - - "WordWrapRightAligned" - - "WordWrapCentred" - - "WordWrapJustified" -*/ -class HorzFormatting : public Property -{ -public: - HorzFormatting() : Property( - "HorzFormatting", - "Property to get/set the horizontal formatting mode. Value is one of the HorzFormatting strings.", - "LeftAligned") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the vertical formatting mode setting. - - \par Usage: - - Name: VertFormatting - - Format: "[text]". - - \par Where [text] is one of: - - "TopAligned" - - "BottomAligned" - - "VertCentred" -*/ -class VertFormatting : public Property -{ -public: - VertFormatting() : Property( - "VertFormatting", - "Property to get/set the vertical formatting mode. Value is one of the VertFormatting strings.", - "VertCentred") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for enabling the vertical scroll bar. - - \par Usage: - - Name: VertScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the scroll bar is enabled and will be shown when needed. - - "False" to indicate the scroll bar is disabled and will never be shown -*/ -class VertScrollbar : public Property -{ -public: - VertScrollbar() : Property( - "VertScrollbar", - "Property to get/set the setting for the vertical scroll bar. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the setting for enabling the horizontal scroll bar. - - \par Usage: - - Name: HorzScrollbar - - Format: "[text]" - - \par Where [Text] is: - - "True" to indicate the scroll bar is enabled and will be shown when needed. - - "False" to indicate the scroll bar is disabled and will never be shown -*/ -class HorzScrollbar : public Property -{ -public: - HorzScrollbar() : Property( - "HorzScrollbar", - "Property to get/set the setting for the horizontal scroll bar. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of StaticTextProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIStaticTextProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabButton.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITabButton.h deleted file mode 100644 index 8657f39594..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabButton.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************ - filename: CEGUITabButton.h - created: 8/8/2004 - author: Steve Streeting - - purpose: Interface to base class for TabButton widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITabButton_h_ -#define _CEGUITabButton_h_ - -#include "CEGUIBase.h" -#include "elements/CEGUIButtonBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for TabButtons. A TabButton based class is used internally as - the button that appears at the top of a TabControl widget to select the - active tab pane. -*/ -class CEGUIEXPORT TabButton : public ButtonBase -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventClicked; //!< The button was clicked. - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for base TabButton class - */ - TabButton(const String& type, const String& name); - - - /*! - \brief - Destructor for TabButton class - */ - virtual ~TabButton(void); - - /*! - \brief - Set whether this tab button is selected or not - */ - virtual void setSelected(bool selected) { d_selected = selected; requestRedraw(); } - - /*! - \brief - Set whether this tab button is on the right of the selected button, - used to disable edges of buttons when deselected (to give an overlapping - look) - */ - virtual void setRightOfSelected(bool isRight) { d_rightOfSelected = isRight; requestRedraw(); } - - /*! - \brief - Return whether this tab button is selected or not - */ - bool isSelected(void) const { return d_selected; } - - - /*! - \brief - Set the target window which is the content pane which this button is - covering. - */ - void setTargetWindow(Window* wnd); - /*! - \brief - Get the target window which is the content pane which this button is - covering. - */ - Window* getTargetWindow(void) { return d_targetWindow; } - - /*! - \brief - Set the index at which this tab is positioned. - */ - void setTabIndex(uint idx) { d_tabIndex = idx; } - - /*! - \brief - Get the index at which this tab is positioned. - */ - uint getTabIndex(void) { return d_tabIndex; } -protected: - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_selected; //!< Is this button selected? - bool d_rightOfSelected; //!< Is this button to the right of the selected tab? - Window* d_targetWindow; //!< The target window which this button is representing - uint d_tabIndex; //!< The index at which this tab is positioned - /************************************************************************* - New Event Handlers - *************************************************************************/ - /*! - \brief - handler invoked internally when the button is clicked. - */ - virtual void onClicked(WindowEventArgs& e); - - - /************************************************************************* - Overridden Event Handlers - *************************************************************************/ - virtual void onMouseButtonUp(MouseEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add button specific events - */ - void addTabButtonEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addTabButtonEvents(false); } - /*! - \brief - Perform the rendering for this widget. - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - void drawSelf(float z); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"TabButton") return true; - return ButtonBase::testClassName_impl(class_name); - } -}; - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUITabButton_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabControl.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITabControl.h deleted file mode 100644 index 20e3f34be8..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabControl.h +++ /dev/null @@ -1,485 +0,0 @@ -/************************************************************************ - filename: CEGUITabControl.h - created: 08/08/2004 - author: Steve Streeting - - purpose: Interface to base class for TabControl widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITabControl_h_ -#define _CEGUITabControl_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUITabControlProperties.h" -#include "elements/CEGUITabPane.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - - // Forward declaration - class TabButton; - -/*! -\brief - Base class for standard Tab Control widget. -*/ -class CEGUIEXPORT TabControl : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Constants - *************************************************************************/ - // event names - static const String EventSelectionChanged; //!< Event triggered when there is a change to the currently selected tab. - - - /************************************************************************* - Accessor Methods - *************************************************************************/ - /*! - \brief - Return number of tabs - - \return - the number of tabs currently present. - */ - uint getTabCount(void) const; - - - /*! - \brief - Set the selected tab by the name of the root window within it. - \exception InvalidRequestException thrown if \a index is out of range. - */ - void setSelectedTab(const String &name); - - /*! - \brief - Set the selected tab by the ID of the root window within it. - \exception InvalidRequestException thrown if \a index is out of range. - */ - void setSelectedTab(uint ID); - - /*! - \brief - Set the selected tab by the index position in the tab control. - \exception InvalidRequestException thrown if \a index is out of range. - */ - void setSelectedTabAtIndex(uint index); - - /*! - \brief - Return the Window which is the first child of the tab at index position \a index. - - \param index - Zero based index of the item to be returned. - - \return - Pointer to the Window at index position \a index in the tab control. - - \exception InvalidRequestException thrown if \a index is out of range. - */ - Window* getTabContentsAtIndex(uint index) const; - - /*! - \brief - Return the Window which is the tab content with the given name. - - \param name - Name of the Window which was attached as a tab content. - - \return - Pointer to the named Window in the tab control. - - \exception InvalidRequestException thrown if content is not found. - */ - Window* getTabContents(const String& name) const; - - /*! - \brief - Return the Window which is the tab content with the given ID. - - \param ID - ID of the Window which was attached as a tab content. - - \return - Pointer to the Window with the given ID in the tab control. - - \exception InvalidRequestException thrown if content is not found. - */ - Window* getTabContents(uint ID) const; - - /*! - \brief - Return whether the tab contents window is currently selected. - - \param wnd - The tab contents window to query. - - \return - true if the tab is currently selected, false otherwise. - - \exception InvalidRequestException thrown if \a wnd is not a valid tab contents window. - */ - bool isTabContentsSelected(Window* wnd) const; - - /*! - \brief - Return the index of the currently selected tab. - - \return - index of the currently selected tab. - */ - uint getSelectedTabIndex() const; - - /*! - \brief - Return the relative height of the tabs - */ - float getRelativeTabHeight(void) const { return d_rel_tabHeight; } - /*! - \brief - Return the absolute height of the tabs - */ - float getAbsoluteTabHeight(void) const { return d_abs_tabHeight; } - /*! - \brief - Return the height of the tabs in the current metrics mode - */ - float getTabHeight(void) const; - /*! - \brief - Return the amount of padding to add either side of the text in the tab, - according to the current metrics mode. - */ - float getTabTextPadding(void) const; - /*! - \brief - Return the relative amount of padding to add either side of the text in the tab - */ - float getRelativeTabTextPadding(void) const { return d_rel_tabPadding; } - /*! - \brief - Return the absolute amount of padding to add either side of the text in the tab - */ - float getAbsoluteTabTextPadding(void) const { return d_abs_tabPadding; } - - - /************************************************************************* - Manipulator Methods - *************************************************************************/ - /*! - \brief - Initialise the Window based object ready for use. - - \note - This must be called for every window created. Normally this is handled automatically by the WindowFactory for each Window type. - - \return - Nothing - */ - virtual void initialise(void); - - /*! - \brief - Set the relative height of the tabs - */ - void setRelativeTabHeight(float height); - /*! - \brief - Set the absolute height of the tabs - */ - void setAbsoluteTabHeight(float height); - /*! - \brief - Set the height of the tabs in the current metrics mode - */ - void setTabHeight(float height); - - /*! - \brief - Set the amount of padding to add either side of the text in the tab, - according to the current metrics mode. - */ - void setTabTextPadding(float); - /*! - \brief - Set the relative amount of padding to add either side of the text in the tab - */ - void setRelativeTabTextPadding(float); - /*! - \brief - Set the absolute amount of padding to add either side of the text in the tab - */ - void setAbsoluteTabTextPadding(float); - /*! - \brief - Add a new tab to the tab control. - \par - The new tab will be added with the same text as the window passed in. - \param wnd - The Window which will be placed in the content area of this new tab. - */ - void addTab(Window* wnd); - /*! - \brief - Remove the named tab from the tab control. - \par - The tab content will be destroyed. - */ - void removeTab(const String& name); - /*! - \brief - Remove the tab with the given ID from the tab control. - \par - The tab content will be destroyed. - */ - void removeTab(uint ID); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for TabControl base class. - */ - TabControl(const String& type, const String& name); - - - /*! - \brief - Destructor for Listbox base class. - */ - virtual ~TabControl(void); - - - /*! - \brief - Return the TabButton associated with this Window. - \exception InvalidRequestException thrown if content is not found. - */ - TabButton* getButtonForTabContents(Window* wnd) const; - - /*! - lil_Toady: MTA STUFF! Requests layout recalculation - */ - void requestChildWindowLayout () { performChildWindowLayout(); }; - -protected: - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Perform the actual rendering for this Window. - - \param z - float value specifying the base Z co-ordinate that should be used when rendering - - \return - Nothing - */ - virtual void drawSelf(float z) { /* do nothing; rendering handled by children */ } - - /*! - \brief - Add tab control specific events - */ - void addTabControlEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addTabControlEvents(false); } - - /*! - \brief - Add a TabButton for the specified child Window. - */ - virtual void addButtonForTabContent(Window* wnd); - /*! - \brief - Remove the TabButton for the specified child Window. - */ - virtual void removeButtonForTabContent(Window* wnd); - /*! - \brief - Construct a button name to handle a window. - */ - String makeButtonName(Window* wnd); - - /*! - \brief - Internal implementation of select tab. - \param wnd - Pointer to a Window which is the root of the tab content to select - */ - virtual void selectTab_impl(Window* wnd); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"TabControl") return true; - return Window::testClassName_impl(class_name); - } - - void performChildWindowLayout(); - int writeChildWindowsXML(OutStream& out_stream) const; - - /************************************************************************* - New event handlers - *************************************************************************/ - - /*! - \brief - Handler called internally when the currently selected item or items changes. - */ - virtual void onSelectionChanged(WindowEventArgs& e); - - /*! - \brief - Handler called when the window's font is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onFontChanged(WindowEventArgs& e); - - /************************************************************************* - Implementation Data - *************************************************************************/ - Window* d_tabButtonPane; //!< The area containing the tab buttons - TabPane* d_tabContentPane; //!< The content area window - float d_abs_tabHeight; //!< The height of the tabs in pixels - float d_rel_tabHeight; //!< The height of the tabs relative to parent - float d_abs_tabPadding; //!< The padding of the tabs in pixels - float d_rel_tabPadding; //!< The padding of the tabs relative to parent - uint d_nextTabIndex; //!< The index to give the next tab - typedef std::map TabButtonIndexMap; - TabButtonIndexMap d_tabButtonIndexMap; //!< Sorting for tabs - /************************************************************************* - Abstract Implementation Functions (must be provided by derived class) - *************************************************************************/ - /*! - \brief - create and return a pointer to a TabPane widget for use as content area - - \param name - String holding the name to be given to the new component. - - \return - Pointer to a TabPane to be used for holding the main content. - */ - virtual TabPane* createTabContentPane(const String& name) const = 0; - - /*! - \brief - create and return a pointer to a widget for use as tab button area - - \param name - String holding the name to be given to the new component. - - \return - Pointer to a Static to be used for holding the tab buttons. - */ - virtual Window* createTabButtonPane(const String& name) const; - - /*! - \brief - create and return a pointer to a TabButton widget for use as a clickable tab header - \param name - Button name - \return - Pointer to a TabButton to be used for changing tabs. - */ - virtual TabButton* createTabButton(const String& name) const = 0; - - /*! - \brief - Calculate the correct position and size of a tab button, based on the - index it is due to be placed at. - \param btn - Pointer to a button to calculate the size and position for. This button - will be updated in place with these metrics. - \param targetIndex - The index at which the tab is/will be placed. Tabs must exist for all the - indexes before this. - */ - void calculateTabButtonSizePosition(TabButton* btn, uint targetIndex); - -protected: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static TabControlProperties::TabHeight d_tabHeightProperty; - static TabControlProperties::AbsoluteTabHeight d_absoluteTabHeightProperty; - static TabControlProperties::RelativeTabHeight d_relativeTabHeightProperty; - - static TabControlProperties::TabTextPadding d_tabTextPaddingProperty; - static TabControlProperties::AbsoluteTabTextPadding d_absoluteTabTextPaddingProperty; - static TabControlProperties::RelativeTabTextPadding d_relativeTabTextPaddingProperty; - /************************************************************************* - Private methods - *************************************************************************/ - void addTabControlProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addTabControlProperties(false); } - - void addChild_impl(Window* wnd); - void removeChild_impl(Window* wnd); - - /************************************************************************* - Event handlers - *************************************************************************/ - bool handleContentWindowTextChanged(const EventArgs& args); - bool handleTabButtonClicked(const EventArgs& args); -}; - - - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUITabControl_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabControlProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITabControlProperties.h deleted file mode 100644 index c32763be8d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabControlProperties.h +++ /dev/null @@ -1,200 +0,0 @@ -/************************************************************************ - filename: CEGUITabControlProperties.h - created: 08/08/2004 - author: Steve Streeting - - purpose: Interface to TabControl property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITabControlProperties_h_ -#define _CEGUITabControlProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of TabControlProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Listbox class -*/ -namespace TabControlProperties -{ -/*! -\brief - Property to access the tab height setting of the tab control. - - \par Usage: - - Name: TabHeight - - Format: "[float]" - -*/ -class TabHeight : public Property -{ -public: - TabHeight() : Property( - "TabHeight", - "Property to get/set the height of the tabs.", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - - // default depends upon current metrics mode - bool isDefault(const PropertyReceiver* receiver) const; - String getDefault(const PropertyReceiver* receiver) const; -}; - -/*! -\brief -Property to access the absolute tab height setting of the tab control. - -\par Usage: -- Name: AbsoluteTabHeight -- Format: "[float]" - -*/ -class AbsoluteTabHeight : public Property -{ -public: - AbsoluteTabHeight() : Property( - "AbsoluteTabHeight", - "Property to get/set the absolute height of the tabs.", - "", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - - // default depends upon size of parent - bool isDefault(const PropertyReceiver* receiver) const; - String getDefault(const PropertyReceiver* receiver) const; -}; - -/*! -\brief -Property to access the relative tab height setting of the tab control. - -\par Usage: -- Name: RelativeTabHeight -- Format: "[float]" - -*/ -class RelativeTabHeight : public Property -{ -public: - RelativeTabHeight() : Property( - "RelativeTabHeight", - "Property to get/set the relative height of the tabs.", - "0.050000", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief -Property to access the tab text padding setting of the tab control. - -\par Usage: -- Name: TabTextPadding -- Format: "[float]" - -*/ -class TabTextPadding : public Property -{ -public: - TabTextPadding() : Property( - "TabTextPadding", - "Property to get/set the padding either side of the tab buttons.", - "") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - - // default depends upon current metrics mode - bool isDefault(const PropertyReceiver* receiver) const; - String getDefault(const PropertyReceiver* receiver) const; -}; - -/*! -\brief -Property to access the absolute tab text padding setting of the tab control. - -\par Usage: -- Name: AbsoluteTabTextPadding -- Format: "[float]" - -*/ -class AbsoluteTabTextPadding : public Property -{ -public: - AbsoluteTabTextPadding() : Property( - "AbsoluteTabTextPadding", - "Property to get/set the absolute padding either side of the tab buttons.", - "5", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -/*! -\brief -Property to access the relative tab text padding setting of the tab control. - -\par Usage: -- Name: RelativeTabTextPadding -- Format: "[float]" - -*/ -class RelativeTabTextPadding : public Property -{ -public: - RelativeTabTextPadding() : Property( - "RelativeTabTextPadding", - "Property to get/set the relative padding either side of the tab buttons.", - "", false) - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - - // default depends upon size of parent - bool isDefault(const PropertyReceiver* receiver) const; - String getDefault(const PropertyReceiver* receiver) const; -}; - - - - - -} // End of TabControlProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIListboxProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabPane.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITabPane.h deleted file mode 100644 index 0c175292ee..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITabPane.h +++ /dev/null @@ -1,118 +0,0 @@ -/************************************************************************ - filename: CEGUITabPane.h - created: 8/8/2004 - author: Steve Streeting - - purpose: Defines interface for the content area of a tab control -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITabPane_h_ -#define _CEGUITabPane_h_ - -#include "elements/CEGUIStatic.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/*! -\brief - Base class for a tab pane. -*/ -class CEGUIEXPORT TabPane : public Static -{ -public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for tab pane widgets. - */ - TabPane(const String& type, const String& name) : Static(type, name) {} - - - /*! - \brief - Destructor for tab pane widgets. - */ - virtual ~TabPane(void) {} - - - /************************************************************************* - Accessors - *************************************************************************/ - - /************************************************************************* - Manipulators - *************************************************************************/ - -protected: - /************************************************************************* - Overridden from base class - *************************************************************************/ - - /************************************************************************* - Implementation methods - *************************************************************************/ - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Tabpane") return true; - return Static::testClassName_impl(class_name); - } - - /************************************************************************* - Implementation Data - *************************************************************************/ - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - - - /************************************************************************* - Private methods - *************************************************************************/ -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUITabPane_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITextItem.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITextItem.h deleted file mode 100644 index 36e536dd6f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITextItem.h +++ /dev/null @@ -1,240 +0,0 @@ -/************************************************************************ - filename: CEGUITextItem.h - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Interface to base class for TextItem widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITextItem_h_ -#define _CEGUITextItem_h_ - -#include "CEGUIBase.h" -#include "CEGUIWindow.h" -#include "elements/CEGUIItemEntry.h" -#include "elements/CEGUITextItemProperties.h" -#include "CEGUIFont.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for all the TextItem widgets. -*/ -class CEGUIEXPORT TextItem : public ItemEntry -{ -public: - /************************************************************************* - Constants - *************************************************************************/ - static const colour DefaultTextColour; //!< Default colour used when rendering text. - - - /************************************************************************* - Accessors - *************************************************************************/ - /*! - \brief - Return the TextFormatting currently used for rendering the text. - - \return - TextFormatting value describing the currently used text formatting option. - */ - TextFormatting getTextFormatting() const {return d_textFormatting;} - - - /*! - \brief - get the offset that is used to shift of the text in the x-direction - this is useful if the button-images are not symmetrical and the - text shouldn't be completely centered - - \return - the offset in pixels - */ - float getTextXOffset(void) const {return d_textXOffset;} - - - /*! - \brief - Get the current text colour of the item. - - \return - The current text colour. - */ - colour getTextColour(void) const {return d_textColour;} - - - /************************************************************************* - Manipulators - *************************************************************************/ - /*! - \brief - Set the TextFormatting to be used when rendering the text. - */ - void setTextFormatting(TextFormatting format) {d_textFormatting=format;} - - - /*! - \brief - Set the current text colour of the item. - - \param col - The colour to set as the current text colour. - */ - void setTextColour(const colour& col) {d_textColour=col;} - - - /*! - \brief - Set the offset to use for a shift of the text in the x-direction - this is useful if the button-images are not symmetrical and the - text shouldn't be completely centered - - \param offset - The offset to use - in pixels. - - \return - Nothing. - */ - void setTextXOffset(float offset) {d_textXOffset=offset;} - - - /************************************************************************* - Pure functions from ItemEntry - *************************************************************************/ - /*! - \brief - Return the "optimal" size for the item - - \return - Size describing the size in pixel that this TextItem's content requires - for non-clipped rendering - */ - virtual Size getItemPixelSize(void); - - - /************************************************************************* - Construction and Destruction - *************************************************************************/ - /*! - \brief - Constructor for TextItem objects - */ - TextItem(const String& type, const String& name); - - - /*! - \brief - Destructor for TextItem objects - */ - virtual ~TextItem(void); - - -protected: - /************************************************************************* - Abstract Implementation Functions (must be provided by derived class) - *************************************************************************/ - - /************************************************************************* - Overridden event handlers - *************************************************************************/ - /*! - \brief - Handler called when the window's text is changed. - - \param e - WindowEventArgs object whose 'window' pointer field is set to the window that triggered the event. For this - event the trigger window is always 'this'. - */ - virtual void onTextChanged(WindowEventArgs& e); - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - virtual void populateRenderCache(); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"TextItem") return true; - return ItemEntry::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Rendering Functions - *************************************************************************/ - - /************************************************************************* - Implementation Data - *************************************************************************/ - colour d_textColour; //!< the current text colour - TextFormatting d_textFormatting; //!< the current text formatting - - //text-offset - float d_textXOffset; //!< offset applied to the x co-ordinate of the text rendered. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static TextItemProperties::TextColour d_textColourProperty; - static TextItemProperties::TextFormatting d_textFormattingProperty; - static TextItemProperties::TextXOffset d_textXOffsetProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addTextItemProperties( bool bCommon = true ); -protected: - void addUncommonProperties( void ) { __super::addUncommonProperties(); addTextItemProperties(false); } -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - - -#endif // end of guard _CEGUITextItem_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITextItemProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITextItemProperties.h deleted file mode 100644 index 509f712d84..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITextItemProperties.h +++ /dev/null @@ -1,120 +0,0 @@ -/************************************************************************ - filename: CEGUITextItemProperties.h - created: 8/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITextItemProperties_h_ -#define _CEGUITextItemProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of TextItemProperties namespace section -namespace TextItemProperties -{ - -/*! -\brief - Property to access the X offset of the text on the item. - - \par Usage: - - Name: TextXOffset - - Format: "[float]". - - \par Where: - - [float] represents the X offset of the text on the item. -*/ -class TextXOffset : public Property -{ -public: - TextXOffset() : Property( - "TextXOffset", - "Property to get/set the X offset of the text on the item. Value is a float.", - "0.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the text colour of the item. - - \par Usage: - - Name: TextColour - - Format: "[aarrggbb]". - - \par Where: - - [aarrggbb] represents the text colour of the item. -*/ -class TextColour : public Property -{ -public: - TextColour() : Property( - "TextColour", - "Property to get/set the text colour of the item. Value is a colour.", - "00FFFFFF") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the horizontal formatting mode setting. - - \par Usage: - - Name: TextFormatting - - Format: "[text]". - - \par Where [text] is one of: - - "LeftAligned" - - "RightAligned" - - "HorzCentred" - - "HorzJustified" - - "WordWrapLeftAligned" - - "WordWrapRightAligned" - - "WordWrapCentred" - - "WordWrapJustified" -*/ -class TextFormatting : public Property -{ -public: - TextFormatting() : Property( - "TextFormatting", - "Property to get/set the horizontal formatting mode. Value is one of the HorzFormatting strings.", - "LeftAligned") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of TextItemProperties namespace section -} // End of CEGUI namespace section - -#endif // end of guard _CEGUITextItemProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIThumb.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIThumb.h deleted file mode 100644 index 72e78cae3f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIThumb.h +++ /dev/null @@ -1,322 +0,0 @@ -/************************************************************************ - filename: CEGUIThumb.h - created: 25/4/2004 - author: Paul D Turner - - purpose: Interface for a 'Thumb' widget. Intended to be used as - part of other widgets such as scrollers and sliders. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIThumb_h_ -#define _CEGUIThumb_h_ - -#include "CEGUIPushButton.h" -#include "elements/CEGUIThumbProperties.h" -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Base class for Thumb widget. - - The thumb widget is used to compose other widgets (like sliders and scroll bars). You would - not normally need to use this widget directly unless you are making a new widget of some type. -*/ -class CEGUIEXPORT Thumb : public PushButton -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /************************************************************************* - Event name constants - *************************************************************************/ - // generated internally by Window - static const String EventThumbPositionChanged; //!< The position of the thumb widget has changed. - static const String EventThumbTrackStarted; //!< Name of the event fired when the user begins dragging the thumb. - static const String EventThumbTrackEnded; //!< Name of the event fired when the user releases the thumb. - - - /************************************************************************* - Accessor Functions - *************************************************************************/ - /*! - \brief - return whether hot-tracking is enabled or not. - - \return - true if hot-tracking is enabled. false if hot-tracking is disabled. - */ - bool isHotTracked(void) const {return d_hotTrack;} - - /*! - \brief - return whether the thumb is movable on the vertical axis. - - \return - true if the thumb is movable along the vertical axis. - false if the thumb is fixed on the vertical axis. - */ - bool isVertFree(void) const {return d_vertFree;} - - /*! - \brief - return whether the thumb is movable on the horizontal axis. - - \return - true if the thumb is movable along the horizontal axis. - false if the thumb is fixed on the horizontal axis. - */ - bool isHorzFree(void) const {return d_horzFree;} - - - /*! - \brief - Return a std::pair that describes the current range set for the vertical movement. - - \return - a std::pair describing the current vertical range. The first element is the minimum value, - the second element is the maximum value. - */ - std::pair getVertRange(void) const; - - - /*! - \brief - Return a std::pair that describes the current range set for the horizontal movement. - - \return - a std::pair describing the current horizontal range. The first element is the minimum value, - the second element is the maximum value. - */ - std::pair getHorzRange(void) const; - - - /************************************************************************* - Manipulator Functions - *************************************************************************/ - /*! - \brief - set whether the thumb uses hot-tracking. - - \param setting - true to enable hot-tracking. false to disable hot-tracking. - - \return - Nothing. - */ - void setHotTracked(bool setting) {d_hotTrack = setting;} - - - /*! - \brief - set whether thumb is movable on the vertical axis. - - \param setting - true to allow movement of thumb along the vertical axis. false to fix thumb on the vertical axis. - - \return - nothing. - */ - void setVertFree(bool setting) {d_vertFree = setting;} - - - /*! - \brief - set whether thumb is movable on the horizontal axis. - - \param setting - true to allow movement of thumb along the horizontal axis. false to fix thumb on the horizontal axis. - - \return - nothing. - */ - void setHorzFree(bool setting) {d_horzFree = setting;} - - - /*! - \brief - set the movement range of the thumb for the vertical axis. - - The values specified here are relative to the parent window for the thumb, and are specified in whichever - metrics mode is active for the widget. - - \param min - the minimum setting for the thumb on the vertical axis. - - \param max - the maximum setting for the thumb on the vertical axis. - - \return - Nothing. - */ - void setVertRange(float min, float max); - - - /*! - \brief - set the movement range of the thumb for the horizontal axis. - - The values specified here are relative to the parent window for the thumb, and are specified in whichever - metrics mode is active for the widget. - - \param min - the minimum setting for the thumb on the horizontal axis. - - \param max - the maximum setting for the thumb on the horizontal axis. - - \return - Nothing. - */ - void setHorzRange(float min, float max); - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for Thumb objects - */ - Thumb(const String& type, const String& name); - - - /*! - \brief - Destructor for Thumb objects - */ - virtual ~Thumb(void); - - -protected: - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Add thumb specific events - */ - void addThumbEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addThumbEvents(false); } - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Thumb") return true; - return PushButton::testClassName_impl(class_name); - } - - - /************************************************************************* - New Thumb Events - *************************************************************************/ - /*! - \brief - event triggered internally when the position of the thumb - */ - virtual void onThumbPositionChanged(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the user begins to drag the thumb. - */ - virtual void onThumbTrackStarted(WindowEventArgs& e); - - - /*! - \brief - Handler triggered when the thumb is released - */ - virtual void onThumbTrackEnded(WindowEventArgs& e); - - - - /************************************************************************* - Overridden event handling routines - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - // general settings - bool d_hotTrack; //!< true if events are to be sent real-time, else just when thumb is released - bool d_vertFree; //!< true if thumb is movable vertically - bool d_horzFree; //!< true if thumb is movable horizontally - - // operational limits - float d_vertMin, d_vertMax; //!< vertical range - float d_horzMin, d_horzMax; //!< horizontal range - - // internal state - bool d_beingDragged; //!< true if thumb is being dragged - Point d_dragPoint; //!< point where we are being dragged at. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static ThumbProperties::HotTracked d_hotTrackedProperty; - static ThumbProperties::VertFree d_vertFreeProperty; - static ThumbProperties::HorzFree d_horzFreeProperty; - static ThumbProperties::VertRange d_vertRangeProperty; - static ThumbProperties::HorzRange d_horzRangeProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addThumbProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addThumbProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIThumb_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUIThumbProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUIThumbProperties.h deleted file mode 100644 index 4ad92add95..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUIThumbProperties.h +++ /dev/null @@ -1,178 +0,0 @@ -/************************************************************************ - filename: CEGUIThumbProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface for Thumb properties -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIThumbProperties_h_ -#define _CEGUIThumbProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ThumbProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Thumb class -*/ -namespace ThumbProperties -{ -/*! -\brief - Property to access the state of the "hot-tracked" setting for the thumb. - - \par Usage: - - Name: HotTracked - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the thumb will send notifications as it is dragged. - - "False" to indicate the thumb will only notify once, when it is released. -*/ -class HotTracked : public Property -{ -public: - HotTracked() : Property( - "HotTracked", - "Property to get/set the state of the state of the 'hot-tracked' setting for the thumb. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the state the setting to free the thumb vertically. - - \par Usage: - - Name: VertFree - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the thumb will be free (movable) vertically. - - "False" to indicate the thumb will be fixed vertically. -*/ -class VertFree : public Property -{ -public: - VertFree() : Property( - "VertFree", - "Property to get/set the state the setting to free the thumb vertically. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the state the setting to free the thumb horizontally. - - \par Usage: - - Name: HorzFree - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate the thumb will be free (movable) horizontally. - - "False" to indicate the thumb will be fixed horizontally. -*/ -class HorzFree : public Property -{ -public: - HorzFree() : Property( - "HorzFree", - "Property to get/set the state the setting to free the thumb horizontally. Value is either \"True\" or \"False\".", - "False") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the vertical movement range for the thumb. - - \par Usage: - - Name: VertRange - - Format: "min:[float] max:[float]". - - \par Where: - - min:[float] specifies the minimum vertical setting (position) for the thumb, specified using the active metrics system for the window. - - max:[float] specifies the maximum vertical setting (position) for the thumb, specified using the active metrics system for the window. -*/ -class VertRange : public Property -{ -public: - VertRange() : Property( - "VertRange", - "Property to get/set the vertical movement range for the thumb. Value is \"min:[float] max:[float]\".", - "min:0.000000 max:1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to access the horizontal movement range for the thumb. - - \par Usage: - - Name: HorzRange - - Format: "min:[float] max:[float]". - - \par Where: - - min:[float] specifies the minimum horizontal setting (position) for the thumb, specified using the active metrics system for the window. - - max:[float] specifies the maximum horizontal setting (position) for the thumb, specified using the active metrics system for the window. -*/ -class HorzRange : public Property -{ -public: - HorzRange() : Property( - "HorzRange", - "Property to get/set the horizontal movement range for the thumb. Value is \"min:[float] max:[float]\".", - "min:0.000000 max:1.000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -} // End of ThumbProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIThumbProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebar.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebar.h deleted file mode 100644 index 9eed1a1b20..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebar.h +++ /dev/null @@ -1,195 +0,0 @@ -/************************************************************************ - filename: CEGUITitlebar.h - created: 25/4/2004 - author: Paul D Turner - - purpose: Interface for a Titlebar Widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITitlebar_h_ -#define _CEGUITitlebar_h_ - -#include "CEGUIWindow.h" -#include "elements/CEGUITitlebarProperties.h" - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Class representing the title bar for Frame Windows. - -*/ -class CEGUIEXPORT Titlebar : public Window -{ -public: - static const String EventNamespace; //!< Namespace for global events - - - /*! - \brief - Return whether this title bar will respond to dragging. - - \return - true if the title bar will respond to dragging, false if the title bar will not respond. - */ - bool isDraggingEnabled(void) const; - - - /*! - \brief - Set whether this title bar widget will respond to dragging. - - \param setting - true if the title bar should respond to being dragged, false if it should not respond. - - \return - Nothing. - */ - void setDraggingEnabled(bool setting); - - - /*! - \brief - Return the current colour used for rendering the caption text - - \return - colour value that specifies the colour used when rendering the title bar caption text. - */ - colour getCaptionColour(void) const; - - - /*! - \brief - Sets the colour to be used for rendering the caption text. - - \param col - colour value that specifies the colour to be used when rendering the title bar caption text. - - \return - Nothing. - */ - void setCaptionColour(const colour& col); - - - /************************************************************************* - Construction / Destruction - *************************************************************************/ - /*! - \brief - Constructor for Titlebar base class. - */ - Titlebar(const String& type, const String& name); - - - /*! - \brief - Destructor for Titlebar base class. - */ - virtual ~Titlebar(void); - - -protected: - /************************************************************************* - Overridden event handler functions - *************************************************************************/ - virtual void onMouseMove(MouseEventArgs& e); - virtual void onMouseButtonDown(MouseEventArgs& e); - virtual void onMouseButtonUp(MouseEventArgs& e); - virtual void onMouseDoubleClicked(MouseEventArgs& e); - virtual void onCaptureLost(WindowEventArgs& e); - virtual void onFontChanged(WindowEventArgs &e); - - - /************************************************************************* - New event handlers for title bar - *************************************************************************/ - /*! - \brief - Event handler called when the 'draggable' state for the title bar is changed. - - Note that this is for 'internal' use at the moment and as such does not add or - fire a public Event that can be subscribed to. - */ - virtual void onDraggingModeChanged(WindowEventArgs& e) {} - - - /************************************************************************* - Implementation Functions - *************************************************************************/ - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Titlebar") return true; - return Window::testClassName_impl(class_name); - } - - - /************************************************************************* - Implementation Data - *************************************************************************/ - bool d_dragging; //!< set to true when the window is being dragged. - Point d_dragPoint; //!< Point at which we are being dragged. - bool d_dragEnabled; //!< true when dragging for the widget is enabled. - - Rect d_oldCursorArea; //!< Used to backup cursor restraint area. - - colour d_captionColour; //!< Colour used when rendering the title caption. - - -private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static TitlebarProperties::DraggingEnabled d_dragEnabledProperty; - static TitlebarProperties::CaptionColour d_captionColourProperty; - - - /************************************************************************* - Private methods - *************************************************************************/ - void addTitlebarProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addTitlebarProperties(false); } -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUITitlebar_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebarProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebarProperties.h deleted file mode 100644 index 37f5306662..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITitlebarProperties.h +++ /dev/null @@ -1,98 +0,0 @@ -/************************************************************************ - filename: CEGUITitlebarProperties.h - created: 10/7/2004 - author: Paul D Turner - - purpose: Interface for title bar property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITitlebarProperties_h_ -#define _CEGUITitlebarProperties_h_ - -#include "CEGUIProperty.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of TitlebarProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Titlebar class -*/ -namespace TitlebarProperties -{ -/*! -\brief - Property to access the state of the dragging enabled setting for the Titlebar. - - \par Usage: - - Name: DraggingEnabled - - Format: "[text]". - - \par Where [Text] is: - - "True" to indicate that drag moving is enabled. - - "False" to indicate that drag moving is disabled. -*/ -class DraggingEnabled : public Property -{ -public: - DraggingEnabled() : Property( - "DraggingEnabled", - "Property to get/set the state of the dragging enabled setting for the Titlebar. Value is either \"True\" or \"False\".", - "True") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - - -/*! -\brief - Property to colour used for rendering the caption text. - - \par Usage: - - Name: CaptionColour - - Format: "aarrggbb". - - \par Where: - - aarrggbb is the ARGB colour value to be used. -*/ -class CaptionColour : public Property -{ -public: - CaptionColour() : Property( - "CaptionColour", - "Property to get/set the colour used for rendering the caption text. Value is \"aarrggbb\" (hex).", - "FF000000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); -}; - -} // End of TitlebarProperties namespace section - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUITitlebarProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITooltip.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITooltip.h deleted file mode 100644 index 7760d68c67..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITooltip.h +++ /dev/null @@ -1,363 +0,0 @@ -/************************************************************************ - filename: CEGUITooltip.h - created: 21/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITooltip_h_ -#define _CEGUITooltip_h_ - -#include "CEGUIWindow.h" -#include "elements/CEGUITooltipProperties.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Base class for Tooltip widgets. - - The Tooltip class shows a simple pop-up window around the mouse position - with some text information. The tool-tip fades in when the user hovers - with the mouse over a window which has tool-tip text set, and then fades - out after some pre-set time. - - \note - For Tooltip to work properly, you must specify a default tool-tip widget - type via System::setTooltip, or by setting a custom tool-tip object for - your Window(s). Additionally, you need to ensure that time pulses are - properly passed to the system via System::injectTimePulse. - */ - class CEGUIEXPORT Tooltip : public Window - { - public: - /************************************************************************* - Constants - *************************************************************************/ - static const String EventNamespace; //!< Namespace for global events - static const String EventHoverTimeChanged; //!< Event fired when the hover timeout gets changed. - static const String EventDisplayTimeChanged; //!< Event fired when the display timeout gets changed. - static const String EventFadeTimeChanged; //!< Event fired when the fade timeout gets changed. - static const String EventTooltipActive; //!< Event fired when the tooltip is about to get activated. - static const String EventTooltipInactive; //!< Event fired when the tooltip has been deactivated. - - /************************************************************************ - Object Construction and Destruction - ************************************************************************/ - /*! - \brief - Constructor for the Tooltip base class constructor - */ - Tooltip(const String& type, const String& name); - - /*! - \brief - Destructor for the Tooltip base class. - */ - ~Tooltip(void); - - /************************************************************************ - Public interface - ************************************************************************/ - /*! - \brief - Sets the target window for the tooltip. This used internally to manage tooltips, you - should not have to call this yourself. - - \param wnd - Window object that the tooltip should be associated with (for now). - - \return - Nothing. - */ - void setTargetWindow(Window* wnd); - - /*! - \brief - return the current target window for this Tooltip. - - \return - Pointer to the target window for this Tooltip or 0 for none. - */ - const Window* getTargetWindow(); - - /*! - \brief - Resets the timer on the tooltip when in the Active / Inactive states. This is used internally - to control the tooltip, it is not normally necessary to call this method yourself. - - \return - Nothing. - */ - void resetTimer(void); - - /*! - \brief - Return the number of seconds the mouse should hover stationary over the target window before - the tooltip gets activated. - - \return - float value representing a number of seconds. - */ - float getHoverTime(void) const; - - /*! - \brief - Set the number of seconds the tooltip should be displayed for before it automatically - de-activates itself. 0 indicates that the tooltip should never timesout and auto-deactivate. - - \param seconds - float value representing a number of seconds. - - \return - Nothing. - */ - void setDisplayTime(float seconds); - - /*! - \brief - Return the number of seconds that should be taken to fade the tooltip into and out of - visibility. - - \return - float value representing a number of seconds. - */ - float getFadeTime(void) const; - - /*! - \brief - Set the number of seconds the mouse should hover stationary over the target window before - the tooltip gets activated. - - \param seconds - float value representing a number of seconds. - - \return - Nothing. - */ - void setHoverTime(float seconds); - - /*! - \brief - Return the number of seconds the tooltip should be displayed for before it automatically - de-activates itself. 0 indicates that the tooltip never timesout and auto-deactivates. - - \return - float value representing a number of seconds. - */ - float getDisplayTime(void) const; - - /*! - \brief - Set the number of seconds that should be taken to fade the tooltip into and out of - visibility. - - \param seconds - float value representing a number of seconds. - - \return - Nothing. - */ - void setFadeTime(float seconds); - - // - /*! - \brief - Causes the tooltip to position itself appropriately. - - \return - Nothing. - */ - void positionSelf(void); - - protected: - /************************************************************************* - Implementation Methods - *************************************************************************/ - /*! - \brief - Add ScrollablePane specific events - */ - void addTooltipEvents(bool bCommon=true); - void addUncommonEvents( void ) { __super::addUncommonEvents(); addTooltipEvents(false); } - - // methods to perform processing for each of the widget states - void doActiveState(float elapsed); - void doInactiveState(float elapsed); - void doFadeInState(float elapsed); - void doFadeOutState(float elapsed); - - // methods to switch widget states - void switchToInactiveState(void); - void switchToActiveState(void); - void switchToFadeInState(void); - void switchToFadeOutState(void); - - - /*! - \brief - Return whether this window was inherited from the given class name at some point in the inheritance heirarchy. - - \param class_name - The class name that is to be checked. - - \return - true if this window was inherited from \a class_name. false if not. - */ - virtual bool testClassName_impl(const String& class_name) const - { - if (class_name==(const utf8*)"Tooltip") return true; - return Window::testClassName_impl(class_name); - } - - /*! - \brief - Return the size of the area that will be occupied by the tooltip text, given - any current formatting options. - - \return - Size object describing the size of the rendered tooltip text in pixels. - */ - virtual Size getTextSize() const; - - /************************************************************************* - Event triggers - *************************************************************************/ - /*! - \brief - Event trigger method called when the hover timeout gets changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onHoverTimeChanged(WindowEventArgs& e); - - /*! - \brief - Event trigger method called when the display timeout gets changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onDisplayTimeChanged(WindowEventArgs& e); - - /*! - \brief - Event trigger method called when the fade timeout gets changed. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onFadeTimeChanged(WindowEventArgs& e); - - /*! - \brief - Event trigger method called just before the tooltip becomes active. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onTooltipActive(WindowEventArgs& e); - - /*! - \brief - Event trigger method called just after the tooltip is deactivated. - - \param e - WindowEventArgs object. - - \return - Nothing. - */ - virtual void onTooltipInactive(WindowEventArgs& e); - - - /************************************************************************ - Overridden from Window. - ************************************************************************/ - void updateSelf(float elapsed); - void onMouseEnters(MouseEventArgs& e); - void onTextChanged(WindowEventArgs& e); - - /************************************************************************ - Enumerations - ************************************************************************/ - /*! - \brief - states for tooltip - */ - enum TipState - { - Inactive, //!< Tooltip is currently inactive. - Active, //!< Tooltip is currently displayed and active. - FadeIn, //!< Tooltip is currently transitioning from Inactive to Active state. - FadeOut //!< Tooltip is currently transitioning from Active to Inactive state. - }; - - /************************************************************************ - Data fields - ************************************************************************/ - TipState d_state; //!< Current tooltip state. - float d_elapsed; //!< Used to track state change timings - const Window* d_target; //!< Current target Window for this Tooltip. - float d_hoverTime; //!< tool-tip hover time (seconds mouse must stay stationary before tip shows). - float d_displayTime; //!< tool-tip display time (seconds that tip is showsn for). - float d_fadeTime; //!< tool-tip fade time (seconds it takes for tip to fade in and/or out). - - private: - /************************************************************************* - Static Properties for this class - *************************************************************************/ - static TooltipProperties::HoverTime d_hoverTimeProperty; - static TooltipProperties::DisplayTime d_displayTimeProperty; - static TooltipProperties::FadeTime d_fadeTimeProperty; - - /************************************************************************* - Private methods - *************************************************************************/ - void addTooltipProperties( bool bCommon = true ); - void addUncommonProperties( void ) { __super::addUncommonProperties(); addTooltipProperties(false); } - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUITooltip_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/CEGUITooltipProperties.h b/vendor/cegui-0.4.0-custom/include/elements/CEGUITooltipProperties.h deleted file mode 100644 index f25a107e77..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/CEGUITooltipProperties.h +++ /dev/null @@ -1,115 +0,0 @@ -/************************************************************************ - filename: CEGUITooltipProperties.h - created: 3/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUITooltipProperties_h_ -#define _CEGUITooltipProperties_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of TooltipProperties namespace section -/*! -\brief - Namespace containing all classes that make up the properties interface for the Tooltip class -*/ -namespace TooltipProperties -{ - /*! - \brief - Property to access the timout that must expire before the tooltip gets activated. - - \par Usage: - - Name: HoverTime - - Format: "[float]". - - \par Where: - - [float] specifies the number of seconds the mouse must hover stationary on a widget before the tooltip gets activated. - */ - class HoverTime : public Property - { - public: - HoverTime() : Property( - "HoverTime", - "Property to get/set the hover timeout value in seconds. Value is a float.", - "0.400000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the time after which the tooltip automatically de-activates itself. - - \par Usage: - - Name: DisplayTime - - Format: "[float]". - - \par Where: - - [float] specifies the number of seconds after which the tooltip will deactivate itself if the mouse has remained stationary. - */ - class DisplayTime : public Property - { - public: - DisplayTime() : Property( - "DisplayTime", - "Property to get/set the display timeout value in seconds. Value is a float.", - "7.500000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - - /*! - \brief - Property to access the duration of the fade effect for the tooltip. - - \par Usage: - - Name: FadeTime - - Format: "[float]". - - \par Where: - - [float] specifies the number of seconds over which the fade in / fade out effect will happen. - */ - class FadeTime : public Property - { - public: - FadeTime() : Property( - "FadeTime", - "Property to get/set duration of the fade effect in seconds. Value is a float.", - "0.330000") - {} - - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - }; - -} // End of TooltipProperties namespace section -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUITooltipProperties_h_ diff --git a/vendor/cegui-0.4.0-custom/include/elements/Makefile.am b/vendor/cegui-0.4.0-custom/include/elements/Makefile.am deleted file mode 100644 index 782e6d5586..0000000000 --- a/vendor/cegui-0.4.0-custom/include/elements/Makefile.am +++ /dev/null @@ -1,73 +0,0 @@ -pkgincludedir=$(prefix)/include/CEGUI/elements -pkginclude_HEADERS = CEGUIButtonBase.h \ - CEGUIButtonBaseProperties.h \ - CEGUICheckbox.h \ - CEGUICheckboxProperties.h \ - CEGUIComboDropList.h \ - CEGUICombobox.h \ - CEGUIComboboxProperties.h \ - CEGUIDragContainer.h \ - CEGUIDragContainerProperties.h \ - CEGUIEditbox.h \ - CEGUIEditboxProperties.h \ - CEGUIFrameWindow.h \ - CEGUIFrameWindowProperties.h \ - CEGUIGUISheet.h \ - CEGUIItemEntry.h \ - CEGUIItemListBase.h \ - CEGUIItemListBaseProperties.h \ - CEGUIListHeader.h \ - CEGUIListHeaderProperties.h \ - CEGUIListbox.h \ - CEGUIListboxItem.h \ - CEGUIListboxProperties.h \ - CEGUIListboxTextItem.h \ - CEGUIListHeader.h \ - CEGUIListHeaderProperties.h \ - CEGUIListHeaderSegment.h \ - CEGUIListHeaderSegmentProperties.h \ - CEGUIMenubar.h \ - CEGUIMenuBase.h \ - CEGUIMenuBaseProperties.h \ - CEGUIMenuItem.h \ - CEGUIMenuItemProperties.h \ - CEGUIMultiColumnList.h \ - CEGUIMultiColumnListProperties.h \ - CEGUIMultiLineEditbox.h \ - CEGUIMultiLineEditboxProperties.h \ - CEGUIPopupMenu.h \ - CEGUIPopupMenuProperties.h \ - CEGUIProgressBar.h \ - CEGUIProgressBarProperties.h \ - CEGUIPushButton.h \ - CEGUIPushButtonProperties.h \ - CEGUIRadioButton.h \ - CEGUIRadioButtonProperties.h \ - CEGUIScrollablePane.h \ - CEGUIScrollablePaneProperties.h \ - CEGUIScrollbar.h \ - CEGUIScrollbarProperties.h \ - CEGUIScrolledContainer.h \ - CEGUIScrolledContainerProperties.h \ - CEGUISlider.h \ - CEGUISliderProperties.h \ - CEGUISpinner.h \ - CEGUISpinnerProperties.h \ - CEGUIStatic.h \ - CEGUIStaticImage.h \ - CEGUIStaticImageProperties.h \ - CEGUIStaticProperties.h \ - CEGUIStaticText.h \ - CEGUIStaticTextProperties.h \ - CEGUITabButton.h \ - CEGUITabControl.h \ - CEGUITabControlProperties.h \ - CEGUITabPane.h \ - CEGUITextItem.h \ - CEGUITextItemProperties.h \ - CEGUIThumb.h \ - CEGUIThumbProperties.h \ - CEGUITitlebar.h \ - CEGUITitlebarProperties.h \ - CEGUITooltip.h \ - CEGUITooltipProperties.h diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalComponentBase.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalComponentBase.h deleted file mode 100644 index 05b3465ad2..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalComponentBase.h +++ /dev/null @@ -1,252 +0,0 @@ -/************************************************************************ - filename: CEGUIFalComponentBase.h - created: Mon Jul 18 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalComponentBase_h_ -#define _CEGUIFalComponentBase_h_ - -#include "falagard/CEGUIFalDimensions.h" -#include "CEGUIWindow.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Common base class used for renderable components within an ImagerySection. - */ - class CEGUIEXPORT FalagardComponentBase - { - public: - /*! - \brief - Constructor - */ - FalagardComponentBase(); - - /*! - \brief - Destructor - */ - virtual ~FalagardComponentBase(); - - /*! - \brief - Render this component. More correctly, the component is cached for rendering. - - \param srcWindow - Window to use as the base for translating the component's ComponentArea into pixel values. - - \param base_z - The z value to use for rendering the component. Note that this is not the final z value to use, but - some z offset from a currently unknown starting value. - - \param modColours - ColourRect describing colours that are to be modulated with the component's stored colour values - to calculate a set of 'final' colour values to be used. May be 0. - - \return - Nothing. - */ - void render(Window& srcWindow, float base_z, const CEGUI::ColourRect* modColours = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Render this component. More correctly, the component is cached for rendering. - - \param srcWindow - Window to use as the base for translating the component's ComponentArea into pixel values. - - \param baseRect - Rect to use as the base for translating the component's ComponentArea into pixel values. - - \param base_z - The z value to use for rendering the component. Note that this is not the final z value to use, but - some z offset from a currently unknown starting value. - - \param modColours - ColourRect describing colours that are to be modulated with the component's stored colour values - to calculate a set of 'final' colour values to be used. May be 0. - - \return - Nothing. - */ - void render(Window& srcWindow, const Rect& baseRect, float base_z, const CEGUI::ColourRect* modColours = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Return the ComponentArea of this ImageryComponent. - - \return - ComponentArea object describing the ImageryComponent's current target area. - */ - const ComponentArea& getComponentArea() const; - - /*! - \brief - Set the ImageryComponent's ComponentArea. - - \param area - ComponentArea object describing a new target area for the ImageryComponent. - - \return - Nothing. - */ - void setComponentArea(const ComponentArea& area); - - /*! - \brief - Return the ColourRect set for use by this ImageryComponent. - - \return - ColourRect object holding the colours currently in use by this ImageryComponent. - */ - const ColourRect& getColours() const; - - /*! - \brief - Set the colours to be used by this ImageryComponent. - - \param cols - ColourRect object describing the colours to be used by this ImageryComponent. - */ - void setColours(const ColourRect& cols); - - /*! - \brief - Set the name of the property where colour values can be obtained. - - \param property - String containing the name of the property. - - \return - Nothing. - */ - void setColoursPropertySource(const String& property); - - /*! - \brief - Set whether the colours property source represents a full ColourRect. - - \param setting - - true if the colours property will access a ColourRect object. - - false if the colours property will access a colour object. - - \return - Nothing. - */ - void setColoursPropertyIsColourRect(bool setting = true); - - /*! - \brief - Set the name of the property where vertical formatting option can be obtained. - - \param property - String containing the name of the property. - - \return - Nothing. - */ - void setVertFormattingPropertySource(const String& property); - - /*! - \brief - Set the name of the property where horizontal formatting option can be obtained. - - \param property - String containing the name of the property. - - \return - Nothing. - */ - void setHorzFormattingPropertySource(const String& property); - - protected: - /*! - \brief - Helper method to initialise a ColourRect with appropriate values according to the way the - ImageryComponent is set up. - - This will try and get values from multiple places: - - a property attached to \a wnd - - or the integral d_colours value. - */ - void initColoursRect(const Window& wnd, const ColourRect* modCols, ColourRect& cr) const; - - /*! - \brief - Method to do main render caching work. - */ - virtual void render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const = 0; - - /*! - \brief - Writes xml for the colours to a OutStream. Will prefer property colours before explicit. - - \note - This is intended as a helper method for sub-classes when outputting xml to a stream. - - \return - - true if xml element was written. - - false if nothing was output due to the formatting not being set (sub-class may then choose to do something else.) - */ - bool writeColoursXML(OutStream& out_stream) const; - - /*! - \brief - Writes xml for the vertical formatting to a OutStream if such a property is defined. - - \note - This is intended as a helper method for sub-classes when outputting xml to a stream. - - \return - - true if xml element was written. - - false if nothing was output due to the formatting not being set (sub-class may then choose to do something else.) - */ - bool writeVertFormatXML(OutStream& out_stream) const; - - /*! - \brief - Writes xml for the horizontal formatting to a OutStream if such a property is defined. - - \note - This is intended as a helper method for sub-classes when outputting xml to a stream. - - \return - - true if xml element was written. - - false if nothing was output due to the formatting not being set (sub-class may then choose to do something else.) - */ - bool writeHorzFormatXML(OutStream& out_stream) const; - - - // data fields - ComponentArea d_area; //!< Destination area for this component. - ColourRect d_colours; //!< base colours to be applied when rendering the image component. - String d_colourPropertyName; //!< name of property to fetch colours from. - bool d_colourProperyIsRect; //!< true if the colour property will fetch a full ColourRect. - String d_vertFormatPropertyName; //!< name of property to fetch vertical formatting setting from. - String d_horzFormatPropertyName; //!< name of property to fetch horizontal formatting setting from. - }; -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalComponentBase_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalDimensions.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalDimensions.h deleted file mode 100644 index aa2309f8b4..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalDimensions.h +++ /dev/null @@ -1,677 +0,0 @@ -/************************************************************************ - filename: CEGUIFalDimensions.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalDimensions_h_ -#define _CEGUIFalDimensions_h_ - -#include "falagard/CEGUIFalEnums.h" -#include "CEGUIString.h" -#include "CEGUIUDim.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Abstract interface for a generic 'dimension' class. - */ - class CEGUIEXPORT BaseDim - { - public: - BaseDim(); - - virtual ~BaseDim(); - - /*! - \brief - Return a value that represents this dimension as absolute pixels. - - \param wnd - Window object that may be used by the specialised class to aid in - calculating the final value. - - \return - float value which represents, in pixels, the same value as this BaseDim. - */ - float getValue(const Window& wnd) const; - - /*! - \brief - Return a value that represents this dimension as absolute pixels. - - \param wnd - Window object that may be used by the specialised class to aid in - calculating the final value (typically would be used to obtain - window/widget dimensions). - - \param container - Rect object which describes an area to be considered as the base area - when calculating the final value. Basically this means that relative values - are calculated from the dimensions of this Rect. - - \return - float value which represents, in pixels, the same value as this BaseDim. - */ - float getValue(const Window& wnd, const Rect& container) const; - - /*! - \brief - Create an exact copy of the specialised class and return it as a pointer to - a BaseDim object. - - Since the system needs to be able to copy objects derived from BaseDim, but only - has knowledge of the BaseDim interface, this clone method is provided to prevent - slicing issues. - - \return - BaseDim object pointer - */ - BaseDim* clone() const; - - /*! - \brief - Return the DimensionOperator set for this BaseDim based object. - - \return - One of the DimensionOperator enumerated values representing a mathematical operation to be - performed upon this BaseDim using the set operand. - */ - DimensionOperator getDimensionOperator() const; - - /*! - \brief - Set the DimensionOperator set for this BaseDim based object. - - \param op - One of the DimensionOperator enumerated values representing a mathematical operation to be - performed upon this BaseDim using the set operand. - - \return - Nothing. - */ - void setDimensionOperator(DimensionOperator op); - - /*! - \brief - Return a pointer to the BaseDim set to be used as the other operand. - - \return - Pointer to the BaseDim object. - */ - const BaseDim* getOperand() const; - - /*! - \brief - Set the BaseDim set to be used as the other operand in calculations for this BaseDim. - - \param operand - sub-class of BaseDim representing the 'other' operand. The given object will be cloned; no - transfer of ownership occurrs for the passed object. - - \return - Nothing. - */ - void setOperand(const BaseDim& operand); - - /*! - \brief - Writes an xml representation of this BaseDim to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - protected: - /*! - \brief - Implementataion method to return the base value for this BaseDim. This method should - not attempt to apply the mathematical operator; this is handled automatically. - */ - virtual float getValue_impl(const Window& wnd) const = 0; - - /*! - \brief - Implementataion method to return the base value for this BaseDim. This method should - not attempt to apply the mathematical operator; this is handled automatically by BaseDim. - */ - virtual float getValue_impl(const Window& wnd, const Rect& container) const = 0; - - /*! - \brief - Implementataion method to return a clone of this sub-class of BaseDim. - This method should not attempt to clone the mathematical operator or operand; theis is - handled automatically by BaseDim. - */ - virtual BaseDim* clone_impl() const = 0; - - /*! - \brief - Implementataion method to output real xml element name to an OutStream. - This method should not write the element opening '<' character, nor close the element, it - must write just the element name itself. - */ - virtual void writeXMLElementName_impl(OutStream& out_stream) const = 0; - - /*! - \brief - Implementataion method to output xml element attributes to an OutStream. - This method should not write the element opening '<' character, nor close the element, it - must write just the element attributes. - */ - virtual void writeXMLElementAttributes_impl(OutStream& out_stream) const = 0; - - private: - DimensionOperator d_operator; - BaseDim* d_operand; - }; - - - /*! - \brief - Dimension type that represents an absolute pixel value. Implements BaseDim interface. - */ - class CEGUIEXPORT AbsoluteDim : public BaseDim - { - public: - /*! - \brief - Constructor. - - \param val - float value to be assigned to the AbsoluteDim. - */ - AbsoluteDim(float val); - - /*! - \brief - Set the current value of the AbsoluteDim. - */ - void setValue(float val); - - protected: - // Implementation of the base class interface - float getValue_impl(const Window& wnd) const; - float getValue_impl(const Window& wnd, const Rect& container) const; - void writeXMLElementName_impl(OutStream& out_stream) const; - void writeXMLElementAttributes_impl(OutStream& out_stream) const; - - BaseDim* clone_impl() const; - - private: - float d_val; //!< holds pixel value for the AbsoluteDim. - }; - - - /*! - \brief - Dimension type that represents some dimension of a named Image. Implements BaseDim interface. - */ - class CEGUIEXPORT ImageDim : public BaseDim - { - public: - /*! - \brief - Constructor. - - \param imageset - String object holding the name of the imagseset which contains the image. - - \param image - String object holding the name of the image. - - \param dim - DimensionType value indicating which dimension of the described image that this ImageDim - is to represent. - */ - ImageDim(const String& imageset, const String& image, DimensionType dim); - - /*! - \brief - Sets the source image information for this ImageDim. - - \param imageset - String object holding the name of the imagseset which contains the image. - - \param image - String object holding the name of the image. - - \return - Nothing. - */ - void setSourceImage(const String& imageset, const String& image); - - /*! - \brief - Sets the source dimension type for this ImageDim. - - \param dim - DimensionType value indicating which dimension of the described image that this ImageDim - is to represent. - - \return - Nothing. - */ - void setSourceDimension(DimensionType dim); - - protected: - // Implementation of the base class interface - float getValue_impl(const Window& wnd) const; - float getValue_impl(const Window& wnd, const Rect& container) const; - void writeXMLElementName_impl(OutStream& out_stream) const; - void writeXMLElementAttributes_impl(OutStream& out_stream) const; - BaseDim* clone_impl() const; - - private: - String d_imageset; //!< name of the Imageset containing the image. - String d_image; //!< name of the Image. - DimensionType d_what; //!< the dimension of the image that we are to represent. - }; - - - /*! - \brief - Dimension type that represents some dimension of a Window/widget. Implements BaseDim interface. - - When calculating the final pixel value for the dimension, a target widget name is built by - appending the name suffix specified for the WidgetDim to the name of the window passed to - getValue, we then find the window/widget with that name - the final value of the dimension - is taken from this window/widget. - */ - class CEGUIEXPORT WidgetDim : public BaseDim - { - public: - /*! - \brief - Constructor. - - \param name - String object holding the name suffix for a window/widget. - - \param dim - DimensionType value indicating which dimension of the described image that this ImageDim - is to represent. - */ - WidgetDim(const String& name, DimensionType dim); - - /*! - \brief - Set the name suffix to use for this WidgetDim. - - \param name - String object holding the name suffix for a window/widget. - - \return - Nothing. - */ - void setWidgetName(const String& name); - - /*! - \brief - Sets the source dimension type for this WidgetDim. - - \param dim - DimensionType value indicating which dimension of the described image that this WidgetDim - is to represent. - - \return - Nothing. - */ - void setSourceDimension(DimensionType dim); - - protected: - // Implementation of the base class interface - float getValue_impl(const Window& wnd) const; - float getValue_impl(const Window& wnd, const Rect& container) const; - void writeXMLElementName_impl(OutStream& out_stream) const; - void writeXMLElementAttributes_impl(OutStream& out_stream) const; - BaseDim* clone_impl() const; - - private: - String d_widgetName; //!< Holds target window name suffix. - DimensionType d_what; //!< the dimension of the target window that we are to represent. - }; - - - /*! - \brief - Dimension type that represents an Unified dimension. Implements BaseDim interface. - */ - class CEGUIEXPORT UnifiedDim : public BaseDim - { - public: - /*! - \brief - Constructor. - - \param value - UDim holding the value to assign to this UnifiedDim. - - \param dim - DimensionType value indicating what this UnifiedDim is to represent. This is required - because we need to know what part of the base Window that the UDim scale component is - to operate against. - */ - UnifiedDim(const UDim& value, DimensionType dim); - - protected: - // Implementation of the base class interface - float getValue_impl(const Window& wnd) const; - float getValue_impl(const Window& wnd, const Rect& container) const; - void writeXMLElementName_impl(OutStream& out_stream) const; - void writeXMLElementAttributes_impl(OutStream& out_stream) const; - BaseDim* clone_impl() const; - - private: - UDim d_value; //!< The UDim value. - DimensionType d_what; //!< what we represent. - }; - - /*! - \brief - Dimension type that represents some metric of a Font. Implements BaseDim interface. - */ - class CEGUIEXPORT FontDim : public BaseDim - { - public: - /*! - \brief - Constructor. - - \param name - String holding the name suffix of the window to be accessed to obtain the font - and / or text strings to be used when these items are not explicitly given. - - \param font - String holding the name of the font to use for this dimension. If the string is - empty, the font assigned to the window passed to getValue will be used. - - \param text - String holding the text to be measured for horizontal extent. If this is empty, - the text from the window passed to getValue will be used. - - \param metric - One of the FontMetricType values indicating what we should represent. - - \param padding - constant pixel padding value to be added. - */ - FontDim(const String& name, const String& font, const String& text, FontMetricType metric, float padding = 0); - - protected: - // Implementation of the base class interface - float getValue_impl(const Window& wnd) const; - float getValue_impl(const Window& wnd, const Rect& container) const; - void writeXMLElementName_impl(OutStream& out_stream) const; - void writeXMLElementAttributes_impl(OutStream& out_stream) const; - BaseDim* clone_impl() const; - - private: - String d_font; //!< Name of Font. If empty font will be taken from Window. - String d_text; //!< String to measure for extents, if empty will use window text. - String d_childSuffix; //!< String to hold the name suffix of the window to use for fetching missing font and/or text. - FontMetricType d_metric; //!< what metric we represent. - float d_padding; //!< padding value to be added. - }; - - /*! - \brief - Dimension type that represents the value of a Window property. Implements BaseDim interface. - */ - class CEGUIEXPORT PropertyDim : public BaseDim - { - public: - /*! - \brief - Constructor. - - \param name - String holding the name suffix of the window on which the property is to be accessed. - - \param property - String object holding the name of the property this PropertyDim represents the value of. - The property named should represent a simple float value. - */ - PropertyDim(const String& name, const String& property); - - protected: - // Implementation of the base class interface - float getValue_impl(const Window& wnd) const; - float getValue_impl(const Window& wnd, const Rect& container) const; - void writeXMLElementName_impl(OutStream& out_stream) const; - void writeXMLElementAttributes_impl(OutStream& out_stream) const; - BaseDim* clone_impl() const; - - private: - String d_property; //!< Propery that this object represents. - String d_childSuffix; //!< String to hold the name suffix of the child to access the property form. - }; - - /*! - \brief - Class representing some kind of dimension. - - The key thing to understand about Dimension is that it contains not just a dimensional value, - but also a record of what the dimension value is supposed to represent. (e.g. a co-ordinate on - the x axis, or the height of something). - */ - class CEGUIEXPORT Dimension - { - public: - /*! - \brief - Constructor - */ - Dimension(); - - /*! - \brief - Destructor - */ - ~Dimension(); - - /*! - \brief - Constructor - - \param dim - object based on subclass of BaseDim which holds the dimensional value. - - \param type - DimensionType value indicating what dimension this object is to represent. - */ - Dimension(const BaseDim& dim, DimensionType type); - - /*! - \brief - Copy constructor - */ - Dimension(const Dimension& other); - - /*! - \brief - Assignment operator - */ - Dimension& operator=(const Dimension& other); - - /*! - \brief - return the BaseDim object currently used as the value for this Dimension. - - \return - const reference to the BaseDim sub-class object which contains the value for this Dimension. - */ - const BaseDim& getBaseDimension() const; - - /*! - \brief - set the current value for this Dimension. - - \param dim - object based on a subclass of BaseDim which holds the dimensional value. - - \return - Nothing. - */ - void setBaseDimension(const BaseDim& dim); - - /*! - \brief - Return a DimensionType value indicating what this Dimension represents. - - \return - one of the DimensionType enumerated values. - */ - DimensionType getDimensionType() const; - - /*! - \brief - Sets what this Dimension represents. - - \param type - one of the DimensionType enumerated values. - - \return - Nothing. - */ - void setDimensionType(DimensionType type); - - /*! - \brief - Writes an xml representation of this Dimension to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - private: - BaseDim* d_value; //!< Pointer to the value for this Dimension. - DimensionType d_type; //!< What we represent. - }; - - - /*! - \brief - Class that represents a target area for a widget or imagery component. - - This is essentially a Rect built out of Dimension objects. Of note is that - what would normally be the 'right' and 'bottom' edges may alternatively - represent width and height depending upon what the assigned Dimension(s) - represent. - */ - class CEGUIEXPORT ComponentArea - { - public: - /*! - \brief - Return a Rect describing the absolute pixel area represented by this ComponentArea. - - \param wnd - Window object to be used when calculating final pixel area. - - \return - Rect object describing the pixels area represented by this ComponentArea when using \a wnd - as a reference for calculating the final pixel dimensions. - */ - Rect getPixelRect(const Window& wnd) const; - - /*! - \brief - Return a Rect describing the absolute pixel area represented by this ComponentArea. - - \param wnd - Window object to be used when calculating final pixel area. - - \param container - Rect object to be used as a base or container when converting relative dimensions. - - \return - Rect object describing the pixels area represented by this ComponentArea when using \a wnd - and \a container as a reference for calculating the final pixel dimensions. - */ - Rect getPixelRect(const Window& wnd, const Rect& container) const; - - /*! - \brief - Writes an xml representation of this ComponentArea to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - /*! - \brief - Return whether this ComponentArea fetches it's area via a property on the target window. - - \return - - true if the area comes via a Propery. - - false if the area is defined explicitly via the Dimension fields. - */ - bool isAreaFetchedFromProperty() const; - - /*! - \brief - Return the name of the property that will be used to determine the pixel area for this ComponentArea. - - \return - String object holding the name of a Propery. - */ - const String& getAreaPropertySource() const; - - /*! - \brief - Set the name of the property that will be used to determine the pixel area for this ComponentArea. - - \param property - String object holding the name of a Propery. The property should access a URect type property. - - \return - Nothing. - */ - void setAreaPropertySource(const String& property); - - - Dimension d_left; //!< Left edge of the area. - Dimension d_top; //!< Top edge of the area. - Dimension d_right_or_width; //!< Either the right edge or the width of the area. - Dimension d_bottom_or_height; //!< Either the bototm edge or the height of the area. - - private: - String d_areaProperty; //!< Property to access. Must be a URect style property. - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalDimensions_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalEnums.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalEnums.h deleted file mode 100644 index 07804af2fa..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalEnums.h +++ /dev/null @@ -1,147 +0,0 @@ -/************************************************************************ - filename: CEGUIFalEnums.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalEnums_h_ -#define _CEGUIFalEnums_h_ - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Enumeration of possible values to indicate what a given dimension represents. - */ - enum DimensionType - { - DT_LEFT_EDGE, //!< Dimension represents the left edge of some entity (same as DT_X_POSITION). - DT_X_POSITION, //!< Dimension represents the x position of some entity (same as DT_LEFT_EDGE). - DT_TOP_EDGE, //!< Dimension represents the top edge of some entity (same as DT_Y_POSITION). - DT_Y_POSITION, //!< Dimension represents the y position of some entity (same as DT_TOP_EDGE). - DT_RIGHT_EDGE, //!< Dimension represents the right edge of some entity. - DT_BOTTOM_EDGE, //!< Dimension represents the bottom edge of some entity. - DT_WIDTH, //!< Dimension represents the width of some entity. - DT_HEIGHT, //!< Dimension represents the height of some entity. - DT_X_OFFSET, //!< Dimension represents the x offset of some entity (usually only applies to an Image entity). - DT_Y_OFFSET, //!< Dimension represents the y offset of some entity (usually only applies to an Image entity). - DT_INVALID //!< Invalid / uninitialised DimensionType. - }; - - /*! - \brief - Enumeration of possible values to indicate the vertical formatting to be used for an image component. - */ - enum VerticalFormatting - { - VF_TOP_ALIGNED, //!< Top of Image should be aligned with the top of the destination area. - VF_CENTRE_ALIGNED, //!< Image should be vertically centred within the destination area. - VF_BOTTOM_ALIGNED, //!< Bottom of Image should be aligned with the bottom of the destination area. - VF_STRETCHED, //!< Image should be stretched vertically to fill the destination area. - VF_TILED //!< Image should be tiled vertically to fill the destination area (bottom-most tile may be clipped). - }; - - /*! - \brief - Enumeration of possible values to indicate the horizontal formatting to be used for an image component. - */ - enum HorizontalFormatting - { - HF_LEFT_ALIGNED, //!< Left of Image should be aligned with the left of the destination area. - HF_CENTRE_ALIGNED, //!< Image should be horizontally centred within the destination area. - HF_RIGHT_ALIGNED, //!< Right of Image should be aligned with the right of the destination area. - HF_STRETCHED, //!< Image should be stretched horizontally to fill the destination area. - HF_TILED //!< Image should be tiled horizontally to fill the destination area (right-most tile may be clipped). - }; - - /*! - \brief - Enumeration of possible values to indicate the vertical formatting to be used for a text component. - */ - enum VerticalTextFormatting - { - VTF_TOP_ALIGNED, //!< Top of text should be aligned with the top of the destination area. - VTF_CENTRE_ALIGNED, //!< text should be vertically centred within the destination area. - VTF_BOTTOM_ALIGNED //!< Bottom of text should be aligned with the bottom of the destination area. - }; - - /*! - \brief - Enumeration of possible values to indicate the horizontal formatting to be used for a text component. - */ - enum HorizontalTextFormatting - { - HTF_LEFT_ALIGNED, //!< Left of text should be aligned with the left of the destination area (single line of text only). - HTF_RIGHT_ALIGNED, //!< Right of text should be aligned with the right of the destination area (single line of text only). - HTF_CENTRE_ALIGNED, //!< text should be horizontally centred within the destination area (single line of text only). - HTF_JUSTIFIED, //!< text should be spaced so that it takes the full width of the destination area (single line of text only). - HTF_WORDWRAP_LEFT_ALIGNED, //!< Left of text should be aligned with the left of the destination area (word wrapped to multiple lines as needed). - HTF_WORDWRAP_RIGHT_ALIGNED, //!< Right of text should be aligned with the right of the destination area (word wrapped to multiple lines as needed). - HTF_WORDWRAP_CENTRE_ALIGNED, //!< text should be horizontally centred within the destination area (word wrapped to multiple lines as needed). - HTF_WORDWRAP_JUSTIFIED //!< text should be spaced so that it takes the full width of the destination area (word wrapped to multiple lines as needed). - }; - - /*! - \brief - Enumeration of possible values to indicate a particular font metric. - */ - enum FontMetricType - { - FMT_LINE_SPACING, //!< Vertical line spacing value for font. - FMT_BASELINE, //!< Vertical baseline value for font. - FMT_HORZ_EXTENT //!< Horizontal extent of a string. - }; - - /*! - \brief - Enumeration of values representing mathematical operations on dimensions. - */ - enum DimensionOperator - { - DOP_NOOP, //!< Do nothing operator. - DOP_ADD, //!< Dims should be added. - DOP_SUBTRACT, //!< Dims should be subtracted. - DOP_MULTIPLY, //!< Dims should be multiplied. - DOP_DIVIDE //!< Dims should be divided. - }; - - /*! - \brief - Enumeration of values referencing available images forming a frame component. - */ - enum FrameImageComponent - { - FIC_BACKGROUND, //!< References image used for the background. - FIC_TOP_LEFT_CORNER, //!< References image used for the top-left corner. - FIC_TOP_RIGHT_CORNER, //!< References image used for the top-right corner. - FIC_BOTTOM_LEFT_CORNER, //!< References image used for the bottom-left corner. - FIC_BOTTOM_RIGHT_CORNER, //!< References image used for the bottom-right corner. - FIC_LEFT_EDGE, //!< References image used for the left edge. - FIC_RIGHT_EDGE, //!< References image used for the right edge. - FIC_TOP_EDGE, //!< References image used for the top edge. - FIC_BOTTOM_EDGE, //!< References image used for the bottom edge. - FIC_FRAME_IMAGE_COUNT //!< Max number of images for a frame. - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalEnums_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalFrameComponent.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalFrameComponent.h deleted file mode 100644 index d914c31769..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalFrameComponent.h +++ /dev/null @@ -1,165 +0,0 @@ -/************************************************************************ - filename: CEGUIFalFrameComponent.h - created: Mon Jul 18 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalFrameComponent_h_ -#define _CEGUIFalFrameComponent_h_ - -#include "falagard/CEGUIFalComponentBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates information for a frame with background (9 images in total) - - Corner images are always drawn at their natural size, edges are stretched between the corner - pieces for a particular edge, the background image will cover the inner rectangle formed by - the edge images and can be stretched or tiled in either dimension. - */ - class CEGUIEXPORT FrameComponent : public FalagardComponentBase - { - public: - /*! - \brief - Constructor - */ - FrameComponent(); - - /*! - \brief - Return the current vertical formatting setting for this FrameComponent. - - \return - One of the VerticalFormatting enumerated values. - */ - VerticalFormatting getBackgroundVerticalFormatting() const; - - /*! - \brief - Set the vertical formatting setting for this FrameComponent. - - \param fmt - One of the VerticalFormatting enumerated values. - - \return - Nothing. - */ - void setBackgroundVerticalFormatting(VerticalFormatting fmt); - - /*! - \brief - Return the current horizontal formatting setting for this FrameComponent. - - \return - One of the HorizontalFormatting enumerated values. - */ - HorizontalFormatting getBackgroundHorizontalFormatting() const; - - /*! - \brief - Set the horizontal formatting setting for this FrameComponent. - - \param fmt - One of the HorizontalFormatting enumerated values. - - \return - Nothing. - */ - void setBackgroundHorizontalFormatting(HorizontalFormatting fmt); - - /*! - \brief - Return the Image object that will be drawn by this FrameComponent for a specified frame part. - - \param part - One of the FrameImageComponent enumerated values specifying the component image to be accessed. - - \return - Image object. - */ - const Image* getImage(FrameImageComponent part) const; - - /*! - \brief - Set the Image that will be drawn by this ImageryComponent. - - \param part - One of the FrameImageComponent enumerated values specifying the component image to be accessed. - - \param image - Pointer to the Image object to be drawn by this FrameComponent. - - \return - Nothing. - */ - void setImage(FrameImageComponent part, const Image* image); - - /*! - \brief - Set the Image that will be drawn by this FrameComponent. - - \param part - One of the FrameImageComponent enumerated values specifying the component image to be accessed. - - \param imageset - String holding the name of the Imagset that contains the Image to be rendered. - - \param image - String holding the name of the Image to be rendered. - - \return - Nothing. - */ - void setImage(FrameImageComponent part, const String& imageset, const String& image); - - /*! - \brief - Writes an xml representation of this FrameComponent to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - protected: - // implemets abstract from base - void render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const; - - // renders the background image (basically a clone of render_impl from ImageryComponent - maybe we need a helper class?) - void doBackgroundRender(Window& srcWindow, Rect& destRect, float base_z, const ColourRect& colours, const Rect* clipper, bool clipToDisplay) const; - - // formatting options for background - VerticalFormatting d_vertFormatting; //!< Vertical formatting to be applied when rendering the background for the component. - HorizontalFormatting d_horzFormatting; //!< Horizontal formatting to be applied when rendering the background for the component. - // images for the frame - const Image* d_frameImages[FIC_FRAME_IMAGE_COUNT]; //!< Array that holds the assigned images. - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalFrameComponent_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImageryComponent.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImageryComponent.h deleted file mode 100644 index 75098fa606..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImageryComponent.h +++ /dev/null @@ -1,179 +0,0 @@ -/************************************************************************ - filename: CEGUIFalImageryComponent.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalImageryComponent_h_ -#define _CEGUIFalImageryComponent_h_ - -#include "falagard/CEGUIFalComponentBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates information for a single image component. - */ - class CEGUIEXPORT ImageryComponent : public FalagardComponentBase - { - public: - /*! - \brief - Constructor - */ - ImageryComponent(); - - /*! - \brief - Return the Image object that will be drawn by this ImageryComponent. - - \return - Image object. - */ - const Image* getImage() const; - - /*! - \brief - Set the Image that will be drawn by this ImageryComponent. - - \param - Pointer to the Image object to be drawn by this ImageryComponent. - - \return - Nothing. - */ - void setImage(const Image* image); - - /*! - \brief - Set the Image that will be drawn by this ImageryComponent. - - \param imageset - String holding the name of the Imagset that contains the Image to be rendered. - - \param image - String holding the name of the Image to be rendered. - - \return - Nothing. - */ - void setImage(const String& imageset, const String& image); - - /*! - \brief - Return the current vertical formatting setting for this ImageryComponent. - - \return - One of the VerticalFormatting enumerated values. - */ - VerticalFormatting getVerticalFormatting() const; - - /*! - \brief - Set the vertical formatting setting for this ImageryComponent. - - \param fmt - One of the VerticalFormatting enumerated values. - - \return - Nothing. - */ - void setVerticalFormatting(VerticalFormatting fmt); - - /*! - \brief - Return the current horizontal formatting setting for this ImageryComponent. - - \return - One of the HorizontalFormatting enumerated values. - */ - HorizontalFormatting getHorizontalFormatting() const; - - /*! - \brief - Set the horizontal formatting setting for this ImageryComponent. - - \param fmt - One of the HorizontalFormatting enumerated values. - - \return - Nothing. - */ - void setHorizontalFormatting(HorizontalFormatting fmt); - - /*! - \brief - Writes an xml representation of this ImageryComponent to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - /*! - \brief - Return whether this ImageryComponent fetches it's image via a property on the target window. - - \return - - true if the image comes via a Propery. - - false if the image is defined explicitly. - */ - bool isImageFetchedFromProperty() const; - - /*! - \brief - Return the name of the property that will be used to determine the image for this ImageryComponent. - - \return - String object holding the name of a Propery. - */ - const String& getImagePropertySource() const; - - /*! - \brief - Set the name of the property that will be used to determine the image for this ImageryComponent. - - \param property - String object holding the name of a Propery. The property should access a imageset & image specification. - - \return - Nothing. - */ - void setImagePropertySource(const String& property); - - protected: - // implemets abstract from base - void render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const; - - const Image* d_image; //!< CEGUI::Image to be drawn by this image component. - VerticalFormatting d_vertFormatting; //!< Vertical formatting to be applied when rendering the image component. - HorizontalFormatting d_horzFormatting; //!< Horizontal formatting to be applied when rendering the image component. - String d_imagePropertyName; //!< Name of the property to access to obtain the image to be used. - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalImageryComponent_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImagerySection.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImagerySection.h deleted file mode 100644 index 12873cbf7f..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalImagerySection.h +++ /dev/null @@ -1,275 +0,0 @@ -/************************************************************************ - filename: CEGUIFalImagerySection.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalImagerySection_h_ -#define _CEGUIFalImagerySection_h_ - -#include "falagard/CEGUIFalImageryComponent.h" -#include "falagard/CEGUIFalTextComponent.h" -#include "falagard/CEGUIFalFrameComponent.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates a re-usable collection of imagery specifications. - */ - class CEGUIEXPORT ImagerySection - { - public: - /*! - \brief - Constructor. - */ - ImagerySection(); - - /*! - \brief - ImagerySection constructor. Name must be supplied, masterColours are set to 0xFFFFFFFF by default. - - \param name - Name of the new ImagerySection. - */ - ImagerySection(const String& name); - - /*! - \brief - Render the ImagerySection. - - \param srcWindow - Window object to be used when calculating pixel values from BaseDim values. - - \param base_z - base z value to be used for all imagery in the section. - - \param modColours - ColourRect specifying colours to be modulated with the ImagerySection's master colours. May be 0. - - \return - Nothing. - */ - void render(Window& srcWindow, float base_z, const CEGUI::ColourRect* modColours = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Render the ImagerySection. - - \param srcWindow - Window object to be used when calculating pixel values from BaseDim values. - - \param baseRect - Rect object to be used when calculating pixel values from BaseDim values. - - \param base_z - base z value to be used for all imagery in the section. - - \param modColours - ColourRect specifying colours to be modulated with the ImagerySection's master colours. May be 0. - - \return - Nothing. - */ - void render(Window& srcWindow, const Rect& baseRect, float base_z, const CEGUI::ColourRect* modColours = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Add an ImageryComponent to this ImagerySection. - - \param img - ImageryComponent to be added to the section (a copy is made) - - \return - Nothing - */ - void addImageryComponent(const ImageryComponent& img); - - /*! - \brief - Clear all ImageryComponents from this ImagerySection. - - \return - Nothing - */ - void clearImageryComponents(); - - /*! - \brief - Add a TextComponent to this ImagerySection. - - \param text - TextComponent to be added to the section (a copy is made) - - \return - Nothing - */ - void addTextComponent(const TextComponent& text); - - /*! - \brief - Clear all TextComponents from this ImagerySection. - - \return - Nothing - */ - void clearTextComponents(); - - /*! - \brief - Clear all FrameComponents from this ImagerySection. - - \return - Nothing - */ - void clearFrameComponents(); - - /*! - \brief - Add a FrameComponent to this ImagerySection. - - \param frame - FrameComponent to be added to the section (a copy is made) - - \return - Nothing - */ - void addFrameComponent(const FrameComponent& frame); - - /*! - \brief - Return the current master colours set for this ImagerySection. - - \return - ColourRect describing the master colour values in use for this ImagerySection. - */ - const ColourRect& getMasterColours() const; - - /*! - \brief - Set the master colours to be used for this ImagerySection. - - \param cols - ColourRect describing the colours to be set as the master colours for this ImagerySection. - - \return - Nothing. - */ - void setMasterColours(const ColourRect& cols); - - /*! - \brief - Return the name of this ImagerySection. - - \return - String object holding the name of the ImagerySection. - */ - const String& getName() const; - - /*! - \brief - Set the name of the property where master colour values can be obtained. - - \param property - String containing the name of the property. - - \return - Nothing. - */ - void setMasterColoursPropertySource(const String& property); - - /*! - \brief - Set whether the master colours property source represents a full ColourRect. - - \param setting - - true if the master colours property will access a ColourRect object. - - false if the master colours property will access a colour object. - - \return - Nothing. - */ - void setMasterColoursPropertyIsColourRect(bool setting = true); - - /*! - \brief - Return smallest Rect that could contain all imagery within this section. - */ - Rect getBoundingRect(const Window& wnd) const; - - /*! - \brief - Return smallest Rect that could contain all imagery within this section. - */ - Rect getBoundingRect(const Window& wnd, const Rect& rect) const; - - /*! - \brief - Writes an xml representation of this ImagerySection to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - protected: - /*! - \brief - Helper method to initialise a ColourRect with appropriate values according to the way the - ImagerySection is set up. - - This will try and get values from multiple places: - - a property attached to \a wnd - - or the integral d_masterColours value. - */ - void initMasterColourRect(const Window& wnd, ColourRect& cr) const; - - private: - typedef std::vector ImageryList; - typedef std::vector TextList; - typedef std::vector FrameList; - - CEGUI::String d_name; //!< Holds the name of the ImagerySection. - CEGUI::ColourRect d_masterColours; //!< Naster colours for the the ImagerySection (combined with colours of each ImageryComponent). - FrameList d_frames; //!< Collection of FrameComponent objects to be drawn for this ImagerySection. - ImageryList d_images; //!< Collection of ImageryComponent objects to be drawn for this ImagerySection. - TextList d_texts; //!< Collection of TextComponent objects to be drawn for this ImagerySection. - String d_colourPropertyName; //!< name of property to fetch colours from. - bool d_colourProperyIsRect; //!< true if the colour property will fetch a full ColourRect. - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFalImagerySection_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalLayerSpecification.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalLayerSpecification.h deleted file mode 100644 index b2ef2af011..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalLayerSpecification.h +++ /dev/null @@ -1,149 +0,0 @@ -/************************************************************************ - filename: CEGUIFalLayerSpecification.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalLayerSpecification_h_ -#define _CEGUIFalLayerSpecification_h_ - -#include "falagard/CEGUIFalSectionSpecification.h" -#include "CEGUIWindow.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates a single layer of imagery. - */ - class CEGUIEXPORT LayerSpecification - { - public: - /*! - \brief - Constructor. - - \param priority - Specifies the priority of the layer. Layers with higher priorities will be drawn on top - of layers with lower priorities. - */ - LayerSpecification(uint priority); - - /*! - \brief - Render this layer. - - \param srcWindow - Window to use when calculating pixel values from BaseDim values. - - \param base_z - base level z value to use for all imagery in the layer. - - \return - Nothing. - */ - void render(Window& srcWindow, float base_z, const ColourRect* modcols = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Render this layer. - - \param srcWindow - Window to use when calculating pixel values from BaseDim values. - - \param baseRect - Rect to use when calculating pixel values from BaseDim values. - - \param base_z - base level z value to use for all imagery in the layer. - - \return - Nothing. - */ - void render(Window& srcWindow, const Rect& baseRect, float base_z, const ColourRect* modcols = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Add a section specification to the layer. - - A section specification is a reference to a named ImagerySection within the WidgetLook. - - \param section - SectionSpecification object descibing the section that should be added to this layer. - - \return - Nothing, - */ - void addSectionSpecification(const SectionSpecification& section); - - /*! - \brief - Clear all section specifications from this layer, - - \return - Nothing. - */ - void clearSectionSpecifications(); - - /*! - \brief - Return the priority of this layer. - - \return - uint value descibing the priority of this LayerSpecification. - */ - uint getLayerPriority() const; - - // required to sort layers according to priority - bool operator<(const LayerSpecification& other) const; - - /*! - \brief - Writes an xml representation of this Layer to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - private: - typedef std::vector SectionList; - - SectionList d_sections; //!< Collection of SectionSpecification objects descibing the sections to be drawn for this layer. - uint d_layerPriority; //!< Priority of the layer. - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFalLayerSpecification_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalNamedArea.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalNamedArea.h deleted file mode 100644 index ee9aff9140..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalNamedArea.h +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - filename: CEGUIFalNamedArea.h - created: Sun Jun 26 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalNamedArea_h_ -#define _CEGUIFalNamedArea_h_ - -#include "falagard/CEGUIFalDimensions.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - NamedArea defines an area for a component which may later be obtained - and referenced by a name unique to the WidgetLook holding the NamedArea. - */ - class CEGUIEXPORT NamedArea - { - public: - NamedArea() {} - NamedArea(const String& name); - - /*! - \brief - Return the name of this NamedArea. - - \return - String object holding the name of this NamedArea. - */ - const String& getName() const; - - /*! - \brief - Return the ComponentArea of this NamedArea - - \return - ComponentArea object describing the NamedArea's current target area. - */ - const ComponentArea& getArea() const; - - /*! - \brief - Set the Area for this NamedArea. - - \param area - ComponentArea object describing a new target area for the NamedArea.. - - \return - Nothing. - */ - void setArea(const ComponentArea& area); - - /*! - \brief - Writes an xml representation of this NamedArea to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - private: - String d_name; - ComponentArea d_area; - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalNamedArea_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyDefinition.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyDefinition.h deleted file mode 100644 index a862891f34..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyDefinition.h +++ /dev/null @@ -1,67 +0,0 @@ -/************************************************************************ - filename: CEGUIFalPropertyDefinition.h - created: Sun Jun 26 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalPropertyDefinition_h_ -#define _CEGUIFalPropertyDefinition_h_ - -#include "CEGUIProperty.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - class representing a new property to be available on all widgets that use the WidgetLook - that this PropertyDefinition is defiend for. - */ - class CEGUIEXPORT PropertyDefinition : public Property - { - public: - PropertyDefinition(const String& name, const String& initialValue, bool redrawOnWrite, bool layoutOnWrite); - - // abstract members from Property - String get(const PropertyReceiver* receiver) const; - void set(PropertyReceiver* receiver, const String& value); - - /*! - \brief - Writes an xml representation of this PropertyDefinition to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - protected: - String d_userStringName; - bool d_writeCausesRedraw; - bool d_writeCausesLayout; - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalPropertyDefinition_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyInitialiser.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyInitialiser.h deleted file mode 100644 index 5b1103518a..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalPropertyInitialiser.h +++ /dev/null @@ -1,102 +0,0 @@ -/************************************************************************ - filename: CEGUIFalPropertyInitialiser.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalPropertyInitialiser_h_ -#define _CEGUIFalPropertyInitialiser_h_ - -#include "CEGUIPropertySet.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that holds information about a property and it's required initial value. - */ - class CEGUIEXPORT PropertyInitialiser - { - public: - /*! - \brief - Constructor - - \param property - String holding the name of the property targetted by this PropertyInitialiser. - - \param value - String holding the value to be set by this PropertyInitialiser. - */ - PropertyInitialiser(const String& property, const String& value); - - /*! - \brief - Apply this property initialiser to the specified target CEGUI::PropertySet object. - - \param target - CEGUI::PropertySet object to be initialised by this PropertyInitialiser. - - \return - Nothing. - */ - void apply(PropertySet& target) const; - - /*! - \brief - Return the name of the property targetted by this PropertyInitialiser. - - \return - String object holding the name of the target property. - */ - const String& getTargetPropertyName() const; - - /*! - \brief - Return the value string to be set on the property targetted by this PropertyInitialiser. - - \return - String object holding the value string. - */ - const String& getInitialiserValue() const; - - /*! - \brief - Writes an xml representation of this PropertyInitialiser to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - private: - CEGUI::String d_propertyName; //!< Name of a property to be set. - CEGUI::String d_propertyValue; //!< Value string to be set on the property. - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalPropertyInitialiser_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalSectionSpecification.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalSectionSpecification.h deleted file mode 100644 index bed88bd672..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalSectionSpecification.h +++ /dev/null @@ -1,232 +0,0 @@ -/************************************************************************ - filename: CEGUIFalSectionSpecification.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalSectionSpecification_h_ -#define _CEGUIFalSectionSpecification_h_ - -#include "CEGUIWindow.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - // forward refs - class WidgetLookFeel; - - /*! - \brief - Class that represents a simple 'link' to an ImagerySection. - - This class enables sections to be easily re-used, by different states and/or layers, by allowing - sections to be specified by name rather than having mutiple copies of the same thing all over the place. - */ - class CEGUIEXPORT SectionSpecification - { - public: - /*! - \brief - Constructor - - \param owner - String holding the name of the WidgetLookFeel object that contains the target section. - - \param sectionName - String holding the name of the target section. - */ - SectionSpecification(const String& owner, const String& sectionName); - - /*! - \brief - Constructor - - \param owner - String holding the name of the WidgetLookFeel object that contains the target section. - - \param sectionName - String holding the name of the target section. - - \param cols - Override colours to be used (modulates sections master colours). - */ - SectionSpecification(const String& owner, const String& sectionName, const ColourRect& cols); - - /*! - \brief - Render the section specified by this SectionSpecification. - - \param srcWindow - Window object to be used when calculating pixel values from BaseDim values. - - \param base_z - base z co-ordinate to use for all imagery in the linked section. - - \return - Nothing. - */ - void render(Window& srcWindow, float base_z, const ColourRect* modcols = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Render the section specified by this SectionSpecification. - - \param srcWindow - Window object to be used when calculating pixel values from BaseDim values. - - \param baseRect - Rect object to be used when calculating pixel values from BaseDim values. - - \param base_z - base z co-ordinate to use for all imagery in the linked section. - - \return - Nothing. - */ - void render(Window& srcWindow, const Rect& baseRect, float base_z, const ColourRect* modcols = 0, const Rect* clipper = 0, bool clipToDisplay = false) const; - - /*! - \brief - Return the name of the WidgetLookFeel object containing the target section. - - \return - String object holding the name of the WidgetLookFeel that contains the target ImagerySection. - */ - const String& getOwnerWidgetLookFeel() const; - - /*! - \brief - Return the name of the target ImagerySection. - - \return - String object holding the name of the target ImagerySection. - */ - const String& getSectionName() const; - - /*! - \brief - Return the current override colours. - - \return - ColourRect holding the colours that will be modulated with the sections master colours if - colour override is enabled on this SectionSpecification. - */ - const ColourRect& getOverrideColours() const; - - /*! - \brief - Set the override colours to be used by this SectionSpecification. - - \param cols - ColourRect describing the override colours to set for this SectionSpecification. - - \return - Nothing. - */ - void setOverrideColours(const ColourRect& cols); - - /*! - \brief - return whether the use of override colours is enabled on this SectionSpecification. - - \return - - true if override colours will be used for this SectionSpecification. - - false if override colours will not be used for this SectionSpecification. - */ - bool isUsingOverrideColours() const; - - /*! - \brief - Enable or disable the use of override colours for this section. - - \param setting - - true if override colours should be used for this SectionSpecification. - - false if override colours should not be used for this SectionSpecification. - - \return - Nothing. - */ - void setUsingOverrideColours(bool setting = true); - - /*! - \brief - Set the name of the property where override colour values can be obtained. - - \param property - String containing the name of the property. - - \return - Nothing. - */ - void setOverrideColoursPropertySource(const String& property); - - /*! - \brief - Set whether the override colours property source represents a full ColourRect. - - \param setting - - true if the override colours property will access a ColourRect object. - - false if the override colours property will access a colour object. - - \return - Nothing. - */ - void setOverrideColoursPropertyIsColourRect(bool setting = true); - - /*! - \brief - Writes an xml representation of this SectionSpecification to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - protected: - /*! - \brief - Helper method to initialise a ColourRect with appropriate values according to the way the - section sepcification is set up. - - This will try and get values from multiple places: - - a property attached to \a wnd - - the integral d_coloursOverride values. - - or default to colour(1,1,1,1); - */ - void initColourRectForOverride(const Window& wnd, ColourRect& cr) const; - - private: - String d_owner; //!< Name of the WidgetLookFeel containing the required section. - String d_sectionName; //!< Name of the required section within the specified WidgetLookFeel. - ColourRect d_coloursOverride; //!< Colours to use when override is enabled. - bool d_usingColourOverride; //!< true if colour override is enabled. - String d_colourPropertyName; //!< name of property to fetch colours from. - bool d_colourProperyIsRect; //!< true if the colour property will fetch a full ColourRect. - }; - - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalSectionSpecification_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalStateImagery.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalStateImagery.h deleted file mode 100644 index 0ab7bcf25e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalStateImagery.h +++ /dev/null @@ -1,172 +0,0 @@ -/************************************************************************ - filename: CEGUIFalStateImagery.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalStateImagery_h_ -#define _CEGUIFalStateImagery_h_ - -#include "falagard/CEGUIFalLayerSpecification.h" -#include "CEGUIWindow.h" -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class the encapsulates imagery for a given widget state. - */ - class CEGUIEXPORT StateImagery - { - public: - /*! - \brief - Constructor - */ - StateImagery() {} - - /*! - \brief - Constructor - - \param name - Name of the state - */ - StateImagery(const String& name); - - /*! - \brief - Render imagery for this state. - - \param srcWindow - Window to use when convering BaseDim values to pixels. - - \return - Nothing. - */ - void render(Window& srcWindow, const ColourRect* modcols = 0, const Rect* clipper = 0) const; - - /*! - \brief - Render imagery for this state. - - \param srcWindow - Window to use when convering BaseDim values to pixels. - - \param baseRect - Rect to use when convering BaseDim values to pixels. - - \return - Nothing. - */ - void render(Window& srcWindow, const Rect& baseRect, const ColourRect* modcols = 0, const Rect* clipper = 0) const; - - /*! - \brief - Add an imagery LayerSpecification to this state. - - \param layer - LayerSpecification to be added to this state (will be copied) - - \return - Nothing. - */ - void addLayer(const LayerSpecification& layer); - - /*! - \brief - Removed all LayerSpecifications from this state. - - \return - Nothing. - */ - void clearLayers(); - - /*! - \brief - Return the name of this state. - - \return - String object holding the name of the StateImagery object. - */ - const String& getName() const; - - /*! - \brief - Return whether this state imagery should be clipped to the display rather than the target window. - - Clipping to the display effectively implies that the imagery should be rendered unclipped. - - /return - - true if the imagery will be clipped to the display area. - - false if the imagery will be clipped to the target window area. - */ - bool isClippedToDisplay() const; - - /*! - \brief - Set whether this state imagery should be clipped to the display rather than the target window. - - Clipping to the display effectively implies that the imagery should be rendered unclipped. - - \param setting - - true if the imagery should be clipped to the display area. - - false if the imagery should be clipped to the target window area. - - \return - Nothing. - */ - void setClippedToDisplay(bool setting); - - /*! - \brief - Writes an xml representation of this StateImagery to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - private: - typedef std::multiset LayersList; - - CEGUI::String d_stateName; //!< Name of this state. - LayersList d_layers; //!< Collection of LayerSpecification objects to be drawn for this state. - bool d_clipToDisplay; //!< true if Imagery for this state should be clipped to the display instead of winodw (effectively, not clipped). - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFalStateImagery_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalTextComponent.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalTextComponent.h deleted file mode 100644 index 5cc1426ce9..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalTextComponent.h +++ /dev/null @@ -1,161 +0,0 @@ -/************************************************************************ - filename: CEGUIFalTextComponent.h - created: Sun Jun 19 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalTextComponent_h_ -#define _CEGUIFalTextComponent_h_ - -#include "falagard/CEGUIFalComponentBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates information for a text component. - */ - class CEGUIEXPORT TextComponent : public FalagardComponentBase - { - public: - /*! - \brief - Constructor - */ - TextComponent(); - - /*! - \brief - Return the text object that will be rendered by this TextComponent. - - \return - String object containing the text that will be rendered. - */ - const String& getText() const; - - /*! - \brief - Set the text that will be rendered by this TextComponent. - - Note that setting this to the empty string ("") will cause the text from the - base window passed when rendering to be used instead. - - \param text - String containing text to render, or "" to render text from window. - - \return - Nothing. - */ - void setText(const String& text); - - /*! - \brief - Return the name of the font to be used when rendering this TextComponent. - - \return - String object containing the name of a font, or "" if the window font is to be used. - */ - const String& getFont() const; - - /*! - \brief - Set the name of the font to be used when rendering this TextComponent. - - Note that setting this to the empty string ("") will cause the font from the - base window passed when rendering to be used instead. - - \param font - String containing name of a font - - \return - Nothing. - */ - void setFont(const String& font); - - /*! - \brief - Return the current vertical formatting setting for this TextComponent. - - \return - One of the VerticalTextFormatting enumerated values. - */ - VerticalTextFormatting getVerticalFormatting() const; - - /*! - \brief - Set the vertical formatting setting for this TextComponent. - - \param fmt - One of the VerticalTextFormatting enumerated values. - - \return - Nothing. - */ - void setVerticalFormatting(VerticalTextFormatting fmt); - - /*! - \brief - Return the current horizontal formatting setting for this TextComponent. - - \return - One of the HorizontalTextFormatting enumerated values. - */ - HorizontalTextFormatting getHorizontalFormatting() const; - - /*! - \brief - Set the horizontal formatting setting for this TextComponent. - - \param fmt - One of the HorizontalTextFormatting enumerated values. - - \return - Nothing. - */ - void setHorizontalFormatting(HorizontalTextFormatting fmt); - - /*! - \brief - Writes an xml representation of this TextComponent to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - protected: - // implemets abstract from base - void render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const; - - private: - String d_text; //!< text rendered by this component. - String d_font; //!< name of font to use. - VerticalTextFormatting d_vertFormatting; //!< Vertical formatting to be applied when rendering the component. - HorizontalTextFormatting d_horzFormatting; //!< Horizontal formatting to be applied when rendering the component. - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalTextComponent_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetComponent.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetComponent.h deleted file mode 100644 index d20b035fd9..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetComponent.h +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************************************ - filename: CEGUIFalWidgetComponent.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalWidgetComponent_h_ -#define _CEGUIFalWidgetComponent_h_ - -#include "falagard/CEGUIFalDimensions.h" -#include "falagard/CEGUIFalPropertyInitialiser.h" -#include "CEGUIWindow.h" - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates information regarding a sub-widget required for a widget. - - \todo - This is not finished in the slightest! There will be many changes here... - */ - class CEGUIEXPORT WidgetComponent - { - public: - WidgetComponent() {} - WidgetComponent(const String& type, const String& look, const String& suffix); - - /*! - \brief - Create an instance of this widget component adding it as a child to the given Window. - */ - void create(Window& parent) const; - - const ComponentArea& getComponentArea() const; - void setComponentArea(const ComponentArea& area); - - const String& getBaseWidgetType() const; - void setBaseWidgetType(const String& type); - - const String& getWidgetLookName() const; - void setWidgetLookName(const String& look); - - const String& getWidgetNameSuffix() const; - void setWidgetNameSuffix(const String& suffix); - - VerticalAlignment getVerticalWidgetAlignemnt() const; - void setVerticalWidgetAlignment(VerticalAlignment alignment); - - HorizontalAlignment getHorizontalWidgetAlignemnt() const; - void setHorizontalWidgetAlignemnt(HorizontalAlignment alignment); - - void addPropertyInitialiser(const PropertyInitialiser& initialiser); - void clearPropertyInitialisers(); - - void layout(const Window& owner) const; - - /*! - \brief - Writes an xml representation of this WidgetComponent to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - private: - typedef std::vector PropertiesList; - - ComponentArea d_area; //!< Destination area for the widget (relative to it's parent). - String d_baseType; //!< Type of widget to be created. - String d_imageryName; //!< Name of a WidgetLookFeel to be used for the widget. - String d_nameSuffix; //!< Suffix to apply to the parent Window name to create this widgets unique name. - VerticalAlignment d_vertAlign; //!< Vertical alignment to be used for this widget. - HorizontalAlignment d_horzAlign; //!< Horizontal alignment to be used for this widget. - PropertiesList d_properties; //!< Collection of PropertyInitialisers to be applied the the widget upon creation. - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFalWidgetComponent_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookFeel.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookFeel.h deleted file mode 100644 index 8fa2ada476..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookFeel.h +++ /dev/null @@ -1,318 +0,0 @@ -/************************************************************************ - filename: CEGUIFalWidgetLookFeel.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalWidgetLookFeel_h_ -#define _CEGUIFalWidgetLookFeel_h_ - -#include "falagard/CEGUIFalStateImagery.h" -#include "falagard/CEGUIFalWidgetComponent.h" -#include "falagard/CEGUIFalImagerySection.h" -#include "falagard/CEGUIFalPropertyInitialiser.h" -#include "falagard/CEGUIFalPropertyDefinition.h" -#include "falagard/CEGUIFalNamedArea.h" -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Class that encapsulates look & feel information for a particular widget type. - */ - class CEGUIEXPORT WidgetLookFeel - { - public: - WidgetLookFeel(const String& name); - WidgetLookFeel() {} - - /*! - \brief - Return a const reference to the StateImagery object for the specified state. - - \return - StateImagery object for the requested state. - */ - const StateImagery& getStateImagery(const CEGUI::String& state) const; - - /*! - \brief - Return a const reference to the ImagerySection object with the specified name. - - \return - ImagerySection object with the specified name. - */ - const ImagerySection& getImagerySection(const CEGUI::String& section) const; - - /*! - \brief - Return the name of the widget look. - - \return - String object holding the name of the WidgetLookFeel. - */ - const String& getName() const; - - /*! - \brief - Add an ImagerySection to the WidgetLookFeel. - - \param section - ImagerySection object to be added. - - \return Nothing. - */ - void addImagerySection(const ImagerySection& section); - - /*! - \brief - Add a WidgetComponent to the WidgetLookFeel. - - \param widget - WidgetComponent object to be added. - - \return Nothing. - */ - void addWidgetComponent(const WidgetComponent& widget); - - /*! - \brief - Add a state specification (StateImagery object) to the WidgetLookFeel. - - \param section - StateImagery object to be added. - - \return Nothing. - */ - void addStateSpecification(const StateImagery& state); - - /*! - \brief - Add a property initialiser to the WidgetLookFeel. - - \param initialiser - PropertyInitialiser object to be added. - - \return Nothing. - */ - void addPropertyInitialiser(const PropertyInitialiser& initialiser); - - /*! - \brief - Clear all ImagerySections from the WidgetLookFeel. - - \return - Nothing. - */ - void clearImagerySections(); - - /*! - \brief - Clear all WidgetComponents from the WidgetLookFeel. - - \return - Nothing. - */ - void clearWidgetComponents(); - - /*! - \brief - Clear all StateImagery objects from the WidgetLookFeel. - - \return - Nothing. - */ - void clearStateSpecifications(); - - /*! - \brief - Clear all PropertyInitialiser objects from the WidgetLookFeel. - - \return - Nothing. - */ - void clearPropertyInitialisers(); - - /*! - \brief - Initialise the given window using PropertyInitialsers and component widgets - specified for this WidgetLookFeel. - - \param widget - Window based object to be initialised. - - \return - Nothing. - */ - void initialiseWidget(Window& widget) const; - - /*! - \brief - Return whether imagery is defined for the given state. - - \param state - String object containing name of state to look for. - - \return - - true if imagery exists for the specified state, - - false if no imagery exists for the specified state. - */ - bool isStateImageryPresent(const String& state) const; - - /*! - \brief - Adds a named area to the WidgetLookFeel. - - \param area - NamedArea to be added. - - \return - Nothing. - */ - void addNamedArea(const NamedArea& area); - - /*! - \brief - Clear all defined named areas from the WidgetLookFeel - - \return - Nothing. - */ - void clearNamedAreas(); - - /*! - \brief - Return the NamedArea with the specified name. - - \param name - String object holding the name of the NamedArea to be returned. - - \return - The requested NamedArea object. - */ - const NamedArea& getNamedArea(const String& name) const; - - /*! - \brief - return whether a NamedArea object with the specified name exists for this WidgetLookFeel. - - \param name - String holding the name of the NamedArea to check for. - - \return - - true if a named area with the requested name is defined for this WidgetLookFeel. - - false if no such named area is defined for this WidgetLookFeel. - */ - bool isNamedAreaDefined(const String& name) const; - - /*! - \brief - Layout the child widgets defined for this WidgetLookFeel which are attached to the given window. - - \param owner - Window object that has the child widgets that require laying out. - - \return - Nothing. - */ - void layoutChildWidgets(const Window& owner) const; - - /*! - \brief - Adds a property definition to the WidgetLookFeel. - - \param propdef - PropertyDefinition to be added. - - \return - Nothing. - */ - void addPropertyDefinition(const PropertyDefinition& propdef); - - /*! - \brief - Clear all defined property definitions from the WidgetLookFeel - - \return - Nothing. - */ - void clearPropertyDefinitions(); - - /*! - \brief - Writes an xml representation of this WidgetLookFeel to \a out_stream. - - \param out_stream - Stream where xml data should be output. - - \return - Nothing. - */ - void writeXMLToStream(OutStream& out_stream) const; - - /*! - \brief - Uses the WindowManager to rename the child windows that are - created for this WidgetLookFeel. - - \param widget - The target Window containing the child windows that are to be - renamed. - - \param newBaseName - String object holding the new base name that will be used when - constructing new names for the child windows. - */ - void renameChildren(const Window& widget, const String& newBaseName) const; - - private: - typedef std::map StateList; - typedef std::map ImageryList; - typedef std::map NamedAreaList; - typedef std::vector WidgetList; - typedef std::vector PropertyList; - typedef std::vector PropertyDefinitionList; - - CEGUI::String d_lookName; //!< Name of this WidgetLookFeel. - ImageryList d_imagerySections; //!< Collection of ImagerySection objects. - WidgetList d_childWidgets; //!< Collection of WidgetComponent objects. - StateList d_stateImagery; //!< Collection of StateImagery objects. - PropertyList d_properties; //!< Collection of PropertyInitialser objects. - NamedAreaList d_namedAreas; //!< Collection of NamedArea objects. - mutable PropertyDefinitionList d_propertyDefinitions; //!< Collection of PropertyDefinition objects. - }; - - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFalWidgetLookFeel_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookManager.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookManager.h deleted file mode 100644 index bf6e53babd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalWidgetLookManager.h +++ /dev/null @@ -1,227 +0,0 @@ -/************************************************************************ - filename: CEGUIFalWidgetLookManager.h - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalWidgetLookManager_h_ -#define _CEGUIFalWidgetLookManager_h_ - -#include "CEGUISingleton.h" -#include "CEGUIString.h" -#include "CEGUIExceptions.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -# pragma warning(disable : 4275) -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Manager class that gives top-level access to widget data based "look and feel" specifications loaded into the system. - */ - class CEGUIEXPORT WidgetLookManager : public Singleton - { - public: - /*! - \brief - Constructor. - */ - WidgetLookManager(); - - /*! - \brief - Destructor - */ - ~WidgetLookManager(); - - /*! - \brief - Return singleton WidgetLookManager object - - \return - Singleton WidgetLookManager object - */ - static WidgetLookManager& getSingleton(void); - - - /*! - \brief - Return pointer to singleton WindowFactoryManager object - - \return - Pointer to singleton WindowFactoryManager object - */ - static WidgetLookManager* getSingletonPtr(void); - - - /*! - \brief - Parses a file containing window look & feel specifications (in the form of XML). - - \note - If the new file contains specifications for widget types that are already specified, it is not an error; - the previous definitions are overwritten by the new data. An entry will appear in the log each time any - look & feel component is overwritten. - - \param filename - String object containing the filename of a file containing the widget look & feel data - - \param resourceGroup - Resource group identifier to pass to the resource provider when loading the file. - - \return - Nothing. - - \exception FileIOException thrown if there was some problem accessing or parsing the file \a filename - \exception InvalidRequestException thrown if an invalid filename was provided. - */ - void parseLookNFeelSpecification(const String& filename, const String& resourceGroup = ""); - - - /*! - \brief - Return whether a WidgetLookFeel has been created with the specified name. - - \param widget - String object holding the name of a widget look to test for. - - \return - - true if a WindowLookFeel named \a widget is available. - - false if so such WindowLookFeel is currently available. - */ - bool isWidgetLookAvailable(const String& widget) const; - - - /*! - \brief - Return a const reference to a WidgetLookFeel object which has the specified name. - - \param widget - String object holding the name of a widget look that is to be returned. - - \return - const reference to the requested WidgetLookFeel object. - - \exception UnknownObjectException thrown if no WindowLookFeel is available with the requested name. - */ - const WidgetLookFeel& getWidgetLook(const String& widget) const; - - - /*! - \brief - Erase the WidgetLookFeel that has the specified name. - - \param widget - String object holding the name of a widget look to be erased. If no such WindowLookFeel exists, nothing - happens. - - \return - Nothing. - */ - void eraseWidgetLook(const String& widget); - - - /*! - \brief - Add the given WidgetLookFeel. - - \note - If the WidgetLookFeel specification uses a name that already exists within the system, it is not an error; - the previous definition is overwritten by the new data. An entry will appear in the log each time any - look & feel component is overwritten. - - \param look - WidgetLookFeel object to be added to the system. NB: The WidgetLookFeel is copied, no change of ownership of the - input object occurrs. - - \return - Nothing. - */ - void addWidgetLook(const WidgetLookFeel& look); - - /*! - \brief - Writes the xml header and opening 'Falagard' tags to a stream. - */ - void writeFalagardXMLHeadToStream(OutStream& out_stream) const; - - /*! - \brief - Writes closing xml 'Falagard' tag to a stream. - - \param out_stream - OutStream where XML data should be sent. - */ - void writeFalagardXMLTailToStream(OutStream& out_stream) const; - - /*! - \brief - Writes a complete Widge Look to a stream. Note that xml file header and - falagard opening/closing tags will also be written. - - \param name - String holding the name of the widget look to be output to the stream. - - \param out_stream - OutStream where XML data should be sent. - */ - void writeWidgetLookToStream(const String& name, OutStream& out_stream) const; - - /*! - \brief - Writes a series of complete Widge Look objects to a stream. Note that xml file header and - falagard opening/closing tags will also be written. - - The \a prefix specifies a name prefix common to all widget looks to be written, you could - specify this as "TaharezLook/" and then any defined widget look starting with that prefix, such - as "TaharezLook/Button" and "TaharezLook/Listbox" will be written to the stream. - - \param prefix - String holding the widget look name prefix, which will be used when searching for the widget looks - to be output to the stream. - - \param out_stream - OutStream where XML data should be sent. - */ - void writeWidgetLookSeriesToStream(const String& prefix, OutStream& out_stream) const; - - - private: - static const String FalagardSchemaName; //!< Name of schema file used for XML validation. - - typedef std::map WidgetLookList; - WidgetLookList d_widgetLooks; - }; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _CEGUIFalWidgetLookManager_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalXMLEnumHelper.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalXMLEnumHelper.h deleted file mode 100644 index 6decd652ad..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalXMLEnumHelper.h +++ /dev/null @@ -1,66 +0,0 @@ -/************************************************************************ - filename: CEGUIFalXMLEnumHelper.h - created: Mon Jul 18 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalXMLEnumHelper_h_ -#define _CEGUIFalXMLEnumHelper_h_ - -#include "CEGUIString.h" -#include "CEGUIWindow.h" -#include "falagard/CEGUIFalEnums.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - /*! - \brief - Utility helper class primarily intended for use by the falagard xml parser. - */ - class CEGUIEXPORT FalagardXMLHelper - { - public: - static VerticalFormatting stringToVertFormat(const String& str); - static HorizontalFormatting stringToHorzFormat(const String& str); - static VerticalAlignment stringToVertAlignment(const String& str); - static HorizontalAlignment stringToHorzAlignment(const String& str); - static DimensionType stringToDimensionType(const String& str); - static VerticalTextFormatting stringToVertTextFormat(const String& str); - static HorizontalTextFormatting stringToHorzTextFormat(const String& str); - static FontMetricType stringToFontMetricType(const String& str); - static DimensionOperator stringToDimensionOperator(const String& str); - static FrameImageComponent stringToFrameImageComponent(const String& str); - - static String vertFormatToString(VerticalFormatting format); - static String horzFormatToString(HorizontalFormatting format); - static String vertAlignmentToString(VerticalAlignment alignment); - static String horzAlignmentToString(HorizontalAlignment alignment); - static String dimensionTypeToString(DimensionType dim); - static String vertTextFormatToString(VerticalTextFormatting format); - static String horzTextFormatToString(HorizontalTextFormatting format); - static String fontMetricTypeToString(FontMetricType metric); - static String dimensionOperatorToString(DimensionOperator op); - static String frameImageComponentToString(FrameImageComponent imageComp); - }; -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalXMLEnumHelper_h_ diff --git a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalagard_xmlHandler.h b/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalagard_xmlHandler.h deleted file mode 100644 index ae064d3d54..0000000000 --- a/vendor/cegui-0.4.0-custom/include/falagard/CEGUIFalagard_xmlHandler.h +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************ - filename: CEGUIFalagard_xmlHandler.h - created: Fri Jun 17 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIFalagard_xmlHandler_h_ -#define _CEGUIFalagard_xmlHandler_h_ - -#include "CEGUIXMLHandler.h" -#include "CEGUIcolour.h" -#include "falagard/CEGUIFalDimensions.h" -#include "CEGUIWindow.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - // forward refs - class WidgetLookManager; - class WidgetLookFeel; - class WidgetComponent; - class ImagerySection; - class StateImagery; - class LayerSpecification; - class SectionSpecification; - class ImageryComponent; - class ComponentArea; - class Dimension; - class TextComponent; - class NamedArea; - class FrameComponent; - - /*! - \brief - Handler class used to parse look & feel XML files used by the Falagard system. - */ - class Falagard_xmlHandler : public XMLHandler - { - public: - /*! - \brief - Constructor for Falagard_xmlHandler objects - */ - Falagard_xmlHandler(WidgetLookManager* mgr); - - /*! - \brief - Destructor for Falagard_xmlHandler objects - */ - ~Falagard_xmlHandler(); - - /************************************************************************* - XMLHandler base class overrides - *************************************************************************/ - void elementStart(const String& element, const XMLAttributes& attributes); - void elementEnd(const String& element); - - private: - /************************************************************************* - Implementation Constants - *************************************************************************/ - // element names - static const String FalagardElement; //!< Tag name for root Falagard elements. - static const String WidgetLookElement; //!< Tag name for WidgetLook elements. - static const String ChildElement; //!< Tag name for Child elements. - static const String ImagerySectionElement; //!< Tag name for ImagerySection elements. - static const String StateImageryElement; //!< Tag name for StateImagery elements. - static const String LayerElement; //!< Tag name for Layer elements. - static const String SectionElement; //!< Tag name for Section elements. - static const String ImageryComponentElement; //!< Tag name for ImageryComponent elements. - static const String TextComponentElement; //!< Tag name for TextComponent elements. - static const String FrameComponentElement; //!< Tag name for FrameComponent elements. - static const String AreaElement; //!< Tag name for Area elements. - static const String ImageElement; //!< Tag name for Image elements. - static const String ColoursElement; //!< Tag name for Colours elements. - static const String VertFormatElement; //!< Tag name for VertFormat elements. - static const String HorzFormatElement; //!< Tag name for HorzFormat elements. - static const String VertAlignmentElement; //!< Tag name for VertAlignment elements. - static const String HorzAlignmentElement; //!< Tag name for HorzAlignment elements. - static const String PropertyElement; //!< Tag name for Property elements. - static const String DimElement; //!< Tag name for dimension container elements. - static const String UnifiedDimElement; //!< Tag name for unified dimension elements. - static const String AbsoluteDimElement; //!< Tag name for absolute dimension elements. - static const String ImageDimElement; //!< Tag name for image dimension elements. - static const String WidgetDimElement; //!< Tag name for widget dimension elements. - static const String FontDimElement; //!< Tag name for font dimension elements. - static const String PropertyDimElement; //!< Tag name for property dimension elements. - static const String TextElement; //!< Tag name for text component text elements - static const String ColourPropertyElement; //!< Tag name for property colour elements (fetches cols from a colour property) - static const String ColourRectPropertyElement; //!< Tag name for property colour elements (fetches cols from a ColourRect property) - static const String NamedAreaElement; //!< Tag name for named area elements. - static const String PropertyDefinitionElement; //!< Tag name for property definition elements. - static const String DimOperatorElement; //!< Tag name for dimension operator elements. - static const String VertFormatPropertyElement; //!< Tag name for element that specifies a vertical formatting property. - static const String HorzFormatPropertyElement; //!< Tag name for element that specifies a horizontal formatting property.. - static const String AreaPropertyElement; //!< Tag name for element that specifies a URect property.. - static const String ImagePropertyElement; //!< Tag name for element that specifies an Image property.. - // attribute names - static const String TopLeftAttribute; //!< Attribute name that stores colour for top-left corner. - static const String TopRightAttribute; //!< Attribute name that stores colour for top-right corner. - static const String BottomLeftAttribute; //!< Attribute name that stores colour for bottom-left corner. - static const String BottomRightAttribute; //!< Attribute name that stores colour for bottom-right corner. - static const String ImagesetAttribute; //!< Attribute name that stores name of an imageset. - static const String ImageAttribute; //!< Attribute name that stores name of an image. - static const String TypeAttribute; //!< Attribute name that stores a type string. - static const String NameAttribute; //!< Attribute name that stores name string - static const String PriorityAttribute; //!< Attribute name that stores an integer priority. - static const String SectionNameAttribute; //!< Attribute name that stores an imagery section name. - static const String NameSuffixAttribute; //!< Attribute name that stores a widget name suffix. - static const String LookAttribute; //!< Attribute name that stores the name of a widget look. - static const String ScaleAttribute; //!< Attribute name that stores a UDim scale value. - static const String OffsetAttribute; //!< Attribute name that stores a UDim offset value. - static const String ValueAttribute; //!< Attribute name that stores a property value string. - static const String DimensionAttribute; //!< Attribute name that stores a dimension type. - static const String WidgetAttribute; //!< Attribute name that stores the name of a widget (suffix). - static const String StringAttribute; //!< Attribute name that stores a string of text. - static const String FontAttribute; //!< Attribute name that stores the name of a font. - static const String InitialValueAttribute; //!< Attribute name that stores the initial default value for a property definition. - static const String ClippedAttribute; //!< Attribute name that stores whether some component will be clipped. - static const String OperatorAttribute; //!< Attribute name that stores the name of an operator. - static const String PaddingAttribute; //!< Attribute name that stores some padding value.. - static const String LayoutOnWriteAttribute; //!< Attribute name that stores whether to layout on write of a property. - static const String RedrawOnWriteAttribute; //!< Attribute name that stores whether to redraw on write of a property. - - /************************************************************************* - helper methods - **************************************************************************/ - static argb_t hexStringToARGB(const String& str); - - /************************************************************************* - implementation methods - **************************************************************************/ - void assignAreaDimension(Dimension& dim); - - void doBaseDimStart(const BaseDim* dim); - void doBaseDimEnd(); - - /************************************************************************* - Implementation Data - *************************************************************************/ - WidgetLookManager* d_manager; - - // these hold pointers to various objects under construction. - WidgetLookFeel* d_widgetlook; - WidgetComponent* d_childcomponent; - ImagerySection* d_imagerysection; - StateImagery* d_stateimagery; - LayerSpecification* d_layer; - SectionSpecification* d_section; - ImageryComponent* d_imagerycomponent; - ComponentArea* d_area; - Dimension d_dimension; - TextComponent* d_textcomponent; - NamedArea* d_namedArea; - FrameComponent* d_framecomponent; - - std::vector d_dimStack; - }; - -} // End of CEGUI namespace section - - -#endif // end of guard _CEGUIFalagard_xmlHandler_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtRendererDef.h b/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtRendererDef.h deleted file mode 100644 index 029ebd4329..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtRendererDef.h +++ /dev/null @@ -1,48 +0,0 @@ -/************************************************************************ -filename: IrrlichtRendererDef.h -created: 20/7/2004 -author: Thomas Suter - -changes: -- Irrlicht patching not needed anymore -- using the irrlicht filesystem to load config files etc. -*************************************************************************/ - -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ - -/* - Beginning from version 0.7 Irrlicht does NOT need any changes for the GUI-renderer. - Thanks to Nikolaus Gebhardt for including the missing methods in the renderer. -*/ - -#ifndef IRRLICHTRENDERERDEF_H_INCLUDED -#define IRRLICHTRENDERERDEF_H_INCLUDED - -#if defined( __WIN32__ ) || defined( _WIN32 ) || defined (WIN32) -# ifdef IRRRENDERER_EXPORTS -# define IRRLICHT_GUIRENDERER_API __declspec(dllexport) -# else -# define IRRLICHT_GUIRENDERER_API __declspec(dllimport) -# endif -#else -# define IRRLICHT_GUIRENDERER_API -#endif - -#endif diff --git a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtResourceProvider.h b/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtResourceProvider.h deleted file mode 100644 index e2abf594d4..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/IrrlichtResourceProvider.h +++ /dev/null @@ -1,53 +0,0 @@ -/************************************************************************ -filename: IrrlichtResourceProvider.h -created: 12/22/2004 -author: Thomas Suter - -purpose: DImplements the Resource Provider common functionality -*************************************************************************/ -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUIIrrlichtResourceProvider_h_ -#define _CEGUIIrrlichtResourceProvider_h_ - -#include "IrrlichtRendererDef.h" -#include "CEGUIResourceProvider.h" -#include -// Start of CEGUI namespace section -namespace CEGUI -{ - class IRRLICHT_GUIRENDERER_API IrrlichtResourceProvider : public ResourceProvider - { - protected: - irr::io::IFileSystem* fsys; - public: - /************************************************************************* - Construction and Destruction - *************************************************************************/ - IrrlichtResourceProvider(irr::io::IFileSystem* fsys_); - - ~IrrlichtResourceProvider(void) ; - - void loadRawDataContainer(const String& filename, RawDataContainer& output, const String& resourceGroup); - void unloadRawDataContainer(RawDataContainer& data); - }; - -} // End of CEGUI namespace section - -#endif // end of guard _CEGUIIrrlichtResourceProvider_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Makefile.am b/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Makefile.am deleted file mode 100644 index 5d9b075543..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -pkgincludedir=$(prefix)/include/CEGUI/renderers/IrrlichtRenderer -pkginclude_HEADERS = irrlichtrenderer.h \ - IrrlichtRendererDef.h \ - IrrlichtResourceProvider.h \ - irrlichttexture.h diff --git a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Readme.txt b/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Readme.txt deleted file mode 100644 index 91045f63f5..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/Readme.txt +++ /dev/null @@ -1,52 +0,0 @@ -CEGUI IrrlichtRenderer - -For license information read the remarks in the file "include/renderers/IrrlichtRenderer/IrrlichtRendererDef.h" - -Use the method "bool IrrlichtRenderer::OnEvent(SEvent e)" to push events into the gui system. - -Example: - -------------------------- - - // create a renderer which uses the irrlicht filesystem to load data - renderer=new CEGUI::IrrlichtRenderer(device,true); - - // create the gui - new CEGUI::System(renderer); - - // draw everything - while(device->run()) - { - // draw only if the window is active - if (device->isWindowActive()) - { - driver->beginScene(true, true, video::SColor(150,50,50,50)); - //draw scene - smgr->drawAll(); - // draw gui - CEGUI::System::getSingleton().renderGUI(); - driver->endScene(); - } - } - --------------------------- - -// irrlicht event handler function -bool CEGuiTest::OnEvent(SEvent event) -{ - if(irrlichtrenderer!=0) - return irrlichtrenderer->OnEvent(event); - else - return false; -} - --------------------------- - - -Changes: -22/12/2004 -- added IrrlichResourceProvider -- added IrrlichtEventPusher - -6/1/2005 -- IrrlichtResourceProvider is now Optional diff --git a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichtrenderer.h b/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichtrenderer.h deleted file mode 100644 index ecf7766821..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichtrenderer.h +++ /dev/null @@ -1,388 +0,0 @@ -/************************************************************************ - filename: irrlichtrenderer.h - created: 20/7/2004 - author: Thomas Suter -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _CEGUI_IrrlichtRenderer_h_ -#define _CEGUI_IrrlichtRenderer_h_ - -#include "IrrlichtRendererDef.h" -#include "irrlichttexture.h" -#include "IrrlichtResourceProvider.h" - -#include "CEGUIRenderer.h" -#include "CEGUIInputEvent.h" - -#include - -#include -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -namespace CEGUI -{ - - class EventPusher; - - /*! - \brief - class implementing the interface for Renderer objects with - the irrlicht graphics engine. - */ - class IRRLICHT_GUIRENDERER_API IrrlichtRenderer: public Renderer - { - public: - - /*! constructor - \brief create the irrlicht renderer - - \param dev - pointer to irr::IrrlichtDevice value specifying the irrlicht device - - \param bWithIrrlichtResourceProvicer - bool specifying wether to use an irrlicht- or defautresourceprovider (default) - */ - - IrrlichtRenderer(irr::IrrlichtDevice* dev,bool bWithIrrlichtResourceProvicer=false); - - /*! destructor */ - virtual ~IrrlichtRenderer(); - - - /*! get an irrlicht resource provider - \return irrlicht resourceprovider - */ - virtual ResourceProvider* createResourceProvider(void); - - /*! forward event to CEGUI system */ - bool OnEvent(irr::SEvent& event); - - - /************************************************************************* - Abstract interface methods - *************************************************************************/ - /*! - \brief - Add a quad to the rendering queue. All clipping and other adjustments should have been made prior to calling this. - - \param dest_rect - Rect object describing the destination area (values are in pixels) - - \param z - float value specifying the z co-ordinate / z order of the quad - - \param tex - pointer to the Texture object that holds the imagery to be rendered - - \param texture_rect - Rect object holding the area of \a tex that is to be rendered (values are in texture co-ordinates). - - \param colours - ColourRect object describing the colour values that are to be applied when rendering. - - \param quad_split_mode - One of the QuadSplitMode values specifying the way quads are split into triangles - - \return - Nothing - */ - virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, - const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode); - - - /*! - \brief - Perform final rendering for all quads that have been queued for rendering - - The contents of the rendering queue is retained and can be rendered again as required. If the contents is not required call clearRenderList(). - - \return - Nothing - */ - virtual void doRender(void); - - - /*! - \brief - Clears all queued quads from the render queue. - - \return - Nothing - */ - virtual void clearRenderList(void); - - - /*! - \brief - Enable or disable the queueing of quads from this point on. - - This only affects queueing. If queueing is turned off, any calls to addQuad will cause the quad to be rendered directly. Note that - disabling queueing will not cause currently queued quads to be rendered, nor is the queue cleared - at any time the queue can still - be drawn by calling doRender, and the list can be cleared by calling clearRenderList. Re-enabling the queue causes subsequent quads - to be added as if queueing had never been disabled. - - \param setting - true to enable queueing, or false to disable queueing (see notes above). - - \return - Nothing - */ - virtual void setQueueingEnabled(bool setting); - - - /*! - \brief - Creates a 'null' Texture object. - - \return - a newly created Texture object. The returned Texture object has no size or imagery associated with it, and is - generally of little or no use. - */ - virtual Texture* createTexture(void); - - - /*! - \brief - Create a Texture object using the given image file. - - \param filename - String object that specifies the path and filename of the image file to use when creating the texture. - - \param resourceGroup - Resource group identifier passed to the resource provider. - - \return - a newly created Texture object. The initial contents of the texture memory is the requested image file. - - \note - Textures are always created with a size that is a power of 2. If the file you specify is of a size that is not - a power of two, the final size will be rounded up. Additionally, textures are always square, so the ultimate - size is governed by the larger of the width and height of the specified file. You can check the ultimate sizes - by querying the texture after creation. - */ - virtual Texture* createTexture(const String& filename, const String& resourceGroup); - - - /*! - \brief - Create a Texture object with the given pixel dimensions as specified by \a size. NB: Textures are always square. - - \param size - float value that specifies the size to use for the width and height when creating the new texture. - - \return - a newly created Texture object. The initial contents of the texture memory is undefined / random. - - \note - Textures are always created with a size that is a power of 2. If you specify a size that is not a power of two, the final - size will be rounded up. So if you specify a size of 1024, the texture will be (1024 x 1024), however, if you specify a size - of 1025, the texture will be (2048 x 2048). You can check the ultimate size by querying the texture after creation. - */ - virtual Texture* createTexture(float size); - - - /*! - \brief - Destroy the given Texture object. - - \param texture - pointer to the Texture object to be destroyed - - \return - Nothing - */ - virtual void destroyTexture(Texture* texture); - - - /*! - \brief - Destroy all Texture objects. - - \return - Nothing - */ - virtual void destroyAllTextures(void); - - - /*! - \brief - Return whether queueing is enabled. - - \return - true if queueing is enabled, false if queueing is disabled. - */ - virtual bool isQueueingEnabled(void) const; - - - /*! - \brief - Return the current width of the display in pixels - - \return - float value equal to the current width of the display in pixels. - */ - virtual float getWidth(void) const; - - - /*! - \brief - Return the current height of the display in pixels - - \return - float value equal to the current height of the display in pixels. - */ - virtual float getHeight(void) const; - - - /*! - \brief - Return the size of the display in pixels - - \return - Size object describing the dimensions of the current display. - */ - virtual Size getSize(void) const; - - - /*! - \brief - Return a Rect describing the screen - - \return - A Rect object that describes the screen area. Typically, the top-left values are always 0, and the size of the area described is - equal to the screen resolution. - */ - virtual Rect getRect(void) const; - - - /*! - \brief - Return the maximum texture size available - - \return - Size of the maximum supported texture in pixels (textures are always assumed to be square) - */ - virtual uint getMaxTextureSize(void) const; - - - /*! - \brief - Return the horizontal display resolution dpi - - \return - horizontal resolution of the display in dpi. - */ - virtual uint getHorzScreenDPI(void) const; - - - /*! - \brief - Return the vertical display resolution dpi - - \return - vertical resolution of the display in dpi. - */ - virtual uint getVertScreenDPI(void) const; - - private: - - // the irrlicht device - irr::IrrlichtDevice* device; - // video driver - irr::video::IVideoDriver* driver; - // window width,height - irr::core::dimension2d resolution; - // screen resolution - irr::core::dimension2d screensize; - - // is queueing enabled - bool bQueuingEnabled; - // is quad queue sorted - bool bSorted; - // enable irrlicht resource provider - bool bWithIrrlichtResourceProvicer; - - // quad structure used for rendering the gui - struct RenderQuad - { - RenderQuad(){}; - - RenderQuad(float zVal, - const irr::core::rect& target, - const irr::core::rect& source, - ColourRect col,const Texture*t) - :z(zVal),dst(target),src(source),colours(col){ - tex=(IrrlichtTexture*)t; - }; - - float z; - irr::core::rect dst; - irr::core::rect src; - ColourRect colours; - IrrlichtTexture* tex; - }; - - RenderQuad dummyQuad; - - // std sorting RenderQuad class - struct quadsorter - : public std::binary_function - { - bool operator()(const RenderQuad& _Left, const RenderQuad& _Right) const - {return (_Left.z > _Right.z);} - }; - - // list ot quads we want to render - std::vector renderlist; - - // list of textures used for rendering - std::vector textures; - - // sort the quads in the renderlist - void sortQuads(); - - // render the quad - void doRender(RenderQuad& quad); - - // print some debug output - void print(RenderQuad& quad); - - // convert cegui colour to irrlicht scolor - inline irr::video::SColor toIrrlichtColor(CEGUI::ulong cecolor); - irr::video::SColor colors[4]; - - - - EventPusher* eventpusher; - - }; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif diff --git a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichttexture.h b/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichttexture.h deleted file mode 100644 index 37c7da90bd..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/IrrlichtRenderer/irrlichttexture.h +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************************************ - filename: irrlichttexture.h - created: 20/7/2004 - author: Thomas Suter -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef IRRLICHTTEXTURE_H_INCLUDED -#define IRRLICHTTEXTURE_H_INCLUDED - -#include "IrrlichtRendererDef.h" - -#include "CEGUIBase.h" -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" - -#include - -namespace CEGUI -{ - class IRRLICHT_GUIRENDERER_API IrrlichtTexture : public Texture - { - public: - - // constructor - IrrlichtTexture(Renderer* r, irr::IrrlichtDevice* device); - - // destructor - virtual ~IrrlichtTexture(); - - // returns the irrlich texture - irr::video::ITexture* getTexture(); - - // set the irrlicht texture - void setTexture(irr::video::ITexture* texture); - - - /*! - \brief - Returns the current pixel width of the texture - - \return - ushort value that is the current width of the texture in pixels - */ - virtual ushort getWidth(void) const; - - - /*! - \brief - Returns the current pixel height of the texture - - \return - ushort value that is the current height of the texture in pixels - */ - virtual ushort getHeight(void) const; - - - /*! - \brief - Loads the specified image file into the texture. The texture is resized as required to hold the image. - - \param filename - The filename of the image file that is to be loaded into the texture - - \param resourceGroup - Resource group identifier passed to the resource provider. - - \return - Nothing. - */ - virtual void loadFromFile(const String& filename, const String& resourceGroup); - - - /*! - \brief - Loads (copies) an image in memory into the texture. The texture is resized as required to hold the image. - - \param buffPtr - Pointer to the buffer containing the image data - - \param buffWidth - Width of the buffer (in 0xAARRGGBB pixels) - - \param buffHeight - Height of the buffer (in 0xAARRGGBB pixels) - - \return - Nothing. - */ - virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight); - - private: - - // counter for unique texture names - static int iTextureNumber; - - // generate a unique name - static irr::core::stringc getUniqueName(void); - - // remove the texture from irrlicht textures - void freeTexture(); - - // the current texture for rendering - irr::video::ITexture* tex; - - // the irrlicht video driver - irr::video::IVideoDriver* driver; - - // the irrlicht device - irr::IrrlichtDevice* device; - - }; -} -#endif diff --git a/vendor/cegui-0.4.0-custom/include/renderers/Makefile.am b/vendor/cegui-0.4.0-custom/include/renderers/Makefile.am deleted file mode 100644 index 05161a6c10..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = OpenGLGUIRenderer IrrlichtRenderer diff --git a/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/Makefile.am b/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/Makefile.am deleted file mode 100644 index 608020d48d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -pkgincludedir=$(prefix)/include/CEGUI/renderers/OpenGLGUIRenderer -pkginclude_HEADERS = openglrenderer.h opengltexture.h diff --git a/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/openglrenderer.h b/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/openglrenderer.h deleted file mode 100644 index 31a6f4a1e9..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/openglrenderer.h +++ /dev/null @@ -1,395 +0,0 @@ -/************************************************************************ - filename: openglrenderer.h - created: 9/4/2004 - author: Mark Strom - mwstrom@gmail.com - - purpose: Interface to Renderer implemented via Opengl -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _openglrenderer_h_ -#define _openglrenderer_h_ - -#include "CEGUIBase.h" - -#if defined( __WIN32__ ) || defined( _WIN32 ) -# ifdef OPENGL_GUIRENDERER_EXPORTS -# define OPENGL_GUIRENDERER_API __declspec(dllexport) -# else -# define OPENGL_GUIRENDERER_API __declspec(dllimport) -# endif -#else -# define OPENGL_GUIRENDERER_API -#endif - - -#if defined(_WIN32)// All this taken from glut.h -# ifndef APIENTRY -# define GLUT_APIENTRY_DEFINED -# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__) -# define APIENTRY __stdcall -# else -# define APIENTRY -# endif -# endif -/* XXX This is from Win32's */ -# ifndef CALLBACK -# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) || defined(__LCC__) -# define CALLBACK __stdcall -# else -# define CALLBACK -# endif -# endif -/* XXX Hack for lcc compiler. It doesn't support __declspec(dllimport), just __stdcall. */ -# if defined( __LCC__ ) -# undef WINGDIAPI -# define WINGDIAPI __stdcall -# else -/* XXX This is from Win32's and */ -# ifndef WINGDIAPI -# define GLUT_WINGDIAPI_DEFINED -# define WINGDIAPI __declspec(dllimport) -# endif -# endif -/* XXX This is from Win32's */ -# ifndef _WCHAR_T_DEFINED -typedef unsigned short wchar_t; -# define _WCHAR_T_DEFINED -# endif -# endif //win32 end glut.h stuff - -/* XXX Hack for finding headers in Apple's OpenGL framework. */ -#if defined( __APPLE__ ) -#include -#include -#else /* __APPLE__ */ -#include -#include -#endif /* __APPLE__ */ -#include -#include - -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" - - -#if defined(_WIN32) -# if defined(_DEBUG) -# pragma comment(lib, "CEGUIBase_d.lib") -# else -# pragma comment(lib, "CEGUIBase.lib") -# endif -#endif - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - -#define OGLRENDERER_VBUFF_CAPACITY 4096 - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Forward refs -*************************************************************************/ -class OpenGLTexture; - -/*! -\brief -Renderer class to interface with OpenGL -*/ -class OPENGL_GUIRENDERER_API OpenGLRenderer : public Renderer -{ -public: - /*! - \brief - Constructor for OpenGL Renderer object - - \param max_quads - obsolete. Set to 0. - */ - OpenGLRenderer(uint max_quads); - OpenGLRenderer(uint max_quads,int width, int height); - - - /*! - \brief - Destructor for OpenGLRenderer objects - */ - virtual ~OpenGLRenderer(void); - - // add's a quad to the list to be rendered - virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode); - - // perform final rendering for all queued renderable quads. - virtual void doRender(void); - - // clear the queue - virtual void clearRenderList(void); - - - /*! - \brief - Enable or disable the queuing of quads from this point on. - - This only affects queuing. If queuing is turned off, any calls to addQuad will cause the quad to be rendered directly. Note that - disabling queuing will not cause currently queued quads to be rendered, nor is the queue cleared - at any time the queue can still - be drawn by calling doRender, and the list can be cleared by calling clearRenderList. Re-enabling the queue causes subsequent quads - to be added as if queuing had never been disabled. - - \param setting - true to enable queuing, or false to disable queuing (see notes above). - - \return - Nothing - */ - virtual void setQueueingEnabled(bool setting) {d_queueing = setting;} - - - // create an empty texture - virtual Texture* createTexture(void); - - // create a texture and load it with the specified file. - virtual Texture* createTexture(const String& filename, const String& resourceGroup); - - // create a texture and set it to the specified size - virtual Texture* createTexture(float size); - - // destroy the given texture - virtual void destroyTexture(Texture* texture); - - // destroy all textures still active - virtual void destroyAllTextures(void); - - /*! - \brief - Return whether queuing is enabled. - - \return - true if queuing is enabled, false if queuing is disabled. - */ - virtual bool isQueueingEnabled(void) const {return d_queueing;} - - - /*! - \brief - Return the current width of the display in pixels - - \return - float value equal to the current width of the display in pixels. - */ - virtual float getWidth(void) const {return d_display_area.getWidth();} - - - /*! - \brief - Return the current height of the display in pixels - - \return - float value equal to the current height of the display in pixels. - */ - virtual float getHeight(void) const {return d_display_area.getHeight();} - - - /*! - \brief - Return the size of the display in pixels - - \return - Size object describing the dimensions of the current display. - */ - virtual Size getSize(void) const {return d_display_area.getSize();} - - - /*! - \brief - Return a Rect describing the screen - - \return - A Rect object that describes the screen area. Typically, the top-left values are always 0, and the size of the area described is - equal to the screen resolution. - */ - virtual Rect getRect(void) const {return d_display_area;} - - - /*! - \brief - Return the maximum texture size available - - \return - Size of the maximum supported texture in pixels (textures are always assumed to be square) - */ - virtual uint getMaxTextureSize(void) const {return d_maxTextureSize;} - - - /*! - \brief - Return the horizontal display resolution dpi - - \return - horizontal resolution of the display in dpi. - */ - virtual uint getHorzScreenDPI(void) const {return 96;} - - - /*! - \brief - Return the vertical display resolution dpi - - \return - vertical resolution of the display in dpi. - */ - virtual uint getVertScreenDPI(void) const {return 96;} - - - /*! - \brief - Set the size of the display in pixels. - - If your viewport size changes, you can call this function with the new size - in pixels to update the rendering area. - - \note - This method will cause the EventDisplaySizeChanged event to fire if the - display size has changed. - - \param sz - Size object describing the size of the display. - - \return - Nothing. - */ - void setDisplaySize(const Size& sz); - - - /*! - \brief - Grabs all the loaded textures from Texture RAM and stores them in a local data buffer. - This function invalidates all textures, and restoreTextures must be called before any - CEGUI rendering is done for predictable results - */ - void grabTextures(void); - - - /*! - \brief - Restores all the loaded textures from the local data buffers previously created by 'grabTextures' - */ - void restoreTextures(void); - - -private: - /************************************************************************ - Implementation Constants - ************************************************************************/ - static const int VERTEX_PER_QUAD; //!< number of vertices per quad - static const int VERTEX_PER_TRIANGLE; //!< number of vertices for a triangle - static const int VERTEXBUFFER_CAPACITY; //!< capacity of the allocated vertex buffer - - /************************************************************************* - Implementation Structs & classes - *************************************************************************/ - struct MyQuad - { - float tex[2]; - uint32 color; - float vertex[3]; - }; - - /*! - \brief - structure holding details about a quad to be drawn - */ - struct QuadInfo - { - GLuint texid; - Rect position; - float z; - Rect texPosition; - uint32 topLeftCol; - uint32 topRightCol; - uint32 bottomLeftCol; - uint32 bottomRightCol; - - QuadSplitMode splitMode; - - bool operator<(const QuadInfo& other) const - { - // this is intentionally reversed. - return z > other.z; - } - - }; - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - // setup states etc - void initPerFrameStates(void); - - // restore states - void exitPerFrameStates(void); - - // render whatever is in the vertex buffer - void renderVBuffer(void); - - // sort quads list according to texture - void sortQuads(void); - - // render a quad directly to the display - void renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode); - - // convert colour value to whatever the OpenGL system is expecting. - uint32 colourToOGL(const colour& col) const; - - // set the module ID string - void setModuleIdentifierString(); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - typedef std::multiset QuadList; - QuadList d_quadlist; - - Rect d_display_area; - - MyQuad myBuff[OGLRENDERER_VBUFF_CAPACITY]; - - bool d_queueing; //!< setting for queuing control. - uint d_currTexture; //!< Currently bound texture. - int d_bufferPos; //!< index into buffer where next vertex should be put. - bool d_sorted; //!< true when data in quad list is sorted. - - std::list d_texturelist; //!< List used to track textures. - GLint d_maxTextureSize; //!< Holds maximum supported texture size (in pixels). -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _openglrenderer_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/opengltexture.h b/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/opengltexture.h deleted file mode 100644 index b3dd16d5a7..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/OpenGLGUIRenderer/opengltexture.h +++ /dev/null @@ -1,216 +0,0 @@ -/************************************************************************ - filename: opengltexture.h - created: 9/4/2004 - author: Mark Strom - mwstrom@gmail.com - - purpose: Interface to Texture implemented via Opengl -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _opengltexture_h_ -#define _opengltexture_h_ - -#include "CEGUIBase.h" -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" -#include "renderers/OpenGLGUIRenderer/openglrenderer.h" - -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Texture class that is created by OpenGLRenderer objects -*/ -class OPENGL_GUIRENDERER_API OpenGLTexture : public Texture -{ -private: - /************************************************************************* - Friends (to allow construction and destruction) - *************************************************************************/ - friend Texture* OpenGLRenderer::createTexture(void); - friend Texture* OpenGLRenderer::createTexture(const String& filename, const String& resourceGroup); - friend Texture* OpenGLRenderer::createTexture(float size); - friend void OpenGLRenderer::destroyTexture(Texture* texture); - - - /************************************************************************* - Construction & Destruction (by Renderer object only) - *************************************************************************/ - OpenGLTexture(Renderer* owner); - virtual ~OpenGLTexture(void); - -public: - /*! - \brief - Returns the current pixel width of the texture - - \return - ushort value that is the current width of the texture in pixels - */ - virtual ushort getWidth(void) const {return d_width;} - - - /*! - \brief - Returns the current pixel height of the texture - - \return - ushort value that is the current height of the texture in pixels - */ - virtual ushort getHeight(void) const {return d_height;} - - - /*! - \brief - Loads the specified image file into the texture. The texture is resized as required to hold the image. - - \param filename - The filename of the image file that is to be loaded into the texture - - \param resourceGroup - Resource group identifier passed to the resource provider. - - \return - Nothing. - */ - virtual void loadFromFile(const String& filename, const String& resourceGroup); - - - /*! - \brief - Loads (copies) an image in memory into the texture. The texture is resized as required to hold the image. - - \param buffPtr - Pointer to the buffer containing the image data - - \param buffWidth - Width of the buffer (in 0xAARRGGBB pixels) - - \param buffHeight - Height of the buffer (in 0xAARRGGBB pixels) - - \return - Nothing. - */ - virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight); - - - /*! - \brief - Return a pointer to the internal texture id - - \return - Texture id that is loaded - */ - GLuint getOGLTexid(void) const {return d_ogltexture;} - - - /*! - \brief - set the size of the internal texture. - - \param size - pixel size of the new internal texture. This will be rounded up to a power of 2. - - \return - Nothing. - */ - void setOGLTextureSize(uint size); - - - /************************************************************************ - Grab/restore - *************************************************************************/ - /*! - \brief - Grab the texture to a local buffer. - This will destroy the OpenGL texture, and restoreTexture must be called before using it again. - */ - void grabTexture(void); - - - /*! - \brief - Restore the texture from the locally buffered copy previously create by a call to grabTexture. - */ - void restoreTexture(void); - - -private: -#ifndef USE_DEVIL_LIBRARY -// These defines are used to tell us about the type of TARGA file it is -# define TGA_RGB 2 // This tells us it's a normal RGB (really BGR) file -# define TGA_A 3 // This tells us it's a ALPHA file -# define TGA_RLE 10 // This tells us that the targa is Run-Length Encoded (RLE) - - /************************************************************************* - Implementation Struct - *************************************************************************/ - // This is our image structure for our targa data - struct tImageTGA - { - int channels; // The channels in the image (3 = RGB : 4 = RGBA) - int sizeX; // The width of the image in pixels - int sizeY; // The height of the image in pixels - unsigned char *data; // The image pixel data - }; - - - // flips data for tImageTGA 'img' - static void flipImageTGA(tImageTGA* img); - - - // Took this code from http://www.gametutorials.com still ne - // tImageTGA *LoadTGA(const char *filename) - // - // This is our cool function that loads the targa (TGA) file, then returns it's data. - // This tutorial supports 16, 24 and 32 bit images, along with RLE compression. - // - // - // Ben Humphrey (DigiBen) - // Game Programmer - // DigiBen@GameTutorials.com - // Co-Web Host of www.GameTutorials.com - // - // - // Modified by Paul D Turner to accept a raw data buffer & it's length - // as input. - // - tImageTGA* OpenGLTexture::LoadTGA(const unsigned char* buffer, size_t buffer_size); - -#endif - /************************************************************************* - Implementation Data - *************************************************************************/ - GLuint d_ogltexture; //!< The 'real' texture. - ushort d_width; //!< cached width of the texture - ushort d_height; //!< cached height of the texture - uint8* d_grabBuffer; //!< cached image data for restoring the texture -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _opengltexture_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/renderer.h b/vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/renderer.h deleted file mode 100644 index bebc4b099e..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/renderer.h +++ /dev/null @@ -1,362 +0,0 @@ -/************************************************************************ - filename: renderer.h - created: 15/3/2004 - author: Paul D Turner - - purpose: Interface for DirectX 8.1 Renderer class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -/************************************************************************* - This file contains code that is specific to Win32 and DirectX -*************************************************************************/ -#ifndef _DirectX81GUIRenderer_h_ -#define _DirectX81GUIRenderer_h_ - -#ifdef DIRECTX81_GUIRENDERER_EXPORTS -#define DIRECTX81_GUIRENDERER_API __declspec(dllexport) -#else -#define DIRECTX81_GUIRENDERER_API __declspec(dllimport) -#endif - -#include "CEGUIBase.h" -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" -#include -#include -#include - - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Forward refs -*************************************************************************/ -class DirectX81Texture; - -/*! -\brief - Renderer class to interface with Microsoft DirectX 8.1 -*/ -class DIRECTX81_GUIRENDERER_API DirectX81Renderer : public Renderer -{ -public: - /*! - \brief - Constructor for Direct3D 8.1 Renderer object - - \param device - Pointer to the IDirect3DDevice8 interface object that will be used for all rendering - - \param max_quads - Obsolete. Set to 0. - */ - DirectX81Renderer(LPDIRECT3DDEVICE8 device, uint max_quads = 0); - - - /*! - \brief - Constructor for Direct3D 8.1 Renderer object - - \param device - Pointer to the IDirect3DDevice8 interface object that will be used for all rendering - - \param sz - Size object describing the initial size of the display (the dimensions should be >0) - */ - DirectX81Renderer(LPDIRECT3DDEVICE8 device, const Size& sz); - - - /*! - \brief - Destructor for DirectX81Renderer objects - */ - virtual ~DirectX81Renderer(void); - - // add's a quad to the list to be rendered - virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode); - - // perform final rendering for all queued renderable quads. - virtual void doRender(void); - - // clear the queue - virtual void clearRenderList(void); - - - /*! - \brief - Enable or disable the queueing of quads from this point on. - - This only affects queueing. If queueing is turned off, any calls to addQuad will cause the quad to be rendered directly. Note that - disabling queueing will not cause currently queued quads to be rendered, nor is the queue cleared - at any time the queue can still - be drawn by calling doRender, and the list can be cleared by calling clearRenderList. Re-enabling the queue causes subsequent quads - to be added as if queueing had never been disabled. - - \param setting - true to enable queueing, or false to disable queueing (see notes above). - - \return - Nothing - */ - virtual void setQueueingEnabled(bool setting) {d_queueing = setting;} - - - // create an empty texture - virtual Texture* createTexture(void); - - // create a texture and load it with the specified file. - virtual Texture* createTexture(const String& filename, const String& resourceGroup); - - // create a texture and set it to the specified size - virtual Texture* createTexture(float size); - - // destroy the given texture - virtual void destroyTexture(Texture* texture); - - // destroy all textures still active - virtual void destroyAllTextures(void); - - // return ptr to device - LPDIRECT3DDEVICE8 getDevice(void) const {return d_device;} - - - /*! - \brief - Return whether queueing is enabled. - - \return - true if queueing is enabled, false if queueing is disabled. - */ - virtual bool isQueueingEnabled(void) const {return d_queueing;} - - - /*! - \brief - Return the current width of the display in pixels - - \return - float value equal to the current width of the display in pixels. - */ - virtual float getWidth(void) const {return d_display_area.getWidth();} - - - /*! - \brief - Return the current height of the display in pixels - - \return - float value equal to the current height of the display in pixels. - */ - virtual float getHeight(void) const {return d_display_area.getHeight();} - - - /*! - \brief - Return the size of the display in pixels - - \return - Size object describing the dimensions of the current display. - */ - virtual Size getSize(void) const {return d_display_area.getSize();} - - - /*! - \brief - Return a Rect describing the screen - - \return - A Rect object that describes the screen area. Typically, the top-left values are always 0, and the size of the area described is - equal to the screen resolution. - */ - virtual Rect getRect(void) const {return d_display_area;} - - - /*! - \brief - Return the maximum texture size available - - \return - Size of the maximum supported texture in pixels (textures are always assumed to be square) - */ - virtual uint getMaxTextureSize(void) const {return d_maxTextureSize;} - - - /*! - \brief - Return the horizontal display resolution dpi - - \return - horizontal resolution of the display in dpi. - */ - virtual uint getHorzScreenDPI(void) const {return 96;} - - - /*! - \brief - Return the vertical display resolution dpi - - \return - vertical resolution of the display in dpi. - */ - virtual uint getVertScreenDPI(void) const {return 96;} - - - /*! - \brief - Direct3D support method that must be called prior to a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can release any - unmanaged D3D resources as needed for the device reset to succeed. - */ - virtual void preD3DReset(void); - - - /*! - \brief - Direct3D support method that must be called after a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can rebuild any - unmanaged D3D resources after the device has been reset. - */ - virtual void postD3DReset(void); - - - /*! - \brief - Set the size of the display in pixels. - - This method is important if your D3D 8 device is a pure device; since - with a pure device the system is unable to determine the size of the - view port, so you must manually tell it the size by using this method. - - \note - This method will cause the EventDisplaySizeChanged event to fire if the - display size has changed. - - \param sz - Size object describing the size of the display. - - \return - Nothing. - */ - void setDisplaySize(const Size& sz); - - -private: - /************************************************************************ - Implementation Constants - ************************************************************************/ - static const int VERTEX_PER_QUAD; //!< number of vertices per quad - static const int VERTEX_PER_TRIANGLE; //!< number of vertices for a triangle - static const int VERTEXBUFFER_CAPACITY; //!< capacity of the allocated vertex buffer - static const ulong VERTEX_FVF; //!< FVF specifier constant - - /************************************************************************* - Implementation Structs & classes - *************************************************************************/ - /*! - \brief - FVF structure used for all vertices. - */ - struct QuadVertex { - FLOAT x, y, z, rhw; //!< The transformed position for the vertex. - DWORD diffuse; //!< colour of the vertex - float tu1, tv1; //!< texture coordinates - }; - - /*! - \brief - structure holding details about a quad to be drawn - */ - struct QuadInfo - { - LPDIRECT3DTEXTURE8 texture; - Rect position; - float z; - Rect texPosition; - ulong topLeftCol; - ulong topRightCol; - ulong bottomLeftCol; - ulong bottomRightCol; - - QuadSplitMode splitMode; - - bool operator<(const QuadInfo& other) const - { - // this is intentionally reversed. - return z > other.z; - } - }; - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - // setup states etc - void initPerFrameStates(void); - - // renders whatever is in the vertex buffer - void renderVBuffer(void); - - // sort quads list according to texture - void sortQuads(void); - - // render a quad directly to the display - void renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode); - - // return size of device view port (if possible) - Size getViewportSize(void); - - // method to do work of constructor - void constructor_impl(LPDIRECT3DDEVICE8 device, const Size& display_size); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - Rect d_display_area; - - typedef std::multiset QuadList; - QuadList d_quadlist; - bool d_queueing; //!< setting for queueing control. - - LPDIRECT3DDEVICE8 d_device; //!< Base Direct3DDevice8 interface that we use for rendering - LPDIRECT3DTEXTURE8 d_currTexture; //!< currently set texture; - LPDIRECT3DVERTEXBUFFER8 d_buffer; //!< vertex buffer to queue sprite rendering - int d_bufferPos; //!< index into buffer where next vertex should be put. - - std::list d_texturelist; //!< List used to track textures. - - uint d_maxTextureSize; //!< Holds maximum supported texture size (in pixels). - bool d_canGetVPSize; //!< true if we should try to extract the view port size ourselves. -}; - -} // End of CEGUI namespace section - - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _DirectX81GUIRenderer_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/texture.h b/vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/texture.h deleted file mode 100644 index 83bb20205d..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/directx81GUIRenderer/texture.h +++ /dev/null @@ -1,193 +0,0 @@ -/************************************************************************ - filename: texture.h - created: 10/4/2004 - author: Paul D Turner - - purpose: Defines concrete texture class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _texture_h_ -#define _texture_h_ - -#include "CEGUIBase.h" -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" -#include "renderer.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Texture class that is created by DirectX81Renderer objects -*/ -class DIRECTX81_GUIRENDERER_API DirectX81Texture : public Texture -{ -private: - /************************************************************************* - Friends (to allow construction and destruction) - *************************************************************************/ - friend Texture* DirectX81Renderer::createTexture(void); - friend Texture* DirectX81Renderer::createTexture(const String& filename, const String& resourceGroup); - friend Texture* DirectX81Renderer::createTexture(float size); - friend void DirectX81Renderer::destroyTexture(Texture* texture); - - - /************************************************************************* - Construction & Destruction (by Renderer object only) - *************************************************************************/ - DirectX81Texture(Renderer* owner); - virtual ~DirectX81Texture(void); - -public: - /*! - \brief - Returns the current pixel width of the texture - - \return - ushort value that is the current width of the texture in pixels - */ - virtual ushort getWidth(void) const {return d_width;} - - - /*! - \brief - Returns the current pixel height of the texture - - \return - ushort value that is the current height of the texture in pixels - */ - virtual ushort getHeight(void) const {return d_height;} - - - /*! - \brief - Loads the specified image file into the texture. The texture is resized as required to hold the image. - - \param filename - The filename of the image file that is to be loaded into the texture - - \param resourceGroup - Resource group identifier passed to the resource provider. - - \return - Nothing. - */ - virtual void loadFromFile(const String& filename, const String& resourceGroup); - - - /*! - \brief - Loads (copies) an image in memory into the texture. The texture is resized as required to hold the image. - - \param buffPtr - Pointer to the buffer containing the image data - - \param buffWidth - Width of the buffer (in 0xAARRGGBB pixels) - - \param buffHeight - Height of the buffer (in 0xAARRGGBB pixels) - - \return - Nothing. - */ - virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight); - - - /*! - \brief - Return a pointer to the internal Direct3DTexture8 object - - \return - Pointer to the IDirect3DTexture8 interface currently being used by this Texture object - */ - LPDIRECT3DTEXTURE8 getD3DTexture(void) const {return d_d3dtexture;} - - - // - /*! - \brief - set the size of the internal D3D texture. Previous D3D texture is lost. - - \param size - pixel size of the new internal texture. This will be rounded up to a power of 2. - - \return - Nothing. - */ - void setD3DTextureSize(uint size); - - - /*! - \brief - Direct3D support method that must be called prior to a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can release any - unmanaged D3D resources as needed for the device reset to succeed. - - \note - You do not need to call this on DirectX81Texture objects created via the - DirectX81Renderer object; for such textures the method is called by the - system when you call the DirectX81Renderer::preD3DReset method. - */ - virtual void preD3DReset(void); - - - /*! - \brief - Direct3D support method that must be called after a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can rebuild any - unmanaged D3D resources after the device has been reset. - - \note - You do not need to call this on DirectX81Texture objects created via the - DirectX81Renderer object; for such textures the method is called by the - system when you call the DirectX81Renderer::postD3DReset method. - */ - virtual void postD3DReset(void); - - -private: - /************************************************************************* - Implementation Functions - *************************************************************************/ - // safely free direc3d texture (can be called multiple times with no ill effect) - void freeD3DTexture(void); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - LPDIRECT3DTEXTURE8 d_d3dtexture; //!< The 'real' texture. - String d_filename; //!< name of file used to create the texture, if any. - String d_resourceGroup; //!< resource provider group ID to use when loading file. - bool d_isMemoryTexture; //!< true if the texture was created from memory (and not a file). - - ushort d_width; //!< cached width of the texture - ushort d_height; //!< cached height of the texture -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _texture_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9renderer.h b/vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9renderer.h deleted file mode 100644 index a92a1f1910..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9renderer.h +++ /dev/null @@ -1,352 +0,0 @@ -/************************************************************************ - filename: d3d9renderer.h - created: 17/7/2004 - author: Paul D Turner with D3D 9 Updates by Magnus Österlind - - purpose: Interface for DirectX 9.0 Renderer class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -/************************************************************************* - This file contains code that is specific to Win32 and DirectX -*************************************************************************/ -#ifndef _d3d9renderer_h_ -#define _d3d9renderer_h_ - -#include "CEGUIBase.h" -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" -#include "CEGUIFont.h" -#include "CEGUIFontManager.h" -#include "CEGUIImage.h" -#include -#include -#include - -#ifdef DIRECTX9_GUIRENDERER_EXPORTS -#define DIRECTX9_GUIRENDERER_API __declspec(dllexport) -#else -#define DIRECTX9_GUIRENDERER_API __declspec(dllimport) -#endif - -// Statically linked, so blank it out -#undef DIRECTX9_GUIRENDERER_API -#define DIRECTX9_GUIRENDERER_API - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Forward refs -*************************************************************************/ -class DirectX9Texture; - -/*! -\brief - Renderer class to interface with Microsoft DirectX 9.0 -*/ -class DIRECTX9_GUIRENDERER_API DirectX9Renderer : public Renderer -{ -public: - /*! - \brief - Constructor for Direct3D 9.0 Renderer object - - \param device - Pointer to the IDirect3DDevice9 interface object that will be used for all rendering - - \param max_quads - Obsolete. Set to 0. - */ - DirectX9Renderer(LPDIRECT3DDEVICE9 device, uint max_quads); - - /*! - \brief - Destructor for DirectX9Renderer objects - */ - virtual ~DirectX9Renderer(void); - - // add's a quad to the list to be rendered - virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode, const Image* image = NULL ); - - // perform final rendering for all queued renderable quads. - virtual bool doRender(void); - - // clear the queue - virtual void clearRenderList(void); - - - /*! - \brief - Enable or disable the queueing of quads from this point on. - - This only affects queueing. If queueing is turned off, any calls to addQuad will cause the quad to be rendered directly. Note that - disabling queueing will not cause currently queued quads to be rendered, nor is the queue cleared - at any time the queue can still - be drawn by calling doRender, and the list can be cleared by calling clearRenderList. Re-enabling the queue causes subsequent quads - to be added as if queueing had never been disabled. - - \param setting - true to enable queueing, or false to disable queueing (see notes above). - - \return - Nothing - */ - virtual void setQueueingEnabled(bool setting) {d_queueing = setting;} - - - // create an empty texture - virtual Texture* createTexture(void); - - // create a texture and load it with the specified file. - virtual Texture* createTexture(const String& filename, const String& resourceGroup); - - // create a texture and set it to the specified size - virtual Texture* createTexture(float size); - - // destroy the given texture - virtual void destroyTexture(Texture* texture); - - // destroy all textures still active - virtual void destroyAllTextures(void); - - // return ptr to device - LPDIRECT3DDEVICE9 getDevice(void) const {return d_device;} - - - /*! - \brief - Return whether queueing is enabled. - - \return - true if queueing is enabled, false if queueing is disabled. - */ - virtual bool isQueueingEnabled(void) const {return d_queueing;} - - - /*! - \brief - Return the current width of the display in pixels - - \return - float value equal to the current width of the display in pixels. - */ - virtual float getWidth(void) const {return d_display_area.getWidth();} - - - /*! - \brief - Return the current height of the display in pixels - - \return - float value equal to the current height of the display in pixels. - */ - virtual float getHeight(void) const {return d_display_area.getHeight();} - - - /*! - \brief - Return the size of the display in pixels - - \return - Size object describing the dimensions of the current display. - */ - virtual Size getSize(void) const {return d_display_area.getSize();} - - - /*! - \brief - Return a Rect describing the screen - - \return - A Rect object that describes the screen area. Typically, the top-left values are always 0, and the size of the area described is - equal to the screen resolution. - */ - virtual Rect getRect(void) const {return d_display_area;} - - - /*! - \brief - Return the maximum texture size available - - \return - Size of the maximum supported texture in pixels (textures are always assumed to be square) - */ - virtual uint getMaxTextureSize(void) const {return d_maxTextureSize;} - - - /*! - \brief - Return the horizontal display resolution dpi - - \return - horizontal resolution of the display in dpi. - */ - virtual uint getHorzScreenDPI(void) const {return 96;} - - - /*! - \brief - Return the vertical display resolution dpi - - \return - vertical resolution of the display in dpi. - */ - virtual uint getVertScreenDPI(void) const {return 96;} - - - /*! - \brief - Direct3D support method that must be called prior to a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can release any - unmanaged D3D resources as needed for the device reset to succeed. - */ - virtual void preD3DReset(void); - - - /*! - \brief - Direct3D support method that must be called after a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can rebuild any - unmanaged D3D resources after the device has been reset. - */ - virtual void postD3DReset(void); - - - /*! - \brief - Set the size of the display in pixels. - - You do not have to call this method under normal operation as the system - will automatically extract the size from the current view port. - - \note - This method will cause the EventDisplaySizeChanged event to fire if the - display size has changed. - - \param sz - Size object describing the size of the display. - - \return - Nothing. - */ - void setDisplaySize(const Size& sz); - - virtual void NotifyImageInvalid ( Image* const image ); - -private: - /************************************************************************ - Implementation Constants - ************************************************************************/ - static const int VERTEX_PER_QUAD; //!< number of vertices per quad - static const int VERTEX_PER_TRIANGLE; //!< number of vertices for a triangle - static const int VERTEXBUFFER_CAPACITY; //!< capacity of the allocated vertex buffer - static const ulong VERTEX_FVF; //!< FVF specifier constant - - /************************************************************************* - Implementation Structs & classes - *************************************************************************/ - /*! - \brief - FVF structure used for all vertices. - */ - struct QuadVertex { - FLOAT x, y, z, rhw; //!< The transformed position for the vertex. - DWORD diffuse; //!< colour of the vertex - float tu1, tv1; //!< texture coordinates - }; - - /*! - \brief - structure holding details about a quad to be drawn - */ - struct QuadInfo - { - DirectX9Texture* texture; - const Image* image; - Rect position; - float z; - Rect texPosition; - ulong topLeftCol; - ulong topRightCol; - ulong bottomLeftCol; - ulong bottomRightCol; - - QuadSplitMode splitMode; - - bool operator<(const QuadInfo& other) const - { - // this is intentionally reversed. - return z > other.z; - } - }; - - - /************************************************************************* - Implementation Methods - *************************************************************************/ - // setup states etc - void initPerFrameStates(void); - - // renders whatever is in the vertex buffer - void renderVBuffer(void); - - // sort quads list according to texture - void sortQuads(void); - - // render a quad directly to the display - void renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode); - - // return size of device view port (if possible) - Size getViewportSize(void); - - // method to do work of constructor - void constructor_impl(LPDIRECT3DDEVICE9 device, const Size& display_size); - - /************************************************************************* - Implementation Data - *************************************************************************/ - Rect d_display_area; - - typedef std::multiset QuadList; - QuadList d_quadlist; - bool d_queueing; //!< setting for queueing control. - - LPDIRECT3DDEVICE9 d_device; //!< Base Direct3DDevice9 interface that we use for rendering - LPDIRECT3DTEXTURE9 d_currTexture; //!< currently set texture; - LPDIRECT3DVERTEXBUFFER9 d_buffer; //!< vertex buffer to queue sprite rendering - int d_bufferPos; //!< index into buffer where next vertex should be put. - - std::list d_texturelist; //!< List used to track textures. - - uint d_maxTextureSize; //!< Holds maximum supported texture size (in pixels). -}; - -} // End of CEGUI namespace section - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#endif // end of guard _d3d9renderer_h_ diff --git a/vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9texture.h b/vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9texture.h deleted file mode 100644 index d1ca7d4b00..0000000000 --- a/vendor/cegui-0.4.0-custom/include/renderers/directx9GUIRenderer/d3d9texture.h +++ /dev/null @@ -1,197 +0,0 @@ -/************************************************************************ - filename: d3d9texture.h - created: 17/7/2004 - author: Paul D Turner with D3D 9 Updates by Magnus Österlind - - purpose: Defines concrete texture class for D3D9.0 -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#ifndef _d3d9texture_h_ -#define _d3d9texture_h_ - -#include "CEGUIBase.h" -#include "CEGUIRenderer.h" -#include "CEGUITexture.h" -#include "d3d9renderer.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/*! -\brief - Texture class that is created by DirectX9Renderer objects -*/ -class DIRECTX9_GUIRENDERER_API DirectX9Texture : public Texture -{ -private: - /************************************************************************* - Friends (to allow construction and destruction) - *************************************************************************/ - friend Texture* DirectX9Renderer::createTexture(void); - friend Texture* DirectX9Renderer::createTexture(const String& filename, const String& resourceGroup); - friend Texture* DirectX9Renderer::createTexture(float size); - friend void DirectX9Renderer::destroyTexture(Texture* texture); - - - /************************************************************************* - Construction & Destruction (by Renderer object only) - *************************************************************************/ -public: // changed by MTA; BE CAREFUL! - DirectX9Texture(Renderer* owner); - virtual ~DirectX9Texture(void); - - /*! - \brief - Returns the current pixel width of the texture - - \return - ushort value that is the current width of the texture in pixels - */ - virtual ushort getWidth(void) const {return d_width;} - - - /*! - \brief - Returns the current pixel height of the texture - - \return - ushort value that is the current height of the texture in pixels - */ - virtual ushort getHeight(void) const {return d_height;} - - - /*! - \brief - Loads the specified image file into the texture. The texture is resized as required to hold the image. - - \param filename - The filename of the image file that is to be loaded into the texture - - \param resourceGroup - Resource group identifier passed to the resource provider. - - \return - Nothing. - */ - virtual void loadFromFile(const String& filename, const String& resourceGroup); - - - /*! - \brief - Loads (copies) an image in memory into the texture. The texture is resized as required to hold the image. - - \param buffPtr - Pointer to the buffer containing the image data - - \param buffWidth - Width of the buffer (in 0xAARRGGBB pixels) - - \param buffHeight - Height of the buffer (in 0xAARRGGBB pixels) - - \return - Nothing. - */ - virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight); - - - /*! - \brief - Return a pointer to the internal Direct3DTexture9 object - - \return - Pointer to the IDirect3DTexture9 interface currently being used by this Texture object - */ - virtual LPDIRECT3DTEXTURE9 getD3DTexture(void) const {return d_d3dtexture;} - - - // - void createRenderTarget(uint width, uint height); - - // - /*! - \brief - set the size of the internal D3D texture. Previous D3D texture is lost. - - \param size - pixel size of the new internal texture. This will be rounded up to a power of 2. - - \return - Nothing. - */ - void setD3DTextureSize(uint size); - - - /*! - \brief - Direct3D support method that must be called prior to a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can release any - unmanaged D3D resources as needed for the device reset to succeed. - - \note - You do not need to call this on DirectX9Texture objects created via the - DirectX9Renderer object; for such textures the method is called by the - system when you call the DirectX9Renderer::preD3DReset method. - */ - virtual void preD3DReset(void); - - - /*! - \brief - Direct3D support method that must be called after a Reset call on the - Direct3DDevice; this is required so that the GUI renderer can rebuild any - unmanaged D3D resources after the device has been reset. - - \note - You do not need to call this on DirectX9Texture objects created via the - DirectX9Renderer object; for such textures the method is called by the - system when you call the DirectX9Renderer::postD3DReset method. - */ - virtual void postD3DReset(void); - - -private: - /************************************************************************* - Implementation Functions - *************************************************************************/ - // safely free direc3d texture (can be called multiple times with no ill effect) - void freeD3DTexture(void); - - - /************************************************************************* - Implementation Data - *************************************************************************/ - LPDIRECT3DTEXTURE9 d_d3dtexture; //!< The 'real' texture. - String d_filename; //!< name of file used to create the texture, if any. - String d_resourceGroup; //!< Group from which the file was loaded. - bool d_isMemoryTexture; //!< true if the texture was created from memory (and not a file). - bool d_isRenderTarget; - - ushort d_width; //!< cached width of the texture - ushort d_height; //!< cached height of the texture -}; - -} // End of CEGUI namespace section - - -#endif // end of guard _d3d9texture_h_ diff --git a/vendor/cegui-0.4.0-custom/premake5.lua b/vendor/cegui-0.4.0-custom/premake5.lua deleted file mode 100644 index c594ea53c7..0000000000 --- a/vendor/cegui-0.4.0-custom/premake5.lua +++ /dev/null @@ -1,56 +0,0 @@ -project "CEGUI" - language "C++" - kind "StaticLib" - targetname "CEGUI" - - pchheader "StdInc.h" - pchsource "src/StdInc.cpp" - - includedirs { - "include", - "dependencies/include", - "../freetype/include" - } - - links { "freetype" } - - defines { - "CEGUIBASE_EXPORTS", - "_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING" - } - - vpaths { - ["Headers/*"] = "include/**.h", - ["Sources/*"] = "src/**.cpp", - ["Sources/*"] = "src/**.c", - ["*"] = "premake5.lua" - } - - files { - "premake5.lua", - "src/**.cpp", - "src/**.c", - "include/**.h", - } - - excludes { - "src/renderers/**", - "src/pcre/ucptypetable.c", - "src/pcre/ucptable.c", - "src/pcre/ucp.c" - } - - filter "files:src/tinyxml/**.cpp" - flags { "NoPCH" } - filter "files:src/pcre/**.c" - flags { "NoPCH" } - - filter "architecture:not x86" - flags { "ExcludeFromBuild" } - - filter "system:not windows" - flags { "ExcludeFromBuild" } - - filter {"system:windows"} - linkoptions { "/ignore:4221" } - disablewarnings { "4221" } diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIBase.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIBase.cpp deleted file mode 100644 index b33f1c62a7..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIBase.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/************************************************************************ - filename: CEGUIBase.cpp - created: 20/2/2004 - author: Paul D Turner - - purpose: Definition of any system-wide data, etc. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIBase.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIColourRect.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIColourRect.cpp deleted file mode 100644 index a30077f911..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIColourRect.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/************************************************************************ - filename: CEGUIColourRect.cpp - created: 8/3/2004 - author: Paul D Turner - - purpose: Implements ColourRect class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIColourRect.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constructor -*************************************************************************/ -ColourRect::ColourRect(const colour& top_left, const colour& top_right, const colour& bottom_left, const colour& bottom_right) : - d_top_left(top_left), - d_top_right(top_right), - d_bottom_left(bottom_left), - d_bottom_right(bottom_right) -{ -} - - -/************************************************************************* - Constructor for ColourRect objects (via single colour). -*************************************************************************/ -ColourRect::ColourRect(const colour& col) : - d_top_left(col), - d_top_right(col), - d_bottom_left(col), - d_bottom_right(col) -{ -} - - -/************************************************************************* - Default constructor -*************************************************************************/ -ColourRect::ColourRect(void) : - d_top_left(), - d_top_right(), - d_bottom_left(), - d_bottom_right() -{ -} - - -/************************************************************************* - Set the alpha value to use for all four corners of the ColourRect. -*************************************************************************/ -void ColourRect::setAlpha(float alpha) -{ - d_top_left.setAlpha(alpha); - d_top_right.setAlpha(alpha); - d_bottom_left.setAlpha(alpha); - d_bottom_right.setAlpha(alpha); -} - - -/************************************************************************* - Set the alpha value to use for the top edge of the ColourRect. -*************************************************************************/ -void ColourRect::setTopAlpha(float alpha) -{ - d_top_left.setAlpha(alpha); - d_top_right.setAlpha(alpha); -} - - -/************************************************************************* - Set the alpha value to use for the bottom edge of the ColourRect. -*************************************************************************/ -void ColourRect::setBottomAlpha(float alpha) -{ - d_bottom_left.setAlpha(alpha); - d_bottom_right.setAlpha(alpha); -} - - -/************************************************************************* - Set the alpha value to use for the left edge of the ColourRect. -*************************************************************************/ -void ColourRect::setLeftAlpha(float alpha) -{ - d_top_left.setAlpha(alpha); - d_bottom_left.setAlpha(alpha); -} - - -/************************************************************************* - Set the alpha value to use for the right edge of the ColourRect. -*************************************************************************/ -void ColourRect::setRightAlpha(float alpha) -{ - d_top_right.setAlpha(alpha); - d_bottom_right.setAlpha(alpha); -} - -/************************************************************************* - Determinate whehter the ColourRect is monochromatic or variegated -*************************************************************************/ -bool ColourRect::isMonochromatic() const -{ - return d_top_left == d_top_right && - d_top_left == d_bottom_left && - d_top_left == d_bottom_right; -} - -/************************************************************************* - Get the colour at a specified point -*************************************************************************/ -colour ColourRect::getColourAtPoint( float x, float y ) const -{ - colour h1((d_top_right - d_top_left) * x + d_top_left); - colour h2((d_bottom_right - d_bottom_left) * x + d_bottom_left); - return colour((h2 - h1) * y + h1); -} - -/************************************************************************* - Get a ColourRectangle from the specified Region -*************************************************************************/ -ColourRect ColourRect::getSubRectangle( float left, float right, float top, float bottom ) const -{ - return ColourRect( - getColourAtPoint(left, top), - getColourAtPoint(right, top), - getColourAtPoint(left, bottom), - getColourAtPoint(right, bottom) - ); -} - - -/************************************************************************* - Set the colour of all four corners simultaneously. -*************************************************************************/ -void ColourRect::setColours(const colour& col) -{ - d_top_left = d_top_right = d_bottom_left = d_bottom_right = col; -} - - -/************************************************************************* - Module the alpha components of each corner's colour by a constant. -*************************************************************************/ -void ColourRect::modulateAlpha(float alpha) -{ - d_top_left.setAlpha(d_top_left.getAlpha()*alpha); - d_top_right.setAlpha(d_top_right.getAlpha()*alpha); - d_bottom_left.setAlpha(d_bottom_left.getAlpha()*alpha); - d_bottom_right.setAlpha(d_bottom_right.getAlpha()*alpha); -} - -/************************************************************************* - Modulate all components of this colour rect with corresponding - components from another colour rect. -*************************************************************************/ -ColourRect& ColourRect::operator *=(const ColourRect& other) -{ - d_top_left *= other.d_top_left; - d_top_right *= other.d_top_right; - d_bottom_left *= other.d_bottom_left; - d_bottom_right *= other.d_bottom_right; - - return *this; -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIConfig_xmlHandler.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIConfig_xmlHandler.cpp deleted file mode 100644 index 23e01cb364..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIConfig_xmlHandler.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - filename: CEGUIConfig_xmlHandler.cpp - created: 17/7/2004 - author: Paul D Turner - - purpose: Implements configuration file parser -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIConfig_xmlHandler.h" -#include "CEGUIExceptions.h" -#include "CEGUISystem.h" -#include "CEGUIXMLAttributes.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /************************************************************************* - Implementation Constants - *************************************************************************/ - const String Config_xmlHandler::CEGUIConfigElement( (utf8*)"CEGUIConfig" ); - const char Config_xmlHandler::ConfigLogfileAttribute[] = "Logfile"; - const char Config_xmlHandler::ConfigSchemeAttribute[] = "Scheme"; - const char Config_xmlHandler::ConfigLayoutAttribute[] = "Layout"; - const char Config_xmlHandler::ConfigDefaultFontAttribute[] = "DefaultFont"; - const char Config_xmlHandler::ConfigInitScriptAttribute[] = "InitScript"; - const char Config_xmlHandler::ConfigTerminateScriptAttribute[] = "TerminateScript"; - const char Config_xmlHandler::ConfigDefaultResourceGroupAttribute[] = "DefaultResourceGroup"; - const char Config_xmlHandler::ConfigLoggingLevelAttribute[] = "LoggingLevel"; - - void Config_xmlHandler::elementStart(const String& element, const XMLAttributes& attributes) - { - // handle root CEGUIConfig element - if (element == CEGUIConfigElement) - { - d_logFilename = attributes.getValueAsString(ConfigLogfileAttribute); - d_schemeFilename = attributes.getValueAsString(ConfigSchemeAttribute); - d_layoutFilename = attributes.getValueAsString(ConfigLayoutAttribute); - d_initScriptFilename = attributes.getValueAsString(ConfigInitScriptAttribute); - d_termScriptFilename = attributes.getValueAsString(ConfigTerminateScriptAttribute); - d_defaultFontName = attributes.getValueAsString(ConfigDefaultFontAttribute); - d_defaultResourceGroup = attributes.getValueAsString(ConfigDefaultResourceGroupAttribute); - - // handle logging level - String logLevelStr = attributes.getValueAsString(ConfigLoggingLevelAttribute, "Standard"); - - if (logLevelStr == "Errors") - { - d_logLevel = Errors; - } - else if (logLevelStr == "Informative") - { - d_logLevel = Informative; - } - else if (logLevelStr == "Insane") - { - d_logLevel = Insane; - } - else - { - d_logLevel = Standard; - } - } - // anything else is an error which *should* have already been caught by XML validation - else - { - String message("Config_xmlHandler::startElement - Unexpected data was found while parsing the configuration file: '" + element + "' is unknown."); - - // throw a std::exception (because it won't try and use logger) - throw message.c_str(); - } - - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIDefaultResourceProvider.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIDefaultResourceProvider.cpp deleted file mode 100644 index 1d7b2bd1df..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIDefaultResourceProvider.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/************************************************************************ - filename: CEGUIDefaultResourceProvider.cpp - created: 8/7/2004 - author: James '_mental_' O'Sullivan - - purpose: Implements the Resource Manager common functionality -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIDefaultResourceProvider.h" -#include "CEGUIExceptions.h" - -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -// void DefaultResourceProvider::loadInputSourceContainer(const String& filename, InputSourceContainer& output) -// { -// if (filename.empty() || (filename == (utf8*)"")) -// { -// throw InvalidRequestException((utf8*) -// "DefaultResourceProvider::load - Filename supplied for data loading must be valid"); -// } -// -// XERCES_CPP_NAMESPACE_USE -// XMLCh* pval = XMLString::transcode(filename.c_str()); -// InputSource* mInputSource = new LocalFileInputSource(pval); -// XMLString::release(&pval); -// -// output.setData(mInputSource); -// } - - void DefaultResourceProvider::loadRawDataContainer(const String& filename, RawDataContainer& output, const String& resourceGroup) - { - if (filename.empty() || (filename == (utf8*)"")) - { - throw InvalidRequestException((utf8*) - "DefaultResourceProvider::load - Filename supplied for data loading must be valid"); - } - - - std::wstring strFilename1 = filename.c_wstring (); - std::wstring strFilename2 = System::getSingleton ().GetGuiWorkingDirectory().c_wstring () + strFilename1; - - // If supplied filename looks like it is absolute, try that first - bool bIsAbsolutePath = false; - { - SString strTemp = PathConform ( filename.c_str () ); - if ( strTemp.Contains ( ":" ) || strTemp.BeginsWith ( "\\" ) ) - std::swap ( strFilename1, strFilename2 ); - } - - - std::ifstream dataFile; - dataFile.open(strFilename2.c_str (), std::ios::binary|std::ios::ate); - - if( dataFile.fail()) - { - dataFile.clear(); - dataFile.open(strFilename1.c_str (), std::ios::binary|std::ios::ate); - if( dataFile.fail()) - { - throw InvalidRequestException((utf8*) - "DefaultResourceProvider::load - " + filename + " does not exist"); - } - } - std::streampos size = dataFile.tellg(); - dataFile.seekg (0, std::ios::beg); - - unsigned char* buffer = new unsigned char [(uint)size]; - - try { - dataFile.read(reinterpret_cast(buffer), size); - } - catch(std::ifstream::failure e) { - delete [] buffer; - throw GenericException((utf8*) - "DefaultResourceProvider::loadRawDataContainer - Problem reading " + filename); - } - - dataFile.close(); - - //memcpy(container->getDataPtr(), buffer, size); - output.setData(buffer); - output.setSize((size_t)size); - //delete [] buffer; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIEvent.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIEvent.cpp deleted file mode 100644 index f813223a8b..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIEvent.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/************************************************************************ - filename: CEGUIEvent.cpp - created: 15/10/2004 - author: Gerald Lindsly - - purpose: Implements Event class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIEvent.h" - -#if defined (_MSC_VER) -# pragma warning(disable : 4251) -# pragma warning(disable : 4786) -# if !defined (_MSC_EXTENSIONS) -# pragma warning (disable : 4224) -# endif -#endif - - -// Start of CEGUI namespace section -namespace CEGUI { - -class ConnectionImpl : public Event::ConnectionInterface { -public: - ConnectionImpl(Event* event_, Event::Group group_, Event::Subscriber subscriber_) : - event(event_), group(group_), subscriber(subscriber_) - { - } - - virtual bool connected() - { - return event != 0; - } - - virtual void disconnect() - { - if (event) - { - event->unsubscribe(subscriber, group); - } - - } - -protected: - Event* event; - Event::Group group; - Event::Subscriber subscriber; - - friend class Event; -}; - - -Event::Event(const String& name) : d_name(name) -{ -} - - -Event::~Event() -{ - ConnectionOrdering::iterator i = connectionOrdering.begin(); - for (;i != connectionOrdering.end(); i++) - { - if (((ConnectionImpl*)i->second.get())->event) - { - i->first.subscriber.release(); - } - - } -} - - -Event::Connection Event::subscribe(Group group, Subscriber subscriber) -{ - ConnectionImpl* conn = new ConnectionImpl(this, group, subscriber); - connectionOrdering[GroupSubscriber(group, subscriber)] = conn; - return conn; -} - - -void Event::operator()(EventArgs& args) -{ - ConnectionOrdering::iterator i = connectionOrdering.begin(); - - for (;i != connectionOrdering.end(); ++i) - { - if (((ConnectionImpl*)i->second.get())->event) - { - args.handled |= i->first.subscriber(args); - } - - } - -} - - -bool Event::unsubscribe(Subscriber subscriber, Group group) -{ - ConnectionOrdering::iterator j = connectionOrdering.find(GroupSubscriber(group, subscriber)); - - if (j == connectionOrdering.end()) - { - return false; - } - - ConnectionImpl* c = (ConnectionImpl*)j->second.get(); - c->event = 0; - c->subscriber.release(); - connectionOrdering.erase(j); - return true; -} - -} // End of CEGUI namespace section - diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIEventArgs.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIEventArgs.cpp deleted file mode 100644 index 615a5351c1..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIEventArgs.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/************************************************************************ - filename: CEGUIEventArgs.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implementation of EventArgs base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIEventArgs.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIEventSet.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIEventSet.cpp deleted file mode 100644 index 79027a48ed..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIEventSet.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/************************************************************************ - filename: CEGUIEventSet.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the EventSet class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIEventSet.h" -#include "CEGUIExceptions.h" -#include "CEGUIGlobalEventSet.h" -#include "CEGUIScriptModule.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constructor -*************************************************************************/ -EventSet::EventSet() : - d_muted(false), - d_addedUncommonEvents(false) -{ -} - - -/************************************************************************* - Destructor -*************************************************************************/ -EventSet::~EventSet(void) -{ - removeAllEvents(); -} - - -/************************************************************************* - Add a new event to the EventSet -*************************************************************************/ -void EventSet::addEvent(const String& name) -{ - if (isEventPresent(name)) - { - throw AlreadyExistsException("An event named '" + name + "' already exists in the EventSet."); - } - - d_events[name] = new Event(name); -} - - -/************************************************************************* - Remove an event from the EventSet -*************************************************************************/ -void EventSet::removeEvent(const String& name) -{ - EventMap::iterator pos = d_events.find(name); - - if (pos != d_events.end()) - { - delete pos->second; - d_events.erase(pos); - } - -} - - -/************************************************************************* - Remove all events from the EventSet -*************************************************************************/ -void EventSet::removeAllEvents(void) -{ - EventMap::iterator pos = d_events.begin(); - EventMap::iterator end = d_events.end() ; - - for (; pos != end; ++pos) - { - delete pos->second; - } - - d_events.clear(); -} - - -/************************************************************************* - Check to see if an event is available -*************************************************************************/ -bool EventSet::isEventPresent(const String& name) -{ - return (d_events.find(name) != d_events.end()); -} - - -/************************************************************************* - Subscribe to a scripted event (no group) -*************************************************************************/ -Event::Connection EventSet::subscribeScriptedEvent(const String& name, const String& subscriber_name) -{ - return subscribeEvent(name, Event::Subscriber(ScriptFunctor(subscriber_name))); -} - - -/************************************************************************* - Subscribe to a scripted event -*************************************************************************/ -Event::Connection EventSet::subscribeScriptedEvent(const String& name, Event::Group group, const String& subscriber_name) -{ - return subscribeEvent(name, group, Event::Subscriber(ScriptFunctor(subscriber_name))); -} - - -/************************************************************************* - Subscribe to an event (no group) -*************************************************************************/ -Event::Connection EventSet::subscribeEvent(const String& name, Event::Subscriber subscriber) -{ - EventMap::iterator pos = d_events.find(name); - - if (pos == d_events.end()) - { - // See if we should initialize all events for this instance - maybeAddUncommonEvents ( name ); - // Re-check for match - pos = d_events.find ( name ) ; - if ( pos == d_events.end () ) - throw UnknownObjectException("No event named '" + name + "' is defined for this EventSet"); - } - - return pos->second->subscribe(subscriber); -} - - -/************************************************************************* - Subscribe to an event group -*************************************************************************/ -Event::Connection EventSet::subscribeEvent(const String& name, Event::Group group, Event::Subscriber subscriber) -{ - EventMap::iterator pos = d_events.find(name); - - if (pos == d_events.end()) - { - // See if we should initialize all events for this instance - maybeAddUncommonEvents ( name ); - // Re-check for match - pos = d_events.find ( name ) ; - if ( pos == d_events.end () ) - throw UnknownObjectException("No event named '" + name + "' is defined for this EventSet"); - } - - return pos->second->subscribe(group, subscriber); -} - -/************************************************************************* - Fire / Trigger an event -*************************************************************************/ -void EventSet::fireEvent(const String& name, EventArgs& args, const String& eventNamespace) -{ - // handle global events - GlobalEventSet::getSingleton().fireEvent(name, args, eventNamespace); - - EventMap::iterator pos = d_events.find(name); - - if (pos == d_events.end()) - { - return; - //throw UnknownObjectException("No event named '" + name + "' is defined for this EventSet"); - } - - // fire the event - if (!d_muted) - { - (*pos->second)(args); - } - -} - - -/************************************************************************* - Return whether the EventSet is muted or not. -*************************************************************************/ -bool EventSet::isMuted(void) const -{ - return d_muted; -} - - -/************************************************************************* - Set the mute state for this EventSet. -*************************************************************************/ -void EventSet::setMutedState(bool setting) -{ - d_muted = setting; -} - - -/************************************************************************* - Return a EventSet::EventIterator object to iterate over the available - events. -*************************************************************************/ -EventSet::EventIterator EventSet::getIterator(void) const -{ - maybeAddUncommonEvents ( "getIterator" ); - return EventIterator(d_events.begin(), d_events.end()); -} - - -/************************************************************************* - Return a dummy type name - Should never be called -*************************************************************************/ -const String& EventSet::getType(void) const -{ - static String dummy; - return dummy; -} - - -/************************************************************************* - maybeAddUncommonEvents -*************************************************************************/ -void EventSet::maybeAddUncommonEvents ( const String& name ) const -{ - // Const cast hack - const_cast < EventSet* > ( this )->maybeAddUncommonEvents ( name ) ; -} - - -/************************************************************************* - maybeAddUncommonEvents -*************************************************************************/ -void EventSet::maybeAddUncommonEvents ( const String& name ) -{ - if ( !d_addedUncommonEvents ) - { - Logger::getSingleton ().logEvent ( SString ( "** Adding uncommon events for a %s, to find missing event %s", getType ().c_str (), name.c_str() ), Informative); - d_addedUncommonEvents = true; - addUncommonEvents (); - - // See if event there now - if ( d_events.find ( name ) != d_events.end () ) - { - return; - } - } - - Logger::getSingleton ().logEvent ( SString ( "** Trouble with %s, can't find event %s", getType ().c_str (), name.c_str() ), Informative); -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIExceptions.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIExceptions.cpp deleted file mode 100644 index 34bd21594f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIExceptions.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/************************************************************************ - filename: CEGUIExceptions.cpp - created: 20/2/2004 - author: Paul D Turner - - purpose: Implements the exception classes used within the system -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -Exception::Exception(const String& message) : - d_message(message) -{ - Logger::getSingleton().logEvent((utf8*)"Exception: " + message, Errors); -} - -Exception::~Exception(void) -{ -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIFactoryModule.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIFactoryModule.cpp deleted file mode 100644 index fe6cee8612..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIFactoryModule.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/************************************************************************ - filename: CEGUIFactoryModule.cpp - created: 12/4/2004 - author: Paul D Turner - - purpose: Implements FactoryModule for Win32 systems -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIBase.h" -#include "CEGUIString.h" -#include "CEGUIExceptions.h" -#include "CEGUIFactoryModule.h" -#include "..\widgetsets\falagard\include\falmodule.h" - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(_MSC_VER) -# pragma warning(disable : 4552) // warning: operator has no effect; expected operator with side-effect -# endif -# define WIN32_LEAN_AND_MEAN -# include -#endif - -#if defined(__APPLE_CC__) -# include "macPlugins.h" -#endif - -#if defined(__linux__) -# include "dlfcn.h" -#endif - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants -*************************************************************************/ -#ifdef DYNAMIC_FACTORY_MODULE -const char FactoryModule::RegisterFactoryFunctionName[] = "registerFactory"; -const char FactoryModule::RegisterAllFunctionName[] = "registerAllFactories"; -#endif - - -/************************************************************************* - Construct the FactoryModule object by loading the dynamic loadable - module specified. -*************************************************************************/ -FactoryModule::FactoryModule(const String& filename) -{ -#ifdef DYNAMIC_FACTORY_MODULE - d_moduleName = filename; - -#if defined(__linux__) - // dlopen() does not add .so to the filename, like windows does for .dll - if (d_moduleName.substr(d_moduleName.length() - 3, 3) != (utf8*)".so") - { - d_moduleName += (utf8*)".so"; - } - - // see if we need to add the leading 'lib' - if (d_moduleName.substr(0, 3) != (utf8*)"lib") - { - d_moduleName.insert(0, (utf8*)"lib"); - } -#endif - - /// This optionally adds a _d to the loaded module name under the debug config for Win32 -#if defined(__WIN32__) || defined(_WIN32) -# if defined (_DEBUG) && defined (CEGUI_LOAD_MODULE_APPEND_SUFFIX_FOR_DEBUG) - // if name has .dll extension, assume it's complete and do not touch it. - if (d_moduleName.substr(d_moduleName.length() - 4, 4) != (utf8*)".dll") - { - d_moduleName += (utf8*)CEGUI_LOAD_MODULE_DEBUG_SUFFIX; - } -# endif -#endif - - d_handle = DYNLIB_LOAD(d_moduleName.c_str()); - - // check for library load failure - if (d_handle == NULL) - { - throw GenericException((utf8*)"FactoryModule::FactoryModule - Failed to load module '" + d_moduleName + "'."); - } - - // functions are now optional, and only throw upon the first attempt to use a missing function. - d_regFunc = (FactoryRegisterFunction)DYNLIB_GETSYM(d_handle, RegisterFactoryFunctionName); - d_regAllFunc = (RegisterAllFunction)DYNLIB_GETSYM(d_handle, RegisterAllFunctionName); -#endif // DYNAMIC_FACTORY_MODULE -} - - -/************************************************************************* - Destroys the FactoryModule object and unloads any loadable module. -*************************************************************************/ -FactoryModule::~FactoryModule(void) -{ -#ifdef DYNAMIC_FACTORY_MODULE - DYNLIB_UNLOAD(d_handle); -#endif -} - - -/************************************************************************* - Register a WindowFactory for 'type' Windows. -*************************************************************************/ -void FactoryModule::registerFactory(const String& type) const -{ -#ifdef DYNAMIC_FACTORY_MODULE - // are we attempting to use a missing function export - if (!d_regFunc) - { - throw InvalidRequestException("FactoryModule::registerFactory - Required function export 'void registerFactory(const String& type)' was not found in module '" + d_moduleName + "'."); - } - - d_regFunc(type); -#endif -} - -uint FactoryModule::registerAllFactories() const -{ -#ifdef DYNAMIC_FACTORY_MODULE - // are we attempting to use a missing function export - if (!d_regAllFunc) - { - throw InvalidRequestException("FactoryModule::registerAllFactories - Required function export 'uint registerAllFactories(void)' was not found in module '" + d_moduleName + "'."); - } - - return d_regAllFunc(); -#endif - - registerAllFactoriesF(); - - return 1; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIFont.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIFont.cpp deleted file mode 100644 index 2b605e0637..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIFont.cpp +++ /dev/null @@ -1,1724 +0,0 @@ -/************************************************************************ - filename: CEGUIFont.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements Font class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIFont.h" -#include "CEGUIExceptions.h" -#include "CEGUISystem.h" -#include "CEGUIFontManager.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUITexture.h" -#include "CEGUILogger.h" -#include "CEGUITextUtils.h" -#include "CEGUIFont_xmlHandler.h" -#include "CEGUIFont_implData.h" -#include "CEGUIResourceProvider.h" -#include "CEGUIXMLParser.h" - -#include -#include FT_FREETYPE_H - -#include -#include -#include "time.h" - -#define CACHE_TIMEOUT 30 * 10 - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - static data definitions -*************************************************************************/ -const argb_t Font::DefaultColour = 0xFFFFFFFF; -const uint Font::InterGlyphPadSpace = 2; - -// XML related strings -const char Font::FontSchemaName[] = "Font.xsd"; - - -/************************************************************************* - Constructs a new Font object from a font definition file -*************************************************************************/ -Font::Font(const String& filename, const String& resourceGroup, FontImplData* dat) : - d_freetype(false), - d_lineHeight(0), - d_lineSpacing(0), - d_max_bearingY(0), - d_maxGlyphHeight(0), - d_impldat(dat), - d_ptSize(0), - d_autoScale(false), - d_horzScaling(1.0f), - d_vertScaling(1.0f), - d_nativeHorzRes(DefaultNativeHorzRes), - d_nativeVertRes(DefaultNativeVertRes), - d_antiAliased(false), - d_bAddedGlyphPage(false), - d_uiLastPulseTime(0), - d_glyph_images_default(NULL), - d_total_width(0), - d_avg_width(0) -{ - load(filename, resourceGroup); - - // complete y spacing set-up for bitmap / static fonts - calculateStaticVertSpacing(); -} - - -/************************************************************************* - Constructs a new Font object (via FreeType & a true-type font file) - 'glyph-set' describes the set of code points to be available via - this font -*************************************************************************/ -Font::Font(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, const String& glyph_set, FontImplData* dat) : - d_freetype(false), - d_lineHeight(0), - d_lineSpacing(0), - d_max_bearingY(0), - d_maxGlyphHeight(0), - d_impldat(dat), - d_ptSize(0), - d_autoScale(false), - d_horzScaling(1.0f), - d_vertScaling(1.0f), - d_nativeHorzRes(DefaultNativeHorzRes), - d_nativeVertRes(DefaultNativeVertRes), - d_antiAliased(false), - d_bAddedGlyphPage(false), - d_uiLastPulseTime(0), - d_glyph_images_default(NULL), - d_total_width(0), - d_avg_width(0) -{ - constructor_impl(name, fontname, resourceGroup, size, flags, glyph_set); -} - - -/************************************************************************* - Constructs a new Font object (via FreeType & a true-type font file) - [first_code_point, last_code_point] describes the range of code - points to be available via this font -*************************************************************************/ -Font::Font(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, utf32 first_code_point, utf32 last_code_point, FontImplData* dat) : - d_freetype(false), - d_lineHeight(0), - d_lineSpacing(0), - d_max_bearingY(0), - d_maxGlyphHeight(0), - d_impldat(dat), - d_ptSize(0), - d_autoScale(false), - d_horzScaling(1.0f), - d_vertScaling(1.0f), - d_nativeHorzRes(DefaultNativeHorzRes), - d_nativeVertRes(DefaultNativeVertRes), - d_antiAliased(false), - d_bAddedGlyphPage(false), - d_uiLastPulseTime(0), - d_glyph_images_default(NULL), - d_total_width(0), - d_avg_width(0) -{ - String tmp; - - for (utf32 cp = first_code_point; cp <= last_code_point; ++cp) - { - tmp += cp; - } - - constructor_impl(name, fontname, resourceGroup, size, flags, tmp); -} - - -/************************************************************************* - Constructs a new Font object (via FreeType & a true-type font file) - The font file will provide support for 7-bit ASCII characters only -*************************************************************************/ -Font::Font(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, FontImplData* dat, bool bAutoScale, float fNativeResX, float fNativeResY) : - d_freetype(false), - d_lineHeight(0), - d_lineSpacing(0), - d_max_bearingY(0), - d_maxGlyphHeight(0), - d_impldat(dat), - d_ptSize(0), - d_autoScale(bAutoScale), - d_horzScaling(1.0f), - d_vertScaling(1.0f), - d_nativeHorzRes(fNativeResX), - d_nativeVertRes(fNativeResY), - d_antiAliased(false), - d_bAddedGlyphPage(false), - d_uiLastPulseTime(0), - d_glyph_images_default(NULL), - d_total_width(0), - d_avg_width(0) -{ - String tmp; - - for (utf32 cp = 32; cp <= 127; ++cp) - { - tmp += cp; - } - - Size screensize = System::getSingleton().getRenderer()->getSize(); - d_horzScaling = screensize.d_width / d_nativeHorzRes; - d_vertScaling = screensize.d_height / d_nativeVertRes; - - constructor_impl(name, fontname, resourceGroup, size, flags, tmp); -} - - -/************************************************************************* - Destroys a Font object -*************************************************************************/ -Font::~Font(void) -{ - unload(); - if ( d_glyph_images_default ) - { - ImagesetManager::getSingleton().destroyImageset(d_glyph_images_default); - d_glyph_images_default = NULL; - } - delete d_impldat; -} - - -/************************************************************************* - Return the pixel width of the specified text if rendered with this Font. -*************************************************************************/ -float Font::getTextExtent(const String& text, float x_scale) const -{ - float cur_extent = 0, adv_extent = 0, width; - - size_t char_count = text.length(); - - for (size_t c = 0; c < char_count; ++c) - { - const SCharSize* pCharSize = MapFind ( d_sizes_map, text[c] ); // Ask sub font if not - if ( !pCharSize && !d_is_subfont ) - { - // Check if the size info exists in our substitute font - Font* subfont = FontManager::getSingleton().getSubstituteFont(); - pCharSize = MapFind ( subfont->getSizesMap(), text[c] ); - - if ( !pCharSize ) - { - // Not in the sub font either. Does the glyph exist in this font? If not, let's load it from the sub font - if (!d_is_subfont && !FT_Get_Char_Index( d_impldat->fontFace, text[c] ) ) - { - if ( !( const_cast(subfont)->loadGlyph( text[c], true )) ) - continue; - pCharSize = MapFind ( subfont->getSizesMap(), text[c] ); - } - else - { - if ( !( const_cast(this)->loadGlyph( text[c], true )) ) - continue; - pCharSize = MapFind ( d_sizes_map, text[c] ); - } - } - - if ( !pCharSize ) - continue; - } - - width = (pCharSize->width + pCharSize->offsetX) * x_scale; - - if (adv_extent + width > cur_extent) - { - cur_extent = adv_extent + width; - } - - adv_extent += pCharSize->horz_advance * x_scale; - } - - return ceguimax(adv_extent, cur_extent); -} - - -/************************************************************************* - Return the index of the closest text character in String 'text' that - corresponds to pixel location 'pixel' if the text were rendered. -*************************************************************************/ -size_t Font::getCharAtPixel(const String& text, size_t start_char, float pixel, float x_scale) const -{ - float cur_extent = 0; - size_t char_count = text.length(); - - // handle simple cases - if ((pixel <= 0) || (char_count <= start_char)) - { - return start_char; - } - - CodepointMap::const_iterator pos, end = d_cp_map.end(); - - for (size_t c = start_char; c < char_count; ++c) - { - pos = d_cp_map.find(text[c]); - - if (pos != end) - { - cur_extent += (float)pos->second.d_horz_advance * x_scale; - - if (pixel < cur_extent) - { - return c; - } - - } - - } - - return char_count; -} - - -/************************************************************************* - Renders text on the display. Return number of lines output. -*************************************************************************/ -size_t Font::drawText(const String& text, const Rect& draw_area, float z, const Rect& clip_rect, TextFormatting fmt, const ColourRect& colours, float x_scale, float y_scale) const -{ - size_t thisCount; - size_t lineCount = 0; - - // Check for something that shouldn't happen but does - if ( !this ) - return 0; - - float y_base = draw_area.d_top + getBaseline(y_scale); - - Rect tmpDrawArea( - PixelAligned(draw_area.d_left), - PixelAligned(draw_area.d_top), - PixelAligned(draw_area.d_right), - PixelAligned(draw_area.d_bottom) - ); - - size_t lineStart = 0, lineEnd = 0; - String currLine; - - while (lineEnd < text.length()) - { - if ((lineEnd = text.find_first_of('\n', lineStart)) == String::npos) - { - lineEnd = text.length(); - } - - currLine = text.substr(lineStart, lineEnd - lineStart); - lineStart = lineEnd + 1; // +1 to skip \n char - - switch(fmt) - { - case LeftAligned: - drawTextLine(currLine, Vector3(tmpDrawArea.d_left, y_base, z), clip_rect, colours, x_scale, y_scale); - thisCount = 1; - y_base += getLineSpacing(y_scale); - break; - - case RightAligned: - drawTextLine(currLine, Vector3(tmpDrawArea.d_right - getTextExtent(currLine, x_scale), y_base, z), clip_rect, colours, x_scale, y_scale); - thisCount = 1; - y_base += getLineSpacing(y_scale); - break; - - case Centred: - drawTextLine(currLine, Vector3(PixelAligned(tmpDrawArea.d_left + ((tmpDrawArea.getWidth() - getTextExtent(currLine, x_scale)) / 2.0f)), y_base, z), clip_rect, colours, x_scale, y_scale); - thisCount = 1; - y_base += getLineSpacing(y_scale); - break; - - case Justified: - // new function in order to keep drawTextLine's signature unchanged - drawTextLineJustified(currLine, draw_area, Vector3(tmpDrawArea.d_left, y_base, z), clip_rect, colours, x_scale, y_scale); - thisCount = 1; - y_base += getLineSpacing(y_scale); - break; - - case WordWrapLeftAligned: - thisCount = drawWrappedText(currLine, tmpDrawArea, z, clip_rect, LeftAligned, colours, x_scale, y_scale); - tmpDrawArea.d_top += thisCount * getLineSpacing(y_scale); - break; - - case WordWrapRightAligned: - thisCount = drawWrappedText(currLine, tmpDrawArea, z, clip_rect, RightAligned, colours, x_scale, y_scale); - tmpDrawArea.d_top += thisCount * getLineSpacing(y_scale); - break; - - case WordWrapCentred: - thisCount = drawWrappedText(currLine, tmpDrawArea, z, clip_rect, Centred, colours, x_scale, y_scale); - tmpDrawArea.d_top += thisCount * getLineSpacing(y_scale); - break; - - case WordWrapJustified: - // no change needed - thisCount = drawWrappedText(currLine, tmpDrawArea, z, clip_rect, Justified, colours, x_scale, y_scale); - tmpDrawArea.d_top += thisCount * getLineSpacing(y_scale); - break; - - default: - throw InvalidRequestException((utf8*)"Font::drawText - Unknown or unsupported TextFormatting value specified."); - } - - lineCount += thisCount; - - } - - // should not return 0 - return ceguimax(lineCount, (size_t)1); -} - -/************************************************************************* - Return the required texture size required to store imagery for the - glyphs specified in 'glyph_set' -*************************************************************************/ -uint Font::getRequiredTextureSize(const String& glyph_set) -{ - TIMEUS startTime = GetTimeUs (); - - // Guess required size - int numPixels = d_avg_width * d_maxGlyphHeight * glyph_set.size (); - int size = static_cast < int > ( sqrt ( (float)numPixels ) / 80 * 100 ); - - // Make power of 2 - int targetlevel = 1; - while (size >>= 1) ++targetlevel; - size = std::max (32, 1 << targetlevel); - - // Try - while ( !utilFontGlyphSet( glyph_set, size, NULL, NULL ) ) - { - size *= 2; - } - - TIMEUS deltaTime = GetTimeUs () - startTime; - OutputDebugLine ( SString ( "[CEGUI] getRequiredTextureSize in %0.2fms", deltaTime / 1000.f ) ); - - return size; -} - -/************************************************************************* - Render a set of glyph images into the given memory buffer. - pixels will be in A8R8G8B8 format -*************************************************************************/ -void Font::createFontGlyphSet(const String& glyph_set, uint size, argb_t* buffer, Imageset* glyph_images ) -{ - TIMEUS startTime = GetTimeUs (); - - if ( !utilFontGlyphSet( glyph_set, size, buffer, glyph_images ) ) - { - OutputDebugLine ( SString ( "[CEGUI] Error - Could not fit font into texture of size %d", size ) ); - } - - TIMEUS deltaTime = GetTimeUs () - startTime; - OutputDebugLine ( SString ( "[CEGUI] createFontGlyphSet in %0.2fms", deltaTime / 1000.f ) ); -} - -void* Font::loadGlyph ( unsigned long glyphID, bool bCacheSize ) //Only use this when font isnt loaded yet -{ - FT_GlyphSlot glyph = d_impldat->fontFace->glyph; - if ( bCacheSize && !d_is_subfont && !FT_Get_Char_Index( d_impldat->fontFace, glyphID ) ) - { - return FontManager::getSingleton().getSubstituteFont()->loadGlyph ( glyphID, bCacheSize ); - } - else if (FT_Load_Char(d_impldat->fontFace, glyphID, FT_LOAD_RENDER | (d_antiAliased ? FT_LOAD_TARGET_NORMAL : FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO))) - { - // skip errors (but now we log them!) - std::stringstream err; - err << "Font::createFontGlyphSet - Failed to load glyph for codepoint: "; - err << static_cast(glyphID); - Logger::getSingleton().logEvent(err.str(), Errors); - - return NULL; - } - - if ( bCacheSize ) - { - // Record size info for this character - SCharSize item; - item.width = glyph->bitmap.width; - item.height = glyph->bitmap.rows; - item.offsetX = (float)(glyph->metrics.horiBearingX >> 6); - item.horz_advance = (float)(glyph->advance.x >> 6); - MapSet ( d_sizes_map, glyphID, item ); - SCharSize* pCharSize = MapFind ( d_sizes_map, glyphID ); - - d_total_width += pCharSize->width; - d_avg_width = d_total_width / d_sizes_map.size (); - } - else - { - //dassert ( pCharSize->width == glyph->bitmap.width && pCharSize->height == glyph->bitmap.rows ); - } - return (void*)glyph; -} - - -/************************************************************************* -// Use same code to calculate the texture size and draw to prevent incorrect sizes. -// Returns false if could not fit in the texture. -*************************************************************************/ -bool Font::utilFontGlyphSet(const String& glyph_set, uint size, argb_t* buffer, Imageset* glyph_images ) -{ - bool bCalcSizeOnly = ( buffer == NULL ); - - String imageName; - Rect rect; - Point offset; - - FT_GlyphSlot glyph = d_impldat->fontFace->glyph; - - d_max_bearingY = 0; - - size_t glyph_set_length = glyph_set.length(); - uint cur_x = 0; - uint cur_y = 0; - uint rows = 0; - - for (uint i = 0; i < glyph_set_length; ++i) - { - SCharSize* pCharSize = MapFind ( d_sizes_map, glyph_set[i] ); - - if ( !bCalcSizeOnly ) - { - //Check for repetitions - CodepointMap::const_iterator pos, end = d_cp_map.end(); - pos = d_cp_map.find(glyph_set[i]); - if (pos != end) - continue; - } - - if ( !bCalcSizeOnly || !pCharSize ) - { - glyph = (FT_GlyphSlot)loadGlyph ( glyph_set[i], pCharSize == NULL ); - if ( !glyph ) - continue; - pCharSize = MapFind ( d_sizes_map, glyph_set[i] ); - } - - if ( !pCharSize ) - continue; - - - // if this glyph is taller than all others so far, update height and re-calculate cur_y - if (pCharSize->height + InterGlyphPadSpace > d_maxGlyphHeight) - { - d_maxGlyphHeight = pCharSize->height + InterGlyphPadSpace; - cur_y = rows * d_maxGlyphHeight; - if ( cur_y + d_maxGlyphHeight >= size ) - return false; - } - - uint width = pCharSize->width + InterGlyphPadSpace; - - // see if we need to wrap to next row - if (cur_x + width >= size) - { - if ( width >= size ) - return false; - - cur_x = 0; - rows++; - cur_y += d_maxGlyphHeight; - dassert ( cur_y == rows * d_maxGlyphHeight ); - - if ( cur_y + d_maxGlyphHeight >= size ) - return false; - } - - if ( !bCalcSizeOnly ) - { - // calculate offset into buffer for this glyph - argb_t* dest_buff = buffer + (cur_y * size) + cur_x; - - // draw glyph into buffer - drawGlyphToBuffer((void*)glyph,dest_buff, size); - - // define Image on Imageset for this glyph to save re-rendering glyph later - imageName = glyph_set[i]; - rect.d_left = (float)cur_x; - rect.d_top = (float)cur_y; - rect.d_right = (float)(cur_x + width - InterGlyphPadSpace); - rect.d_bottom = (float)(cur_y + d_maxGlyphHeight - InterGlyphPadSpace); - - offset.d_x = (float)(glyph->metrics.horiBearingX >> 6); - offset.d_y = -(float)(glyph->metrics.horiBearingY >> 6); - glyph_images->defineImage(imageName, rect, offset, glyph_set[i], this); - - // // check and update maximum bearingY value - // if (static_cast(glyph->metrics.horiBearingY >> 6) > d_max_bearingY) - // { - // d_max_bearingY = static_cast(glyph->metrics.horiBearingY >> 6); - // } - - // create entry in code-point to Image map - glyphDat dat; - dat.d_image = &glyph_images->getImage(imageName); - const Image* image = dat.d_image; - dat.d_horz_advance = glyph->advance.x >> 6; - d_cp_map[glyph_set[i]] = dat; - } - - cur_x += width; - } - - return true; -} - - -/************************************************************************* - Return the required texture size required to store imagery for the - glyphs specified in by the inclusive range - [first_code_point, last_code_point] -*************************************************************************/ -uint Font::getRequiredTextureSize(utf32 first_code_point, utf32 last_code_point) -{ - String tmp; - - for (utf32 cp = first_code_point; cp <=last_code_point; ++cp) - { - tmp += cp; - } - - return getRequiredTextureSize(tmp); -} - - -/************************************************************************* - Copy the FreeType glyph bitmap into the given memory buffer -*************************************************************************/ -void Font::drawGlyphToBuffer(void* glyph, argb_t* buffer, uint buf_width) -{ - FT_GlyphSlot thisGlyph = (FT_GlyphSlot)glyph; - FT_Bitmap* glyph_bitmap = &thisGlyph->bitmap; - - for (int i = 0; i < glyph_bitmap->rows; ++i) - { - for (int j = 0; j < glyph_bitmap->width; ++j) - { - switch (glyph_bitmap->pixel_mode) - { - case FT_PIXEL_MODE_GRAY: - { - uchar* bytebuff = reinterpret_cast(&buffer[j]); - *bytebuff++ = 0xFF; - *bytebuff++ = 0xFF; - *bytebuff++ = 0xFF; - *bytebuff = glyph_bitmap->buffer[(i * glyph_bitmap->pitch) + j]; - } - break; - - case FT_PIXEL_MODE_MONO: - buffer[j] = ((glyph_bitmap->buffer[(i * glyph_bitmap->pitch) + j / 8] << (j % 8)) & 0x80) ? 0xFFFFFFFF : 0x00000000; - break; - - default: - throw InvalidRequestException((utf8*)"Font::drawGlyphToBuffer - The glyph could not be drawn because the pixel mode is unsupported."); - break; - } - - } - - buffer += buf_width; - } - -} - - -/************************************************************************* - draws wrapped text -*************************************************************************/ -size_t Font::drawWrappedText(const String& text, const Rect& draw_area, float z, const Rect& clip_rect, TextFormatting fmt, const ColourRect& colours, float x_scale, float y_scale) const -{ - size_t line_count = 0; - Rect dest_area(draw_area); - float wrap_width = draw_area.getWidth(); - - String whitespace = TextUtils::DefaultWhitespace; - String thisLine, thisWord; - size_t currpos = 0; - - // get first word. - currpos += getNextWord(text, currpos, thisLine); - - // while there are words left in the string... - while (String::npos != text.find_first_not_of(whitespace, currpos)) { - // get next word of the string... - currpos += getNextWord(text, currpos, thisWord); - - // if the new word would make the string too long - if ((getTextExtent(thisLine, x_scale) + getTextExtent(thisWord, x_scale)) > wrap_width) { - // output what we had until this new word - line_count += drawText(thisLine, dest_area, z, clip_rect, fmt, colours, x_scale, y_scale); - - // remove whitespace from next word - it will form start of next line - thisWord = thisWord.substr(thisWord.find_first_not_of(whitespace)); - - // reset for a new line. - thisLine.clear(); - - // update y co-ordinate for next line - dest_area.d_top += getLineSpacing(y_scale); - } - - // add the next word to the line - thisLine += thisWord; - } - - // Last line is left aligned - TextFormatting last_fmt = (fmt == Justified ? LeftAligned : fmt); - // output last bit of string - line_count += drawText(thisLine, dest_area, z, clip_rect, last_fmt, colours, x_scale, y_scale); - - return line_count; -} - - -/************************************************************************* - helper function for renderWrappedText to get next word of a string -*************************************************************************/ -size_t Font::getNextWord(const String& in_string, size_t start_idx, String& out_string) const -{ - out_string = TextUtils::getNextWord(in_string, start_idx, TextUtils::DefaultWrapDelimiters); - - return out_string.length(); -} - - -/************************************************************************* - Draw a line of text. No formatting is applied. -*************************************************************************/ -void Font::drawTextLine(const String& text, const Vector3& position, const Rect& clip_rect, const ColourRect& colours, float x_scale, float y_scale) const -{ - Vector3 cur_pos(position); - - float base_y = position.d_y; - - size_t char_count = text.length(); - CodepointMap::const_iterator pos, end = d_cp_map.end(); - - const_cast < Font* > ( this )->refreshStringForGlyphs ( text ); // Refresh our glyph set if there are new characters - - for (size_t c = 0; c < char_count; ++c) - { - pos = d_cp_map.find(text[c]); - - const Image* img; - float horz_advance; - - // Check subfont, or add holding character if not found - if (pos == end) - { - const CodepointMap& d_sub_cp_map = FontManager::getSingleton().getSubstituteFont()->getCodepointMap(); - CodepointMap::const_iterator pos_sub = d_sub_cp_map.find(text[c]); - if ( pos_sub == d_sub_cp_map.end() ) - { - if ( text[c] < 32 ) - continue; - - pos = d_cp_map.find('*'); - if (pos == end) - { - pos = d_cp_map.begin(); // Get first - if (pos == end) - continue; // empty? - } - img = pos->second.d_image; - horz_advance = (float)pos->second.d_horz_advance; - } - else - { - img = pos_sub->second.d_image; - horz_advance = (float)pos_sub->second.d_horz_advance; - } - } - else - { - img = pos->second.d_image; - horz_advance = (float)pos->second.d_horz_advance; - } - cur_pos.d_y = base_y - (img->getOffsetY() - img->getOffsetY() * y_scale); - Size sz(img->getWidth() * x_scale, img->getHeight() * y_scale); - img->draw(cur_pos, sz, clip_rect, colours); - cur_pos.d_x += horz_advance * x_scale; - - } -} - - -/************************************************************************* - Draw a justified line of text. -*************************************************************************/ -void Font::drawTextLineJustified(const String& text, const Rect& draw_area, const Vector3& position, const Rect& clip_rect, const ColourRect& colours, float x_scale, float y_scale) const -{ - Vector3 cur_pos(position); - - float base_y = position.d_y; - // Calculate the length difference between the justified text and the same text, left aligned - // This space has to be shared between the space characters of the line - float lost_space = getFormattedTextExtent(text, draw_area, Justified, x_scale) - getTextExtent(text, x_scale); - - size_t char_count = text.length(); - CodepointMap::const_iterator pos, end = d_cp_map.end(); - - // The number of spaces and tabs in the current line - uint space_count = 0; - size_t c; - for (c = 0; c < char_count; ++c) - if ((text[c] == ' ') || (text[c] == '\t')) ++space_count; - - // The width that must be added to each space character in order to transform the left aligned text in justified text - float shared_lost_space = 0.0; - if (space_count > 0) shared_lost_space = lost_space / (float)space_count; - - const_cast < Font* > ( this )->refreshStringForGlyphs ( text ); // Refresh our glyph set if there are new characters - - for (c = 0; c < char_count; ++c) - { - pos = d_cp_map.find(text[c]); - - if (pos != end) - { - const Image* img = pos->second.d_image; - cur_pos.d_y = base_y - (img->getOffsetY() - img->getOffsetY() * y_scale); - Size sz(img->getWidth() * x_scale, img->getHeight() * y_scale); - img->draw(cur_pos, sz, clip_rect, colours); - cur_pos.d_x += (float)pos->second.d_horz_advance * x_scale; - // That's where we adjust the size of each space character - if ((text[c] == ' ') || (text[c] == '\t')) cur_pos.d_x += shared_lost_space; - } - - } - -} - - -/************************************************************************* - Function to do real work of constructor -*************************************************************************/ -void Font::constructor_impl(const String& name, const String& fontname, const String& resourceGroup, uint size, uint flags, const String& glyph_set) -{ - ImagesetManager& ismgr = ImagesetManager::getSingleton(); - - // pull a-a setting from flags - d_antiAliased = (flags == NoAntiAlias) ? false : true; - d_is_subfont = false; - - d_imagesetName = name + "_auto_glyph_images_"; - - uint horzdpi = System::getSingleton().getRenderer()->getHorzScreenDPI(); - uint vertdpi = System::getSingleton().getRenderer()->getVertScreenDPI(); - String errMsg; - - System::getSingleton().getResourceProvider()->loadRawDataContainer(fontname, d_impldat->fontData, resourceGroup); - - // create face using input font - if (FT_New_Memory_Face(d_impldat->library, d_impldat->fontData.getDataPtr(), - (FT_Long)d_impldat->fontData.getSize(), 0, &d_impldat->fontFace) == 0) - { - // check that default Unicode character map is available - if (d_impldat->fontFace->charmap != NULL) - { - try - { - refreshStringForGlyphs(glyph_set); - d_name = name; - d_freetype = true; - createFontFromFT_Face(size, horzdpi, vertdpi); - return; - } - catch(...) - { - freeGlyphs(); - FT_Done_Face(d_impldat->fontFace); - d_freetype = false; - - // re-throw - throw; - } - - } - // missing Unicode character map - else - { - FT_Done_Face(d_impldat->fontFace); - d_freetype = false; - - errMsg = (utf8*)"Font::constructor_impl - The source font '" + fontname +"' does not have a Unicode charmap, and cannot be used."; - } - - } - // failed to create face (a problem with the font file?) - else - { - errMsg = (utf8*)"Font::constructor_impl - An error occurred while trying to create a FreeType face from source font '" + fontname + "'."; - } - - // cleanup image set we created here - freeGlyphs(); - - throw GenericException(errMsg); -} - - -/************************************************************************* - Load and complete construction of 'this' via an XML file -*************************************************************************/ -void Font::load(const String& filename, const String& resourceGroup) -{ - // unload old data - unload(); - - if (filename.empty() || (filename == (utf8*)"")) - { - throw InvalidRequestException((utf8*)"Font::load - Filename supplied for Font loading must be valid"); - } - - // create handler object - Font_xmlHandler handler(this); - - // do parse (which uses handler to create actual data) - try - { - System::getSingleton().getXMLParser()->parseXMLFile(handler, filename, FontSchemaName, resourceGroup); - } - catch(...) - { - unload(); - - Logger::getSingleton().logEvent("Font::load - loading of Font from file '" + filename +"' failed.", Errors); - throw; - } - -} - - -/************************************************************************* - Unload data associated with the font (font is then useless. - this is intended for cleanup). -*************************************************************************/ -void Font::unload(void) -{ - // cleanup Imageset if it's valid - freeGlyphs(); - - // cleanup FreeType face if this is a FreeType based font. - if (d_freetype) - { - FT_Done_Face(d_impldat->fontFace); - d_freetype = false; - } - - System::getSingleton().getResourceProvider()->unloadRawDataContainer(d_impldat->fontData); - -} - - -/************************************************************************* - Defines the initial set of code points on the font. (implementation). -*************************************************************************/ -void Font::setInitialFontGlyphs(const String& glyphset) -{ - // Ensure this is called first and once - assert ( d_glyphset_default.empty() && !glyphset.empty() ); - d_glyphset_default = glyphset; - d_glyph_images_default = addFontGlyphs( glyphset, "default" ); -} - - -/************************************************************************* - Defines the additional set of code points on the font. (implementation). -*************************************************************************/ -Imageset* Font::addFontGlyphs(const String& glyphset,const String& id) -{ - // Ensure this is not called before setInitialFontGlyphs - assert ( !d_glyphset_default.empty() ); - - // must be a font using the FreeType system - if (!d_freetype) - { - throw InvalidRequestException((utf8*)"Font::addFontGlyphs - operation not supported on bitmap based fonts."); - } - - uint texture_size = getRequiredTextureSize(glyphset); - - // check renderer can do a texture big enough - if (texture_size > System::getSingleton().getRenderer()->getMaxTextureSize()) - { - throw RendererException((utf8*)"Font::addFontGlyphs - operation requires a texture larger than the supported maximum."); - } - - // allocate memory buffer where we will define the imagery - argb_t* mem_buffer; - - try - { - mem_buffer = new argb_t[texture_size * texture_size]; - } - catch (std::bad_alloc) - { - throw MemoryException((utf8*)"Font::addFontGlyphs - failed to allocate required memory buffer."); - } - - // initialise background to transparent black. - memset(mem_buffer, 0, ((texture_size * texture_size) * sizeof(argb_t))); - - // create our fresh Imageset - ImagesetManager& ismgr = ImagesetManager::getSingleton(); - Imageset* glyph_images = ismgr.createImageset(d_imagesetName + id, System::getSingleton().getRenderer()->createTexture()); - - // render new glyphs and define Imageset images. - createFontGlyphSet(glyphset, texture_size, mem_buffer, glyph_images); - - // update Imageset texture with new imagery. - glyph_images->getTexture()->loadFromMemory(mem_buffer, texture_size, texture_size); - - delete[] mem_buffer; - - d_lineHeight = (float)d_maxGlyphHeight; - - // calculate spacing and base-line - d_max_bearingY = ((float)d_impldat->fontFace->ascender / (float)d_impldat->fontFace->units_per_EM) * (float)d_impldat->fontFace->size->metrics.y_ppem; - d_lineSpacing = ((float)d_impldat->fontFace->height / (float)d_impldat->fontFace->units_per_EM) * (float)d_impldat->fontFace->size->metrics.y_ppem; - - return glyph_images; -} - - -/************************************************************************* - Calculate the vertical spacing fields for a static / bitmap font -*************************************************************************/ -void Font::calculateStaticVertSpacing(void) -{ - if (!d_freetype) - { - float scale = d_autoScale ? d_vertScaling : 1.0f; - - d_lineHeight = 0; - d_max_bearingY = 0; - - CodepointMap::iterator pos = d_cp_map.begin(), end = d_cp_map.end(); - - for (;pos != end; ++pos) - { - const Image* img = pos->second.d_image; - - if (-img->getOffsetY() > d_max_bearingY) - d_max_bearingY = -img->getOffsetY(); - - if (img->getHeight() > d_lineHeight) - d_lineHeight = img->getHeight(); - } - - d_max_bearingY *= scale; - d_lineHeight *= scale; - d_lineSpacing = d_lineHeight; - d_maxGlyphHeight = static_cast(d_lineHeight); - } - -} - - -/************************************************************************* - Set the native resolution for this Font -*************************************************************************/ -void Font::setNativeResolution(const Size& size) -{ - d_nativeHorzRes = size.d_width; - d_nativeVertRes = size.d_height; - - // set native resolution for underlying imageset for bitmap fonts - if ((!d_freetype)) - { - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; iter++ ) - if ( iter->second.glyph_images ) - iter->second.glyph_images->setNativeResolution(size); - } - - // re-calculate scaling factors & notify images as required - notifyScreenResolution(System::getSingleton().getRenderer()->getSize()); -} - - -/************************************************************************* - Notify the Font of the current (usually new) display resolution. -*************************************************************************/ -void Font::notifyScreenResolution(const Size& size) -{ - // notification should come from System which would have notified the Imageset anyway, but - // in case client code decides to call us, we must pass on notification here too. - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; iter++ ) - if ( iter->second.glyph_images ) - iter->second.glyph_images->notifyScreenResolution(size); - - d_horzScaling = size.d_width / d_nativeHorzRes; - d_vertScaling = size.d_height / d_nativeVertRes; - - if (d_autoScale) - { - updateFontScaling(); - } - -} - - -/************************************************************************* - Enable or disable auto-scaling for this Font. -*************************************************************************/ -void Font::setAutoScalingEnabled(bool setting) -{ - if (setting != d_autoScale) - { - if ((!d_freetype)) - { - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; iter++ ) - if ( iter->second.glyph_images ) - iter->second.glyph_images->setAutoScalingEnabled(setting); - } - - d_autoScale = setting; - updateFontScaling(); - } - -} - - -/************************************************************************* - Update the font as required according to the current scaling -*************************************************************************/ -void Font::updateFontScaling(void) -{ - if (d_freetype) - { - uint hdpi = System::getSingleton().getRenderer()->getHorzScreenDPI(); - uint vdpi = System::getSingleton().getRenderer()->getVertScreenDPI(); - - createFontFromFT_Face(d_ptSize, hdpi, vdpi); - } - // bitmapped font - else - { - float hscale = d_autoScale ? d_horzScaling : 1.0f; - - // perform update on font mapping advance values - CodepointMap::iterator pos = d_cp_map.begin(), end = d_cp_map.end(); - for (; pos != end; ++pos) - { - pos->second.d_horz_advance = (uint)(((float)pos->second.d_horz_advance_unscaled) * hscale); - } - - // re-calculate height - calculateStaticVertSpacing(); - } - -} - - -/************************************************************************* - Set the size of the free-type font (via d_impldat->fontFace which should already - be setup) and render the glyphs in d_glyphset. -*************************************************************************/ -void Font::createFontFromFT_Face(uint size, uint horzDpi, uint vertDpi) -{ - if (d_autoScale) - { - horzDpi = (uint)(((float)horzDpi) * d_horzScaling); - vertDpi = (uint)(((float)vertDpi) * d_vertScaling); - } - - d_ptSize = size; - - if (FT_Set_Char_Size(d_impldat->fontFace, 0, d_ptSize * 64, horzDpi, vertDpi) == 0) - { - redrawGlyphCache(); // Needed when recreating the font-face - refreshStringForGlyphs(getAvailableGlyphs()); // Needed when creating the font face for the first time - } - // failed to set size for font - else - { - throw GenericException((utf8*)"Font::createFontFromFT_Face - An error occurred while creating a source font with the requested size."); - } - -} - - -/************************************************************************* - Return the number of lines the given text would be formatted to. -*************************************************************************/ -size_t Font::getFormattedLineCount(const String& text, const Rect& format_area, TextFormatting fmt, float x_scale) const -{ - // handle simple non-wrapped cases. - if ((fmt == LeftAligned) || (fmt == Centred) || (fmt == RightAligned) || (fmt == Justified)) - { - return std::count(text.begin(), text.end(), static_cast('\n')) + 1; - } - - // handle wraping cases - size_t lineStart = 0, lineEnd = 0; - String sourceLine; - - float wrap_width = format_area.getWidth(); - String whitespace = TextUtils::DefaultWhitespace; - String thisLine, thisWord; - size_t line_count = 0, currpos = 0; - - while (lineEnd < text.length()) - { - if ((lineEnd = text.find_first_of('\n', lineStart)) == String::npos) - { - lineEnd = text.length(); - } - - sourceLine = text.substr(lineStart, lineEnd - lineStart); - lineStart = lineEnd + 1; - - // get first word. - currpos = getNextWord(sourceLine, 0, thisLine); - - // while there are words left in the string... - while (String::npos != sourceLine.find_first_not_of(whitespace, currpos)) - { - // get next word of the string... - currpos += getNextWord(sourceLine, currpos, thisWord); - - // if the new word would make the string too long - if ((getTextExtent(thisLine, x_scale) + getTextExtent(thisWord, x_scale)) > wrap_width) - { - // too long, so that's another line of text - line_count++; - - // remove whitespace from next word - it will form start of next line - thisWord = thisWord.substr(thisWord.find_first_not_of(whitespace)); - - // reset for a new line. - thisLine.clear(); - } - - // add the next word to the line - thisLine += thisWord; - } - - // plus one for final line - line_count++; - } - - return line_count; -} - - -/************************************************************************* - Return whether this font is anti-aliased or not. -*************************************************************************/ -bool Font::isAntiAliased(void) const -{ - return d_freetype ? d_antiAliased : false; -} - - -/************************************************************************* - Set whether the font is anti-aliased or not. -*************************************************************************/ -void Font::setAntiAliased(bool setting) -{ - if (d_freetype && (d_antiAliased != setting)) - { - d_antiAliased = setting; - - // regenerate font - createFontFromFT_Face(d_ptSize, System::getSingleton().getRenderer()->getHorzScreenDPI(), System::getSingleton().getRenderer()->getVertScreenDPI()); - } - -} - - -/************************************************************************* - Return the horizontal pixel extent given text would be formatted to. -*************************************************************************/ -float Font::getFormattedTextExtent(const String& text, const Rect& format_area, TextFormatting fmt, float x_scale) const -{ - float lineWidth; - float widest = 0; - - size_t lineStart = 0, lineEnd = 0; - String currLine; - - while (lineEnd < text.length()) - { - if ((lineEnd = text.find_first_of('\n', lineStart)) == String::npos) - { - lineEnd = text.length(); - } - - currLine = text.substr(lineStart, lineEnd - lineStart); - lineStart = lineEnd + 1; // +1 to skip \n char - - switch(fmt) - { - case Centred: - case RightAligned: - case LeftAligned: - lineWidth = getTextExtent(currLine, x_scale); - break; - - case Justified: - // usually we use the width of the rect but we have to ensure the current line is not wider than that - lineWidth = ceguimax(format_area.getWidth(), getTextExtent(currLine, x_scale)); - break; - - case WordWrapLeftAligned: - case WordWrapRightAligned: - case WordWrapCentred: - lineWidth = getWrappedTextExtent(currLine, format_area.getWidth(), x_scale); - break; - - case WordWrapJustified: - // same as above - lineWidth = ceguimax(format_area.getWidth(), getWrappedTextExtent(currLine, format_area.getWidth(), x_scale)); - break; - - default: - throw InvalidRequestException((utf8*)"Font::getFormattedTextExtent - Unknown or unsupported TextFormatting value specified."); - } - - if (lineWidth > widest) - { - widest = lineWidth; - } - - } - - return widest; -} - - -/************************************************************************* - returns extent of widest line of wrapped text. -*************************************************************************/ -float Font::getWrappedTextExtent(const String& text, float wrapWidth, float x_scale) const -{ - String whitespace = TextUtils::DefaultWhitespace; - String thisWord; - size_t currpos; - float lineWidth, wordWidth; - float widest = 0; - - // get first word. - currpos = getNextWord(text, 0, thisWord); - lineWidth = getTextExtent(thisWord, x_scale); - - // while there are words left in the string... - while (String::npos != text.find_first_not_of(whitespace, currpos)) { - // get next word of the string... - currpos += getNextWord(text, currpos, thisWord); - wordWidth = getTextExtent(thisWord, x_scale); - - // if the new word would make the string too long - if ((lineWidth + wordWidth) > wrapWidth) { - - if (lineWidth > widest) - { - widest = lineWidth; - } - - // remove whitespace from next word - it will form start of next line - thisWord = thisWord.substr(thisWord.find_first_not_of(whitespace)); - wordWidth = getTextExtent(thisWord, x_scale); - - // reset for a new line. - lineWidth = 0; - } - - // add the next word to the line - lineWidth += wordWidth; - } - - if (lineWidth > widest) - { - widest = lineWidth; - } - - return widest; -} - -/************************************************************************* - Glyph <-> PageId helpers -*************************************************************************/ -static uint GlyphToGlyphPageId ( ulong ulGlyph ) -{ - return ( ulGlyph & ~0x7F ); -} - -static ulong GlyphPageIdFirstGlyph ( uint uiPageId ) -{ - return uiPageId; -} - -static ulong GlyphPageIdLastGlyph ( uint uiPageId ) -{ - return uiPageId + 0x7F; -} - -/************************************************************************* - Erase all pages and imagesets for the font -*************************************************************************/ -void Font::freeGlyphs ( void ) -{ - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; ) - { - if ( iter->second.glyph_images ) - { - ImagesetManager::getSingleton().destroyImageset(iter->second.glyph_images); - iter->second.glyph_images = NULL; - } - d_GlyphPageInfoMap.erase ( iter++ ); - } - d_cp_map.clear(); -WriteDebugEvent("All glyphs freed"); -} - -void Font::freeGlyphPage ( uint uiPage ) -{ - std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.find(uiPage); - if ( iter->second.glyph_images ) - { - ImagesetManager::getSingleton().destroyImageset(iter->second.glyph_images); - iter->second.glyph_images = NULL; - } - ulong ulFirst = GlyphPageIdFirstGlyph ( iter->first ); - ulong ulLast = GlyphPageIdLastGlyph ( iter->first ); - for ( ulong i = ulFirst ; i <= ulLast ; i++ ) - { - d_cp_map.erase(i); - } -} - -/************************************************************************* - Return a String object that contains the code-points that the font - is currently configured to render. -*************************************************************************/ -const String Font::getAvailableGlyphs(void) const -{ - String glyphset = d_glyphset_default; - for ( std::map < uint, GlyphPageInfo >::const_iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; iter++ ) - { - if ( !iter->second.bWaitingToBeDeleted && !iter->second.bWaitingToBeAdded ) - { - ulong ulFirst = GlyphPageIdFirstGlyph ( iter->first ); - ulong ulLast = GlyphPageIdLastGlyph ( iter->first ); - for ( ulong i = ulFirst ; i <= ulLast ; i++ ) - { - glyphset += (CEGUI::utf32)i; - } - } - } - return glyphset; -} - - -/************************************************************************* - Find an existing cache page for the glyph -*************************************************************************/ -GlyphPageInfo* Font::findGlyphPageInfo ( ulong ulGlyph, bool bScanSubFont ) -{ - uint uiPageId = GlyphToGlyphPageId ( ulGlyph ); - const GlyphPageInfo* pInfo = MapFind ( d_GlyphPageInfoMap, uiPageId ); - if ( !pInfo && !d_is_subfont && bScanSubFont ) - // Try checking our substitute font for this page - pInfo = MapFind ( FontManager::getSingleton().getSubstituteFont()->getPageInfoMap(), uiPageId ); - - return const_cast(pInfo); -} - - -/************************************************************************* - Add a cache page for the glyph -*************************************************************************/ -GlyphPageInfo* Font::addGlyphPageInfo ( ulong ulGlyph ) -{ - uint uiPageId = GlyphToGlyphPageId ( ulGlyph ); - OutputDebugLine ( SString ( "[CEGUI] Adding glyph page 0x%08x (glyph: 0x%08x)", uiPageId, ulGlyph ) ); - return &MapGet ( d_GlyphPageInfoMap, uiPageId ); -} - - -/************************************************************************* - Keep the glyph in the cache -*************************************************************************/ -void Font::refreshCachedGlyph ( unsigned long ulGlyph ) -{ - GlyphPageInfo* pInfo = findGlyphPageInfo ( ulGlyph, true ); - if ( pInfo ) - pInfo->uiLastUsedTime = d_uiLastPulseTime; -} - - -/************************************************************************* - Add/keep the glyph in the cache -*************************************************************************/ -GlyphPageInfo* Font::insertGlyphToCache ( unsigned long ulGlyph ) -{ - if ( ulGlyph < 128 ) - return NULL; - - GlyphPageInfo* pInfo = findGlyphPageInfo ( ulGlyph ); - if ( !pInfo ) - { - // If the glyph exists in this font, we'll load the codepage. Otherwise we get the sub font to do it - if (!d_is_subfont && !FT_Get_Char_Index( d_impldat->fontFace, ulGlyph ) ) - pInfo = FontManager::getSingleton().getSubstituteFont()->insertGlyphToCache(ulGlyph); - else - { - pInfo = addGlyphPageInfo ( ulGlyph ); - pInfo->bWaitingToBeAdded = true; - d_bAddedGlyphPage = true; - } - } - pInfo->uiLastUsedTime = d_uiLastPulseTime; - return pInfo; -} - - -/************************************************************************* - Add/keep the glyphs in the cache -*************************************************************************/ -void Font::refreshStringForGlyphs ( const String& text ) -{ - if ( d_glyphset_default.empty() ) - return; - - size_t char_count = text.length(); - for (size_t c = 0; c < char_count; ++c) - { - insertGlyphToCache(text[c]); - } -} - - -/************************************************************************* - Add/keep the glyphs in the cache. Rebuild the font if cache was added to. -*************************************************************************/ -void Font::insertStringForGlyphs ( const String& text ) -{ - if ( d_glyphset_default.empty() ) - return; - - size_t char_count = text.length(); - for (size_t c = 0; c < char_count; ++c) - { - insertGlyphToCache(text[c]); - } - - if ( needsRebuild () ) - rebuild (); -} - - -/************************************************************************* - Update cache timer -*************************************************************************/ -void Font::pulse ( void ) -{ - if ( System::getSingleton().isStarted() ) - d_uiLastPulseTime = clock() / CLOCKS_PER_SEC; -} - -/************************************************************************* - Returns true if font needs rebuilding -*************************************************************************/ -bool Font::needsRebuild ( void ) -{ - // Only start defining glyphs once the system is started, and we've built up a substantial cache - return System::getSingleton().isStarted() && d_bAddedGlyphPage; -} - -/************************************************************************* - Called when the renderer has no cached images from this font, - so will speed up rebuiling. -*************************************************************************/ -void Font::onClearRenderList ( void ) -{ - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; ) - { - if ( iter->second.bWaitingToBeDeleted ) - { - std::stringstream ss; - ss << iter->first; - - TIMEUS startTime = GetTimeUs (); - freeGlyphPage(iter->first); - TIMEUS deltaTime = GetTimeUs () - startTime; - OutputDebugLine ( SString ( "[CEGUI] destroyImageset in %0.2fms", deltaTime / 1000.f ) ); - Logger::getSingleton().logEvent("Unloaded glyph page " + ss.str() + " for Font '" + d_name + "'"); - d_GlyphPageInfoMap.erase ( iter++ ); - } - else if ( iter->second.bWaitingToBeRedrawn ) - { - ImagesetManager::getSingleton().destroyImageset(iter->second.glyph_images); - iter->second.glyph_images = NULL; - iter->second.bWaitingToBeAdded = true; - iter++; - } - else - ++iter; - } - - if ( needsRebuild () ) - rebuild (); -} - -/************************************************************************* - Rebuild font if required -*************************************************************************/ -void Font::redrawGlyphCache ( void ) -{ - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; iter++ ) - if ( iter->second.glyph_images ) - iter->second.bWaitingToBeRedrawn = true; - - d_bAddedGlyphPage = false; -} - -/************************************************************************* - Rebuild font if required -*************************************************************************/ -void Font::rebuild ( void ) -{ - if ( !needsRebuild () ) - return; - - // Make glyphset - for ( std::map < uint, GlyphPageInfo >::iterator iter = d_GlyphPageInfoMap.begin () ; iter != d_GlyphPageInfoMap.end () ; iter++ ) - { - if ( iter->second.bWaitingToBeAdded ) - { - String glyphset; - ulong ulFirst = GlyphPageIdFirstGlyph ( iter->first ); - ulong ulLast = GlyphPageIdLastGlyph ( iter->first ); - for ( ulong i = ulFirst ; i <= ulLast ; i++ ) - { - glyphset += (CEGUI::utf32)i; - } - - std::stringstream ss; - ss << iter->first; - - TIMEUS startTime = GetTimeUs (); - iter->second.glyph_images = addFontGlyphs(glyphset,ss.str()); - TIMEUS deltaTime = GetTimeUs () - startTime; - OutputDebugLine ( SString ( "[CEGUI] Made font with %d characters in %0.2fms", glyphset.size (), deltaTime / 1000.f ) ); - Logger::getSingleton().logEvent("Loaded glyph page " + ss.str() + " for Font '" + d_name + "'"); - iter->second.bWaitingToBeAdded = false; - } - else if ( ( d_uiLastPulseTime - iter->second.uiLastUsedTime ) > CACHE_TIMEOUT ) //If outdated, add to our erase list - if ( iter->second.glyph_images ) - iter->second.bWaitingToBeDeleted = true; - } - d_bAddedGlyphPage = false; -} - - -/************************************************************************* - Return the point size of a dynamic (ttf based) font. -*************************************************************************/ -uint Font::getPointSize(void) const -{ - if (d_freetype) - { - return d_ptSize; - } - else - { - throw InvalidRequestException("Font::getPointSize - unable to return point size for a static (bitmap based) font."); - } -} - - -/************************************************************************* - Writes an xml representation of this Font to \a out_stream. -*************************************************************************/ -void Font::writeXMLToStream(OutStream& out_stream) const -{ - // output starting element - out_stream << "(d_nativeHorzRes) << "\" "; - - if (d_nativeVertRes != DefaultNativeVertRes) - out_stream << "NativeVertRes=\"" << static_cast(d_nativeVertRes) << "\" "; - - if (d_autoScale) - out_stream << "AutoScaled=\"True\" "; - - out_stream << ">" << std::endl; -/* - // dynamic font so output defined glyphs - if (d_freetype) - { - size_t start = 0, idx = 0; - - while(start < d_glyphset.length()) - { - // find end of range - while ((idx + 1 < d_glyphset.length()) && (d_glyphset[idx] + 1 == d_glyphset[idx + 1])) - ++idx; - - if (start == idx) - // if range is a just a single codepoint - out_stream << "" << std::endl; - else - // range contains >1 codepoint - out_stream << "" << std::endl; - - start = ++idx; - } - } - // static font, so output glyph to imageset mappings - else - { - for (CodepointMap::const_iterator iter = d_cp_map.begin(); iter != d_cp_map.end(); ++iter) - { - out_stream << "getName() << "\" "; - - if ((*iter).second.d_horz_advance_unscaled != -1) - out_stream << "HorzAdvance=\"" << (*iter).second.d_horz_advance_unscaled << "\" "; - - out_stream << "/>" << std::endl; - } - }*/ - - // output closing element. - out_stream << "" << std::endl; -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIFontManager.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIFontManager.cpp deleted file mode 100644 index c1ed115371..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIFontManager.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/************************************************************************ - filename: CEGUIFontManager.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the FontManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIFontManager.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" -#include "CEGUIFont.h" -#include "CEGUIFontManager_implData.h" -#include "CEGUIFont_implData.h" -#include "CEGUISystem.h" - -#include -#include FT_FREETYPE_H - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> FontManager* Singleton::ms_Singleton = NULL; - - - -/************************************************************************* - constructor -*************************************************************************/ -FontManager::FontManager(void) -{ - d_implData = new FontManagerImplData; - d_subfntdata = new Font::FontImplData(d_implData->d_ftlib); - - if (FT_Init_FreeType(&d_implData->d_ftlib)) - { - throw GenericException((utf8*)"FontManager::FontManager - Failed to initialise the FreeType library."); - } - - Logger::getSingleton().logEvent((utf8*)"CEGUI::FontManager singleton created."); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -FontManager::~FontManager(void) -{ - Logger::getSingleton().logEvent((utf8*)"---- Begining cleanup of Font system ----"); - destroyAllFonts(); - -#if 0 // Crash - System::getSingleton().getResourceProvider()->unloadRawDataContainer(d_subfntdata->fontData); - FT_Done_Face(d_subfntdata->fontFace); - delete d_subfntdata; -#endif - - FT_Done_FreeType(d_implData->d_ftlib); - delete d_implData; - - Logger::getSingleton().logEvent((utf8*)"CEGUI::FontManager singleton destroyed."); -} - - -/************************************************************************* - Create a font from a definition file -*************************************************************************/ -Font* FontManager::createFont(const String& filename, const String& resourceGroup) -{ - Logger::getSingleton().logEvent((utf8*)"Attempting to create Font from the information specified in file '" + filename + "'."); - - Font* temp = new Font(filename, resourceGroup, new Font::FontImplData(d_implData->d_ftlib)); - - String name = temp->getName(); - - if (isFontPresent(name)) - { - delete temp; - - throw AlreadyExistsException((utf8*)"FontManager::createFont - A font named '" + name + "' already exists."); - } - - d_fonts[name] = temp; - - // if this was the first font created, set it as the default font - if (d_fonts.size() == 1) - { - System::getSingleton().setDefaultFont(temp); - } - - return temp; -} - - -/************************************************************************* - Create a font from an installed OS font -*************************************************************************/ -Font* FontManager::createFont(const String& name, const String& fontname, uint size, uint flags, bool bAutoScale, float fNativeResX, float fNativeResY, const String& resourceGroup) -{ - char strbuf[16]; - sprintf(strbuf, "%d", size); - Logger::getSingleton().logEvent((utf8*)"Attempting to create Font '" + name + "' using the font file '" + fontname + "' and a size of " + strbuf + "."); - - // first ensure name uniqueness - if (isFontPresent(name)) - { - throw AlreadyExistsException((utf8*)"FontManager::createFont - A font named '" + name + "' already exists."); - } - - Font* temp = new Font(name, fontname, resourceGroup, size, flags, new Font::FontImplData(d_implData->d_ftlib), bAutoScale, fNativeResX, fNativeResY ); - d_fonts[name] = temp; - - // if this was the first font created, set it as the default font - if (d_fonts.size() == 1) - { - System::getSingleton().setDefaultFont(temp); - } - - return temp; -} - - -/************************************************************************* - Destroy the named font -*************************************************************************/ -void FontManager::destroyFont(const String& name) -{ - FontRegistry::iterator pos = d_fonts.find(name); - - if (pos != d_fonts.end()) - { - String tmpName(name); - - delete pos->second; - d_fonts.erase(pos); - - Logger::getSingleton().logEvent((utf8*)"Font '" + tmpName +"' has been destroyed."); - } - -} - - -/************************************************************************* - Destroys the given Font object -*************************************************************************/ -void FontManager::destroyFont(Font* font) -{ - if (font != NULL) - { - destroyFont(font->getName()); - } - -} - - -/************************************************************************* - Destroys all Font objects registered in the system -*************************************************************************/ -void FontManager::destroyAllFonts(void) -{ - while (!d_fonts.empty()) - { - destroyFont(d_fonts.begin()->first); - } - -} - - -/************************************************************************* - Check to see if a font is available -*************************************************************************/ -bool FontManager::isFontPresent(const String& name) const -{ - return (d_fonts.find(name) != d_fonts.end()); -} - - -/************************************************************************* - Return a pointer to the named font -*************************************************************************/ -Font* FontManager::getFont(const String& name) const -{ - FontRegistry::const_iterator pos = d_fonts.find(name); - - if (pos == d_fonts.end()) - { - throw UnknownObjectException("FontManager::getFont - A Font object with the specified name '" + name +"' does not exist within the system"); - } - - return pos->second; -} - - -/************************************************************************* - Notify the FontManager of the current (usually new) display - resolution. -*************************************************************************/ -void FontManager::notifyScreenResolution(const Size& size) -{ - // notify all attached Font objects of the change in resolution - FontRegistry::iterator pos = d_fonts.begin(), end = d_fonts.end(); - - for (; pos != end; ++pos) - { - pos->second->notifyScreenResolution(size); - } - -} - - -FontManager& FontManager::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -FontManager* FontManager::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - - -/************************************************************************* - Return a FontManager::FontIterator object to iterate over the - available Font objects. -*************************************************************************/ -FontManager::FontIterator FontManager::getIterator(void) const -{ - return FontIterator(d_fonts.begin(), d_fonts.end()); -} - - -void FontManager::writeFontToStream(const String& name, OutStream& out_stream) const -{ - const Font* font = getFont(name); - - // output xml header - out_stream << "" << std::endl; - - // output font data - font->writeXMLToStream(out_stream); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIFont_xmlHandler.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIFont_xmlHandler.cpp deleted file mode 100644 index 1ffbcdc5c1..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIFont_xmlHandler.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/************************************************************************ -filename: CEGUIFont.cpp -created: 21/2/2004 -author: Paul D Turner - -purpose: Implements Font class -*************************************************************************/ -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIFont_xmlHandler.h" - -#include "CEGUIExceptions.h" -#include "CEGUIImageset.h" -#include "CEGUILogger.h" -#include "CEGUIXMLAttributes.h" - -#include -#include FT_FREETYPE_H - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -static data definitions -*************************************************************************/ - -// XML related strings -const String Font_xmlHandler::FontElement( (utf8*)"Font" ); -const String Font_xmlHandler::MappingElement( (utf8*)"Mapping" ); -const String Font_xmlHandler::FontTypeStatic( (utf8*)"Static" ); -const String Font_xmlHandler::FontTypeDynamic( (utf8*)"Dynamic" ); -const String Font_xmlHandler::GlyphElement( (utf8*)"Glyph" ); -const String Font_xmlHandler::GlyphRangeElement( (utf8*)"GlyphRange" ); -const String Font_xmlHandler::GlyphSetElement( (utf8*)"GlyphSet" ); -const char Font_xmlHandler::FontNameAttribute[] = "Name"; -const char Font_xmlHandler::FontFilenameAttribute[] = "Filename"; -const char Font_xmlHandler::FontResourceGroupAttribute[] = "ResourceGroup"; -const char Font_xmlHandler::FontTypeAttribute[] = "Type"; -const char Font_xmlHandler::FontSizeAttribute[] = "Size"; -const char Font_xmlHandler::FontFirstCodepointAttribute[] = "FirstCodepoint"; -const char Font_xmlHandler::FontLastCodepointAttribute[] = "LastCodepoint"; -const char Font_xmlHandler::FontNativeHorzResAttribute[] = "NativeHorzRes"; -const char Font_xmlHandler::FontNativeVertResAttribute[] = "NativeVertRes"; -const char Font_xmlHandler::FontAutoScaledAttribute[] = "AutoScaled"; -const char Font_xmlHandler::FontAntiAliasedAttribute[] = "AntiAlias"; -const char Font_xmlHandler::MappingCodepointAttribute[] = "Codepoint"; -const char Font_xmlHandler::MappingImageAttribute[] = "Image"; -const char Font_xmlHandler::MappingHorzAdvanceAttribute[] = "HorzAdvance"; -const char Font_xmlHandler::GlyphCodepointAttribute[] = "Codepoint"; -const char Font_xmlHandler::GlyphRangeStartCodepointAttribute[] = "StartCodepoint"; -const char Font_xmlHandler::GlyphRangeEndCodepointAttribute[] = "EndCodepoint"; -const char Font_xmlHandler::GlyphSetGlyphsAttribute[] = "Glyphs"; - -// General constants -const int Font_xmlHandler::AutoGenerateHorzAdvance = -1; - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -/************************************************************************* -SAX2 Handler methods -*************************************************************************/ -void Font_xmlHandler::elementStart(const String& element, const XMLAttributes& attributes) -{ - // handle a Mapping element - if (element == MappingElement) - { - if (!d_font->d_freetype) - { - String image_name(attributes.getValueAsString(MappingImageAttribute)); - utf32 codepoint = (utf32)attributes.getValueAsInteger(MappingCodepointAttribute); - int horzAdvance = attributes.getValueAsInteger(MappingHorzAdvanceAttribute, -1); - - Font::glyphDat mapDat; - // Disable this for now - // mapDat.d_image = &d_font->d_glyph_images->getImage(image_name); - - // calculate advance width if it was not specified - if (horzAdvance == AutoGenerateHorzAdvance) - { - //horzAdvance = (int)(mapDat.d_image->getWidth() + mapDat.d_image->getOffsetX()); - } - - mapDat.d_horz_advance_unscaled = horzAdvance; - mapDat.d_horz_advance = (uint)(((float)horzAdvance) * (d_font->d_autoScale ? d_font->d_horzScaling : 1.0f)); - d_font->d_cp_map[codepoint] = mapDat; - } - else - { - Logger::getSingleton().logEvent((utf8*)"Mapping element encountered. This element is invalid for dynamic fonts.", Informative); - } - } - // handle root Font element - else if (element == FontElement) - { - // get name of font we are creating - String font_name(attributes.getValueAsString(FontNameAttribute)); - - // get filename for the font - String filename(attributes.getValueAsString(FontFilenameAttribute)); - // get resource group for font file. - String resourceGroup(attributes.getValueAsString(FontResourceGroupAttribute)); - - Logger::getSingleton().logEvent("Started creation of Font '" + font_name + "' via XML file.", Informative); - - // - // load auto-scaling configuration - // - float hres, vres; - bool auto_scale; - - // get native horizontal resolution - hres = (float)attributes.getValueAsInteger(FontNativeHorzResAttribute, 640); - - // get native vertical resolution - vres = (float)attributes.getValueAsInteger(FontNativeVertResAttribute, 480); - - // get auto-scaling setting - auto_scale = attributes.getValueAsBool(FontAutoScaledAttribute, false); - - // - // get type of font - // - String font_type(attributes.getValueAsString(FontTypeAttribute)); - - // dynamic (ttf) font - if (font_type == FontTypeDynamic) - { - // get size of font - uint size = (uint)attributes.getValueAsInteger(FontSizeAttribute, 12); - - // extract codepoint range - utf32 first_codepoint = (utf32)attributes.getValueAsInteger(FontFirstCodepointAttribute, 32); - utf32 last_codepoint = (utf32)attributes.getValueAsInteger(FontLastCodepointAttribute, 127); - - // build string containing the required code-points. - for (;first_codepoint <= last_codepoint; ++first_codepoint) - { - d_glyphSet += first_codepoint; - } - - uint flags = attributes.getValueAsBool(FontAntiAliasedAttribute, true) ? 0 : NoAntiAlias; - - // perform pre-initialisation - d_font->setNativeResolution(Size(hres, vres)); - d_font->setAutoScalingEnabled(auto_scale); - - // Finalise construction of font without glyphs. - // Glyphs will defined after we know which ones we need. - d_font->constructor_impl(font_name, filename, resourceGroup, size, flags, String("")); - } - // static (Imageset based) font - else if (font_type == FontTypeStatic) - { - d_font->d_name = font_name; - d_font->d_freetype = false; - - // load the Imageset - //d_font->d_glyph_images = ImagesetManager::getSingleton().createImageset(filename, resourceGroup); - - d_font->setNativeResolution(Size(hres, vres)); - d_font->setAutoScalingEnabled(auto_scale); - } - // error (should never happen) - else - { - throw FileIOException("Font::xmlHandler::startElement - The unknown Font:Type attribute value '" + font_type + "' was encountered while processing the Font file."); - } - - d_font->d_sourceFilename = filename; - } - // Glyph element - else if (element == GlyphElement) - { - if (d_font->d_freetype) - { - utf32 codepoint = (utf32)attributes.getValueAsInteger(GlyphCodepointAttribute); - - if (d_glyphSet.find(codepoint) == String::npos) - { - d_glyphSet.append(1, codepoint); - } - } - else - { - Logger::getSingleton().logEvent((utf8*)"Glyph element encountered. This element is invalid for static fonts.", Informative); - } - } - // GlyphRange element - else if (element == GlyphRangeElement) - { - if (d_font->d_freetype) - { - utf32 start = (utf32)attributes.getValueAsInteger(GlyphRangeStartCodepointAttribute); - utf32 end = (utf32)attributes.getValueAsInteger(GlyphRangeEndCodepointAttribute); - - for (utf32 codepoint = start; codepoint <= end; ++codepoint) - { - if (d_glyphSet.find(codepoint) == String::npos) - { - d_glyphSet.append(1, codepoint); - } - } - - } - else - { - Logger::getSingleton().logEvent((utf8*)"GlyphRange element encountered. This element is invalid for static fonts.", Informative); - } - } - // GlyphSet element - else if (element == GlyphSetElement) - { - if (d_font->d_freetype) - { - String glyphs(attributes.getValueAsString(GlyphSetGlyphsAttribute)); - - for (String::size_type i = 0; i < glyphs.length(); ++i) - { - utf32 codepoint = glyphs[i]; - - if (d_glyphSet.find(codepoint) == String::npos) - { - d_glyphSet.append(1, codepoint); - } - - } - - } - else - { - Logger::getSingleton().logEvent((utf8*)"GlyphSet element encountered. This element is invalid for static fonts.", Informative); - } - } - // anything else is an error which *should* have already been caught by XML validation - else - { - throw FileIOException("Font::xmlHandler::startElement - Unexpected data was found while parsing the Font file: '" + element + "' is unknown."); - } - -} - -void Font_xmlHandler::elementEnd(const String& element) -{ - if (element == FontElement) - { - // if this is a freetype based font, perform glyph definition - if (d_font->d_freetype) - { - //d_font->defineFontGlyphs(d_glyphSet); - } - - Logger::getSingleton().logEvent("Finished creation of Font '" + d_font->d_name + "' via XML file.", Informative); - } - -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIGUILayout_xmlHandler.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIGUILayout_xmlHandler.cpp deleted file mode 100644 index 04e06c1afa..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIGUILayout_xmlHandler.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/************************************************************************ - filename: CEGUIGUILayout_xmlHandler.cpp - created: 5/7/2004 - author: Paul D Turner - - purpose: Implements XML parser for GUILayout files -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIGUILayout_xmlHandler.h" -#include "CEGUIExceptions.h" -#include "CEGUISystem.h" -#include "CEGUIScriptModule.h" -#include "CEGUIXMLAttributes.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Implementation Constants -*************************************************************************/ -const String GUILayout_xmlHandler::GUILayoutElement( (utf8*)"GUILayout" ); -const String GUILayout_xmlHandler::WindowElement( (utf8*)"Window" ); -const String GUILayout_xmlHandler::PropertyElement( (utf8*)"Property" ); -const String GUILayout_xmlHandler::LayoutImportElement( (utf8*)"LayoutImport" ); -const String GUILayout_xmlHandler::EventElement( (utf8*)"Event" ); -const char GUILayout_xmlHandler::WindowTypeAttribute[] = "Type"; -const char GUILayout_xmlHandler::WindowNameAttribute[] = "Name"; -const char GUILayout_xmlHandler::PropertyNameAttribute[] = "Name"; -const char GUILayout_xmlHandler::PropertyValueAttribute[] = "Value"; -const char GUILayout_xmlHandler::LayoutParentAttribute[] = "Parent"; -const char GUILayout_xmlHandler::LayoutImportFilenameAttribute[] = "Filename"; -const char GUILayout_xmlHandler::LayoutImportPrefixAttribute[] = "Prefix"; -const char GUILayout_xmlHandler::LayoutImportResourceGroupAttribute[] = "ResourceGroup"; -const char GUILayout_xmlHandler::EventNameAttribute[] = "Name"; -const char GUILayout_xmlHandler::EventFunctionAttribute[] = "Function"; - -void GUILayout_xmlHandler::elementStart(const String& element, const XMLAttributes& attributes) -{ - // handle root GUILayoutElement element - if (element == GUILayoutElement) - { - d_layoutParent = attributes.getValueAsString(LayoutParentAttribute); - - // before we go to the trouble of creating the layout, see if this parent exists - if (!d_layoutParent.empty()) - { - if (!WindowManager::getSingleton().isWindowPresent(d_layoutParent)) - { - // signal error - with more info about what we have done. - throw InvalidRequestException((utf8*)"GUILayout_xmlHandler::startElement - layout loading has been aborted since the specified parent Window ('" + d_layoutParent + "') does not exist."); - } - - } - - } - // handle Window element (create window and make an entry on our "window stack") - else if (element == WindowElement) - { - // get type of window to create - String windowType(attributes.getValueAsString(WindowTypeAttribute)); - - // get name for new window - String windowName(attributes.getValueAsString(WindowNameAttribute)); - - // attempt to create window - try - { - Window* wnd = WindowManager::getSingleton().createWindow(windowType, d_namingPrefix + windowName); - - // add this window to the current parent (if any) - if (!d_stack.empty()) - { - d_stack.back()->addChildWindow(wnd); - } - else - { - d_root = wnd; - } - - // make this window the top of the stack - d_stack.push_back(wnd); - } - catch (AlreadyExistsException exc) - { - // delete all windows created - cleanupLoadedWindows(); - - // signal error - with more info about what we have done. - throw InvalidRequestException((utf8*)"GUILayout_xmlHandler::startElement - layout loading has been aborted since Window named '" + windowName + "' already exists."); - } - catch (UnknownObjectException exc) - { - // delete all windows created - cleanupLoadedWindows(); - - // signal error - with more info about what we have done. - throw InvalidRequestException((utf8*)"GUILayout_xmlHandler::startElement - layout loading has been aborted since no WindowFactory is available for '" + windowType + "' objects."); - } - - } - // handle Property element (set property for window at top of stack) - else if (element == PropertyElement) - { - // get property name - String propertyName(attributes.getValueAsString(PropertyNameAttribute)); - - // get property value string - String propertyValue(attributes.getValueAsString(PropertyValueAttribute)); - - // attempt to set property on window - try - { - if (!d_stack.empty()) - { - Window* curwindow = d_stack.back(); - bool useit = true; - if (NULL != d_propertyCallback) - { - useit = (*d_propertyCallback)(curwindow, propertyName, propertyValue, d_userData); - } - if (useit) - { - curwindow->setProperty(propertyName, propertyValue); - } - } - } - catch (Exception exc) - { - // Don't do anything here, but the error will have been logged. - } - - } - // handle layout import element (attach a layout to the window at the top of the stack) - else if (element == LayoutImportElement) - { - // build prefix to use for loading imported layout - String prefixName(d_namingPrefix); - prefixName += attributes.getValueAsString(LayoutImportPrefixAttribute); - - try - { - // attempt to load the imported sub-layout - Window* subLayout = WindowManager::getSingleton().loadWindowLayout( - attributes.getValueAsString( LayoutImportFilenameAttribute), - prefixName, - attributes.getValueAsString(LayoutImportResourceGroupAttribute), - d_propertyCallback, - d_userData); - - // Attach loaded sub-layout to appropriate window within this layout - if ((subLayout != NULL) && (!d_stack.empty())) - d_stack.back()->addChildWindow(subLayout); - } - // something failed when loading the sub-layout - catch (Exception& /*exc*/) - { - // delete all windows created so far - cleanupLoadedWindows(); - - // signal error - with more info about what we have done. - throw GenericException("GUILayout_xmlHandler::startElement - layout loading aborted due to imported layout load failure (see error(s) above)."); - } - } - // handle event subscription element - else if (element == EventElement) - { - String eventName(attributes.getValueAsString(EventNameAttribute)); - String functionName(attributes.getValueAsString(EventFunctionAttribute)); - - // attempt to subscribe property on window - try - { - if (!d_stack.empty()) - { - d_stack.back()->subscribeEvent(eventName, ScriptFunctor(functionName)); - } - } - catch (Exception exc) - { - // Don't do anything here, but the error will have been logged. - } - - } - // anything else is an error which *should* have already been caught by XML validation - else - { - throw FileIOException("GUILayout_xmlHandler::startElement - Unexpected data was found while parsing the gui-layout file: '" + element + "' is unknown."); - } - -} - -void GUILayout_xmlHandler::elementEnd(const String& element) -{ - // handle root GUILayoutElement element - if (element == GUILayoutElement) - { - // attach to named parent if needed - if (!d_layoutParent.empty() && (d_root != NULL)) - { - WindowManager::getSingleton().getWindow(d_layoutParent)->addChildWindow(d_root); - } - - } - // handle Window element - else if (element == WindowElement) - { - // pop a window from the window stack - if (!d_stack.empty()) - { - d_stack.pop_back(); - } - - } - -} - - -/************************************************************************* - Destroy all windows created so far. -*************************************************************************/ -void GUILayout_xmlHandler::cleanupLoadedWindows(void) -{ - // Notes: We could just destroy the root window of the layout, which normally would also destroy - // all attached windows. Since the client may have specified that certain windows are not auto-destroyed - // we can't rely on this, so we work backwards detaching and deleting windows instead. - while (!d_stack.empty()) - { - Window* wnd = d_stack.back(); - - // detach from parent - if (wnd->getParent() != NULL) - { - wnd->getParent()->removeChildWindow(wnd); - } - - // destroy the window - WindowManager::getSingleton().destroyWindow(wnd); - - // pop window from stack - d_stack.pop_back(); - } - - d_root = NULL; -} - - -/************************************************************************* - Return a pointer to the 'root' window created. -*************************************************************************/ -Window* GUILayout_xmlHandler::getLayoutRootWindow(void) const -{ - return d_root; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIGlobalEventSet.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIGlobalEventSet.cpp deleted file mode 100644 index 0ca28da54f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIGlobalEventSet.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/************************************************************************ - filename: CEGUIGlobalEventSet.cpp - created: 16/1/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIGlobalEventSet.h" -#include "CEGUILogger.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - /************************************************************************* - Static Data Definitions - *************************************************************************/ - // singleton instance pointer - template<> GlobalEventSet* Singleton::ms_Singleton = NULL; - - /************************************************************************* - GlobalEventSet constructor. - *************************************************************************/ - GlobalEventSet::GlobalEventSet() - { - Logger::getSingleton().logEvent("CEGUI::GlobalEventSet singleton created."); - } - - /************************************************************************* - GlobalEventSet destructor. - *************************************************************************/ - GlobalEventSet::~GlobalEventSet() - { - Logger::getSingleton().logEvent("CEGUI::GlobalEventSet singleton destroyed."); - } - - /************************************************************************* - Return singleton object - *************************************************************************/ - GlobalEventSet& GlobalEventSet::getSingleton(void) - { - return Singleton::getSingleton(); - } - - /************************************************************************* - Return singleton pointer - *************************************************************************/ - GlobalEventSet* GlobalEventSet::getSingletonPtr(void) - { - return Singleton::getSingletonPtr(); - } - - /************************************************************************* - Overridden subscribeEvent which always succeeds. - *************************************************************************/ - Event::Connection GlobalEventSet::subscribeEvent(const String& name, Event::Subscriber subscriber) - { - EventMap::iterator pos = d_events.find(name); - - // if event did not exist, add it and then find it. - if (pos == d_events.end()) - { - Logger::getSingleton().logEvent("Adding event '" + name + "' to GlobalEventSet.", Informative); - addEvent(name); - pos = d_events.find(name); - } - - // do the actual subscription - return pos->second->subscribe(subscriber); - } - - /************************************************************************* - Overridden subscribeEvent (with group) which always succeeds. - *************************************************************************/ - Event::Connection GlobalEventSet::subscribeEvent(const String& name, Event::Group group, Event::Subscriber subscriber) - { - EventMap::iterator pos = d_events.find(name); - - // if event did not exist, add it and then find it. - if (pos == d_events.end()) - { - addEvent(name); - pos = d_events.find(name); - } - - // do subscription with group - return pos->second->subscribe(group, subscriber); - } - - /************************************************************************* - Overridden fireEvent which always succeeds. - *************************************************************************/ - void GlobalEventSet::fireEvent(const String& name, EventArgs& args, const String& eventNamespace) - { - EventMap::iterator pos = d_events.find(eventNamespace + "/" + name); - - // do nothing if the event does not exist - if (pos != d_events.end()) - { - // fire the event - if (!d_muted) - { - (*pos->second)(args); - } - - } - - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIImage.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIImage.cpp deleted file mode 100644 index 13c8121436..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIImage.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/************************************************************************ - filename: CEGUIImage.cpp - created: 13/3/2004 - author: Paul D Turner - - purpose: Implementation of Image class members -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIImage.h" -#include "CEGUIExceptions.h" -#include "CEGUITexture.h" -#include "CEGUIImageset.h" -#include "CEGUIRenderer.h" -#include "CEGUIPropertyHelper.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Constructor -*************************************************************************/ -Image::Image(const Imageset* owner, const String& name, const Rect& area, const Point& render_offset, float horzScaling, float vertScaling, unsigned long ulCodepoint, Font* pFont ) : - d_owner(owner), - d_area(area), - d_offset(render_offset), - d_name(name), - d_codepoint(ulCodepoint), - d_font(pFont) -{ - if (d_owner == NULL) - { - throw NullObjectException((utf8*)"Image::Image - Imageset pointer passed to Image constructor must not be null."); - } - // setup initial image scaling - setHorzScaling(horzScaling); - setVertScaling(vertScaling); - - // TODO: if we ever store texture co-ordinates, they should be calculated here. -} - -/************************************************************************* - Copy constructor -*************************************************************************/ -Image::Image(const Image& image) : - d_owner(image.d_owner), - d_area(image.d_area), - d_offset(image.d_offset), - d_scaledWidth(image.d_scaledWidth), - d_scaledHeight(image.d_scaledHeight), - d_scaledOffset(image.d_scaledOffset), - d_name(image.d_name), - d_codepoint(image.d_codepoint), - d_font(image.d_font) -{ -} - -/************************************************************************* - destructor -*************************************************************************/ -Image::~Image(void) -{ - System::getSingleton().getRenderer ()->NotifyImageInvalid ( this ); -} - - -/************************************************************************* - set the horizontal scaling factor to be applied to this Image -*************************************************************************/ -void Image::setHorzScaling(float factor) -{ - d_scaledWidth = PixelAligned(d_area.getWidth() * factor); - d_scaledOffset.d_x = PixelAligned(d_offset.d_x * factor); -} - - -/************************************************************************* - set the vertical scaling factor to be applied to this Image -*************************************************************************/ -void Image::setVertScaling(float factor) -{ - d_scaledHeight = PixelAligned(d_area.getHeight() * factor); - d_scaledOffset.d_y = PixelAligned(d_offset.d_y * factor); -} - - -/************************************************************************* - Clip and then queue the image to be rendered. -*************************************************************************/ -void Image::draw(const Rect& dest_rect, float z, const Rect& clip_rect, const ColourRect& colours, QuadSplitMode quad_split_mode) const -{ - Rect dest(dest_rect); - - // apply rendering offset to the destination Rect - dest.offset(d_scaledOffset); - - // draw - d_owner->draw(d_area, dest, z, clip_rect, colours, quad_split_mode, this ); -} - - -/************************************************************************* - String object containing the name of this Image -*************************************************************************/ -const String& Image::getName(void) const -{ - return d_name; -} - - -/************************************************************************* - Return the name of the Imageset that contains this Image -*************************************************************************/ -const String& Image::getImagesetName(void) const -{ - return d_owner->getName(); -} - -/************************************************************************* - Return Rect describing the source texture area used by this Image. -*************************************************************************/ -const Rect& Image::getSourceTextureArea(void) const -{ - return d_area; -} - -/************************************************************************* - Sets Rect describing the source texture area used by this Image. - !!! ADDED BY MTA !!! -*************************************************************************/ -void Image::setSourceTextureArea(const Rect& area) -{ - d_area = area; -} - - -/************************************************************************* - Output XML element for this image -*************************************************************************/ -void Image::writeXMLToStream(OutStream& out_stream) const -{ - out_stream << "(d_area.d_left)) << "\" "; - out_stream << "YPos=\"" << PropertyHelper::uintToString(static_cast(d_area.d_top)) << "\" "; - out_stream << "Width=\"" << PropertyHelper::uintToString(static_cast(d_area.getWidth())) << "\" "; - out_stream << "Height=\"" << PropertyHelper::uintToString(static_cast(d_area.getHeight())) << "\" "; - - if (d_offset.d_x != 0.0f) - out_stream << "XOffset=\"" << PropertyHelper::intToString(static_cast(d_offset.d_x)) << "\" "; - - if (d_offset.d_y != 0.0f) - out_stream << "YOffset=\"" << PropertyHelper::intToString(static_cast(d_offset.d_x)) << "\" "; - - out_stream << "/>" << std::endl; -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIImageset.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIImageset.cpp deleted file mode 100644 index 5eef88671f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIImageset.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/************************************************************************ - filename: CEGUIImageset.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the Imageset class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIImageset.h" -#include "CEGUIExceptions.h" -#include "CEGUITexture.h" -#include "CEGUIRenderer.h" -#include "CEGUISystem.h" -#include "CEGUIImageset_xmlHandler.h" -#include "CEGUILogger.h" -#include "CEGUIDataContainer.h" -#include "CEGUIXMLParser.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Definition of constant data for Imageset (and sub-classes) -*************************************************************************/ -// Declared in Imageset -const char Imageset::ImagesetSchemaName[] = "Imageset.xsd"; - - -/************************************************************************* - constructor -*************************************************************************/ -Imageset::Imageset(const String& name, Texture* texture, bool bDestroyTextureManagedExternally) : - d_name(name), - d_texture(texture), - d_bDestroyTextureManagedExternally(bDestroyTextureManagedExternally) -{ - if (d_texture == NULL) - { - throw NullObjectException((utf8*)"Imageset::Imageset - Texture object supplied for Imageset creation must not be NULL"); - } - - // defaults for scaling options - d_autoScale = false; - setNativeResolution(Size(DefaultNativeHorzRes, DefaultNativeVertRes)); -} - - -/************************************************************************* - construct and initialise Imageset from the specified file. -*************************************************************************/ -Imageset::Imageset(const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally) : - d_bDestroyTextureManagedExternally(bDestroyTextureManagedExternally) -{ - // defaults for scaling options - d_autoScale = false; - setNativeResolution(Size(DefaultNativeHorzRes, DefaultNativeVertRes)); - - d_texture = NULL; - load(filename, resourceGroup); -} - - -Imageset::Imageset(const String& name, const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally) : - d_name(name), - d_bDestroyTextureManagedExternally(bDestroyTextureManagedExternally) -{ - // try to load the image file using the renderer - d_texture = - System::getSingleton().getRenderer()->createTexture(filename, resourceGroup); - - // initialse the auto-scaling for this Imageset - d_autoScale = true; - setNativeResolution( - Size(d_texture->getWidth(), d_texture->getHeight())); - - // define the default image for this Imageset - defineImage( - "full_image", - Rect(0, 0, d_texture->getWidth(), d_texture->getHeight()), - Point(0, 0) - ); -} - - -/************************************************************************* - destructor -*************************************************************************/ -Imageset::~Imageset(void) -{ - unload(); -} - - -/************************************************************************* - Set texture for use by this imageset object -*************************************************************************/ -void Imageset::setTexture(Texture* texture) -{ - if (d_texture == NULL) - { - throw NullObjectException((utf8*)"Imageset::setTexture - Texture object supplied for Imageset creation must not be NULL"); - } - - d_texture = texture; -} - - -/************************************************************************* - load Imageset data from the specified file -*************************************************************************/ -void Imageset::load(const String& filename, const String& resourceGroup) -{ - // unload old data and texture. - unload(); - - if (filename.empty() || (filename == (utf8*)"")) - { - throw InvalidRequestException((utf8*)"Imageset::load - Filename supplied for Imageset loading must be valid"); - } - - // create handler object - Imageset_xmlHandler handler(this); - - // do parse (which uses handler to create actual data) - try - { - System::getSingleton().getXMLParser()->parseXMLFile(handler, filename, ImagesetSchemaName, resourceGroup); - } - catch(...) - { - unload(); - - Logger::getSingleton().logEvent("Imageset::load - loading of Imageset from file '" + filename +"' failed.", Errors); - throw; - } - -} - - -/************************************************************************* - return the Image object for the named image -*************************************************************************/ -const Image& Imageset::getImage(const String& name) const -{ - ImageRegistry::const_iterator pos = d_images.find(name); - - if (pos == d_images.end()) - { - throw UnknownObjectException("Imageset::getImage - The Image named '" + name + "' could not be found in Imageset '" + d_name + "'."); - } - - return pos->second; -} - - -/************************************************************************* - defines a new Image. -*************************************************************************/ -void Imageset::defineImage(const String& name, const Rect& image_rect, const Point& render_offset, unsigned long ulCodepoint, Font* pFont ) -{ - if (isImageDefined(name)) - { - throw AlreadyExistsException("Imageset::defineImage - An image with the name '" + name + "' already exists in Imageset '" + d_name + "'."); - } - - // get scaling factors - float hscale = d_autoScale ? d_horzScaling : 1.0f; - float vscale = d_autoScale ? d_vertScaling : 1.0f; - - // add the Image definition - d_images[name] = Image(this, name, image_rect, render_offset, hscale, vscale, ulCodepoint, pFont ); - - CEGUI_LOGINSANE("Image '" + name + "' has been defined for Imageset '" + d_name + "'.") -} - - -/************************************************************************* - Queues an area of the associated Texture the be drawn on the screen. - Low-level routine not normally used! -*************************************************************************/ -void Imageset::draw(const Rect& source_rect, const Rect& dest_rect, float z, const Rect& clip_rect,const ColourRect& colours, QuadSplitMode quad_split_mode, const Image* image ) const -{ - // get the rect area that we will actually draw to (i.e. perform clipping) - Rect final_rect(dest_rect.getIntersection(clip_rect)); - - // check if rect was totally clipped - if (final_rect.getWidth() != 0) - { - // Check for somthing that shouldn't happen but does - if ( !d_texture ) - return; - - float x_scale = 1.0f / (float)d_texture->getWidth(); - float y_scale = 1.0f / (float)d_texture->getHeight(); - - float tex_per_pix_x = source_rect.getWidth() / dest_rect.getWidth(); - float tex_per_pix_y = source_rect.getHeight() / dest_rect.getHeight(); - - // calculate final, clipped, texture co-ordinates - Rect tex_rect((source_rect.d_left + ((final_rect.d_left - dest_rect.d_left) * tex_per_pix_x)) * x_scale, - (source_rect.d_top + ((final_rect.d_top - dest_rect.d_top) * tex_per_pix_y)) * y_scale, - (source_rect.d_right + ((final_rect.d_right - dest_rect.d_right) * tex_per_pix_x)) * x_scale, - (source_rect.d_bottom + ((final_rect.d_bottom - dest_rect.d_bottom) * tex_per_pix_y)) * y_scale); - - final_rect.d_left = PixelAligned(final_rect.d_left); - final_rect.d_right = PixelAligned(final_rect.d_right); - final_rect.d_top = PixelAligned(final_rect.d_top); - final_rect.d_bottom = PixelAligned(final_rect.d_bottom); - - // queue a quad to be rendered - d_texture->getRenderer()->addQuad(final_rect, z, d_texture, tex_rect, colours, quad_split_mode,image); - } - -} - -/************************************************************************* - Unload all data, leaving Imageset in a clean (but unusable) state -*************************************************************************/ -void Imageset::unload(void) -{ - undefineAllImages(); - - // cleanup texture - // MTA destroys textures manually - if ( !d_bDestroyTextureManagedExternally ) - System::getSingleton().getRenderer()->destroyTexture(d_texture); - d_texture = NULL; -} - - -/************************************************************************* - Sets the scaling factor for all Images that are a part of this Imageset. -*************************************************************************/ -void Imageset::updateImageScalingFactors(void) -{ - float hscale, vscale; - - if (d_autoScale) - { - hscale = d_horzScaling; - vscale = d_vertScaling; - } - else - { - hscale = vscale = 1.0f; - } - - ImageRegistry::iterator pos = d_images.begin(), end = d_images.end(); - for(; pos != end; ++pos) - { - pos->second.setHorzScaling(hscale); - pos->second.setVertScaling(vscale); - } - -} - - -/************************************************************************* - Enable or disable auto-scaling for this Imageset. -*************************************************************************/ -void Imageset::setAutoScalingEnabled(bool setting) -{ - if (setting != d_autoScale) - { - d_autoScale = setting; - updateImageScalingFactors(); - } - -} - - -/************************************************************************* - Set the native resolution for this Imageset -*************************************************************************/ -void Imageset::setNativeResolution(const Size& size) -{ - d_nativeHorzRes = size.d_width; - d_nativeVertRes = size.d_height; - - // re-calculate scaling factors & notify images as required - notifyScreenResolution(System::getSingleton().getRenderer()->getSize()); -} - - -/************************************************************************* - Notify the Imageset of the current (usually new) display resolution. -*************************************************************************/ -void Imageset::notifyScreenResolution(const Size& size) -{ - d_horzScaling = size.d_width / d_nativeHorzRes; - d_vertScaling = size.d_height / d_nativeVertRes; - - if (d_autoScale) - { - updateImageScalingFactors(); - } - -} - -void Imageset::writeXMLToStream(OutStream& out_stream) const -{ - // output opening tag - out_stream << "(d_nativeHorzRes) << "\" "; - - if (d_nativeVertRes != DefaultNativeVertRes) - out_stream << "NativeVertRes=\"" << static_cast(d_nativeVertRes) << "\" "; - - if (d_autoScale) - out_stream << "AutoScaled=\"True\" "; - - out_stream << ">" << std::endl; - - // output images - ImageIterator image = getIterator(); - - while (!image.isAtEnd()) - { - image.getCurrentValue().writeXMLToStream(out_stream); - ++image; - } - - // output closing tag - out_stream << "" << std::endl; -} - - -/************************************************************************* - Return an iterator object that can be used to iterate over the Image - objects in the Imageset. -*************************************************************************/ -Imageset::ImageIterator Imageset::getIterator(void) const -{ - return ImageIterator(d_images.begin(), d_images.end()); -} - - -void Imageset::undefineImage(const String& name) -{ - d_images.erase(name); - - CEGUI_LOGINSANE("Image '" + name + "' has been removed from Imageset '" + d_name + "'.") -} - - -void Imageset::undefineAllImages(void) -{ - d_images.clear(); - - CEGUI_LOGINSANE("All images have been removed from Imageset '" + d_name + "'.") -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIImagesetManager.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIImagesetManager.cpp deleted file mode 100644 index f4d021fd1f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIImagesetManager.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/************************************************************************ - filename: CEGUIImagesetManager.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the ImagesetManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" -#include "CEGUIImageset.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> ImagesetManager* Singleton::ms_Singleton = NULL; - - -/************************************************************************* - Constructor -*************************************************************************/ -ImagesetManager::ImagesetManager(void) -{ - Logger::getSingleton().logEvent((utf8*)"CEGUI::ImagesetManager singleton created"); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -ImagesetManager::~ImagesetManager(void) -{ - Logger::getSingleton().logEvent((utf8*)"---- Begining cleanup of Imageset system ----"); - - destroyAllImagesets(); - - Logger::getSingleton().logEvent((utf8*)"CEGUI::ImagesetManager singleton destroyed"); -} - - -/************************************************************************* - Create an empty Imageset that has the given name and uses the - given Texture -*************************************************************************/ -Imageset* ImagesetManager::createImageset(const String& name, Texture* texture, bool bDestroyTextureManagedExternally) -{ - Logger::getSingleton().logEvent((utf8*)"Attempting to create Imageset '" + name +"' with texture only."); - - if (isImagesetPresent(name)) - { - throw AlreadyExistsException("ImagesetManager::createImageset - An Imageset object named '" + name + "' already exists."); - } - - Imageset* temp = new Imageset(name, texture, bDestroyTextureManagedExternally); - d_imagesets[name] = temp; - - return temp; -} - - -/************************************************************************* - Create an Imageset object from the specified file -*************************************************************************/ -Imageset* ImagesetManager::createImageset(const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally) -{ - Logger::getSingleton().logEvent((utf8*)"Attempting to create an Imageset from the information specified in file '" + filename + "'."); - - Imageset* temp = new Imageset(filename, resourceGroup, bDestroyTextureManagedExternally); - - String name = temp->getName(); - - if (isImagesetPresent(name)) - { - delete temp; - - throw AlreadyExistsException("ImagesetManager::createImageset - An Imageset object named '" + name + "' already exists."); - } - - d_imagesets[name] = temp; - - return temp; -} - - -/************************************************************************* - Create an Imageset object from the specified image file. -*************************************************************************/ -Imageset* ImagesetManager::createImagesetFromImageFile(const String& name, const String& filename, const String& resourceGroup, bool bDestroyTextureManagedExternally) -{ - Logger::getSingleton().logEvent((utf8*)"Attempting to create Imageset '" + name + "' using image file '" + filename + "'."); - - if (isImagesetPresent(name)) - { - throw AlreadyExistsException("ImagesetManager::createImageset - An Imageset object named '" + name + "' already exists."); - } - - Imageset* temp = new Imageset(name, filename, resourceGroup, bDestroyTextureManagedExternally); - d_imagesets[name] = temp; - - return temp; -} - - -/************************************************************************* - Destroys the Imageset with the specified name -*************************************************************************/ -void ImagesetManager::destroyImageset(const String& name) -{ - ImagesetRegistry::iterator pos = d_imagesets.find(name); - - if (pos != d_imagesets.end()) - { - String tmpName(name); - - delete pos->second; - d_imagesets.erase(pos); - - Logger::getSingleton().logEvent((utf8*)"Imageset '" + tmpName +"' has been destroyed.", Informative); - } - -} - - -/************************************************************************* - Destroys the given Imageset object -*************************************************************************/ -void ImagesetManager::destroyImageset(Imageset* imageset) -{ - if (imageset != NULL) - { - destroyImageset(imageset->getName()); - } - -} - - -/************************************************************************* - Destroy all Imageset objects -*************************************************************************/ -void ImagesetManager::destroyAllImagesets(void) -{ - while (!d_imagesets.empty()) - { - destroyImageset(d_imagesets.begin()->first); - } -} - -/************************************************************************* - Returns a pointer to the Imageset object with the specified name -*************************************************************************/ -Imageset* ImagesetManager::getImageset(const String& name) const -{ - ImagesetRegistry::const_iterator pos = d_imagesets.find(name); - - if (pos == d_imagesets.end()) - { - throw UnknownObjectException("ImagesetManager::getImageset - No Imageset named '" + name + "' is present in the system."); - } - - return pos->second; -} - - -/************************************************************************* - Notify the ImagesetManager of the current (usually new) display - resolution. -*************************************************************************/ -void ImagesetManager::notifyScreenResolution(const Size& size) -{ - // notify all attached Imageset objects of the change in resolution - ImagesetRegistry::iterator pos = d_imagesets.begin(), end = d_imagesets.end(); - - for (; pos != end; ++pos) - { - pos->second->notifyScreenResolution(size); - } - -} - - -ImagesetManager& ImagesetManager::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -ImagesetManager* ImagesetManager::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - - -/************************************************************************* - Return a ImagesetManager::ImagesetIterator object to iterate over - the available Imageset objects. -*************************************************************************/ -ImagesetManager::ImagesetIterator ImagesetManager::getIterator(void) const -{ - return ImagesetIterator(d_imagesets.begin(), d_imagesets.end()); -} - - -void ImagesetManager::writeImagesetToStream(const String& imageset, OutStream& out_stream) const -{ - const Imageset* iset = getImageset(imageset); - - // output xml header - out_stream << "" << std::endl; - - // output imageset data - iset->writeXMLToStream(out_stream); -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIImageset_xmlHandler.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIImageset_xmlHandler.cpp deleted file mode 100644 index 1b6f14e4ca..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIImageset_xmlHandler.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/************************************************************************ -filename: CEGUIImageset_xmlHandler.cpp -created: 21/2/2004 -author: Paul D Turner - -purpose: Implements the Imageset class -*************************************************************************/ -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIImageset_xmlHandler.h" - -#include "CEGUIExceptions.h" -#include "CEGUISystem.h" -#include "CEGUILogger.h" -#include "CEGUIXMLAttributes.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -Definition of constant data for Imageset (and sub-classes) -*************************************************************************/ -// Declared in Imageset::xmlHandler -const String Imageset_xmlHandler::ImagesetElement( (utf8*)"Imageset" ); -const String Imageset_xmlHandler::ImageElement( (utf8*)"Image" ); -const char Imageset_xmlHandler::ImagesetImageFileAttribute[] = "Imagefile"; -const char Imageset_xmlHandler::ImagesetResourceGroupAttribute[] = "ResourceGroup"; -const char Imageset_xmlHandler::ImagesetNameAttribute[] = "Name"; -const char Imageset_xmlHandler::ImagesetNativeHorzResAttribute[] = "NativeHorzRes"; -const char Imageset_xmlHandler::ImagesetNativeVertResAttribute[] = "NativeVertRes"; -const char Imageset_xmlHandler::ImagesetAutoScaledAttribute[] = "AutoScaled"; -const char Imageset_xmlHandler::ImageNameAttribute[] = "Name"; -const char Imageset_xmlHandler::ImageXPosAttribute[] = "XPos"; -const char Imageset_xmlHandler::ImageYPosAttribute[] = "YPos"; -const char Imageset_xmlHandler::ImageWidthAttribute[] = "Width"; -const char Imageset_xmlHandler::ImageHeightAttribute[] = "Height"; -const char Imageset_xmlHandler::ImageXOffsetAttribute[] = "XOffset"; -const char Imageset_xmlHandler::ImageYOffsetAttribute[] = "YOffset"; - -/************************************************************************* -SAX2 Handler methods -*************************************************************************/ -void Imageset_xmlHandler::elementStart(const String& element, const XMLAttributes& attributes) -{ - // handle an Image element (extract all element attributes and use data to define an Image for the Imageset) - if (element == ImageElement) - { - String name(attributes.getValueAsString(ImageNameAttribute)); - - Rect rect; - rect.d_left = (float)attributes.getValueAsInteger(ImageXPosAttribute); - rect.d_top = (float)attributes.getValueAsInteger(ImageYPosAttribute); - rect.setWidth((float)attributes.getValueAsInteger(ImageWidthAttribute)); - rect.setHeight((float)attributes.getValueAsInteger(ImageHeightAttribute)); - - Point offset; - offset.d_x = (float)attributes.getValueAsInteger(ImageXOffsetAttribute, 0); - offset.d_y = (float)attributes.getValueAsInteger(ImageYOffsetAttribute, 0); - - d_imageset->defineImage(name, rect, offset); - } - // handle root Imageset element - else if (element == ImagesetElement) - { - d_imageset->d_name = attributes.getValueAsString(ImagesetNameAttribute); - - Logger::getSingleton().logEvent("Started creation of Imageset '" + d_imageset->d_name + "' via XML file.", Informative); - - // - // load auto-scaling configuration - // - float hres, vres; - - // get native horizontal resolution - hres = (float)attributes.getValueAsInteger(ImagesetNativeHorzResAttribute, 640); - - // get native vertical resolution - vres = (float)attributes.getValueAsInteger(ImagesetNativeVertResAttribute, 480); - - d_imageset->setNativeResolution(Size(hres, vres)); - - // enable / disable auto-scaling for this Imageset according to the setting - d_imageset->setAutoScalingEnabled(attributes.getValueAsBool(ImagesetAutoScaledAttribute, false)); - - // - // Create a Texture object via the specified filename, and set it as the texture for the Imageset - // - String filename(attributes.getValueAsString(ImagesetImageFileAttribute)); - String resourceGroup(attributes.getValueAsString(ImagesetResourceGroupAttribute)); - - try - { - d_imageset->d_texture = System::getSingleton().getRenderer()->createTexture(filename, resourceGroup); - } - catch(...) - { - throw RendererException((utf8*)"Imageset::xmlHandler::startElement - An unexpected error occurred while creating a Texture object from file '" + filename + "'"); - } - - d_imageset->d_textureFilename = filename; - } - // anything else is an error which *should* have already been caught by XML validation - else - { - throw FileIOException("Imageset::xmlHandler::startElement - Unexpected data was found while parsing the Imageset file: '" + element + "' is unknown."); - } - -} - -void Imageset_xmlHandler::elementEnd(const String& element) -{ - if (element == ImagesetElement) - { - Logger::getSingleton().logEvent("Finished creation of Imageset '" + d_imageset->d_name + "' via XML file.", Informative); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUILogger.cpp b/vendor/cegui-0.4.0-custom/src/CEGUILogger.cpp deleted file mode 100644 index 4e019abf8d..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUILogger.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/************************************************************************ - filename: CEGUILogger.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implementation of the Logger class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUILogger.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - /************************************************************************* - Static Data Definitions - *************************************************************************/ - // singleton instance pointer - template<> Logger* Singleton::ms_Singleton = NULL; - - - /************************************************************************* - Constructor - *************************************************************************/ - Logger::Logger(void) : - d_level(Standard), - d_caching(true), - d_pDuplicateLineFilter(new CDuplicateLineFilter(4, 60)) - { - // create log header - logEvent("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); - logEvent("+ Crazy Eddie's GUI System - Event log +"); - logEvent("+ (http://www.cegui.org.uk/) +"); - logEvent("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); - logEvent("CEGUI::Logger singleton created."); - } - - /************************************************************************* - Destructor - *************************************************************************/ - Logger::~Logger(void) - { - if (d_ostream.is_open()) - { - logEvent((utf8*)"CEGUI::Logger singleton destroyed."); - d_pDuplicateLineFilter->Flush(); - updateLogOutput(); - d_ostream.close(); - } - delete d_pDuplicateLineFilter; - } - - /************************************************************************* - Logs an event - *************************************************************************/ - void Logger::logEvent(const String& message, LoggingLevel level /* = Standard */) - { - // Early out if not relevant - if ( d_level < level && !d_caching ) - return; - d_pDuplicateLineFilter->AddLine({message, level}); - updateLogOutput(); - } - - // Handle duplicate lines - void Logger::updateLogOutput() - { - SLoggingLine line; - while (d_pDuplicateLineFilter->PopOutputLine(line)) - { - logEventInternal(line.message, line.level); - } - } - - void Logger::logEventInternal(const String& message, LoggingLevel level) - { - using namespace std; - time_t et; - time(&et); - tm* etm = localtime(&et); - - if (etm != NULL) - { - // clear sting stream - d_workstream.str(""); - - // write date - d_workstream << setfill('0') << setw(2) << etm->tm_mday << '/' << - setfill('0') << setw(2) << 1 + etm->tm_mon << '/' << - setw(4) << (1900 + etm->tm_year) << ' '; - - // wite time - d_workstream << setfill('0') << setw(2) << etm->tm_hour << ':' << - setfill('0') << setw(2) << etm->tm_min << ':' << - setfill('0') << setw(2) << etm->tm_sec << ' '; - - // write event type code - switch(level) - { - case Errors: - d_workstream << "(Error)\t"; - break; - - case Standard: - d_workstream << "(InfL1)\t"; - break; - - case Informative: - d_workstream << "(InfL2)\t"; - break; - - case Insane: - d_workstream << "(InfL3)\t"; - break; - - default: - d_workstream << "(Unkwn)\t"; - break; - } - - d_workstream << message << endl; - - if (d_caching) - { - d_cache.push_back(std::make_pair(d_workstream.str(), level)); - } - else if (d_level >= level) - { - // write message - d_ostream << d_workstream.str(); - // ensure new event is written to the file, rather than just being buffered. - d_ostream.flush(); - } - } - } - - void Logger::setLogFilename(const String& filename, bool append) - { - // close current log file (if any) - if (d_ostream.is_open()) - { - d_ostream.close(); - } - - d_ostream.open(filename.c_wstring().c_str(), std::ios_base::out | (append ? std::ios_base::app : std::ios_base::trunc)); - - if (!d_ostream) - { - throw "Logger::setLogFilename - Failed to open file."; - } - - // initialise width for date & time alignment. - d_ostream.width(2); - - // write out cahced log strings. - if (d_caching) - { - d_caching = false; - - std::vector >::iterator iter = d_cache.begin(); - - while (iter != d_cache.end()) - { - if (d_level >= (*iter).second) - { - // write message - d_ostream << (*iter).first; - // ensure new event is written to the file, rather than just being buffered. - d_ostream.flush(); - } - - ++iter; - } - - d_cache.clear(); - } - } - - - Logger& Logger::getSingleton(void) - { - return Singleton::getSingleton(); - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIMouseCursor.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIMouseCursor.cpp deleted file mode 100644 index 5c8b12db41..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIMouseCursor.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/************************************************************************ - filename: CEGUIMouseCursor.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements MouseCursor class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIMouseCursor.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" -#include "CEGUISystem.h" -#include "CEGUIRenderer.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUIImage.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String MouseCursor::EventNamespace("MouseCursor"); - -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> MouseCursor* Singleton::ms_Singleton = NULL; - - -/************************************************************************* - Event name constants -*************************************************************************/ -const String MouseCursor::EventImageChanged( (utf8*)"ImageChanged" ); - - -/************************************************************************* - constructor -*************************************************************************/ -MouseCursor::MouseCursor(void) -{ - Rect screenArea(System::getSingleton().getRenderer()->getRect()); - - // mouse defaults to middle of the constrained area - d_position.d_x = screenArea.getWidth() / 2; - d_position.d_y = screenArea.getHeight() / 2; - d_position.d_z = 1.0f; - - // default constraint is to whole screen - setConstraintArea(&screenArea); - - // mouse defaults to visible - d_visible = true; - - // no default image though - d_cursorImage = NULL; - - // set default colour rect - d_colourRect.setColours(colour(1.0f, 1.0f, 1.0f)); - - // add events - addMouseCursorEvents(); - - Logger::getSingleton().logEvent((utf8*)"CEGUI::MouseCursor singleton created."); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -MouseCursor::~MouseCursor(void) -{ - Logger::getSingleton().logEvent((utf8*)"CEGUI::MouseCursor singleton destroyed."); -} - - -/************************************************************************* - Set the current mouse cursor image -*************************************************************************/ -void MouseCursor::setImage(const Image* image) -{ - d_cursorImage = image; - MouseCursorEventArgs args(this); - args.image = image; - onImageChanged(args); -} - - -/************************************************************************* - Set the current mouse cursor image -*************************************************************************/ -void MouseCursor::setImage(const String& imageset, const String& image_name) -{ - setImage(&ImagesetManager::getSingleton().getImageset(imageset)->getImage(image_name)); -} - - -/************************************************************************* - Draw the mouse cursor -*************************************************************************/ -void MouseCursor::draw(void) const -{ - if (d_visible && (d_cursorImage != NULL)) - { - d_cursorImage->draw( d_position, System::getSingleton().getRenderer()->getRect(), d_colourRect ); - } -} - - -/************************************************************************* - Set the current mouse cursor position -*************************************************************************/ -void MouseCursor::setPosition(const Point& position) -{ - d_position.d_x = position.d_x; - d_position.d_y = position.d_y; - constrainPosition(); -} - - -/************************************************************************* - Offset the mouse cursor position by the deltas specified in 'offset'. -*************************************************************************/ -void MouseCursor::offsetPosition(const Point& offset) -{ - d_position.d_x += offset.d_x; - d_position.d_y += offset.d_y; - constrainPosition(); -} - - -/************************************************************************* - Set the mouse cursor's alpha -*************************************************************************/ -void MouseCursor::setAlpha(float alpha) -{ - d_colourRect.setColours(colour(1.0f, 1.0f, 1.0f, alpha)); -} - - -/************************************************************************* - Checks the mouse cursor position is within the current 'constrain' - Rect and adjusts as required. -*************************************************************************/ -void MouseCursor::constrainPosition(void) -{ - Rect absarea(getConstraintArea()); - - if (d_position.d_x >= absarea.d_right) - d_position.d_x = absarea.d_right -1; - - if (d_position.d_y >= absarea.d_bottom) - d_position.d_y = absarea.d_bottom -1; - - if (d_position.d_y < absarea.d_top) - d_position.d_y = absarea.d_top; - - if (d_position.d_x < absarea.d_left) - d_position.d_x = absarea.d_left; -} - - -/************************************************************************* - Set the area that the mouse cursor is constrained to. -*************************************************************************/ -void MouseCursor::setConstraintArea(const Rect* area) -{ - Rect renderer_area = System::getSingleton().getRenderer()->getRect(); - - if (area == NULL) - { - d_constraints.d_min.d_x = cegui_reldim(renderer_area.d_left / renderer_area.getWidth()); - d_constraints.d_min.d_y = cegui_reldim(renderer_area.d_top / renderer_area.getHeight()); - d_constraints.d_max.d_x = cegui_reldim(renderer_area.d_right / renderer_area.getWidth()); - d_constraints.d_max.d_y = cegui_reldim(renderer_area.d_bottom / renderer_area.getHeight()); - } - else - { - Rect finalArea(area->getIntersection(renderer_area)); - d_constraints.d_min.d_x = cegui_reldim(finalArea.d_left / renderer_area.getWidth()); - d_constraints.d_min.d_y = cegui_reldim(finalArea.d_top / renderer_area.getHeight()); - d_constraints.d_max.d_x = cegui_reldim(finalArea.d_right / renderer_area.getWidth()); - d_constraints.d_max.d_y = cegui_reldim(finalArea.d_bottom / renderer_area.getHeight()); - } - - constrainPosition(); -} - - -/************************************************************************* - Set the area that the mouse cursor is constrained to. -*************************************************************************/ -void MouseCursor::setUnifiedConstraintArea(const URect* area) -{ - Rect renderer_area = System::getSingleton().getRenderer()->getRect(); - - if (area) - { - d_constraints = *area; - } - else - { - d_constraints.d_min.d_x = cegui_reldim(renderer_area.d_left / renderer_area.getWidth()); - d_constraints.d_min.d_y = cegui_reldim(renderer_area.d_top / renderer_area.getHeight()); - d_constraints.d_max.d_x = cegui_reldim(renderer_area.d_right / renderer_area.getWidth()); - d_constraints.d_max.d_y = cegui_reldim(renderer_area.d_bottom / renderer_area.getHeight()); - } - - constrainPosition(); -} - -/************************************************************************* - Set the area that the mouse cursor is constrained to. -*************************************************************************/ -Rect MouseCursor::getConstraintArea(void) const -{ - return Rect(d_constraints.asAbsolute(System::getSingleton().getRenderer()->getSize())); -} - -/************************************************************************* - Set the area that the mouse cursor is constrained to. -*************************************************************************/ -const URect& MouseCursor::getUnifiedConstraintArea(void) const -{ - return d_constraints; -} - -/************************************************************************* - Return the current mouse cursor position in display resolution - independant values. -*************************************************************************/ -Point MouseCursor::getDisplayIndependantPosition(void) const -{ - Size dsz(System::getSingleton().getRenderer()->getSize()); - - return Point(d_position.d_x / (dsz.d_width - 1.0f), d_position.d_y / (dsz.d_height - 1.0f)); -} - - -/************************************************************************* - Add MouseCursor events -*************************************************************************/ -void MouseCursor::addMouseCursorEvents(void) -{ - // mouse cursor events - addEvent(EventImageChanged); -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - - Begin event triggers section - -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// - -void MouseCursor::onImageChanged(MouseCursorEventArgs& e) -{ - fireEvent(EventImageChanged, e, EventNamespace); -} - - -MouseCursor& MouseCursor::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -MouseCursor* MouseCursor::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIProperty.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIProperty.cpp deleted file mode 100644 index 8796fee50e..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIProperty.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************ - filename: CEGUIProperty.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements Property base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIProperty.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - /************************************************************************* - Returns whether the property is at it's default value. - *************************************************************************/ - bool Property::isDefault(const PropertyReceiver* receiver) const - { - return (get(receiver) == d_default); - } - - /************************************************************************* - Returns the default value of the Property as a String. - *************************************************************************/ - String Property::getDefault(const PropertyReceiver* receiver) const - { - return d_default; - } - - void Property::writeXMLToStream(const PropertyReceiver* receiver, OutStream& out_stream) const - { - if (d_writeXML) - { - out_stream << "" << std::endl; - } - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIPropertyHelper.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIPropertyHelper.cpp deleted file mode 100644 index 4104ea9ae7..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIPropertyHelper.cpp +++ /dev/null @@ -1,392 +0,0 @@ -/************************************************************************ - filename: CEGUIPropertyHelper.cpp - created: 6/7/2004 - author: Paul D Turner - - purpose: Implementation of PropertyHelper methods -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUIExceptions.h" - -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -float PropertyHelper::stringToFloat(const String& str) -{ - using namespace std; - - float val = 0; - sscanf(str.c_str(), " %f", &val); - - return val; -} - - -uint PropertyHelper::stringToUint(const String& str) -{ - using namespace std; - - uint val = 0; - sscanf(str.c_str(), " %u", &val); - - return val; -} - - -int PropertyHelper::stringToInt(const String& str) -{ - using namespace std; - - uint val = 0; - sscanf(str.c_str(), " %d", &val); - - return val; -} - - -bool PropertyHelper::stringToBool(const String& str) -{ - if ((str == (utf8*)"True") || (str == (utf8*)"true")) - { - return true; - } - else - { - return false; - } - -} - - -Size PropertyHelper::stringToSize(const String& str) -{ - using namespace std; - - Size val(0,0); - sscanf(str.c_str(), " w:%f h:%f", &val.d_width, &val.d_height); - - return val; -} - - -Point PropertyHelper::stringToPoint(const String& str) -{ - using namespace std; - - Point val(0,0) ; - sscanf(str.c_str(), " x:%f y:%f", &val.d_x, &val.d_y); - - return val; -} - - -Rect PropertyHelper::stringToRect(const String& str) -{ - using namespace std; - - Rect val(0, 0, 0, 0); - sscanf(str.c_str(), " l:%f t:%f r:%f b:%f", &val.d_left, &val.d_top, &val.d_right, &val.d_bottom); - - return val; -} - - -MetricsMode PropertyHelper::stringToMetricsMode(const String& str) -{ - if (str == (utf8*)"Relative") - { - return Relative; - } - else if (str == (utf8*)"Absolute") - { - return Absolute; - } - else - { - return Inherited; - } - -} - - -const Image* PropertyHelper::stringToImage(const String& str) -{ - using namespace std; - - char imageSet[128]; - char imageName[128]; - - sscanf(str.c_str(), " set:%127s image:%127s", imageSet, imageName); - - const Image* image; - - try - { - image = &ImagesetManager::getSingleton().getImageset((utf8*)imageSet)->getImage((utf8*)imageName); - } - catch (UnknownObjectException) - { - image = NULL; - } - - return image; -} - - -UDim PropertyHelper::stringToUDim(const String& str) -{ - using namespace std; - - UDim ud; - sscanf(str.c_str()," {%f,%f}", &ud.d_scale, &ud.d_offset); - - return ud; -} - - -UVector2 PropertyHelper::stringToUVector2(const String& str) -{ - using namespace std; - - UVector2 uv; - sscanf(str.c_str(), " {{%f,%f},{%f,%f}}", &uv.d_x.d_scale,&uv.d_x.d_offset, &uv.d_y.d_scale,&uv.d_y.d_offset); - - return uv; -} - - -URect PropertyHelper::stringToURect(const String& str) -{ - using namespace std; - - URect ur; - sscanf( - str.c_str(), - " {{%f,%f},{%f,%f},{%f,%f},{%f,%f}}", - &ur.d_min.d_x.d_scale, &ur.d_min.d_x.d_offset, - &ur.d_min.d_y.d_scale, &ur.d_min.d_y.d_offset, - &ur.d_max.d_x.d_scale, &ur.d_max.d_x.d_offset, - &ur.d_max.d_y.d_scale, &ur.d_max.d_y.d_offset - ); - - return ur; -} - - -String PropertyHelper::floatToString(float val) -{ - using namespace std; - - char buff[64]; - sprintf(buff, "%f", val); - - return String((utf8*)buff); -} - - -String PropertyHelper::uintToString(uint val) -{ - using namespace std; - - char buff[64]; - sprintf(buff, "%u", val); - - return String((utf8*)buff); -} - - -String PropertyHelper::intToString(int val) -{ - using namespace std; - - char buff[64]; - sprintf(buff, "%d", val); - - return String((utf8*)buff); -} - - -String PropertyHelper::boolToString(bool val) -{ - if (val) - { - return String((utf8*)"True"); - } - else - { - return String ((utf8*)"False"); - } - -} - - -String PropertyHelper::sizeToString(const Size& val) -{ - using namespace std; - - char buff[128]; - sprintf(buff, "w:%f h:%f", val.d_width, val.d_height); - - return String((utf8*)buff); -} - - -String PropertyHelper::pointToString(const Point& val) -{ - using namespace std; - - char buff[128]; - sprintf(buff, "x:%f y:%f", val.d_x, val.d_y); - - return String((utf8*)buff); -} - - -String PropertyHelper::rectToString(const Rect& val) -{ - using namespace std; - - char buff[256]; - sprintf(buff, "l:%f t:%f r:%f b:%f", val.d_left, val.d_top, val.d_right, val.d_bottom); - - return String((utf8*)buff); -} - - -String PropertyHelper::metricsModeToString(MetricsMode val) -{ - if (val == Relative) - { - return String((utf8*)"Relative"); - } - else if (val == Absolute) - { - return String((utf8*)"Absolute"); - } - else - { - return String((utf8*)"Inherited"); - } - -} - - -String PropertyHelper::imageToString(const Image* const val) -{ - if (val != NULL) - { - return String((utf8*)"set:" + val->getImagesetName() + (utf8*)" image:" + val->getName()); - } - - return String((utf8*)""); -} - - -String PropertyHelper::udimToString(const UDim& val) -{ - using namespace std; - - char buff[128]; - sprintf(buff, "{%f,%f}", val.d_scale, val.d_offset); - - return String((utf8*)buff); -} - - -String PropertyHelper::uvector2ToString(const UVector2& val) -{ - using namespace std; - - char buff[256]; - sprintf(buff, "{{%f,%f},{%f,%f}}", val.d_x.d_scale, val.d_x.d_offset, val.d_y.d_scale, val.d_y.d_offset); - - return String((utf8*)buff); -} - - -String PropertyHelper::urectToString(const URect& val) -{ - using namespace std; - - char buff[512]; - sprintf( - buff, - "{{%f,%f},{%f,%f},{%f,%f},{%f,%f}}", - val.d_min.d_x.d_scale,val.d_min.d_x.d_offset, - val.d_min.d_y.d_scale,val.d_min.d_y.d_offset, - val.d_max.d_x.d_scale,val.d_max.d_x.d_offset, - val.d_max.d_y.d_scale,val.d_max.d_y.d_offset - ); - - return String((utf8*)buff); -} - - -String PropertyHelper::colourToString(const colour& val) -{ - using namespace std; - - char buff[16]; - sprintf(buff, "%.8X", val.getARGB()); - - return String((utf8*)buff); -} - - -colour PropertyHelper::stringToColour(const String& str) -{ - using namespace std; - - argb_t val = 0xFF000000; - sscanf(str.c_str(), " %8X", &val); - - return colour(val); - -} - - -String PropertyHelper::colourRectToString(const ColourRect& val) -{ - using namespace std; - - char buff[64]; - sprintf(buff, "tl:%.8X tr:%.8X bl:%.8X br:%.8X", val.d_top_left.getARGB(), val.d_top_right.getARGB(), val.d_bottom_left.getARGB(), val.d_bottom_right.getARGB()); - - return String((utf8*)buff); -} - - -ColourRect PropertyHelper::stringToColourRect(const String& str) -{ - using namespace std; - - argb_t topLeft = 0xFF000000, topRight = 0xFF000000, bottomLeft = 0xFF000000, bottomRight = 0xFF000000; - sscanf(str.c_str(), "tl:%8X tr:%8X bl:%8X br:%8X", &topLeft, &topRight, &bottomLeft, &bottomRight); - - return ColourRect(topLeft, topRight, bottomLeft, bottomRight); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIPropertySet.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIPropertySet.cpp deleted file mode 100644 index 710eb251f1..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIPropertySet.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/************************************************************************ - filename: CEGUIPropertySet.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements PropertySet class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIPropertySet.h" -#include "CEGUIProperty.h" -#include "CEGUIExceptions.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Add a new property to the set -*************************************************************************/ -void PropertySet::addProperty(Property* property) -{ - if (property == NULL) - { - throw NullObjectException((utf8*)"The given Property object pointer is NULL."); - } - - if (d_properties.find(property->getName()) != d_properties.end()) - { - throw AlreadyExistsException((utf8*)"A Property named '" + property->getName() + (utf8*)"' already exists in the PropertySet."); - } - - d_properties[property->getName()] = property; -} - -/************************************************************************* - Remove a property from the set -*************************************************************************/ -void PropertySet::removeProperty(const String& name) -{ - PropertyRegistry::iterator pos = d_properties.find(name); - - if (pos != d_properties.end()) - { - d_properties.erase(pos); - } -} - -/************************************************************************* - Remove all properties from the set -*************************************************************************/ -void PropertySet::clearProperties(void) -{ - d_properties.clear(); -} - -/************************************************************************* - Return true if a property with the given name is in the set -*************************************************************************/ -bool PropertySet::isPropertyPresent(const String& name) const -{ - return (d_properties.find(name) != d_properties.end()); -} - -/************************************************************************* - Return the help string for a property -*************************************************************************/ -const String& PropertySet::getPropertyHelp(const String& name) const -{ - PropertyRegistry::const_iterator pos = d_properties.find(name); - - if (pos == d_properties.end()) - { - // See if we should initialize all properties for this instance - maybeAddUncommonProperties ( name ); - // Re-check for match - pos = d_properties.find ( name ); - if ( pos == d_properties.end () ) - throw UnknownObjectException((utf8*)"There is no Property named '" + name + (utf8*)"' available in the set."); - } - - return pos->second->getHelp(); -} - -/************************************************************************* - Return the current value of a property -*************************************************************************/ -String PropertySet::getProperty(const String& name) const -{ - PropertyRegistry::const_iterator pos = d_properties.find(name); - - if (pos == d_properties.end()) - { - // See if we should initialize all properties for this instance - maybeAddUncommonProperties ( name ); - // Re-check for match - pos = d_properties.find ( name ); - if ( pos == d_properties.end () ) - throw UnknownObjectException((utf8*)"There is no Property named '" + name + (utf8*)"' available in the set."); - } - - return pos->second->get(this); -} - -/************************************************************************* - Set the current value of a property -*************************************************************************/ -void PropertySet::setProperty(const String& name,const String& value) -{ - PropertyRegistry::iterator pos = d_properties.find(name); - - if (pos == d_properties.end()) - { - // See if we should initialize all properties for this instance - maybeAddUncommonProperties ( name ); - // Re-check for match - pos = d_properties.find ( name ); - if ( pos == d_properties.end () ) - return; -// throw UnknownObjectException((utf8*)"There is no Property named '" + name + (utf8*)"' available in the set."); - } - - pos->second->set(this, value); -} - - -/************************************************************************* - Return a PropertySet::PropertyIterator object to iterate over the - available Properties. -*************************************************************************/ -PropertySet::PropertyIterator PropertySet::getIterator(void) const -{ - maybeAddUncommonProperties ( "getIterator" ); - return PropertyIterator(d_properties.begin(), d_properties.end()); -} - - -/************************************************************************* - Returns whether a Property is at it's default value. -*************************************************************************/ -bool PropertySet::isPropertyDefault(const String& name) const -{ - PropertyRegistry::const_iterator pos = d_properties.find(name); - - if (pos == d_properties.end()) - { - // See if we should initialize all properties for this instance - maybeAddUncommonProperties ( name ); - // Re-check for match - pos = d_properties.find ( name ); - if ( pos == d_properties.end () ) - throw UnknownObjectException((utf8*)"There is no Property named '" + name + (utf8*)"' available in the set."); - } - - return pos->second->isDefault(this); -} - - -/************************************************************************* - Returns the default value of a Property as a String. -*************************************************************************/ -String PropertySet::getPropertyDefault(const String& name) const -{ - PropertyRegistry::const_iterator pos = d_properties.find(name); - - if (pos == d_properties.end()) - { - // See if we should initialize all properties for this instance - maybeAddUncommonProperties ( name ); - // Re-check for match - pos = d_properties.find ( name ); - if ( pos == d_properties.end () ) - throw UnknownObjectException((utf8*)"There is no Property named '" + name + (utf8*)"' available in the set."); - } - - return pos->second->getDefault(this); -} - - -namespace -{ - // Global to store list of unknown properties - std::map < String, int > g_UnknownPropertiesMap; -} - -/************************************************************************* - Try to find a propery. -*************************************************************************/ -void PropertySet::maybeAddUncommonProperties ( const String& name ) const -{ - // Const cast hack - const_cast < PropertySet* > ( this )->maybeAddUncommonProperties ( name ); -} - -/************************************************************************* - Try to find a propery. -*************************************************************************/ -void PropertySet::maybeAddUncommonProperties ( const String& name ) -{ - if ( g_UnknownPropertiesMap.find( getType () + name ) != g_UnknownPropertiesMap.end () ) - { - // Early out on unknown type/property combo - Logger::getSingleton ().logEvent( SString ( "** Early out on unknown property %s-%s", getType ().c_str (), name.c_str () ), Informative); - return; - } - - if ( !d_addedUncommonProperties ) - { - // Add uncommon properties for this object, to find missing property 'name' - Logger::getSingleton ().logEvent ( SString ( "** Adding uncommon properties for a %s, to find missing property %s", getType ().c_str (), name.c_str() ), Informative); - d_addedUncommonProperties = true; - addUncommonProperties (); - - // See if property there now - if ( d_properties.find ( name ) != d_properties.end () ) - { - return; - } - } - - // Add type / name to unknown properties list - g_UnknownPropertiesMap[ getType() + name ] = 1; - Logger::getSingleton ().logEvent ( SString ( "** Unknown property %s-%s", getType ().c_str (), name.c_str () ), Informative); - return; -} - - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRect.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRect.cpp deleted file mode 100644 index d82c1df06c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRect.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/************************************************************************ - filename: CEGUIRect.cpp - created: 8/3/2004 - author: Paul D Turner - - purpose: Implements 'Rect' class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIRect.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constructor -*************************************************************************/ -Rect::Rect(float left, float top, float right, float bottom) : - d_top(top), - d_bottom(bottom), - d_left(left), - d_right(right) -{ -} - -Rect::Rect(Point pos, Size sz) : - d_top(pos.d_y), - d_bottom(pos.d_y + sz.d_height), - d_left(pos.d_x), - d_right(pos.d_x + sz.d_width) -{ -} - - -/************************************************************************* - Return a Rect object that is the intersection of 'this' with 'rect' -*************************************************************************/ -Rect Rect::getIntersection(const Rect& rect) const -{ - // check for total exclusion - if ((d_right > rect.d_left) && - (d_left < rect.d_right) && - (d_bottom > rect.d_top) && - (d_top < rect.d_bottom)) - { - Rect temp; - - // fill in temp with the intersection - temp.d_left = (d_left > rect.d_left) ? d_left : rect.d_left; - temp.d_right = (d_right < rect.d_right) ? d_right : rect.d_right; - temp.d_top = (d_top > rect.d_top) ? d_top : rect.d_top; - temp.d_bottom = (d_bottom < rect.d_bottom) ? d_bottom : rect.d_bottom; - - return temp; - } - else - { - return Rect(0.0f, 0.0f, 0.0f, 0.0f); - } - -} - -/************************************************************************* - Apply an offset the the Rect -*************************************************************************/ -Rect& Rect::offset(const Point& pt) -{ - d_left += pt.d_x; - d_right += pt.d_x; - d_top += pt.d_y; - d_bottom += pt.d_y; - return *this; -} - - -/************************************************************************* - Check if a given point is within the Rect -*************************************************************************/ -bool Rect::isPointInRect(const Point& pt) const -{ - if ((d_left > pt.d_x) || - (d_right <= pt.d_x) || - (d_top > pt.d_y) || - (d_bottom <= pt.d_y)) - { - return false; - } - - return true; -} - -/************************************************************************* - Set location of rect retaining current size. -*************************************************************************/ -void Rect::setPosition(const Point& pt) -{ - Size sz(getSize()); - - d_left = pt.d_x; - d_top = pt.d_y; - setSize(sz); -} - - -/************************************************************************* - check the size of the Rect object and if it is bigger than 'sz', - resize it so it isn't. -*************************************************************************/ -Rect& Rect::constrainSizeMax(const Size& sz) -{ - if (getWidth() > sz.d_width) - { - setWidth(sz.d_width); - } - - if (getHeight() > sz.d_height) - { - setHeight(sz.d_height); - } - - return *this; -} - - -/************************************************************************* - check the size of the Rect object and if it is smaller than 'sz', - resize it so it isn't. -*************************************************************************/ -Rect& Rect::constrainSizeMin(const Size& sz) -{ - if (getWidth() < sz.d_width) - { - setWidth(sz.d_width); - } - - if (getHeight() < sz.d_height) - { - setHeight(sz.d_height); - } - - return *this; -} - - -/************************************************************************* - check the size of the Rect object and if it is bigger than 'max_sz' - or smaller than 'min_sz', resize it so it isn't. -*************************************************************************/ -Rect& Rect::constrainSize(const Size& max_sz, const Size& min_sz) -{ - Size curr_sz(getSize()); - - if (curr_sz.d_width > max_sz.d_width) - { - setWidth(max_sz.d_width); - } - else if (curr_sz.d_width < min_sz.d_width) - { - setWidth(min_sz.d_width); - } - - if (curr_sz.d_height > max_sz.d_height) - { - setHeight(max_sz.d_height); - } - else if (curr_sz.d_height < min_sz.d_height) - { - setHeight(min_sz.d_height); - } - - return *this; -} - -Rect& Rect::operator=(const Rect& rhs) -{ - d_left = rhs.d_left; - d_top = rhs.d_top; - d_right = rhs.d_right; - d_bottom = rhs.d_bottom; - - return *this; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRefPtr.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRefPtr.cpp deleted file mode 100644 index 1eaa1f4294..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRefPtr.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/************************************************************************ - filename: CEGUIRefPtr.cpp - created: 15/10/2004 - author: Gerald Lindsly -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include -#include - -CEGUI::Referenced::~Referenced() -{ - assert(d_refCount == 0); -} diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRenderCache.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRenderCache.cpp deleted file mode 100644 index dfaada745c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRenderCache.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderCache.cpp - created: Fri Jun 17 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIRenderCache.h" -#include "CEGUISystem.h" -#include "CEGUIRenderer.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - RenderCache::RenderCache() - {} - - RenderCache::~RenderCache() - {} - - bool RenderCache::hasCachedImagery() const - { - return !(d_cachedImages.empty() && d_cachedTexts.empty()); - } - - void RenderCache::render(const Point& basePos, float baseZ, const Rect& clipper) const - { - Rect displayArea(System::getSingleton().getRenderer()->getRect()); - Rect custClipper; - const Rect* finalClipper; - Rect finalRect; - - // Send all cached images to renderer. - for(ImageryList::const_iterator image = d_cachedImages.begin(); image != d_cachedImages.end(); ++image) - { - if ((*image).usingCustomClipper) - { - custClipper = (*image).customClipper; - custClipper.offset(basePos); - custClipper = (*image).clipToDisplay ? displayArea.getIntersection(custClipper) : clipper.getIntersection(custClipper); - finalClipper = &custClipper; - } - else - { - finalClipper = (*image).clipToDisplay ? &displayArea : &clipper; - } - - finalRect = (*image).target_area; - finalRect.offset(basePos); - (*image).source_image->draw(finalRect, baseZ + (*image).z_offset, *finalClipper, (*image).colours); - } - - // send all cached texts to renderer. - for(TextList::const_iterator text = d_cachedTexts.begin(); text != d_cachedTexts.end(); ++text) - { - if ((*text).usingCustomClipper) - { - custClipper = (*text).customClipper; - custClipper.offset(basePos); - custClipper = (*text).clipToDisplay ? displayArea.getIntersection(custClipper) : clipper.getIntersection(custClipper); - finalClipper = &custClipper; - } - else - { - finalClipper = (*text).clipToDisplay ? &displayArea : &clipper; - } - - finalRect = (*text).target_area; - finalRect.offset(basePos); - (*text).source_font->drawText((*text).text, finalRect, baseZ + (*text).z_offset, *finalClipper, (*text).formatting, (*text).colours); - } - - } - - void RenderCache::clearCachedImagery() - { - d_cachedImages.clear(); - d_cachedTexts.clear(); - } - - void RenderCache::cacheImage(const Image& image, const Rect& destArea, float zOffset, const ColourRect& cols, const Rect* clipper, bool clipToDisplay) - { - ImageInfo imginf; - imginf.source_image = ℑ - imginf.target_area = destArea; - imginf.z_offset = zOffset; - imginf.colours = cols; - imginf.clipToDisplay = clipToDisplay; - - if (clipper) - { - imginf.customClipper = *clipper; - imginf.usingCustomClipper = true; - } - else - { - imginf.usingCustomClipper = false; - } - - d_cachedImages.push_back(imginf); - } - - void RenderCache::cacheText(const String& text, const Font* font, TextFormatting format, const Rect& destArea, float zOffset, const ColourRect& cols, const Rect* clipper, bool clipToDisplay) - { - TextInfo txtinf; - txtinf.text = text; - txtinf.source_font = font; - txtinf.formatting = format; - txtinf.target_area = destArea; - txtinf.z_offset = zOffset; - txtinf.colours = cols; - txtinf.clipToDisplay = clipToDisplay; - - if (clipper) - { - txtinf.customClipper = *clipper; - txtinf.usingCustomClipper = true; - } - else - { - txtinf.usingCustomClipper = false; - } - - d_cachedTexts.push_back(txtinf); - } - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRenderableElement.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRenderableElement.cpp deleted file mode 100644 index d669f1d2e3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRenderableElement.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderableElement.cpp - created: 14/4/2004 - author: Paul D Turner - - purpose: Implements RenderableElement base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIRenderableElement.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Constructor -*************************************************************************/ -RenderableElement::RenderableElement(void) : - d_next(NULL), - d_colours(colour(1, 1, 1, 1)), - d_area(0, 0, 0, 0), - d_useColoursPerImage(false) -{ -} - - -/************************************************************************* - Destructor -*************************************************************************/ -RenderableElement::~RenderableElement(void) -{ -} - - -/************************************************************************* - Sets the colours to be applied when rendering the element. -*************************************************************************/ -void RenderableElement::setColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour) -{ - d_colours.d_top_left = top_left_colour; - d_colours.d_top_right = top_right_colour; - d_colours.d_bottom_left = bottom_left_colour; - d_colours.d_bottom_right = bottom_right_colour; -} - - -/************************************************************************* - Draw the element chain starting with this element. -*************************************************************************/ -void RenderableElement::draw(const Vector3& position, const Rect& clip_rect) -{ - Vector3 final_pos(position); - final_pos.d_x += d_area.d_left; - final_pos.d_y += d_area.d_top; - - // call implementation function to perform actual rendering - draw_impl(final_pos, clip_rect); - - // render next element in the chain if any. - if (d_next != NULL) - { - d_next->draw(position, clip_rect); - } - -} - -void RenderableElement::draw(RenderCache& renderCache) const -{ - draw_impl(renderCache); - - // also draw next element in the chain - if (d_next) - { - d_next->draw(renderCache); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRenderableFrame.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRenderableFrame.cpp deleted file mode 100644 index 7b4ccd7222..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRenderableFrame.cpp +++ /dev/null @@ -1,677 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderableFrame.cpp - created: 14/4/2004 - author: Paul D Turner - - purpose: Implementation of RenderableFrame -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIRenderableFrame.h" -#include "CEGUIImage.h" -#include "CEGUIExceptions.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Default constructor for RenderableFrame -*************************************************************************/ -RenderableFrame::RenderableFrame(void) -{ - d_left = d_right = d_top = d_bottom = NULL; - d_topleft = d_topright = d_bottomleft = d_bottomright = NULL; -} - - -/************************************************************************* - Destructor for RenderableFrame -*************************************************************************/ -RenderableFrame::~RenderableFrame(void) -{ -} - - -/************************************************************************* - Set the images to use for the frame -*************************************************************************/ -void RenderableFrame::setImages(const Image* topleft, const Image* topright, const Image* bottomleft, const Image* bottomright, const Image* left, const Image* top, const Image* right, const Image* bottom) -{ - d_topleft = topleft; - d_topright = topright; - d_bottomleft = bottomleft; - d_bottomright = bottomright; - - d_left = left; - d_right = right; - d_top = top; - d_bottom = bottom; -} - - -/************************************************************************* - Drawing method for the frame -*************************************************************************/ -void RenderableFrame::draw_impl(const Vector3& position, const Rect& clip_rect) const -{ - Vector3 final_pos(position); - float org_width = d_area.getWidth(), org_height = d_area.getHeight(); - Size final_size; - ColourRect final_colours(d_colours); - bool calcColoursPerImage = !(d_useColoursPerImage || d_colours.isMonochromatic()); - float leftfactor, rightfactor, topfactor, bottomfactor; - - // calculate 'adjustments' required to accommodate corner pieces. - float coord_adj, size_adj; - - // draw top-edge, if required - if (d_top != NULL) { - - // calculate adjustments required if top-left corner will be rendered. - if (d_topleft != NULL) { - size_adj = (d_topleft->getWidth() - d_topleft->getOffsetX()); - coord_adj = d_topleft->getWidth(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if top-right corner will be rendered. - if (d_topright != NULL) { - size_adj += (d_topright->getWidth() + d_topright->getOffsetX()); - } - - final_size.d_width = org_width - size_adj; - final_size.d_height = d_top->getHeight(); - final_pos.d_x = position.d_x + coord_adj; - final_pos.d_y = position.d_y; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_top->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y - position.d_y + d_top->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_top->draw(final_pos, final_size, clip_rect, final_colours); - } - - // draw bottom-edge, if required - if (d_bottom != NULL) { - - // calculate adjustments required if bottom-left corner will be rendered. - if (d_bottomleft != NULL) { - size_adj = (d_bottomleft->getWidth() - d_bottomleft->getOffsetX()); - coord_adj = d_bottomleft->getWidth(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if bottom-right corner will be rendered. - if (d_bottomright != NULL) { - size_adj += (d_bottomright->getWidth() + d_bottomright->getOffsetX()); - } - - final_size.d_width = org_width - size_adj; - final_size.d_height = d_bottom->getHeight(); - final_pos.d_x = position.d_x + coord_adj; - final_pos.d_y = position.d_y + org_height - final_size.d_height; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_bottom->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y - position.d_y + d_bottom->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_bottom->draw(final_pos, final_size, clip_rect, final_colours); - } - - // draw left-edge, if required - if (d_left != NULL) { - - // calculate adjustments required if top-left corner will be rendered. - if (d_topleft != NULL) { - size_adj = (d_topleft->getHeight() - d_topleft->getOffsetY()); - coord_adj = d_topleft->getHeight(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if bottom-left corner will be rendered. - if (d_bottomleft != NULL) { - size_adj += (d_bottomleft->getHeight() + d_bottomleft->getOffsetY()); - } - - final_size.d_height = org_height - size_adj; - final_size.d_width = d_left->getWidth(); - final_pos.d_y = position.d_y + coord_adj; - final_pos.d_x = position.d_x; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_left->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y - position.d_y + d_left->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_left->draw(final_pos, final_size, clip_rect, final_colours); - } - - // draw right-edge, if required - if (d_right != NULL) { - - // calculate adjustments required if top-left corner will be rendered. - if (d_topright != NULL) { - size_adj = (d_topright->getHeight() - d_topright->getOffsetY()); - coord_adj = d_topright->getHeight(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if bottom-left corner will be rendered. - if (d_bottomright != NULL) { - size_adj += (d_bottomright->getHeight() + d_bottomright->getOffsetY()); - } - - - final_size.d_height = org_height - size_adj; - final_size.d_width = d_right->getWidth(); - final_pos.d_y = position.d_y + coord_adj; - final_pos.d_x = position.d_x + org_width - final_size.d_width; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_right->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y - position.d_y + d_right->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_right->draw(final_pos, final_size, clip_rect, final_colours); - } - - // draw required corner pieces... - if (d_topleft != NULL) { - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = d_topleft->getOffsetX() / org_width; - rightfactor = leftfactor + d_topleft->getWidth() / org_width; - topfactor = d_topleft->getOffsetY() / org_height; - bottomfactor = topfactor + d_topleft->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_topleft->draw(position, clip_rect, final_colours); - } - - if (d_topright != NULL) { - final_pos.d_x = position.d_x + org_width - d_topright->getWidth(); - final_pos.d_y = position.d_y; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_topright->getOffsetX()) / org_width; - rightfactor = leftfactor + d_topright->getWidth() / org_width; - topfactor = (final_pos.d_y - position.d_y + d_topright->getOffsetY()) / org_height; - bottomfactor = topfactor + d_topright->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_topright->draw(final_pos, clip_rect, final_colours); - } - - if (d_bottomleft != NULL) { - final_pos.d_x = position.d_x; - final_pos.d_y = position.d_y + org_height - d_bottomleft->getHeight(); - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_bottomleft->getOffsetX()) / org_width; - rightfactor = leftfactor + d_bottomleft->getWidth() / org_width; - topfactor = (final_pos.d_y - position.d_y + d_bottomleft->getOffsetY()) / org_height; - bottomfactor = topfactor + d_bottomleft->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_bottomleft->draw(final_pos, clip_rect, final_colours); - } - - if (d_bottomright != NULL) { - final_pos.d_x = position.d_x + org_width - d_bottomright->getWidth(); - final_pos.d_y = position.d_y + org_height - d_bottomright->getHeight(); - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x - position.d_x + d_bottomright->getOffsetX()) / org_width; - rightfactor = leftfactor + d_bottomright->getWidth() / org_width; - topfactor = (final_pos.d_y - position.d_y + d_bottomright->getOffsetY()) / org_height; - bottomfactor = topfactor + d_bottomright->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_bottomright->draw(final_pos, clip_rect, final_colours); - } - -} - - -/************************************************************************* - Set the Image to use for the specified location of the frame. -*************************************************************************/ -void RenderableFrame::setImageForLocation(FrameLocation location, const Image* image) -{ - switch (location) - { - case TopLeftCorner: - d_topleft = image; - break; - - case TopRightCorner: - d_topright = image; - break; - - case BottomLeftCorner: - d_bottomleft = image; - break; - - case BottomRightCorner: - d_bottomright = image; - break; - - case LeftEdge: - d_left = image; - break; - - case RightEdge: - d_right = image; - break; - - case TopEdge: - d_top = image; - break; - - case BottomEdge: - d_bottom = image; - break; - - default: - break; - } - -} - - -/************************************************************************* - Return the Image being used for the specified location of the frame. -*************************************************************************/ -const Image* RenderableFrame::getImageForLocation(FrameLocation location) const -{ - switch (location) - { - case TopLeftCorner: - return d_topleft; - break; - - case TopRightCorner: - return d_topright; - break; - - case BottomLeftCorner: - return d_bottomleft; - break; - - case BottomRightCorner: - return d_bottomright; - break; - - case LeftEdge: - return d_left; - break; - - case RightEdge: - return d_right; - break; - - case TopEdge: - return d_top; - break; - - case BottomEdge: - return d_bottom; - break; - - default: - return NULL; - break; - } - -} - -void RenderableFrame::draw_impl(RenderCache& renderCache) const -{ - // TODO: This is a fairly substantial Cut, paste, and hack job. - // TODO: There are probably a thousand ways that this should be improved! - - Rect destArea; - Vector3 final_pos(0,0,0); - float org_width = d_area.getWidth(), org_height = d_area.getHeight(); - Size final_size; - ColourRect final_colours(d_colours); - bool calcColoursPerImage = !(d_useColoursPerImage || d_colours.isMonochromatic()); - float leftfactor, rightfactor, topfactor, bottomfactor; - - // calculate 'adjustments' required to accommodate corner pieces. - float coord_adj, size_adj; - - // draw top-edge, if required - if (d_top != NULL) { - - // calculate adjustments required if top-left corner will be rendered. - if (d_topleft != NULL) { - size_adj = (d_topleft->getWidth() - d_topleft->getOffsetX()); - coord_adj = d_topleft->getWidth(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if top-right corner will be rendered. - if (d_topright != NULL) { - size_adj += (d_topright->getWidth() + d_topright->getOffsetX()); - } - - final_size.d_width = org_width - size_adj; - final_size.d_height = d_top->getHeight(); - final_pos.d_x = coord_adj; - final_pos.d_y = 0; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_top->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y + d_top->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + final_size.d_width; - destArea.d_bottom = final_pos.d_y + final_size.d_height; - - renderCache.cacheImage(*d_top, destArea, 0, final_colours); - } - - // draw bottom-edge, if required - if (d_bottom != NULL) { - - // calculate adjustments required if bottom-left corner will be rendered. - if (d_bottomleft != NULL) { - size_adj = (d_bottomleft->getWidth() - d_bottomleft->getOffsetX()); - coord_adj = d_bottomleft->getWidth(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if bottom-right corner will be rendered. - if (d_bottomright != NULL) { - size_adj += (d_bottomright->getWidth() + d_bottomright->getOffsetX()); - } - - final_size.d_width = org_width - size_adj; - final_size.d_height = d_bottom->getHeight(); - final_pos.d_x = coord_adj; - final_pos.d_y = org_height - final_size.d_height; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_bottom->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y + d_bottom->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + final_size.d_width; - destArea.d_bottom = final_pos.d_y + final_size.d_height; - - renderCache.cacheImage(*d_bottom, destArea, 0, final_colours); - } - - // draw left-edge, if required - if (d_left != NULL) { - - // calculate adjustments required if top-left corner will be rendered. - if (d_topleft != NULL) { - size_adj = (d_topleft->getHeight() - d_topleft->getOffsetY()); - coord_adj = d_topleft->getHeight(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if bottom-left corner will be rendered. - if (d_bottomleft != NULL) { - size_adj += (d_bottomleft->getHeight() + d_bottomleft->getOffsetY()); - } - - final_size.d_height = org_height - size_adj; - final_size.d_width = d_left->getWidth(); - final_pos.d_y = coord_adj; - final_pos.d_x = 0; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_left->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y + d_left->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + final_size.d_width; - destArea.d_bottom = final_pos.d_y + final_size.d_height; - - renderCache.cacheImage(*d_left, destArea, 0, final_colours); - } - - // draw right-edge, if required - if (d_right != NULL) { - - // calculate adjustments required if top-left corner will be rendered. - if (d_topright != NULL) { - size_adj = (d_topright->getHeight() - d_topright->getOffsetY()); - coord_adj = d_topright->getHeight(); - } - else { - coord_adj = 0; - size_adj = 0; - } - - // calculate adjustments required if bottom-left corner will be rendered. - if (d_bottomright != NULL) { - size_adj += (d_bottomright->getHeight() + d_bottomright->getOffsetY()); - } - - - final_size.d_height = org_height - size_adj; - final_size.d_width = d_right->getWidth(); - final_pos.d_y = coord_adj; - final_pos.d_x = org_width - final_size.d_width; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_right->getOffsetX()) / org_width; - rightfactor = leftfactor + final_size.d_width / org_width; - topfactor = (final_pos.d_y + d_right->getOffsetY()) / org_height; - bottomfactor = topfactor + final_size.d_height / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + final_size.d_width; - destArea.d_bottom = final_pos.d_y + final_size.d_height; - - renderCache.cacheImage(*d_right, destArea, 0, final_colours); - } - - // draw required corner pieces... - if (d_topleft != NULL) { - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = d_topleft->getOffsetX() / org_width; - rightfactor = leftfactor + d_topleft->getWidth() / org_width; - topfactor = d_topleft->getOffsetY() / org_height; - bottomfactor = topfactor + d_topleft->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = 0; - destArea.d_top = 0; - destArea.d_right = d_topleft->getWidth(); - destArea.d_bottom = d_topleft->getHeight(); - - renderCache.cacheImage(*d_topleft, destArea, 0, final_colours); - } - - if (d_topright != NULL) { - final_pos.d_x = org_width - d_topright->getWidth(); - final_pos.d_y = 0; - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_topright->getOffsetX()) / org_width; - rightfactor = leftfactor + d_topright->getWidth() / org_width; - topfactor = (final_pos.d_y + d_topright->getOffsetY()) / org_height; - bottomfactor = topfactor + d_topright->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + d_topright->getWidth(); - destArea.d_bottom = final_pos.d_y + d_topright->getHeight(); - - renderCache.cacheImage(*d_topright, destArea, 0, final_colours); - } - - if (d_bottomleft != NULL) { - final_pos.d_x = 0; - final_pos.d_y = org_height - d_bottomleft->getHeight(); - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_bottomleft->getOffsetX()) / org_width; - rightfactor = leftfactor + d_bottomleft->getWidth() / org_width; - topfactor = (final_pos.d_y + d_bottomleft->getOffsetY()) / org_height; - bottomfactor = topfactor + d_bottomleft->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + d_bottomleft->getWidth(); - destArea.d_bottom = final_pos.d_y + d_bottomleft->getHeight(); - - renderCache.cacheImage(*d_bottomleft, destArea, 0, final_colours); - } - - if (d_bottomright != NULL) { - final_pos.d_x = org_width - d_bottomright->getWidth(); - final_pos.d_y = org_height - d_bottomright->getHeight(); - - // calculate final colours that are to be used - if (calcColoursPerImage) - { - leftfactor = (final_pos.d_x + d_bottomright->getOffsetX()) / org_width; - rightfactor = leftfactor + d_bottomright->getWidth() / org_width; - topfactor = (final_pos.d_y + d_bottomright->getOffsetY()) / org_height; - bottomfactor = topfactor + d_bottomright->getHeight() / org_height; - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - destArea.d_left = final_pos.d_x; - destArea.d_top = final_pos.d_y; - destArea.d_right = final_pos.d_x + d_bottomright->getWidth(); - destArea.d_bottom = final_pos.d_y + d_bottomright->getHeight(); - - renderCache.cacheImage(*d_bottomright, destArea, 0, final_colours); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRenderableImage.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRenderableImage.cpp deleted file mode 100644 index 6619fa349a..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRenderableImage.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderableImage.cpp - created: 17/4/2004 - author: Paul D Turner - - purpose: Implementation of RenderableImage UI entity -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIRenderableImage.h" -#include "CEGUIImage.h" -#include "CEGUIExceptions.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Constructor -*************************************************************************/ -RenderableImage::RenderableImage(void) : - d_horzFormat(LeftAligned), - d_vertFormat(TopAligned), - d_quadSplitMode(TopLeftToBottomRight), - d_image(NULL) -{ -} - - -/************************************************************************* - Destructor -*************************************************************************/ -RenderableImage::~RenderableImage(void) -{ -} - - -/************************************************************************* - Renders the imagery for a RenderableImage element. -*************************************************************************/ -void RenderableImage::draw_impl(const Vector3& position, const Rect& clip_rect) const -{ - // do not draw anything if image is not set. - if (d_image == NULL) - return; - - // calculate final clipping rect which is intersection of RenderableImage area and supplied clipping area - Rect final_clipper(position.d_x, position.d_y, 0, 0); - final_clipper.setSize(d_area.getSize()); - final_clipper = clip_rect.getIntersection(final_clipper); - - Size imgSize(getDestinationSize()); - // calculate number of times to tile image based of formatting options - uint horzTiles = getHorzTileCount(); - uint vertTiles = getVertTileCount(); - // calculate 'base' X co-ordinate, depending upon formatting - float baseX = getBaseXCoord(imgSize) + position.d_x; - // calculate 'base' Y co-ordinate, depending upon formatting - float baseY = getBaseYCoord(imgSize) + position.d_y; - - Vector3 drawpos(0,baseY, position.d_z); - ColourRect final_colours(d_colours); - bool calcColoursPerImage = !(d_useColoursPerImage || d_colours.isMonochromatic()); - - // perform actual rendering - for (uint row = 0; row < vertTiles; ++row) - { - drawpos.d_x = baseX; - - for (uint col = 0; col < horzTiles; ++col) - { - if (calcColoursPerImage) - { - float leftfactor = (drawpos.d_x - baseX + d_image->getOffsetX()) / d_area.getWidth(); - float rightfactor = leftfactor + imgSize.d_width / d_area.getWidth(); - float topfactor = (drawpos.d_y - baseY + d_image->getOffsetY()) / d_area.getHeight(); - float bottomfactor = topfactor + imgSize.d_height / d_area.getHeight(); - - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - d_image->draw(drawpos, imgSize, final_clipper, final_colours, d_quadSplitMode); - drawpos.d_x += imgSize.d_width; - } - - drawpos.d_y += imgSize.d_height; - } - -} - -void RenderableImage::draw_impl(RenderCache& renderCache) const -{ - // do not do anything if image is not set. - if (!d_image) - return; - - // get size of destination image(s) - Size imgSize(getDestinationSize()); - // get starting co-ords for image(s) - float baseX = getBaseXCoord(imgSize) + d_area.d_left; - float baseY = getBaseYCoord(imgSize) + d_area.d_top; - // get number of image (tiles) to draw - uint horzTiles = getHorzTileCount(); - uint vertTiles = getVertTileCount(); - - // get initial colours and decide how to handle those for each drawn tile. - ColourRect final_colours(d_colours); - bool calcColoursPerImage = !(d_useColoursPerImage || d_colours.isMonochromatic()); - - // init target area vertically - Rect targetRect; - targetRect.d_top = baseY; - targetRect.d_bottom = baseY + imgSize.d_height; - - // perform actual rendering - for (uint row = 0; row < vertTiles; ++row) - { - // reset horizontal target position - targetRect.d_left = baseX; - targetRect.d_right = baseX + imgSize.d_width; - - for (uint col = 0; col < horzTiles; ++col) - { - // calculate colours to be used as required. - if (calcColoursPerImage) - { - float leftfactor = (targetRect.d_left - baseX + d_image->getOffsetX()) / d_area.getWidth(); - float rightfactor = leftfactor + imgSize.d_width / d_area.getWidth(); - float topfactor = (targetRect.d_top - baseY + d_image->getOffsetY()) / d_area.getHeight(); - float bottomfactor = topfactor + imgSize.d_height / d_area.getHeight(); - final_colours = d_colours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // cache the image - renderCache.cacheImage(*d_image, targetRect, 0, final_colours); - // advance to next horizontal position - targetRect.d_left += imgSize.d_width; - targetRect.d_right += imgSize.d_width; - } - - // advance to next vertical position. - targetRect.d_top += imgSize.d_height; - targetRect.d_bottom += imgSize.d_height; - } -} - -uint RenderableImage::getHorzTileCount() const -{ - return (d_horzFormat == HorzTiled) ? (uint)((d_area.getWidth() + (d_image->getWidth() - 1)) / d_image->getWidth()) : 1; -} - -uint RenderableImage::getVertTileCount() const -{ - return (d_vertFormat == VertTiled) ? (uint)((d_area.getHeight() + (d_image->getHeight() - 1)) / d_image->getHeight()) : 1; -} - -float RenderableImage::getBaseXCoord(const Size& sz) const -{ - switch (d_horzFormat) - { - case HorzStretched: - case HorzTiled: - case LeftAligned: - return 0; - break; - - case HorzCentred: - return PixelAligned((d_area.getWidth() - sz.d_width) * 0.5f); - break; - - case RightAligned: - return d_area.getWidth() - sz.d_width; - break; - - default: - throw InvalidRequestException("An unknown horizontal formatting value was specified in a RenderableImage object."); - } -} - -float RenderableImage::getBaseYCoord(const Size& sz) const -{ - switch (d_vertFormat) - { - case VertStretched: - case VertTiled: - case TopAligned: - return 0; - break; - - case VertCentred: - return PixelAligned((d_area.getHeight() - sz.d_height) * 0.5f); - break; - - case BottomAligned: - return d_area.getHeight() - sz.d_height; - break; - - default: - throw InvalidRequestException("An unknown vertical formatting value was specified in a RenderableImage object."); - } -} - -Size RenderableImage::getDestinationSize() const -{ - return Size ( - (d_horzFormat == HorzStretched) ? d_area.getWidth() : d_image->getWidth(), - (d_vertFormat == VertStretched) ? d_area.getHeight() : d_image->getHeight() - ); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIRenderer.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIRenderer.cpp deleted file mode 100644 index cc4d8f1dbb..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIRenderer.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/************************************************************************ - filename: CEGUIRenderer.cpp - created: 20/2/2004 - author: Paul D Turner - - purpose: Some base class implementation for Renderer objects -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIRenderer.h" -#include "CEGUIEventSet.h" -#include "CEGUIEvent.h" -#include "CEGUIDefaultResourceProvider.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Renderer::EventNamespace("Renderer"); - -/************************************************************************* - Event name constants (static data definitions) -*************************************************************************/ -const String Renderer::EventDisplaySizeChanged( (utf8*)"DisplayModeChanged" ); - - -/************************************************************************* - Implementation constants -*************************************************************************/ -const float Renderer::GuiZInitialValue = 1.0f; -const float Renderer::GuiZElementStep = 0.001f; // this is enough for 1000 Windows. -const float Renderer::GuiZLayerStep = 0.0001f; // provides space for 10 layers per Window. - - -/************************************************************************* - Constructor -*************************************************************************/ -Renderer::Renderer(void) - : d_resourceProvider(0), - d_identifierString("Unknown renderer (vendor did not set the ID string!)") -{ - // setup standard events available - addEvent(EventDisplaySizeChanged); - - // default initialisation - resetZValue(); -} - -/************************************************************************* - Destructor -*************************************************************************/ -Renderer::~Renderer(void) -{ - if(d_resourceProvider) - { - delete d_resourceProvider; - d_resourceProvider = 0; - } -} - -ResourceProvider* Renderer::createResourceProvider(void) -{ - d_resourceProvider = new DefaultResourceProvider(); - return d_resourceProvider; -} - -const String& Renderer::getIdentifierString() const -{ - return d_identifierString; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIScheme.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIScheme.cpp deleted file mode 100644 index 4f4bdd40a8..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIScheme.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/************************************************************************ - filename: CEGUIScheme.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements GUI Scheme class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIScheme.h" -#include "CEGUIExceptions.h" -#include "CEGUISchemeManager.h" -#include "CEGUILogger.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUIFontManager.h" -#include "CEGUIFont.h" -#include "CEGUIWindowFactoryManager.h" -#include "CEGUIFactoryModule.h" -#include "CEGUIScheme_xmlHandler.h" -#include "CEGUIDataContainer.h" -#include "CEGUISystem.h" -#include "CEGUIXMLParser.h" -#include "falagard/CEGUIFalWidgetLookManager.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Static Data definitions -*************************************************************************/ -// name of the xml schema for GUIScheme files -const char Scheme::GUISchemeSchemaName[] = "GUIScheme.xsd"; - - -/************************************************************************* - Constructor for scheme objects -*************************************************************************/ -Scheme::Scheme(const String& filename, const String& resourceGroup) -{ - if (filename.empty() || (filename == (utf8*)"")) - { - throw InvalidRequestException((utf8*)"Scheme::Scheme - Filename supplied for Scheme loading must be valid"); - } - - // create handler object - Scheme_xmlHandler handler(this); - - // do parse (which uses handler to create actual data) - try - { - System::getSingleton().getXMLParser()->parseXMLFile(handler, filename, GUISchemeSchemaName, resourceGroup); - } - catch(...) - { - Logger::getSingleton().logEvent("Scheme::Scheme - loading of Scheme from file '" + filename +"' failed.", Errors); - throw; - } - - Logger::getSingleton().logEvent((utf8*)"Loaded GUI scheme '" + d_name + "' from data in file '" + filename + "'.", Informative); - - // attempt to load in resources - loadResources(); -} - - -/************************************************************************* - Destructor for scheme objects -*************************************************************************/ -Scheme::~Scheme(void) -{ - unloadResources(); - - Logger::getSingleton().logEvent((utf8*)"GUI scheme '" + d_name + "' has been unloaded.", Informative); -} - - -/************************************************************************* - Load all resources for this scheme -*************************************************************************/ -void Scheme::loadResources(void) -{ - Logger::getSingleton().logEvent((utf8*)"---- Begining resource loading for GUI scheme '" + d_name + "' ----", Informative); - - ImagesetManager& ismgr = ImagesetManager::getSingleton(); - FontManager& fntmgr = FontManager::getSingleton(); - WindowFactoryManager& wfmgr = WindowFactoryManager::getSingleton(); - WidgetLookManager& wlfMgr = WidgetLookManager::getSingleton(); - - std::vector::const_iterator pos; - - // check imagesets - for (pos = d_imagesets.begin(); pos != d_imagesets.end(); ++pos) - { - if (!ismgr.isImagesetPresent((*pos).name)) - { - Imageset* iset = ismgr.createImageset((*pos).filename, (*pos).resourceGroup); - - // check for wrong imageset for specified name - String realname = iset->getName(); - - if (realname != (*pos).name) - { - ismgr.destroyImageset(iset); - throw InvalidRequestException((utf8*)"Scheme::loadResources - The Imageset created by file '" + - (*pos).filename + "' is named '" + realname + "', not '" + (*pos).name + "' as required by Scheme '" + d_name + "'."); - } - - } - - } - - // check imagesets that are created directly from image files - for (pos = d_imagesetsFromImages.begin(); pos != d_imagesetsFromImages.end(); ++pos) - { - if (!ismgr.isImagesetPresent((*pos).name)) - ismgr.createImagesetFromImageFile((*pos).name, (*pos).filename, (*pos).resourceGroup); - } - - // check fonts - for (pos = d_fonts.begin(); pos != d_fonts.end(); ++pos) - { - if (!fntmgr.isFontPresent((*pos).name)) - { - Font* font = fntmgr.createFont((*pos).filename, (*pos).resourceGroup); - - // check for wrong font for specified name - String realname = font->getName(); - - if (realname != (*pos).name) - { - fntmgr.destroyFont(font); - throw InvalidRequestException((utf8*)"Scheme::loadResources - The Font created by file '" + - (*pos).filename + "' is named '" + realname + "', not '" + (*pos).name + "' as required by Scheme '" + d_name + "'."); - } - - } - - } - - // load look'n'feels (can't actually check these, so just re-parse data; it does no harm except maybe wase a bit of time) - for (pos = d_looknfeels.begin(); pos != d_looknfeels.end(); ++pos) - { - wlfMgr.parseLookNFeelSpecification((*pos).filename, (*pos).resourceGroup); - } - - // check factories - std::vector::iterator cmod = d_widgetModules.begin(); - for (;cmod != d_widgetModules.end(); ++cmod) - { - // create and load dynamic module as required - if ((*cmod).module == NULL) - { - (*cmod).module = new FactoryModule((*cmod).name); - } - - // see if we should just register all factories available in the module (i.e. No factories explicitly specified) - if ((*cmod).factories.size() == 0) - { - Logger::getSingleton().logEvent("No window factories specified for module '" + (*cmod).name + "' - adding all available factories..."); - (*cmod).module->registerAllFactories(); - } - // some names were explicitly given, so only register those. - else - { - std::vector::const_iterator elem = (*cmod).factories.begin(); - for (; elem != (*cmod).factories.end(); ++elem) - { - if (!wfmgr.isFactoryPresent((*elem).name)) - { - (*cmod).module->registerFactory((*elem).name); - } - } - } - } - - // check aliases - std::vector::iterator alias = d_aliasMappings.begin(); - for (;alias != d_aliasMappings.end(); ++alias) - { - // get iterator - WindowFactoryManager::TypeAliasIterator iter = wfmgr.getAliasIterator(); - - // look for this alias - while (!iter.isAtEnd() && (iter.getCurrentKey() != (*alias).aliasName)) - ++iter; - - // if the alias exists - if (!iter.isAtEnd()) - { - // if the current target type matches - if (iter.getCurrentValue().getActiveTarget() == (*alias).targetName) - { - // assume this mapping is ours and skip to next alias - continue; - } - - } - - // create a new alias entry - wfmgr.addWindowTypeAlias((*alias).aliasName, (*alias).targetName); - } - - // check falagard window mappings. - std::vector::iterator falagard = d_falagardMappings.begin(); - for (;falagard != d_falagardMappings.end(); ++falagard) - { - // get iterator - WindowFactoryManager::FalagardMappingIterator iter = wfmgr.getFalagardMappingIterator(); - - // look for this mapping - while (!iter.isAtEnd() && (iter.getCurrentKey() != (*falagard).windowName)) - ++iter; - - // if the alias exists - if (!iter.isAtEnd()) - { - // if the current target and looks match - if ((iter.getCurrentValue().d_baseType == (*falagard).targetName) && - (iter.getCurrentValue().d_lookName == (*falagard).lookName)) - { - // assume this mapping is ours and skip to next - continue; - } - } - - // create a new mapping entry - wfmgr.addFalagardWindowMapping((*falagard).windowName, (*falagard).targetName, (*falagard).lookName); - } - - Logger::getSingleton().logEvent((utf8*)"---- Resource loading for GUI scheme '" + d_name + "' completed ----", Informative); -} - - -/************************************************************************* - Unload all resources for this scheme -*************************************************************************/ -void Scheme::unloadResources(void) -{ - Logger::getSingleton().logEvent((utf8*)"---- Begining resource cleanup for GUI scheme '" + d_name + "' ----", Informative); - - ImagesetManager& ismgr = ImagesetManager::getSingleton(); - FontManager& fntmgr = FontManager::getSingleton(); - WindowFactoryManager& wfmgr = WindowFactoryManager::getSingleton(); - - std::vector::const_iterator pos; - - // check fonts - for (pos = d_fonts.begin(); pos != d_fonts.end(); ++pos) - { - fntmgr.destroyFont((*pos).name); - } - - // check Imagesets - for (pos = d_imagesets.begin(); pos != d_imagesets.end(); ++pos) - { - ismgr.destroyImageset((*pos).name); - } - - // check imagesets that are created directly from image files - for (pos = d_imagesetsFromImages.begin(); pos != d_imagesetsFromImages.end(); ++pos) - { - ismgr.destroyImageset((*pos).name); - } - - // check factories - std::vector::iterator cmod = d_widgetModules.begin(); - for (;cmod != d_widgetModules.end(); ++cmod) - { - std::vector::const_iterator elem = (*cmod).factories.begin(); - for (; elem != (*cmod).factories.end(); ++elem) - { - wfmgr.removeFactory((*elem).name); - } - - // unload dynamic module as required - if ((*cmod).module != NULL) - { - delete (*cmod).module; - (*cmod).module = NULL; - } - - } - - // check aliases - std::vector::iterator alias = d_aliasMappings.begin(); - for (;alias != d_aliasMappings.end(); ++alias) - { - // get iterator - WindowFactoryManager::TypeAliasIterator iter = wfmgr.getAliasIterator(); - - // look for this alias - while (!iter.isAtEnd() && (iter.getCurrentKey() != (*alias).aliasName)) - ++iter; - - // if the alias exists - if (!iter.isAtEnd()) - { - // create a new alias entry - wfmgr.removeWindowTypeAlias((*alias).aliasName, (*alias).targetName); - } - - } - - // check falagard window mappings. - std::vector::iterator falagard = d_falagardMappings.begin(); - for (;falagard != d_falagardMappings.end(); ++falagard) - { - // get iterator - WindowFactoryManager::FalagardMappingIterator iter = wfmgr.getFalagardMappingIterator(); - - // look for this mapping - while (!iter.isAtEnd() && (iter.getCurrentKey() != (*falagard).windowName)) - ++iter; - - // if the alias exists - if (!iter.isAtEnd()) - { - // if the current target and looks match - if ((iter.getCurrentValue().d_baseType == (*falagard).targetName) && - (iter.getCurrentValue().d_lookName == (*falagard).lookName)) - { - // assume this mapping is ours and delete it - wfmgr.removeFalagardWindowMapping((*falagard).targetName); - } - } - } - - Logger::getSingleton().logEvent((utf8*)"---- Resource cleanup for GUI scheme '" + d_name + "' completed ----", Informative); -} - - -/************************************************************************* - Check if all resources for this Scheme are loaded -*************************************************************************/ -bool Scheme::resourcesLoaded(void) const -{ - ImagesetManager& ismgr = ImagesetManager::getSingleton(); - FontManager& fntmgr = FontManager::getSingleton(); - WindowFactoryManager& wfmgr = WindowFactoryManager::getSingleton(); - - std::vector::const_iterator pos; - - // check imagesets - for (pos = d_imagesets.begin(); pos != d_imagesets.end(); ++pos) - { - if (!ismgr.isImagesetPresent((*pos).name)) - { - return false; - } - - } - - // check fonts - for (pos = d_fonts.begin(); pos != d_fonts.end(); ++pos) - { - if (!fntmgr.isFontPresent((*pos).name)) - { - return false; - } - - } - - // check factories - std::vector::const_iterator cmod = d_widgetModules.begin(); - for (;cmod != d_widgetModules.end(); ++cmod) - { - std::vector::const_iterator elem = (*cmod).factories.begin(); - - for (; elem != (*cmod).factories.end(); ++elem) - { - if (!wfmgr.isFactoryPresent((*elem).name)) - { - return false; - } - - } - - } - - // check aliases - std::vector::const_iterator alias = d_aliasMappings.begin(); - for (;alias != d_aliasMappings.end(); ++alias) - { - // get iterator - WindowFactoryManager::TypeAliasIterator iter = wfmgr.getAliasIterator(); - - // look for this alias - while (!iter.isAtEnd() && (iter.getCurrentKey() != (*alias).aliasName)) - ++iter; - - // if the alias exists - if (!iter.isAtEnd()) - { - // if the current target type matches - if (iter.getCurrentValue().getActiveTarget() == (*alias).targetName) - { - // target matches, assume we set it and continue to next alias - continue; - } - - } - - // no alias or target type does not match - return false; - } - - return true; -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUISchemeManager.cpp b/vendor/cegui-0.4.0-custom/src/CEGUISchemeManager.cpp deleted file mode 100644 index 3924f69826..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUISchemeManager.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/************************************************************************ - filename: CEGUISchemeManager.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements SchemeManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUISchemeManager.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" -#include "CEGUIScheme.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> SchemeManager* Singleton::ms_Singleton = NULL; - - - -/************************************************************************* - constructor -*************************************************************************/ -SchemeManager::SchemeManager(void) -{ - Logger::getSingleton().logEvent((utf8*)"CEGUI::SchemeManager singleton created."); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -SchemeManager::~SchemeManager(void) -{ - Logger::getSingleton().logEvent((utf8*)"---- Begining cleanup of GUI Scheme system ----"); - - unloadAllSchemes(); - - Logger::getSingleton().logEvent((utf8*)"CEGUI::SchemeManager singleton destroyed."); -} - - -/************************************************************************* - Loads a scheme -*************************************************************************/ -Scheme* SchemeManager::loadScheme(const String& scheme_filename, const String& resourceGroup) -{ - Logger::getSingleton().logEvent((utf8*)"Attempting to load Scheme from file '" + scheme_filename + "'."); - - Scheme* tmp = new Scheme(scheme_filename, resourceGroup); - String name = tmp->getName(); - d_schemes[name] = tmp; - return tmp; -} - - -/************************************************************************* - Un-Loads a scheme -*************************************************************************/ -void SchemeManager::unloadScheme(const String& scheme_name) -{ - SchemeRegistry::iterator pos = d_schemes.find(scheme_name); - - if (pos != d_schemes.end()) - { - String tmpName(scheme_name); - - delete pos->second; - d_schemes.erase(pos); - - Logger::getSingleton().logEvent((utf8*)"Scheme '" + tmpName + "' has been unloaded."); - } - else - { - Logger::getSingleton().logEvent((utf8*)"Unable to unload non-existant scheme '" + scheme_name + "'.", Errors); - } - -} - - -/************************************************************************* - Returns a pointer to the Scheme object with the specified name. -*************************************************************************/ -Scheme* SchemeManager::getScheme(const String& name) const -{ - SchemeRegistry::const_iterator pos = d_schemes.find(name); - - if (pos == d_schemes.end()) - { - throw UnknownObjectException("SchemeManager::getScheme - A Scheme object with the specified name '" + name +"' does not exist within the system"); - } - - return pos->second; -} - - -SchemeManager& SchemeManager::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -SchemeManager* SchemeManager::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - - -/************************************************************************* - Return a SchemeManager::SchemeIterator object to iterate over the - available schemes. -*************************************************************************/ -SchemeManager::SchemeIterator SchemeManager::getIterator(void) const -{ - return SchemeIterator(d_schemes.begin(), d_schemes.end()); -} - - -/************************************************************************* - Unload all schemes currently defined within the system. -*************************************************************************/ -void SchemeManager::unloadAllSchemes(void) -{ - // unload all schemes - while (!d_schemes.empty()) - { - unloadScheme(d_schemes.begin()->first); - } - -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIScheme_xmlHandler.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIScheme_xmlHandler.cpp deleted file mode 100644 index 78f99f52c9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIScheme_xmlHandler.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************ -filename: CEGUIScheme_xmlHandler.cpp -created: 21/2/2004 -author: Paul D Turner - -purpose: Implements GUI Scheme class -*************************************************************************/ -/************************************************************************* -Crazy Eddie's GUI System (http://www.cegui.org.uk) -Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIScheme_xmlHandler.h" - -#include "CEGUIExceptions.h" -#include "CEGUIImageset.h" -#include "CEGUILogger.h" -#include "CEGUIXMLAttributes.h" -#include "falagard/CEGUIFalWidgetLookManager.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -Static Data definitions -*************************************************************************/ - -// xml file elements and attributes -const String Scheme_xmlHandler::GUISchemeElement( "GUIScheme" ); -const String Scheme_xmlHandler::ImagesetElement( "Imageset" ); -const String Scheme_xmlHandler::ImagesetFromImageElement( "ImagesetFromImage" ); -const String Scheme_xmlHandler::FontElement( "Font" ); -const String Scheme_xmlHandler::WindowSetElement( "WindowSet" ); -const String Scheme_xmlHandler::WindowFactoryElement( "WindowFactory" ); -const String Scheme_xmlHandler::WindowAliasElement( "WindowAlias" ); -const String Scheme_xmlHandler::FalagardMappingElement( "FalagardMapping" ); -const String Scheme_xmlHandler::LookNFeelElement( "LookNFeel" ); -const String Scheme_xmlHandler::NameAttribute( "Name" ); -const String Scheme_xmlHandler::FilenameAttribute( "Filename" ); -const String Scheme_xmlHandler::AliasAttribute( "Alias" ); -const String Scheme_xmlHandler::TargetAttribute( "Target" ); -const String Scheme_xmlHandler::ResourceGroupAttribute( "ResourceGroup" ); -const String Scheme_xmlHandler::WindowTypeAttribute( "WindowType" ); -const String Scheme_xmlHandler::TargetTypeAttribute( "TargetType" ); -const String Scheme_xmlHandler::LookNFeelAttribute( "LookNFeel" ); - -/************************************************************************* -Handler methods -*************************************************************************/ -void Scheme_xmlHandler::elementStart(const String& element, const XMLAttributes& attributes) -{ - // handle alias element - if (element == WindowAliasElement) - { - Scheme::AliasMapping alias; - - alias.aliasName = attributes.getValueAsString(AliasAttribute); - alias.targetName = attributes.getValueAsString(TargetAttribute); - d_scheme->d_aliasMappings.push_back(alias); - } - // handle an Imageset element - else if (element == ImagesetElement) - { - Scheme::LoadableUIElement imageset; - - imageset.name = attributes.getValueAsString(NameAttribute); - imageset.filename = attributes.getValueAsString(FilenameAttribute); - imageset.resourceGroup = attributes.getValueAsString(ResourceGroupAttribute); - - d_scheme->d_imagesets.push_back(imageset); - } - // handle an ImagesetFromImage element - else if (element == ImagesetFromImageElement) - { - Scheme::LoadableUIElement imageset; - - imageset.name = attributes.getValueAsString(NameAttribute); - imageset.filename = attributes.getValueAsString(FilenameAttribute); - imageset.resourceGroup = attributes.getValueAsString(ResourceGroupAttribute); - - d_scheme->d_imagesetsFromImages.push_back(imageset); - } - // handle a font element - else if (element == FontElement) - { - Scheme::LoadableUIElement font; - - font.name = attributes.getValueAsString(NameAttribute); - font.filename = attributes.getValueAsString(FilenameAttribute); - font.resourceGroup = attributes.getValueAsString(ResourceGroupAttribute); - - d_scheme->d_fonts.push_back(font); - } - // handle a WindowSet element - else if (element == WindowSetElement) - { - Scheme::UIModule module; - module.name = attributes.getValueAsString(FilenameAttribute); - module.module = NULL; - - module.factories.clear(); - d_scheme->d_widgetModules.push_back(module); - } - // handle a WindowFactory element - else if (element == WindowFactoryElement) - { - Scheme::UIElementFactory factory; - - factory.name = attributes.getValueAsString(NameAttribute); - - d_scheme->d_widgetModules[d_scheme->d_widgetModules.size() - 1].factories.push_back(factory); - } - // handle root Scheme element - else if (element == GUISchemeElement) - { - // get name of scheme we are creating - d_scheme->d_name = attributes.getValueAsString(NameAttribute); - - Logger::getSingleton().logEvent("Started creation of Scheme '" + d_scheme->d_name + "' via XML file.", Informative); - - if (SchemeManager::getSingleton().isSchemePresent(d_scheme->d_name)) - { - throw AlreadyExistsException((utf8*)"A GUI Scheme named '" + d_scheme->d_name + "' is already present in the system."); - } - - } - else if (element == FalagardMappingElement) - { - Scheme::FalagardMapping fmap; - fmap.windowName = attributes.getValueAsString(WindowTypeAttribute); - fmap.targetName = attributes.getValueAsString(TargetTypeAttribute); - fmap.lookName = attributes.getValueAsString(LookNFeelAttribute); - - d_scheme->d_falagardMappings.push_back(fmap); - } - else if (element == LookNFeelElement) - { - Scheme::LoadableUIElement lnf; - lnf.filename = attributes.getValueAsString(FilenameAttribute); - lnf.resourceGroup = attributes.getValueAsString(ResourceGroupAttribute); - - d_scheme->d_looknfeels.push_back(lnf); - } - // anything else is an error which *should* have already been caught by XML validation - else - { - throw FileIOException("Scheme::xmlHandler::startElement - Unexpected data was found while parsing the Scheme file: '" + element + "' is unknown."); - } - -} - -void Scheme_xmlHandler::elementEnd(const String& element) -{ - if (element == GUISchemeElement) - { - Logger::getSingleton().logEvent("Finished creation of Scheme '" + d_scheme->d_name + "' via XML file.", Informative); - } - -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIScriptModule.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIScriptModule.cpp deleted file mode 100644 index c8140c3afd..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIScriptModule.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/************************************************************************ - filename: CEGUIScriptModule.cpp - created: 16/7/2004 - author: Paul D Turner - - purpose: Abstract class for scripting support -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIScriptModule.h" -#include "CEGUISystem.h" -#include "CEGUILogger.h" -#include "CEGUIString.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -ScriptModule::ScriptModule(void) : - d_identifierString("Unknown scripting module (vendor did not set the ID string!)") -{} - -const String& ScriptModule::getIdentifierString() const -{ - return d_identifierString; -} - -bool ScriptFunctor::operator()(const EventArgs& e) const -{ - ScriptModule* scriptModule = System::getSingleton().getScriptingModule(); - - if (scriptModule) - { - return scriptModule->executeScriptedEventHandler(scriptFunctionName, e); - } - else - { - Logger::getSingleton().logEvent((utf8*)"Scripted event handler '" + scriptFunctionName + "' could not be called as no ScriptModule is available.", Errors); - - return false; - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUISize.cpp b/vendor/cegui-0.4.0-custom/src/CEGUISize.cpp deleted file mode 100644 index 8bdef86bc4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUISize.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/************************************************************************ - filename: CEGUISize.cpp - created: 14/3/2004 - author: Paul D Turner - - purpose: Implements the Size class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUISize.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -bool Size::operator==(const Size& other) const -{ - return d_width == other.d_width && d_height == other.d_height; -} - - -bool Size::operator!=(const Size& other) const -{ - return !operator==(other); -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIString.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIString.cpp deleted file mode 100644 index 8a797f9f7c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIString.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/************************************************************************ - filename: CEGUIString.cpp - created: 26/2/2004 - author: Paul D Turner - - purpose: Implements string class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIString.h" -#include "CEGUIStringBidi.h" - -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// definition of 'no position' value -const String::size_type String::npos = (String::size_type)(-1); - - -////////////////////////////////////////////////////////////////////////// -// Destructor -////////////////////////////////////////////////////////////////////////// -String::~String(void) -{ - if (d_reserve > STR_QUICKBUFF_SIZE) - { - delete[] d_buffer; - } - if (d_encodedbufflen > 0) - { - delete[] d_encodedbuff; - } -} - -bool String::grow(size_type new_size) -{ - // check for too big - if (max_size() <= new_size) - std::length_error("Resulting CEGUI::String would be too big"); - - // increase, as we always null-terminate the buffer. - ++new_size; - - if (new_size > d_reserve) - { - utf32* temp = new utf32[new_size]; - - if (d_reserve > STR_QUICKBUFF_SIZE) - { - memcpy(temp, d_buffer, (d_cplength + 1) * sizeof(utf32)); - delete[] d_buffer; - } - else - { - memcpy(temp, d_quickbuff, (d_cplength + 1) * sizeof(utf32)); - } - - d_buffer = temp; - d_reserve = new_size; - - return true; - } - - return false; -} - -// perform re-allocation to remove wasted space. -void String::trim(void) -{ - size_type min_size = d_cplength + 1; - - // only re-allocate when not using quick-buffer, and when size can be trimmed - if ((d_reserve > STR_QUICKBUFF_SIZE) && (d_reserve > min_size)) - { - // see if we can trim to quick-buffer - if (min_size <= STR_QUICKBUFF_SIZE) - { - memcpy(d_quickbuff, d_buffer, min_size * sizeof(utf32)); - delete[] d_buffer; - d_reserve = STR_QUICKBUFF_SIZE; - } - // re-allocate buffer - else - { - utf32* temp = new utf32[min_size]; - memcpy(temp, d_buffer, min_size * sizeof(utf32)); - delete[] d_buffer; - d_buffer = temp; - d_reserve = min_size; - } - - } - -} - -// build an internal buffer with the string encoded as utf8 (remains valid until string is modified). -utf8* String::build_utf8_buff(void) const -{ - size_type buffsize = encoded_size(ptr(), d_cplength) + 1; - - if (buffsize > d_encodedbufflen) { - - if (d_encodedbufflen > 0) - { - delete[] d_encodedbuff; - } - - d_encodedbuff = new utf8[buffsize]; - d_encodedbufflen = buffsize; - } - - encode(ptr(), d_encodedbuff, buffsize, d_cplength); - - // always add a null at end - d_encodedbuff[buffsize-1] = ((utf8)0); - d_encodeddatlen = buffsize; - - return d_encodedbuff; -} - -//Get the bidirectional version of the string -String String::bidify(void) const -{ -#ifdef DETECT_ARRAY_ISSUES - doBidiTest (); -#endif - if ( !System::ms_bBidiEnabled ) - return *this; - - String tmp = *this; - - // Apply in sections separated by \n - size_type pos = 0; - while ( true ) - { - size_type newpos = tmp.find ( '\n', pos ); - if ( newpos == String::npos ) - { - doBidi(tmp.ptr() + pos, tmp.length() - pos, true, true); - break; - } - else - if ( newpos - pos > 0 ) - { - doBidi(tmp.ptr() + pos, newpos - pos, true, true); - tmp[newpos] = '\n'; // Restore \n (doBidi replaces it with a zero) - } - pos = newpos + 1; - } - - return tmp; -} - - -////////////////////////////////////////////////////////////////////////// -// Comparison operators -////////////////////////////////////////////////////////////////////////// -bool operator==(const String& str1, const String& str2) -{ - return (str1.compare(str2) == 0); -} - -bool operator==(const String& str, const std::string& std_str) -{ - return (str.compare(std_str) == 0); -} - -bool operator==(const std::string& std_str, const String& str) -{ - return (str.compare(std_str) == 0); -} - -bool operator==(const String& str, const utf8* utf8_str) -{ - return (str.compare(utf8_str) == 0); -} - -bool operator==(const utf8* utf8_str, const String& str) -{ - return (str.compare(utf8_str) == 0); -} - - -bool operator!=(const String& str1, const String& str2) -{ - return (str1.compare(str2) != 0); -} - -bool operator!=(const String& str, const std::string& std_str) -{ - return (str.compare(std_str) != 0); -} - -bool operator!=(const std::string& std_str, const String& str) -{ - return (str.compare(std_str) != 0); -} - -bool operator!=(const String& str, const utf8* utf8_str) -{ - return (str.compare(utf8_str) != 0); -} - -bool operator!=(const utf8* utf8_str, const String& str) -{ - return (str.compare(utf8_str) != 0); -} - - -bool operator<(const String& str1, const String& str2) -{ - return (str1.compare(str2) < 0); -} - -bool operator<(const String& str, const std::string& std_str) -{ - return (str.compare(std_str) < 0); -} - -bool operator<(const std::string& std_str, const String& str) -{ - return (str.compare(std_str) >= 0); -} - -bool operator<(const String& str, const utf8* utf8_str) -{ - return (str.compare(utf8_str) < 0); -} - -bool operator<(const utf8* utf8_str, const String& str) -{ - return (str.compare(utf8_str) >= 0); -} - - -bool operator>(const String& str1, const String& str2) -{ - return (str1.compare(str2) > 0); -} - -bool operator>(const String& str, const std::string& std_str) -{ - return (str.compare(std_str) > 0); -} - -bool operator>(const std::string& std_str, const String& str) -{ - return (str.compare(std_str) <= 0); -} - -bool operator>(const String& str, const utf8* utf8_str) -{ - return (str.compare(utf8_str) > 0); -} - -bool operator>(const utf8* utf8_str, const String& str) -{ - return (str.compare(utf8_str) <= 0); -} - - -bool operator<=(const String& str1, const String& str2) -{ - return (str1.compare(str2) <= 0); -} - -bool operator<=(const String& str, const std::string& std_str) -{ - return (str.compare(std_str) <= 0); -} - -bool operator<=(const std::string& std_str, const String& str) -{ - return (str.compare(std_str) >= 0); -} - -bool operator<=(const String& str, const utf8* utf8_str) -{ - return (str.compare(utf8_str) <= 0); -} - -bool operator<=(const utf8* utf8_str, const String& str) -{ - return (str.compare(utf8_str) >= 0); -} - - -bool operator>=(const String& str1, const String& str2) -{ - return (str1.compare(str2) >= 0); -} - -bool operator>=(const String& str, const std::string& std_str) -{ - return (str.compare(std_str) >= 0); -} - -bool operator>=(const std::string& std_str, const String& str) -{ - return (str.compare(std_str) <= 0); -} - -bool operator>=(const String& str, const utf8* utf8_str) -{ - return (str.compare(utf8_str) >= 0); -} - -bool operator>=(const utf8* utf8_str, const String& str) -{ - return (str.compare(utf8_str) <= 0); -} - -////////////////////////////////////////////////////////////////////////// -// c-string operators -////////////////////////////////////////////////////////////////////////// -bool operator==(const String& str, const char* c_str) -{ - return (str.compare(c_str) == 0); -} - -bool operator==(const char* c_str, const String& str) -{ - return (str.compare(c_str) == 0); -} - -bool operator!=(const String& str, const char* c_str) -{ - return (str.compare(c_str) != 0); -} - -bool operator!=(const char* c_str, const String& str) -{ - return (str.compare(c_str) != 0); -} - -bool operator<(const String& str, const char* c_str) -{ - return (str.compare(c_str) < 0); -} - -bool operator<(const char* c_str, const String& str) -{ - return (str.compare(c_str) >= 0); -} - -bool operator>(const String& str, const char* c_str) -{ - return (str.compare(c_str) > 0); -} - -bool operator>(const char* c_str, const String& str) -{ - return (str.compare(c_str) <= 0); -} - -bool operator<=(const String& str, const char* c_str) -{ - return (str.compare(c_str) <= 0); -} - -bool operator<=(const char* c_str, const String& str) -{ - return (str.compare(c_str) >= 0); -} - -bool operator>=(const String& str, const char* c_str) -{ - return (str.compare(c_str) >= 0); -} - -bool operator>=(const char* c_str, const String& str) -{ - return (str.compare(c_str) <= 0); -} - -////////////////////////////////////////////////////////////////////////// -// Concatenation operator functions -////////////////////////////////////////////////////////////////////////// -String operator+(const String& str1, const String& str2) -{ - String temp(str1); - temp.append(str2); - return temp; -} - -String operator+(const String& str, const std::string& std_str) -{ - String temp(str); - temp.append(std_str); - return temp; -} - -String operator+(const std::string& std_str, const String& str) -{ - String temp(std_str); - temp.append(str); - return temp; -} - -String operator+(const String& str, const utf8* utf8_str) -{ - String temp(str); - temp.append(utf8_str); - return temp; -} - -String operator+(const utf8* utf8_str, const String& str) -{ - String temp(utf8_str); - temp.append(str); - return temp; -} - -String operator+(const String& str, utf32 code_point) -{ - String temp(str); - temp.append(1, code_point); - return temp; -} - -String operator+(utf32 code_point, const String& str) -{ - String temp(1, code_point); - temp.append(str); - return temp; -} - -String operator+(const String& str, const char* c_str) -{ - String tmp(str); - tmp.append(c_str); - return tmp; -} - -String operator+(const char* c_str, const String& str) -{ - String tmp(c_str); - tmp.append(str); - return tmp; -} - -////////////////////////////////////////////////////////////////////////// -// Output (stream) functions -////////////////////////////////////////////////////////////////////////// -std::ostream& operator<<(std::ostream& s, const String& str) -{ - return s << str.c_str(); -} - -////////////////////////////////////////////////////////////////////////// -// Modifying operations -////////////////////////////////////////////////////////////////////////// -// swap the contents of str1 and str2 -void swap(String& str1, String& str2) -{ - str1.swap(str2); -} - - -////////////////////////////////////////////////////////////////////////// -// utf32 to wstring -////////////////////////////////////////////////////////////////////////// -typedef wchar_t utf16; -// encoding functions -// for all: -// src_len is in code units, or 0 for null terminated string. -// dest_len is in code units. -// returns number of code units put into dest buffer. -size_t utf32_To_utf16( const utf32* src, utf16* dest, size_t dest_len, size_t src_len ) -{ - size_t destCapacity = dest_len; - - // while there is data in the source buffer, - for (uint idx = 0; idx < src_len; ++idx) - { - utf32 cp = src[idx]; - - // check there is enough destination buffer to receive this encoded unit (exit loop & return if not) - if (destCapacity < 2) - { - break; - } - - if (cp < 0x10000) - { - *dest++ = (utf16)cp; - --destCapacity; - } - else - { - utf32 vm = cp - 0x10000; - utf32 vh = vm >> 10; - utf32 vl = vm & 0x3FF; - utf32 w1 = 0xD800 + vh; - utf32 w2 = 0xDC00 + vl; - *dest++ = (utf16)(w1); - *dest++ = (utf16)(w2); - destCapacity -= 2; - } - } - - return dest_len - destCapacity; -} - -std::wstring String::c_wstring ( void ) const -{ - const utf32* src = this->ptr(); - size_t src_len = this->length(); - - size_t dest_len = ( src_len + 10 ) * 2; - utf16* dest = (utf16*)_alloca( dest_len + 10 ); - size_t numChars = utf32_To_utf16( src, dest, dest_len, src_len ); - return std::wstring ( dest, numChars ); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUISystem.cpp b/vendor/cegui-0.4.0-custom/src/CEGUISystem.cpp deleted file mode 100644 index 22512a0a52..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUISystem.cpp +++ /dev/null @@ -1,1529 +0,0 @@ -/************************************************************************ - filename: CEGUISystem.cpp - created: 20/2/2004 - author: Paul D Turner - - purpose: Implementation of main system object -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "CEGUISystem.h" -#include "CEGUILogger.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIFontManager.h" -#include "CEGUIWindowFactoryManager.h" -#include "CEGUIWindowManager.h" -#include "CEGUISchemeManager.h" -#include "CEGUIMouseCursor.h" -#include "CEGUIWindow.h" -#include "CEGUIImageset.h" -#include "CEGUIExceptions.h" -#include "elements/CEGUIGUISheet.h" -#include "elements/CEGUIDragContainer.h" -#include "elements/CEGUIScrolledContainer.h" -#include "elements/CEGUITooltip.h" -#include "CEGUIScriptModule.h" -#include "CEGUIConfig_xmlHandler.h" -#include "CEGUIDataContainer.h" -#include "CEGUIResourceProvider.h" -#include "CEGUIGlobalEventSet.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "CEGUIPropertyHelper.h" -#include - -// set up for whichever default xml parser will be used -#ifdef CEGUI_WITH_XERCES -# include "CEGUIXercesParser.h" -# define CEGUI_DEFAULT_XMLPARSER XercesParser -#else -# include "CEGUITinyXMLParser.h" -# define CEGUI_DEFAULT_XMLPARSER TinyXMLParser -#endif - - -// Start of CEGUI namespace section -namespace CEGUI -{ -bool System::ms_bBidiEnabled = true; -const String System::EventNamespace("System"); - -/*! -\brief - Simple timer class. -*/ -class SimpleTimer -{ - clock_t d_baseTime; - -public: - SimpleTimer() : d_baseTime(clock()) {} - - void restart() { d_baseTime = clock(); } - double elapsed() { return static_cast(clock() - d_baseTime) / CLOCKS_PER_SEC; } -}; - -/*! -\brief - Implementation structure used in tracking up & down mouse button inputs in order to generate click, double-click, - and triple-click events. -*/ -struct MouseClickTracker -{ - MouseClickTracker(void) : d_click_count(0), d_click_area(0, 0, 0, 0) {} - - SimpleTimer d_timer; //!< Timer used to track clicks for this button. - int d_click_count; //!< count of clicks made so far. - Rect d_click_area; //!< area used to detect multi-clicks - Window* d_target_window; //!< target window for any events generated. -}; - - -struct MouseClickTrackerImpl -{ - MouseClickTracker click_trackers[MouseButtonCount]; -}; - - -/************************************************************************* - Constants definitions -*************************************************************************/ -const char System::CEGUIConfigSchemaName[] = "CEGUIConfig.xsd"; - - -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> System* Singleton::ms_Singleton = NULL; - -// click event generation defaults -const double System::DefaultSingleClickTimeout = 0.2; -const double System::DefaultMultiClickTimeout = 0.33; -const Size System::DefaultMultiClickAreaSize(12,12); - -// event names -const String System::EventGUISheetChanged( (utf8*)"GUISheetChanged" ); -const String System::EventSingleClickTimeoutChanged( (utf8*)"SingleClickTimeoutChanged" ); -const String System::EventMultiClickTimeoutChanged( (utf8*)"MultiClickTimeoutChanged" ); -const String System::EventMultiClickAreaSizeChanged( (utf8*)"MultiClickAreaSizeChanged" ); -const String System::EventDefaultFontChanged( (utf8*)"DefaultFontChanged" ); -const String System::EventDefaultMouseCursorChanged( (utf8*)"DefaultMouseCursorChanged" ); -const String System::EventMouseMoveScalingChanged( (utf8*)"MouseMoveScalingChanged" ); - - -/************************************************************************* - Constructor -*************************************************************************/ -System::System(Renderer* renderer, const utf8* logFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, NULL, NULL, NULL, (const utf8*)"", logFile); -} -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, ResourceProvider* resourceProvider,const utf8* logFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, resourceProvider, NULL, NULL, (const utf8*)"", logFile); -} - -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, ScriptModule* scriptModule, const utf8* configFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, NULL, NULL, scriptModule, configFile, (const utf8*)"CEGUI.log"); -} - - -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, ScriptModule* scriptModule, ResourceProvider* resourceProvider, const utf8* configFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, resourceProvider, NULL, scriptModule, configFile, (const utf8*)"CEGUI.log"); -} - -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, XMLParser* xmlParser, const utf8* logFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, NULL, xmlParser, NULL, (const utf8*)"", logFile); -} - -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, ResourceProvider* resourceProvider, XMLParser* xmlParser, const utf8* logFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, resourceProvider, xmlParser, NULL, (const utf8*)"", logFile); -} - -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, XMLParser* xmlParser, ScriptModule* scriptModule, const utf8* configFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, NULL, xmlParser, scriptModule, configFile, (const utf8*)"CEGUI.log"); -} - -/************************************************************************* - Construct a new System object -*************************************************************************/ -System::System(Renderer* renderer, ResourceProvider* resourceProvider, XMLParser* xmlParser, ScriptModule* scriptModule, const utf8* configFile) : - d_clickTrackerPimpl(new MouseClickTrackerImpl) -{ - constructor_impl(renderer, resourceProvider, xmlParser, scriptModule, configFile, (const utf8*)"CEGUI.log"); -} - -/************************************************************************* - Method to do the work of the constructor -*************************************************************************/ -void System::constructor_impl(Renderer* renderer, ResourceProvider* resourceProvider, XMLParser* xmlParser, ScriptModule* scriptModule, const String& configFile, const String& logFile) -{ - // Instantiate logger first (we have no file at this point, but entries will be cached until we do) - new Logger(); - - // Set CEGUI version - d_strVersion = PropertyHelper::uintToString(CEGUI_VERSION_MAJOR) + "." + - PropertyHelper::uintToString(CEGUI_VERSION_MINOR) + "." + - PropertyHelper::uintToString(CEGUI_VERSION_PATCH); - - d_renderer = renderer; - d_gui_redraw = false; - d_defaultFont = NULL; - d_wndWithMouse = NULL; - d_activeSheet = NULL; - d_modalTarget = NULL; - d_sysKeys = 0; - - d_lshift = false; - d_rshift = false; - d_lctrl = false; - d_rctrl = false; - d_ralt = false; - d_lalt = false; - d_started = false; - - d_click_timeout = DefaultSingleClickTimeout; - d_dblclick_timeout = DefaultMultiClickTimeout; - d_dblclick_size = DefaultMultiClickAreaSize; - - d_defaultMouseCursor = NULL; - d_scriptModule = scriptModule; - - d_mouseScalingFactor = 1.0f; - - // Tooltip setup - d_defaultTooltip = 0; - d_weOwnTooltip = false; - - // add events for Sytem object - addSystemEvents(); - - // if there has been a resource provider supplied use that otherwise create one. - d_resourceProvider = resourceProvider ? resourceProvider : renderer->createResourceProvider(); - - // use supplied xml parser if provided, otherwise create one of the defaults - if (xmlParser) - { - d_xmlParser = xmlParser; - d_ourXmlParser = false; - } - else - { - d_xmlParser = new CEGUI_DEFAULT_XMLPARSER; - d_ourXmlParser = true; - } - - // perform initialisation of XML parser. - d_xmlParser->initialise(); - - // strings we may get from the configuration file. - String configLogname, configSchemeName, configLayoutName, configInitScript, defaultFontName; - - // now XML is available, read the configuration file (if any) - if (!configFile.empty()) - { - // create handler object - Config_xmlHandler handler; - - // do parsing of xml file - try - { - d_xmlParser->parseXMLFile(handler, configFile, CEGUIConfigSchemaName, ""); - } - catch(...) - { - // cleanup XML stuff - d_xmlParser->cleanup(); - delete d_xmlParser; - - throw; - } - - // set the logging level - Logger::getSingleton().setLoggingLevel(handler.getLoggingLevel()); - - // get the strings read - configLogname = handler.getLogFilename(); - configSchemeName = handler.getSchemeFilename(); - configLayoutName = handler.getLayoutFilename(); - defaultFontName = handler.getDefaultFontName(); - configInitScript = handler.getInitScriptFilename(); - d_termScriptName = handler.getTermScriptFilename(); - - // set default resource group if it was specified. - if (!handler.getDefaultResourceGroup().empty()) - { - d_resourceProvider->setDefaultResourceGroup(handler.getDefaultResourceGroup()); - } - } - - // Start up the logger: - // prefer log filename from config file - if (!configLogname.empty()) - { - Logger::getSingleton().setLogFilename(configLogname, false); - } - // no log specified in configuration, use default / hard-coded option - else - { - Logger::getSingleton().setLogFilename(logFile, false); - } - - // beginning main init - Logger::getSingleton().logEvent((utf8*)"---- Begining CEGUI System initialisation ----"); - - // cause creation of other singleton objects - new ImagesetManager(); - d_fontManager = new FontManager(); - new WindowFactoryManager(); - new WindowManager(); - new SchemeManager(); - new MouseCursor(); - new GlobalEventSet(); - new WidgetLookManager(); - - // Add factories for types that the system supports natively - // (mainly because they do no rendering) - WindowFactoryManager::getSingleton().addFactory(new GUISheetFactory); - WindowFactoryManager::getSingleton().addFactory(new DragContainerFactory); - WindowFactoryManager::getSingleton().addFactory(new ScrolledContainerFactory); - - // GUISheet's name was changed, register an alias so both can be used - WindowFactoryManager::getSingleton().addWindowTypeAlias((utf8*)"DefaultGUISheet", GUISheet::WidgetTypeName); - - // success - we are created! Log it for prosperity :) - Logger::getSingleton().logEvent((utf8*)"CEGUI::System singleton created."); - Logger::getSingleton().logEvent((utf8*)"---- CEGUI System initialisation completed ----"); - Logger::getSingleton().logEvent((utf8*)"---- Version " + d_strVersion + " ----"); - Logger::getSingleton().logEvent("---- Renderer module is: " + d_renderer->getIdentifierString() + " ----"); - Logger::getSingleton().logEvent("---- XML Parser module is: " + d_xmlParser->getIdentifierString() + " ----"); - Logger::getSingleton().logEvent(d_scriptModule ? "---- Scripting module is: " + d_scriptModule->getIdentifierString() + " ----" : "---- Scripting module is: None ----"); - // subscribe to hear about display mode changes - d_renderer->subscribeEvent(Renderer::EventDisplaySizeChanged, Event::Subscriber(&CEGUI::System::handleDisplaySizeChange, this)); - - // load base scheme - if (!configSchemeName.empty()) - { - try - { - SchemeManager::getSingleton().loadScheme(configSchemeName, d_resourceProvider->getDefaultResourceGroup()); - - // set default font if that was specified also - if (!defaultFontName.empty()) - { - setDefaultFont(defaultFontName); - } - - } - catch (CEGUI::Exception exc) {} // catch exception and try to continue anyway - - } - - // load initial layout - if (!configLayoutName.empty()) - { - try - { - setGUISheet(WindowManager::getSingleton().loadWindowLayout(configLayoutName)); - } - catch (CEGUI::Exception exc) {} // catch exception and try to continue anyway - - } - - // Create script module bindings - if (d_scriptModule) - { - d_scriptModule->createBindings(); - } - - // execute start up script - if (!configInitScript.empty()) - { - try - { - executeScriptFile(configInitScript); - } - catch (...) {} // catch all exceptions and try to continue anyway - - } - -} - - -/************************************************************************* - Destructor -*************************************************************************/ -System::~System(void) -{ - Logger::getSingleton().logEvent((utf8*)"---- Begining CEGUI System destruction ----"); - - // execute shut-down script - if (!d_termScriptName.empty()) - { - try - { - executeScriptFile(d_termScriptName); - } - catch (...) {} // catch all exceptions and continue system shutdown - - } - - // Cleanup script module bindings - if (d_scriptModule) - { - d_scriptModule->destroyBindings(); - } - - // cleanup XML stuff - if (d_xmlParser) - { - d_xmlParser->cleanup(); - if (d_ourXmlParser) - delete d_xmlParser; - } - - // - // perform cleanup in correct sequence - // - // destroy windows so it's safe to destroy factories - WindowManager::getSingleton().destroyAllWindows(); - WindowManager::getSingleton().cleanDeadPool(); - - // get pointers to the factories we added - WindowFactory* guiSheetFactory = - WindowFactoryManager::getSingleton().getFactory(GUISheet::WidgetTypeName); - - WindowFactory* dragContainerFactory = - WindowFactoryManager::getSingleton().getFactory(DragContainer::WidgetTypeName); - - WindowFactory* scrolledContainerFactory = - WindowFactoryManager::getSingleton().getFactory(ScrolledContainer::WidgetTypeName); - - // remove factories so it's safe to unload GUI modules - WindowFactoryManager::getSingleton().removeAllFactories(); - - // destroy factories we created - delete guiSheetFactory; - delete dragContainerFactory; - delete scrolledContainerFactory; - - // cleanup singletons - delete SchemeManager::getSingletonPtr(); - delete WindowManager::getSingletonPtr(); - delete WindowFactoryManager::getSingletonPtr(); - delete WidgetLookManager::getSingletonPtr(); - delete FontManager::getSingletonPtr(); - delete MouseCursor::getSingletonPtr(); - delete ImagesetManager::getSingletonPtr(); - delete GlobalEventSet::getSingletonPtr(); - - Logger::getSingleton().logEvent((utf8*)"CEGUI::System singleton destroyed."); - Logger::getSingleton().logEvent((utf8*)"---- CEGUI System destruction completed ----"); - delete Logger::getSingletonPtr(); - - delete d_clickTrackerPimpl; -} - - -/************************************************************************* - Render the GUI for this frame -*************************************************************************/ -bool System::renderGUI(void) -{ - ////////////////////////////////////////////////////////////////////////// - // This makes use of some tricks the Renderer can do so that we do not - // need to do a full redraw every frame - only when some UI element has - // changed. - // - // Since the mouse is likely to move very often, and in order not to - // short-circuit the above optimisation, the mouse is not queued, but is - // drawn directly to the display every frame. - ////////////////////////////////////////////////////////////////////////// - - // Update cache timer - for ( FontManager::FontIterator fontIt = d_fontManager->getIterator() ; !fontIt.isAtEnd() ; ++fontIt ) - (*fontIt)->pulse (); - - if (d_gui_redraw) - { - d_renderer->resetZValue(); - d_renderer->setQueueingEnabled(true); - d_renderer->clearRenderList(); - - // Build fonts while the render list is empty - for ( FontManager::FontIterator fontIt = d_fontManager->getIterator() ; !fontIt.isAtEnd() ; ++fontIt ) - (*fontIt)->onClearRenderList (); - - if (d_activeSheet != NULL) - { - d_activeSheet->render(); - } - - d_gui_redraw = false; - } - - bool bRenderOk = d_renderer->doRender(); - - // draw mouse - d_renderer->setQueueingEnabled(false); - // MouseCursor::getSingleton().draw(); This is done by MTA later - - // do final destruction on dead-pool windows - WindowManager::getSingleton().cleanDeadPool(); - - // Flag for redraw to rebuild fonts if needed - for ( FontManager::FontIterator fontIt = d_fontManager->getIterator() ; !fontIt.isAtEnd() ; ++fontIt ) - if ( (*fontIt)->needsRebuild () ) - d_gui_redraw = true; - - d_started = true; - - return bRenderOk; -} - - -/************************************************************************* - Set the active GUI sheet (root) window. -*************************************************************************/ -Window* System::setGUISheet(Window* sheet) -{ - Window* old = d_activeSheet; - d_activeSheet = sheet; - - // Force and update for the area Rects for 'sheet' so they're correct according - // to the screen size. - if (sheet != 0) - { - WindowEventArgs sheetargs(0); - sheet->onParentSized(sheetargs); - } - - // fire event - WindowEventArgs args(old); - onGUISheetChanged(args); - - return old; -} - - -/************************************************************************* - Set the default font to be used by the system -*************************************************************************/ -void System::setDefaultFont(const String& name) -{ - if (name.empty()) - { - setDefaultFont(NULL); - } - else - { - setDefaultFont(FontManager::getSingleton().getFont(name)); - } - -} - - -/************************************************************************* - Set the default font to be used by the system -*************************************************************************/ -void System::setDefaultFont(Font* font) -{ - d_defaultFont = font; - - // fire event - EventArgs args; - onDefaultFontChanged(args); -} - - -/************************************************************************* - Set the image to be used as the default mouse cursor. -*************************************************************************/ -void System::setDefaultMouseCursor(const Image* image) -{ - // the default, default, is for nothing! - if (image == (const Image*)DefaultMouseCursor) - image = 0; - - // if mouse cursor is set to the current default we *may* need to - // update its Image immediately (first, we will investigate further!) - // - // NB: The reason we do this check, is to allow code to modify the cursor - // image directly without a call to this member changing the image back - // again. However, 'normal' updates to the cursor when the mouse enters - // a window will, of course, update the mouse image as expected. -#if 0 - if (MouseCursor::getSingleton().getImage() == d_defaultMouseCursor) - { - // does the window containing the mouse use the default cursor? - if ((d_wndWithMouse) && (0 == d_wndWithMouse->getMouseCursor(false))) - { - // default cursor is active, update the image immediately - MouseCursor::getSingleton().setImage(image); - } - } -#else - // Hope fix for #8017: Crash on changing GUI skin. - MouseCursor::getSingleton().setImage(image); -#endif - - // update our pointer for the default mouse cursor image. - d_defaultMouseCursor = image; - - // fire off event. - EventArgs args; - onDefaultMouseCursorChanged(args); -} - - -/************************************************************************* - Set the image to be used as the default mouse cursor. -*************************************************************************/ -void System::setDefaultMouseCursor(const String& imageset, const String& image_name) -{ - setDefaultMouseCursor(&ImagesetManager::getSingleton().getImageset(imageset)->getImage(image_name)); -} - - -/************************************************************************* - Return a pointer to the ScriptModule being used for scripting within - the GUI system. -*************************************************************************/ -ScriptModule* System::getScriptingModule(void) const -{ - return d_scriptModule; -} - -/************************************************************************* - Return a pointer to the ResourceProvider being used for within the GUI - system. -*************************************************************************/ -ResourceProvider* System::getResourceProvider(void) const -{ - return d_resourceProvider; -} - -/************************************************************************* - Execute a script file if possible. -*************************************************************************/ -void System::executeScriptFile(const String& filename, const String& resourceGroup) const -{ - if (d_scriptModule != NULL) - { - try - { - d_scriptModule->executeScriptFile(filename, resourceGroup); - } - catch(...) - { - throw GenericException((utf8*)"System::executeScriptFile - An exception was thrown during the execution of the script file."); - } - - } - else - { - Logger::getSingleton().logEvent((utf8*)"System::executeScriptFile - the script named '" + filename +"' could not be executed as no ScriptModule is available.", Errors); - } - -} - - -/************************************************************************* - Execute a scripted global function if possible. The function should - not take any parameters and should return an integer. -*************************************************************************/ -int System::executeScriptGlobal(const String& function_name) const -{ - if (d_scriptModule != NULL) - { - try - { - return d_scriptModule->executeScriptGlobal(function_name); - } - catch(...) - { - throw GenericException((utf8*)"System::executeScriptGlobal - An exception was thrown during execution of the scripted function."); - } - - } - else - { - Logger::getSingleton().logEvent((utf8*)"System::executeScriptGlobal - the global script function named '" + function_name +"' could not be executed as no ScriptModule is available.", Errors); - } - - return 0; -} - - -/************************************************************************* - If possible, execute script code contained in the given - CEGUI::String object. -*************************************************************************/ -void System::executeScriptString(const String& str) const -{ - if (d_scriptModule != NULL) - { - try - { - d_scriptModule->executeString(str); - } - catch(...) - { - throw GenericException((utf8*)"System::executeScriptString - An exception was thrown during execution of the script code."); - } - - } - else - { - Logger::getSingleton().logEvent((utf8*)"System::executeScriptString - the script code could not be executed as no ScriptModule is available.", Errors); - } -} - - -/************************************************************************* - return the current mouse movement scaling factor. -*************************************************************************/ -float System::getMouseMoveScaling(void) const -{ - return d_mouseScalingFactor; -} - - -/************************************************************************* - Set the current mouse movement scaling factor -*************************************************************************/ -void System::setMouseMoveScaling(float scaling) -{ - d_mouseScalingFactor = scaling; - - // fire off event. - EventArgs args; - onMouseMoveScalingChanged(args); -} - - -/************************************************************************* - Method that injects a mouse movement event into the system -*************************************************************************/ -bool System::injectMouseMove(float delta_x, float delta_y) -{ - MouseEventArgs ma(NULL); - MouseCursor& mouse = MouseCursor::getSingleton(); - - ma.moveDelta.d_x = delta_x * d_mouseScalingFactor; - ma.moveDelta.d_y = delta_y * d_mouseScalingFactor; - ma.sysKeys = d_sysKeys; - ma.wheelChange = 0; - ma.clickCount = 0; - - // move the mouse cursor & update position in args. - mouse.offsetPosition(ma.moveDelta); - ma.position = mouse.getPosition(); - - Window* dest_window = getTargetWindow(ma.position); - - // if there is no GUI sheet, then there is nowhere to send input - if (dest_window != NULL) - { - if (dest_window != d_wndWithMouse) - { - if (d_wndWithMouse != NULL) - { - ma.window = d_wndWithMouse; - ma.switchedWindow = dest_window; - d_wndWithMouse->onMouseLeaves(ma); - } - - ma.switchedWindow = d_wndWithMouse; - d_wndWithMouse = dest_window; - ma.window = dest_window; - dest_window->onMouseEnters(ma); - } - - // ensure event starts as 'not handled' - ma.handled = false; - - // loop backwards until event is handled or we run out of windows. - while ((!ma.handled) && (dest_window != NULL)) - { - ma.window = dest_window; - dest_window->onMouseMove(ma); - dest_window = getNextTargetWindow(dest_window); - } - - } - - return ma.handled; -} - - -/************************************************************************* - Method that injects that the mouse is leaves the application window -*************************************************************************/ -bool System::injectMouseLeaves(void) -{ - MouseEventArgs ma(NULL); - - // if there is no window that currently contains the mouse, then - // there is nowhere to send input - if (d_wndWithMouse != NULL) - { - ma.position = MouseCursor::getSingleton().getPosition(); - ma.moveDelta = Vector2(0.0f, 0.0f); - ma.button = NoButton; - ma.sysKeys = d_sysKeys; - ma.wheelChange = 0; - ma.window = d_wndWithMouse; - ma.clickCount = 0; - - d_wndWithMouse->onMouseLeaves(ma); - d_wndWithMouse = NULL; - } - - return ma.handled; -} - - -/************************************************************************* - Method that injects a mouse button down event into the system. -*************************************************************************/ -bool System::injectMouseButtonDown(MouseButton button) -{ - // update system keys - d_sysKeys |= mouseButtonToSyskey(button); - - MouseEventArgs ma(NULL); - ma.position = MouseCursor::getSingleton().getPosition(); - ma.moveDelta = Vector2(0.0f, 0.0f); - ma.button = button; - ma.sysKeys = d_sysKeys; - ma.wheelChange = 0; - - // find the likely destination for generated events. - Window* dest_window = getTargetWindow(ma.position); - - // - // Handling for multi-click generation - // - MouseClickTracker& tkr = d_clickTrackerPimpl->click_trackers[button]; - - tkr.d_click_count++; - - // if multi-click requirements are not met - if ((tkr.d_timer.elapsed() > d_dblclick_timeout) || - (!tkr.d_click_area.isPointInRect(ma.position)) || - (tkr.d_target_window != dest_window) || - (tkr.d_click_count > 3)) - { - // reset to single down event. - tkr.d_click_count = 1; - - // build new allowable area for multi-clicks - tkr.d_click_area.setPosition(ma.position); - tkr.d_click_area.setSize(d_dblclick_size); - tkr.d_click_area.offset(Point(-(d_dblclick_size.d_width / 2), -(d_dblclick_size.d_height / 2))); - - // set target window for click events on this tracker - tkr.d_target_window = dest_window; - } - - // set click count in the event args - ma.clickCount = tkr.d_click_count; - - // loop backwards until event is handled or we run out of windows. - while ((!ma.handled) && (dest_window != NULL)) - { - ma.window = dest_window; - - if (dest_window->wantsMultiClickEvents()) - { - switch (tkr.d_click_count) - { - case 1: - dest_window->onMouseButtonDown(ma); - break; - - case 2: - dest_window->onMouseDoubleClicked(ma); - break; - - case 3: - dest_window->onMouseTripleClicked(ma); - break; - } - } - // current target window does not want multi-clicks, - // so just send a mouse down event instead. - else - { - dest_window->onMouseButtonDown(ma); - } - - dest_window = getNextTargetWindow(dest_window); - } - - // reset timer for this tracker. - tkr.d_timer.restart(); - - return ma.handled; -} - - -/************************************************************************* - Method that injects a mouse button up event into the system. -*************************************************************************/ -bool System::injectMouseButtonUp(MouseButton button) -{ - // update system keys - d_sysKeys &= ~mouseButtonToSyskey(button); - - MouseEventArgs ma(NULL); - ma.position = MouseCursor::getSingleton().getPosition(); - ma.moveDelta = Vector2(0.0f, 0.0f); - ma.button = button; - ma.sysKeys = d_sysKeys; - ma.wheelChange = 0; - - // get the tracker that holds the number of down events seen so far for this button - MouseClickTracker& tkr = d_clickTrackerPimpl->click_trackers[button]; - // set click count in the event args - ma.clickCount = tkr.d_click_count; - - Window* const initial_dest_window = getTargetWindow(ma.position); - Window* dest_window = initial_dest_window; - - // loop backwards until event is handled or we run out of windows. - while ((!ma.handled) && (dest_window != NULL)) - { - ma.window = dest_window; - dest_window->onMouseButtonUp(ma); - dest_window = getNextTargetWindow(dest_window); - } - - bool wasUpHandled = ma.handled; - - // if requirements for click events are met - if ((tkr.d_timer.elapsed() <= d_click_timeout) && - (tkr.d_click_area.isPointInRect(ma.position)) && - (tkr.d_target_window == initial_dest_window)) - { - ma.handled = false; - dest_window = initial_dest_window; - - // loop backwards until event is handled or we run out of windows. - while ((!ma.handled) && (dest_window != NULL)) - { - ma.window = dest_window; - dest_window->onMouseClicked(ma); - dest_window = getNextTargetWindow(dest_window); - } - - } - - return (ma.handled | wasUpHandled); -} - - -/************************************************************************* - Method that injects a key down event into the system. -*************************************************************************/ -bool System::injectKeyDown(uint key_code) -{ - // update system keys - d_sysKeys |= keyCodeToSyskey((Key::Scan)key_code, true); - - KeyEventArgs args(NULL); - - if (d_activeSheet != NULL) - { - args.scancode = (Key::Scan)key_code; - args.sysKeys = d_sysKeys; - - Window* dest = getKeyboardTargetWindow(); - - // loop backwards until event is handled or we run out of windows. - while ((dest != NULL) && (!args.handled)) - { - args.window = dest; - dest->onKeyDown(args); - dest = getNextTargetWindow(dest); - } - - } - - return args.handled; -} - - -/************************************************************************* - Method that injects a key up event into the system. -*************************************************************************/ -bool System::injectKeyUp(uint key_code) -{ - // update system keys - d_sysKeys &= ~keyCodeToSyskey((Key::Scan)key_code, false); - - KeyEventArgs args(NULL); - - if (d_activeSheet != NULL) - { - args.scancode = (Key::Scan)key_code; - args.sysKeys = d_sysKeys; - - Window* dest = getKeyboardTargetWindow(); - - // loop backwards until event is handled or we run out of windows. - while ((dest != NULL) && (!args.handled)) - { - args.window = dest; - dest->onKeyUp(args); - dest = getNextTargetWindow(dest); - } - - } - - return args.handled; -} - - -/************************************************************************* - Method that injects a typed character event into the system. - > Make sure the glyph is loaded for this font by calling setText on the place where it is used -*************************************************************************/ -bool System::injectChar(utf32 code_point) -{ - KeyEventArgs args(NULL); - - if (d_activeSheet != NULL) - { - args.codepoint = code_point; - args.sysKeys = d_sysKeys; - - Window* dest = getKeyboardTargetWindow(); - - // loop backwards until event is handled or we run out of windows. - while ((dest != NULL) && (!args.handled)) - { - args.window = dest; - dest->onCharacter(args); - dest = getNextTargetWindow(dest); - } - - } - - return args.handled; -} - - -/************************************************************************* - Method that injects a mouse-wheel / scroll-wheel event into the system. -*************************************************************************/ -bool System::injectMouseWheelChange(float delta) -{ - MouseEventArgs ma(NULL); - ma.position = MouseCursor::getSingleton().getPosition(); - ma.moveDelta = Vector2(0.0f, 0.0f); - ma.button = NoButton; - ma.sysKeys = d_sysKeys; - ma.wheelChange = delta; - ma.clickCount = 0; - - Window* dest_window = getTargetWindow(ma.position); - - // loop backwards until event is handled or we run out of windows. - while ((!ma.handled) && (dest_window != NULL)) - { - ma.window = dest_window; - dest_window->onMouseWheel(ma); - dest_window = getNextTargetWindow(dest_window); - } - - return ma.handled; -} - - -/************************************************************************* - Method that injects a new position for the mouse cursor. -*************************************************************************/ -bool System::injectMousePosition(float x_pos, float y_pos) -{ - // set new mouse position - MouseCursor::getSingleton().setPosition(Point(x_pos, y_pos)); - - // do the real work - return injectMouseMove(0, 0); -} - - -/************************************************************************* - Method to inject time pulses into the system. -*************************************************************************/ -bool System::injectTimePulse(float timeElapsed) -{ - if (d_activeSheet != NULL) - { - d_activeSheet->update(timeElapsed); - } - - return true; -} - - -/************************************************************************* - Return window that should get mouse inouts when mouse it at 'pt' -*************************************************************************/ -Window* System::getTargetWindow(const Point& pt) const -{ - Window* dest_window = NULL; - - // if there is no GUI sheet, then there is nowhere to send input - if (d_activeSheet != NULL) - { - dest_window = Window::getCaptureWindow(); - - if (dest_window == NULL) - { - dest_window = d_activeSheet->getTargetChildAtPosition(pt); - - if (dest_window == NULL) - { - dest_window = d_activeSheet; - } - - } - else - { - if (dest_window->distributesCapturedInputs()) - { - Window* child_window = dest_window->getTargetChildAtPosition(pt); - - if (child_window != NULL) - { - dest_window = child_window; - } - - } - - } - - // modal target overrules - if (d_modalTarget != NULL && dest_window != d_modalTarget) - { - if (!dest_window->isAncestor(d_modalTarget)) - { - dest_window = d_modalTarget; - } - - } - - } - - return dest_window; -} - - -/************************************************************************* - Return window that should receive keyboard input -*************************************************************************/ -Window* System::getKeyboardTargetWindow(void) const -{ - Window* target = NULL; - - if (d_modalTarget == NULL) - { - target = d_activeSheet->getActiveChild(); - } - else - { - target = d_modalTarget->getActiveChild(); - if (target == NULL) - { - target = d_modalTarget; - } - } - - return target; -} - - -/************************************************************************* - Return the next window that should receive input in the chain -*************************************************************************/ -Window* System::getNextTargetWindow(Window* w) const -{ - // if we have not reached the modal target, return the parent - if (w != d_modalTarget) - { - return w->getParent(); - } - - // otherwise stop now - return NULL; -} - - -/************************************************************************* - Translate a MouseButton value into the corresponding SystemKey value -*************************************************************************/ -SystemKey System::mouseButtonToSyskey(MouseButton btn) const -{ - switch (btn) - { - case LeftButton: - return LeftMouse; - - case RightButton: - return RightMouse; - - case MiddleButton: - return MiddleMouse; - - case X1Button: - return X1Mouse; - - case X2Button: - return X2Mouse; - - default: - throw InvalidRequestException((utf8*)"System::mouseButtonToSyskey - the parameter 'btn' is not a valid MouseButton value."); - } -} - - -/************************************************************************* - Translate a Key::Scan value into the corresponding SystemKey value -*************************************************************************/ -SystemKey System::keyCodeToSyskey(Key::Scan key, bool direction) -{ - switch (key) - { - case Key::LeftShift: - d_lshift = direction; - - if (!d_rshift) - { - return Shift; - } - break; - - case Key::RightShift: - d_rshift = direction; - - if (!d_lshift) - { - return Shift; - } - break; - - - case Key::LeftControl: - d_lctrl = direction; - - if (!d_rctrl) - { - return Control; - } - break; - - case Key::RightControl: - d_rctrl = direction; - - if (!d_lctrl) - { - return Control; - } - break; - - case Key::LeftAlt: - d_lalt = direction; - - if (!d_ralt) - { - return Alt; - } - break; - - case Key::RightAlt: - d_ralt = direction; - - if (!d_lalt) - { - return Alt; - } - break; - - default: - break; - } - - // if not a system key or overall state unchanged, return 0. - return (SystemKey)0; -} - - -System& System::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -System* System::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - - - -/************************************************************************* - Set the timeout to be used for the generation of single-click events. -*************************************************************************/ -void System::setSingleClickTimeout(double timeout) -{ - d_click_timeout = timeout; - - // fire off event. - EventArgs args; - onSingleClickTimeoutChanged(args); -} - - -/************************************************************************* - Set the timeout to be used for the generation of multi-click events. -*************************************************************************/ -void System::setMultiClickTimeout(double timeout) -{ - d_dblclick_timeout = timeout; - - // fire off event. - EventArgs args; - onMultiClickTimeoutChanged(args); -} - - -/************************************************************************* - Set the size of the allowable mouse movement tolerance used when - generating multi-click events. -*************************************************************************/ -void System::setMultiClickToleranceAreaSize(const Size& sz) -{ - d_dblclick_size = sz; - - // fire off event. - EventArgs args; - onMultiClickAreaSizeChanged(args); -} - - -/************************************************************************* - add events for the System object -*************************************************************************/ -void System::addSystemEvents(void) -{ - addEvent(EventGUISheetChanged); - addEvent(EventSingleClickTimeoutChanged); - addEvent(EventMultiClickTimeoutChanged); - addEvent(EventMultiClickAreaSizeChanged); - addEvent(EventDefaultFontChanged); - addEvent(EventDefaultMouseCursorChanged); - addEvent(EventMouseMoveScalingChanged); -} - - -/************************************************************************* - Handler called when the main system GUI Sheet (or root window) is changed -*************************************************************************/ -void System::onGUISheetChanged(WindowEventArgs& e) -{ - fireEvent(EventGUISheetChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the single-click timeout value is changed. -*************************************************************************/ -void System::onSingleClickTimeoutChanged(EventArgs& e) -{ - fireEvent(EventSingleClickTimeoutChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the multi-click timeout value is changed. -*************************************************************************/ -void System::onMultiClickTimeoutChanged(EventArgs& e) -{ - fireEvent(EventMultiClickTimeoutChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the size of the multi-click tolerance area is - changed. -*************************************************************************/ -void System::onMultiClickAreaSizeChanged(EventArgs& e) -{ - fireEvent(EventMultiClickAreaSizeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the default system font is changed. -*************************************************************************/ -void System::onDefaultFontChanged(EventArgs& e) -{ - fireEvent(EventDefaultFontChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the default system mouse cursor image is changed. -*************************************************************************/ -void System::onDefaultMouseCursorChanged(EventArgs& e) -{ - fireEvent(EventDefaultMouseCursorChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the mouse movement scaling factor is changed. -*************************************************************************/ -void System::onMouseMoveScalingChanged(EventArgs& e) -{ - fireEvent(EventMouseMoveScalingChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler method for display size change notifications -*************************************************************************/ -bool System::handleDisplaySizeChange(const EventArgs& e) -{ - // notify the imageset/font manager of the size change - Size new_sz = getRenderer()->getSize(); - ImagesetManager::getSingleton().notifyScreenResolution(new_sz); - FontManager::getSingleton().notifyScreenResolution(new_sz); - - // notify gui sheet / root if size change, event propagation will ensure everything else - // gets updated as required. - if (d_activeSheet != NULL) - { - WindowEventArgs args(NULL); - d_activeSheet->onParentSized(args); - } - - return true; -} - - -/************************************************************************* - Internal method used to inform the System object whenever a window is - destroyed, so that System can perform any required housekeeping. -*************************************************************************/ -void System::notifyWindowDestroyed(const Window* window) -{ - if (d_wndWithMouse == window) - { - d_wndWithMouse = NULL; - } - - if (d_activeSheet == window) - { - d_activeSheet = NULL; - } - - if (d_modalTarget == window) - { - d_modalTarget = NULL; - } - -} - -void System::setTooltip(Tooltip* tooltip) -{ - // destroy current custom tooltip if one exists and we created it - if (d_defaultTooltip && d_weOwnTooltip) - WindowManager::getSingleton().destroyWindow(d_defaultTooltip); - - // set new custom tooltip - d_weOwnTooltip = false; - d_defaultTooltip = tooltip; -} - -void System::setTooltip(const String& tooltipType) -{ - // destroy current tooltip if one exists and we created it - if (d_defaultTooltip && d_weOwnTooltip) - WindowManager::getSingleton().destroyWindow(d_defaultTooltip); - - if (tooltipType.empty()) - { - d_defaultTooltip = 0; - d_weOwnTooltip = false; - } - else - { - try - { - d_defaultTooltip = static_cast(WindowManager::getSingleton().createWindow(tooltipType, "CEGUI::System::default__auto_tooltip__")); - d_weOwnTooltip = true; - } - catch(UnknownObjectException x) - { - d_defaultTooltip = 0; - d_weOwnTooltip = false; - } - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUITextUtils.cpp b/vendor/cegui-0.4.0-custom/src/CEGUITextUtils.cpp deleted file mode 100644 index bba7845e22..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUITextUtils.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/************************************************************************ - filename: CEGUITextUtils.cpp - created: 30/5/2004 - author: Paul D Turner - - purpose: Implementation of text support class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUITextUtils.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants -*************************************************************************/ -const String TextUtils::DefaultWhitespace = (utf8*)" \n\t\r"; -const String TextUtils::DefaultAlphanumerical = (utf8*)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; -const String TextUtils::DefaultWrapDelimiters = (utf8*)" \n\t\r"; - - -/************************************************************************* - return a String containing the the next word in a String. -*************************************************************************/ -String TextUtils::getNextWord(const String& str, String::size_type start_idx, const String& delimiters) -{ - String::size_type word_start = str.find_first_not_of(delimiters, start_idx); - - if (word_start == String::npos) - { - word_start = start_idx; - } - - String::size_type word_end = str.find_first_of(delimiters, word_start); - - if (word_end == String::npos) - { - word_end = str.length(); - } - - return str.substr(start_idx, (word_end - start_idx)); -} - - -/************************************************************************* - Return the index of the first character of the word at 'idx'. -*************************************************************************/ -String::size_type TextUtils::getWordStartIdx(const String& str, String::size_type idx) -{ - String temp = str.substr(0, idx); - - trimTrailingChars(temp, DefaultWhitespace); - - if (temp.length() <= 1) { - return 0; - } - - // identify the type of character at 'pos' - if (String::npos != DefaultAlphanumerical.find(temp[temp.length() - 1])) - { - idx = temp.find_last_not_of(DefaultAlphanumerical); - } - // since whitespace was stripped, character must be a symbol - else - { - idx = temp.find_last_of(DefaultAlphanumerical + DefaultWhitespace); - } - - // make sure we do not go past end of string (+1) - if (idx == String::npos) - { - return 0; - } - else - { - return idx + 1; - } - -} - - -/************************************************************************* - Return the index of the first character of the word after the word - at 'idx'. -*************************************************************************/ -String::size_type TextUtils::getNextWordStartIdx(const String& str, String::size_type idx) -{ - String::size_type str_len = str.length(); - - // do some checks for simple cases - if ((idx >= str_len) || (str_len == 0)) - { - return str_len; - } - - // is character at 'idx' alphanumeric - if (String::npos != DefaultAlphanumerical.find(str[idx])) - { - // find position of next character that is not alphanumeric - idx = str.find_first_not_of(DefaultAlphanumerical, idx); - } - // is character also not whitespace (therefore a symbol) - else if (String::npos == DefaultWhitespace.find(str[idx])) - { - // find index of next character that is either alphanumeric or whitespace - idx = str.find_first_of(DefaultAlphanumerical + DefaultWhitespace, idx); - } - - // check result at this stage. - if (String::npos == idx) - { - idx = str_len; - } - else - { - // if character at 'idx' is whitespace - if (String::npos != DefaultWhitespace.find(str[idx])) - { - // find next character that is not whitespace - idx = str.find_first_not_of(DefaultWhitespace, idx); - } - - if (String::npos == idx) - { - idx = str_len; - } - - } - - return idx; -} - - -/************************************************************************* - Trim all characters from the set specified in \a chars from the - begining of 'str'. -*************************************************************************/ -void TextUtils::trimLeadingChars(String& str, const String& chars) -{ - String::size_type idx = str.find_first_not_of(chars); - - if (idx != String::npos) - { - str.erase(0, idx); - } - else - { - str.erase(); - } - -} - - -/************************************************************************* - Trim all characters from the set specified in \a chars from the end - of 'str'. -*************************************************************************/ -void TextUtils::trimTrailingChars(String& str, const String& chars) -{ - String::size_type idx = str.find_last_not_of(chars); - - if (idx != String::npos) - { - str.resize(idx + 1); - } - else - { - str.erase(); - } - -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUITexture.cpp b/vendor/cegui-0.4.0-custom/src/CEGUITexture.cpp deleted file mode 100644 index 25d4d6eba6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUITexture.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/************************************************************************ - filename: CEGUITexture.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements Texture base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUITexture.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUITinyXMLParser.hpp b/vendor/cegui-0.4.0-custom/src/CEGUITinyXMLParser.hpp deleted file mode 100644 index 7404942915..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUITinyXMLParser.hpp +++ /dev/null @@ -1,129 +0,0 @@ -/************************************************************************ - filename: CEGUITinyXMLParser.cpp - created: Sun Mar 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "CEGUITinyXMLParser.h" -#include "CEGUIResourceProvider.h" -#include "CEGUISystem.h" -#include "CEGUIXMLHandler.h" -#include "CEGUIXMLAttributes.h" -#include "CEGUILogger.h" -#include "tinyxml/tinyxml.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - class TinyXMLDocument : public TiXmlDocument - { - public: - TinyXMLDocument(XMLHandler& handler, const String& filename, const String& schemaName, const String& resourceGroup); - ~TinyXMLDocument() - {} - protected: - void processElement(const TiXmlElement* element); - - private: - XMLHandler* d_handler; - }; - - TinyXMLDocument::TinyXMLDocument(XMLHandler& handler, const String& filename, const String& schemaName, const String& resourceGroup) - { - d_handler = &handler; - - // use resource provider to load file data - // TODO: Fix null termination issue. - RawDataContainer rawXMLData; - System::getSingleton().getResourceProvider()->loadRawDataContainer(filename, rawXMLData, resourceGroup); - - // Copy data and make sure buffer does not end with a whitespace character - CBuffer buffer ( rawXMLData.getDataPtr (), rawXMLData.getSize () ); - CBufferWriteStream stream ( buffer ); - stream.Seek ( stream.GetSize () ); - stream.Write ( (uchar)0 ); - - TiXmlDocument doc; - doc.Parse((const char*)buffer.GetData()); - - const TiXmlElement* currElement = doc.RootElement(); - - if (currElement) - { - // function called recursively to parse xml data - processElement(currElement); - } - - System::getSingleton().getResourceProvider()->unloadRawDataContainer(rawXMLData); - } - - void TinyXMLDocument::processElement(const TiXmlElement* element) - { - // build attributes block for the element - XMLAttributes attrs; - const TiXmlAttribute *currAttr = element->FirstAttribute(); - - while (currAttr) - { - attrs.add((utf8*)currAttr->Name(), (utf8*)currAttr->Value()); - currAttr = currAttr->Next(); - } - - // start element - d_handler->elementStart((utf8*)element->Value(), attrs); - - // do children - const TiXmlElement* childElement = element->FirstChildElement(); - - while (childElement) - { - processElement(childElement); - childElement = childElement->NextSiblingElement(); - } - - // end element - d_handler->elementEnd(element->Value()); - } - - - TinyXMLParser::TinyXMLParser(void) - { - // set ID string - d_identifierString = "CEGUI::TinyXMLParser - Official tinyXML based parser module for CEGUI"; - } - - TinyXMLParser::~TinyXMLParser(void) - {} - - void TinyXMLParser::parseXMLFile(XMLHandler& handler, const String& filename, const String& schemaName, const String& resourceGroup) - { - TinyXMLDocument doc(handler, filename, schemaName, resourceGroup); - } - - - bool TinyXMLParser::initialiseImpl(void) - { - return true; - } - - void TinyXMLParser::cleanupImpl(void) - {} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIVector.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIVector.cpp deleted file mode 100644 index d1f775282a..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIVector.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/************************************************************************ - filename: CEGUIVector.cpp - created: 14/3/2004 - author: Paul D Turner - - purpose: Implements Vector class methods -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIVector.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIWin32XMLSelectHack.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIWin32XMLSelectHack.cpp deleted file mode 100644 index 603360c118..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIWin32XMLSelectHack.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/************************************************************************ - filename: CEGUIWin32XMLSelectHack.cpp - created: 14/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -/************************************************************************* - This hack of a file will become source for whichever XML Parser has - been selected as the default. It's easier to do this than to mess - about trying to do the same by messing around with the project files - for all the different VC++ compiler versions. -*************************************************************************/ -#include "CEGUIConfig.h" - -#ifdef CEGUI_WITH_XERCES -# if defined (_MSC_VER) -# if defined (DEBUG) || defined (_DEBUG) -# pragma comment(lib,"xerces-c_2D.lib") -# else -# pragma comment(lib,"xerces-c_2.lib") -# endif -# endif -# include "CEGUIXercesParser.hpp" -#else -# include "CEGUITinyXMLParser.hpp" -#endif diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIWindow.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIWindow.cpp deleted file mode 100644 index 2cae857cd6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIWindow.cpp +++ /dev/null @@ -1,4186 +0,0 @@ -/************************************************************************ - filename: CEGUIWindow.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the Window base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIWindow.h" -#include "CEGUIExceptions.h" -#include "CEGUIWindowManager.h" -#include "CEGUISystem.h" -#include "CEGUIFontManager.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUIMouseCursor.h" -#include "elements/CEGUITooltip.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Window::EventNamespace("Window"); - -/************************************************************************* - Definitions for Window base class Properties -*************************************************************************/ -WindowProperties::AbsoluteHeight Window::d_absHeightProperty; -WindowProperties::AbsoluteMaxSize Window::d_absMaxSizeProperty; -WindowProperties::AbsoluteMinSize Window::d_absMinSizeProperty; -WindowProperties::AbsolutePosition Window::d_absPositionProperty; -WindowProperties::AbsoluteRect Window::d_absRectProperty; -WindowProperties::AbsoluteSize Window::d_absSizeProperty; -WindowProperties::AbsoluteWidth Window::d_absWidthProperty; -WindowProperties::AbsoluteXPosition Window::d_absXPosProperty; -WindowProperties::AbsoluteYPosition Window::d_absYPosProperty; -WindowProperties::Alpha Window::d_alphaProperty; -WindowProperties::AlwaysOnTop Window::d_alwaysOnTopProperty; -WindowProperties::ClippedByParent Window::d_clippedByParentProperty; -WindowProperties::DestroyedByParent Window::d_destroyedByParentProperty; -WindowProperties::Disabled Window::d_disabledProperty; -WindowProperties::Font Window::d_fontProperty; -WindowProperties::Height Window::d_heightProperty; -WindowProperties::ID Window::d_IDProperty; -WindowProperties::InheritsAlpha Window::d_inheritsAlphaProperty; -WindowProperties::MetricsMode Window::d_metricsModeProperty; -WindowProperties::MouseCursorImage Window::d_mouseCursorProperty; -WindowProperties::Position Window::d_positionProperty; -WindowProperties::Rect Window::d_rectProperty; -WindowProperties::RelativeHeight Window::d_relHeightProperty; -WindowProperties::RelativeMaxSize Window::d_relMaxSizeProperty; -WindowProperties::RelativeMinSize Window::d_relMinSizeProperty; -WindowProperties::RelativePosition Window::d_relPositionProperty; -WindowProperties::RelativeRect Window::d_relRectProperty; -WindowProperties::RelativeSize Window::d_relSizeProperty; -WindowProperties::RelativeWidth Window::d_relWidthProperty; -WindowProperties::RelativeXPosition Window::d_relXPosProperty; -WindowProperties::RelativeYPosition Window::d_relYPosProperty; -WindowProperties::RestoreOldCapture Window::d_restoreOldCaptureProperty; -WindowProperties::Size Window::d_sizeProperty; -WindowProperties::Text Window::d_textProperty; -WindowProperties::Visible Window::d_visibleProperty; -WindowProperties::Width Window::d_widthProperty; -WindowProperties::XPosition Window::d_xPosProperty; -WindowProperties::YPosition Window::d_yPosProperty; -WindowProperties::ZOrderChangeEnabled Window::d_zOrderChangeProperty; -WindowProperties::WantsMultiClickEvents Window::d_wantsMultiClicksProperty; -WindowProperties::MouseButtonDownAutoRepeat Window::d_autoRepeatProperty; -WindowProperties::AutoRepeatDelay Window::d_autoRepeatDelayProperty; -WindowProperties::AutoRepeatRate Window::d_autoRepeatRateProperty; -WindowProperties::DistributeCapturedInputs Window::d_distInputsProperty; -WindowProperties::CustomTooltipType Window::d_tooltipTypeProperty; -WindowProperties::Tooltip Window::d_tooltipProperty; -WindowProperties::InheritsTooltipText Window::d_inheritsTooltipProperty; -WindowProperties::RiseOnClick Window::d_riseOnClickProperty; -WindowProperties::VerticalAlignment Window::d_vertAlignProperty; -WindowProperties::HorizontalAlignment Window::d_horzAlignProperty; -WindowProperties::UnifiedAreaRect Window::d_unifiedAreaRectProperty; -WindowProperties::UnifiedPosition Window::d_unifiedPositionProperty; -WindowProperties::UnifiedXPosition Window::d_unifiedXPositionProperty; -WindowProperties::UnifiedYPosition Window::d_unifiedYPositionProperty; -WindowProperties::UnifiedSize Window::d_unifiedSizeProperty; -WindowProperties::UnifiedWidth Window::d_unifiedWidthProperty; -WindowProperties::UnifiedHeight Window::d_unifiedHeightProperty; -WindowProperties::UnifiedMinSize Window::d_unifiedMinSizeProperty; -WindowProperties::UnifiedMaxSize Window::d_unifiedMaxSizeProperty; -WindowProperties::MousePassThroughEnabled Window::d_mousePassThroughEnabledProperty; - -/************************************************************************* - static data definitions -*************************************************************************/ -Window* Window::d_captureWindow = NULL; - - -/************************************************************************* - Event name constants -*************************************************************************/ -const String Window::EventParentSized( (utf8*)"ParentSized" ); -const String Window::EventSized( (utf8*)"Sized" ); -const String Window::EventMoved( (utf8*)"Moved" ); -const String Window::EventTextChanged( (utf8*)"TextChanged" ); -const String Window::EventFontChanged( (utf8*)"FontChanged" ); -const String Window::EventAlphaChanged( (utf8*)"AlphaChanged" ); -const String Window::EventIDChanged( (utf8*)"IDChanged" ); -const String Window::EventActivated( (utf8*)"Activated" ); -const String Window::EventDeactivated( (utf8*)"Deactivated" ); -const String Window::EventShown( (utf8*)"Shown" ); -const String Window::EventHidden( (utf8*)"Hidden" ); -const String Window::EventEnabled( (utf8*)"Enabled" ); -const String Window::EventDisabled( (utf8*)"Disabled" ); -const String Window::EventMetricsModeChanged( (utf8*)"MetricsChanged" ); -const String Window::EventClippedByParentChanged( (utf8*)"ClippingChanged" ); -const String Window::EventDestroyedByParentChanged( (utf8*)"DestroyedByParentChanged" ); -const String Window::EventInheritsAlphaChanged( (utf8*)"InheritAlphaChanged" ); -const String Window::EventAlwaysOnTopChanged( (utf8*)"AlwaysOnTopChanged" ); -const String Window::EventInputCaptureGained( (utf8*)"CaptureGained" ); -const String Window::EventInputCaptureLost( (utf8*)"CaptureLost" ); -const String Window::EventRenderingStarted( (utf8*)"StartRender" ); -const String Window::EventRenderingEnded( (utf8*)"EndRender" ); -const String Window::EventChildAdded( (utf8*)"AddedChild" ); -const String Window::EventChildRemoved( (utf8*)"RemovedChild" ); -const String Window::EventDestructionStarted( (utf8*)"DestructStart" ); -const String Window::EventZOrderChanged( (utf8*)"ZChanged" ); -const String Window::EventDragDropItemEnters("DragDropItemEnters"); -const String Window::EventDragDropItemLeaves("DragDropItemLeaves"); -const String Window::EventDragDropItemDropped("DragDropItemDropped"); -const String Window::EventVerticalAlignmentChanged("VerticalAlignmentChanged"); -const String Window::EventHorizontalAlignmentChanged("HorizontalAlignmentChanged"); -const String Window::EventMouseEnters( (utf8*)"MouseEnter" ); -const String Window::EventMouseLeaves( (utf8*)"MouseLeave" ); -const String Window::EventMouseMove( (utf8*)"MouseMove" ); -const String Window::EventMouseWheel( (utf8*)"MouseWheel" ); -const String Window::EventMouseButtonDown( (utf8*)"MouseButtonDown" ); -const String Window::EventMouseButtonUp( (utf8*)"MouseButtonUp" ); -const String Window::EventMouseClick( (utf8*)"MouseClick" ); -const String Window::EventMouseDoubleClick( (utf8*)"MouseDoubleClick" ); -const String Window::EventMouseTripleClick( (utf8*)"MouseTripleClick" ); -const String Window::EventKeyDown( (utf8*)"KeyDown" ); -const String Window::EventKeyUp( (utf8*)"KeyUp" ); -const String Window::EventCharacterKey( (utf8*)"CharacterKey" ); -const String Window::EventRedrawRequested( (utf8*)"RedrawRequested" ); - - -/************************************************************************* - Constructor -*************************************************************************/ -Window::Window(const String& type, const String& name) : - d_type(type), - d_name(name) -{ - // basic set-up - d_metricsMode = Relative; - d_parent = NULL; - d_font = NULL; - d_ID = 0; - d_alpha = 1.0f; - d_mouseCursor = (const Image*)DefaultMouseCursor; - d_userData = NULL; - d_needsRedraw = true; - - // basic settings - d_enabled = true; - d_visible = true; - d_active = false; - d_clippedByParent = true; - d_destroyedByParent = true; - d_alwaysOnTop = false; - d_inheritsAlpha = true; - d_restoreOldCapture = false; - d_zOrderingEnabled = true; - d_wantsMultiClicks = true; - d_distCapturedInputs = false; - d_riseOnClick = true; - - // initialise mouse button auto-repeat state - d_repeatButton = NoButton; - d_autoRepeat = false; - d_repeating = false; - d_repeatDelay = 0.3f; - d_repeatRate = 0.06f; - - // Tooltip setup - d_customTip = 0; - d_weOwnTip = false; - d_inheritsTipText = false; - - // add events - addStandardEvents(); - - // set initial min/max sizes. These should normally be re-set in derived classes to something appropriate. - d_minSize = UVector2(cegui_reldim(0), cegui_reldim(0)); - d_maxSize = UVector2(cegui_reldim(1), cegui_reldim(1)); - - // set initial window area. - d_area = URect(cegui_reldim(0), cegui_reldim(0), cegui_reldim(0), cegui_reldim(0)); - d_pixelSize = Size(0, 0); - - // set initial alignments - d_horzAlign = HA_LEFT; - d_vertAlign = VA_TOP; - - // event pass through - d_mousePassThroughEnabled = false; - - // add properties - addStandardProperties(); -} - -/************************************************************************* - Destructor -*************************************************************************/ -Window::~Window(void) -{ - // cleanup events actually happened earlier. -} - - -/************************************************************************* - return type of this window. -*************************************************************************/ -const String& Window::getType(void) const -{ - return d_falagardType.empty() ? d_type : d_falagardType; -} - - -/************************************************************************* - return true if the Window is currently disabled -*************************************************************************/ -bool Window::isDisabled(bool localOnly) const -{ - bool parDisabled = ((d_parent == NULL) || localOnly) ? false : d_parent->isDisabled(); - - return (!d_enabled) || parDisabled; -} - - -/************************************************************************* - return true if the Window is currently visible. -*************************************************************************/ -bool Window::isVisible(bool localOnly) const -{ - bool parVisible = ((d_parent == NULL) || localOnly) ? true : d_parent->isVisible(); - - return d_visible && parVisible; -} - - -/************************************************************************* - return true if this is the active Window - (the window that receives inputs) -*************************************************************************/ -bool Window::isActive(void) const -{ - bool parActive = (d_parent == NULL) ? true : d_parent->isActive(); - - return d_active && parActive; -} - - -/************************************************************************* - returns whether a Window with the specified name is currently - attached to this Window as a child. -*************************************************************************/ -bool Window::isChild(const String& name) const -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->getName() == name) - { - return true; - } - - } - - return false; -} - -/************************************************************************* - returns whether at least one window with the given ID code is - attached as a child. -*************************************************************************/ -bool Window::isChild(uint ID) const -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->getID() == ID) - { - return true; - } - - } - - return false; -} - - -/************************************************************************* - return true if the given Window is a child of this window. -*************************************************************************/ -bool Window::isChild(const Window* window) const -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i] == window) - { - return true; - } - - } - - return false; -} - - -/************************************************************************* - return a pointer to the child window with the specified name. -*************************************************************************/ -Window* Window::getChild(const String& name) const -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->getName() == name) - { - return d_children[i]; - } - - } - - throw UnknownObjectException((utf8*)"Window::getChild - The Window object named '" + name +"' is not attached to Window '" + d_name + "'."); -} - - -/************************************************************************* - return a pointer to the first attached child window with the - specified ID. -*************************************************************************/ -Window* Window::getChild(uint ID) const -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->getID() == ID) - { - return d_children[i]; - } - - } - - // TODO: Update exception to include ID code - char strbuf[16]; - sprintf(strbuf, "%X", ID); - throw UnknownObjectException("Window::getChild - The Window with ID: '" + std::string(strbuf) + "' is not attached to Window '" + d_name + "'."); -} - - -/************************************************************************* - return a pointer to the Window that currently has input focus - starting with this Window. -*************************************************************************/ -Window* Window::getActiveChild(void) -{ - return const_cast(static_cast(this)->getActiveChild()); -} - - -/************************************************************************* - return a pointer to the Window that currently has input focus - starting with this Window. -*************************************************************************/ -const Window* Window::getActiveChild(void) const -{ - // are children can't be active if we are not - if (!isActive()) - { - return NULL; - } - - uint pos = getChildCount(); - - while (pos-- > 0) - { - // don't need full backward scan for activeness as we already know 'this' is active - // NB: This uses the draw-ordered child list, as that should be quicker in most cases. - if (d_drawList[pos]->d_active) - return d_drawList[pos]->getActiveChild(); - } - - // no child was active, therefore we are the topmost active window - return this; -} - - -/************************************************************************* - return true if the specified Window is some ancestor of this Window -*************************************************************************/ -bool Window::isAncestor(const String& name) const -{ - // if we have no ancestor then 'name' can't be ancestor - if (d_parent == NULL) - { - return false; - } - - // check our immediate parent - if (d_parent->getName() == name) - { - return true; - } - - // not out parent, check back up the family line - return d_parent->isAncestor(name); -} - - -/************************************************************************* - return true if any Window with the given ID is some ancestor of - this Window. -*************************************************************************/ -bool Window::isAncestor(uint ID) const -{ - // return false if we have no ancestor - if (d_parent == NULL) - { - return false; - } - - // check our immediate parent - if (d_parent->getID() == ID) - { - return true; - } - - // not our parent, check back up the family line - return d_parent->isAncestor(ID); -} - - -/************************************************************************* - return true if the specified Window is some ancestor of this Window. -*************************************************************************/ -bool Window::isAncestor(const Window* window) const -{ - // if we have no parent, then return false - if (d_parent == NULL) - { - return false; - } - - // check our immediate parent - if (d_parent == window) - { - return true; - } - - // not our parent, check back up the family line - return d_parent->isAncestor(window); -} - - -/************************************************************************* - return the Font object active for the Window. -*************************************************************************/ -const Font* Window::getFont(bool useDefault) const -{ - if (d_font == NULL) - { - return useDefault ? System::getSingleton().getDefaultFont() : 0; - } - - return d_font; -} - - -/************************************************************************* - return the effective alpha value that will be used when rendering - this window, taking into account inheritance of parent window(s) - alpha. -*************************************************************************/ -float Window::getEffectiveAlpha(void) const -{ - if ((d_parent == NULL) || (!inheritsAlpha())) - { - return d_alpha; - } - - return d_alpha * d_parent->getEffectiveAlpha(); -} - - -/************************************************************************* - return a Rect object that describes the Window area. -*************************************************************************/ -Rect Window::getRect(void) const -{ - return (getMetricsMode() == Relative) ? getRelativeRect() : getAbsoluteRect(); -} - - -/************************************************************************* - return a Rect object describing the Window area in screen space. -*************************************************************************/ -Rect Window::getPixelRect(void) const -{ - // clip to parent? - if (isClippedByParent() && (d_parent != NULL)) - { - return getUnclippedPixelRect().getIntersection(d_parent->getInnerRect()); - } - // else, clip to screen - else - { - return getUnclippedPixelRect().getIntersection(System::getSingleton().getRenderer()->getRect()); - } - -} - - -/************************************************************************* - return a Rect object describing the clipping area for this window. -*************************************************************************/ -Rect Window::getInnerRect(void) const -{ - // clip to parent? - if (isClippedByParent() && (d_parent != NULL)) - { - return getUnclippedInnerRect().getIntersection(d_parent->getInnerRect()); - } - // else, clip to screen - else - { - return getUnclippedInnerRect().getIntersection(System::getSingleton().getRenderer()->getRect()); - } - -} - - -/************************************************************************* - return a Rect object describing the Window area unclipped, in - screen space. -*************************************************************************/ -Rect Window::getUnclippedPixelRect(void) const -{ - if (getMetricsMode() == Relative) - { - return windowToScreen(Rect(0, 0, 1, 1)); - } - else - { - return windowToScreen(Rect(0, 0, getAbsoluteWidth(), getAbsoluteHeight())); - } -} - - -/************************************************************************* - Return a Rect object that describes, unclipped, the inner rectangle - for this window. The inner rectangle is typically an area that - excludes some frame or other rendering that should not be touched by - subsequent rendering. -*************************************************************************/ -Rect Window::getUnclippedInnerRect(void) const -{ - return getUnclippedPixelRect(); -} - - -/************************************************************************* - check if the given position would hit this window. -*************************************************************************/ -bool Window::isHit(const Point& position) const -{ - // cannot be hit if we are disabled. - if (isDisabled()) - { - return false; - } - - Rect clipped_area(getPixelRect()); - - if (clipped_area.getWidth() == 0) - { - return false; - } - - return clipped_area.isPointInRect(position); -} - -/************************************************************************* - return the child Window that is 'hit' by the given position -*************************************************************************/ -Window* Window::getChildAtPosition(const Point& position) const -{ - ChildList::const_reverse_iterator child, end; - - end = d_drawList.rend(); - - for (child = d_drawList.rbegin(); child != end; ++child) - { - if ((*child)->isVisible()) - { - // recursively scan children of this child windows... - Window* wnd = (*child)->getChildAtPosition(position); - - // return window pointer if we found a 'hit' down the chain somewhere - if (wnd != NULL) - { - return wnd; - } - // none of our childs children were hit, - else - { - // see if this child is hit and return it's pointer if it is - if ((*child)->isHit(position)) - { - return (*child); - } - - } - - } - - } - - // nothing hit - return NULL; -} - - -/************************************************************************* - return the child Window that is 'hit' by the given position and - is allowed to handle mouse events -*************************************************************************/ -Window* Window::getTargetChildAtPosition(const Point& position) const -{ - ChildList::const_reverse_iterator child; - ChildList::const_reverse_iterator end = d_drawList.rend(); - - for (child = d_drawList.rbegin(); child != end; ++child) - { - if ((*child)->isVisible()) - { - // recursively scan children of this child windows... - Window* wnd = (*child)->getTargetChildAtPosition(position); - - // return window pointer if we found a 'hit' down the chain somewhere - if (wnd != NULL) - { - return wnd; - } - // none of our childs children were hit, - else - { - // see if this child is accepting mouse input and is hit, - // and return it's pointer if it is - if (!(*child)->isMousePassThroughEnabled() && (*child)->isHit(position)) - { - return (*child); - } - } - } - } - - // nothing hit - return NULL; -} - - -/************************************************************************* - return the current metrics mode employed by the Window -*************************************************************************/ -MetricsMode Window::getMetricsMode(void) const -{ - if (d_metricsMode == Inherited) - { - return getInheritedMetricsMode(); - } - - return d_metricsMode; -} - - -/************************************************************************* - return the x position of the window. Interpretation of return value - depends upon the metric type in use by this window. -*************************************************************************/ -float Window::getXPosition(void) const -{ - return (getMetricsMode() == Relative) ? getRelativeXPosition() : getAbsoluteXPosition(); -} - - -/************************************************************************* - return the y position of the window. Interpretation of return value - depends upon the metric type in use by this window. -*************************************************************************/ -float Window::getYPosition(void) const -{ - return (getMetricsMode() == Relative) ? getRelativeYPosition() : getAbsoluteYPosition(); -} - - -/************************************************************************* - return the position of the window. Interpretation of return value - depends upon the metric type in use by this window. -*************************************************************************/ -Point Window::getPosition(void) const -{ - return (getMetricsMode() == Relative) ? getRelativePosition() : getAbsolutePosition(); -} - - -/************************************************************************* - return the width of the Window. Interpretation of return value - depends upon the metric type in use by this window. -*************************************************************************/ -float Window::getWidth(void) const -{ - return (getMetricsMode() == Relative) ? getRelativeWidth() : getAbsoluteWidth(); -} - - -/************************************************************************* - return the height of the Window. Interpretation of return value - depends upon the metric type in use by this window. -*************************************************************************/ -float Window::getHeight(void) const -{ - return (getMetricsMode() == Relative) ? getRelativeHeight() : getAbsoluteHeight(); -} - - -/************************************************************************* - return the size of the Window. Interpretation of return value - depends upon the metric type in use by this window. -*************************************************************************/ -Size Window::getSize(void) const -{ - return (getMetricsMode() == Relative) ? getRelativeSize() : getAbsoluteSize(); -} - - -/************************************************************************* - true to have the Window appear on top of all other non always on top - windows, or false to allow the window to be covered by other windows. -*************************************************************************/ -void Window::setAlwaysOnTop(bool setting) -{ - // only react to an actual change - if (isAlwaysOnTop() != setting) - { - d_alwaysOnTop = setting; - - // move us in front of sibling windows with the same 'always-on-top' setting as we have. - if (d_parent != NULL) - { - Window* org_parent = d_parent; - - org_parent->removeChild_impl(this); - org_parent->addChild_impl(this); - - onZChange_impl(); - } - - WindowEventArgs args(this); - onAlwaysOnTopChanged(args); - } - -} - - -/************************************************************************* - Set whether this window is enabled or disabled. A disabled window - normally can not be interacted with, and may have different rendering. -*************************************************************************/ -void Window::setEnabled(bool setting) -{ - // only react if setting has changed - if (d_enabled != setting) - { - d_enabled = setting; - WindowEventArgs args(this); - - if (d_enabled) - { - // check to see if the window is actually enabled (which depends upon all ancestor windows being enabled) - // we do this so that events we fire give an accurate indication of the state of a window. - if ((d_parent && !d_parent->isDisabled()) || !d_parent) - onEnabled(args); - } - else - { - onDisabled(args); - } - } -} - - -/************************************************************************* - Set whether the Window is visible or hidden. -*************************************************************************/ -void Window::setVisible(bool setting) -{ - // only react if setting has changed - if (d_visible != setting) - { - d_visible = setting; - WindowEventArgs args(this); - d_visible ? onShown(args) : onHidden(args); - } - -} - - -/************************************************************************* - Activate the Window giving it input focus and bringing it to the top - of all non always-on-top Windows. -*************************************************************************/ -void Window::activate(void) -{ - // force complete release of input capture. - // NB: This is not done via releaseCapture() because that has - // different behaviour depending on the restoreOldCapture setting. - if ((d_captureWindow != NULL) && (d_captureWindow != this)) - { - Window* tmpCapture = d_captureWindow; - d_captureWindow = NULL; - - WindowEventArgs args(NULL); - tmpCapture->onCaptureLost(args); - } - - moveToFront(); -} - - -/************************************************************************* - Deactivate the window. No further inputs will be received by the - window until it is re-activated either programmatically or by the - user interacting with the gui. -*************************************************************************/ -void Window::deactivate(void) -{ - ActivationEventArgs args(this); - args.otherWindow = NULL; - onDeactivated(args); -} - - -/************************************************************************* - Set whether this Window will be clipped by its parent window(s). -*************************************************************************/ -void Window::setClippedByParent(bool setting) -{ - // only react if setting has changed - if (d_clippedByParent != setting) - { - d_clippedByParent = setting; - WindowEventArgs args(this); - onClippingChanged(args); - } - -} - - -/************************************************************************* - Set the current text string for the Window. -*************************************************************************/ -void Window::setText(const String& text) -{ - if ( text == d_text_raw ) - return; - d_text_raw = text; - d_text = d_text_raw.bidify (); - - if ( getFont () ) - const_cast < Font* > ( getFont () )->insertStringForGlyphs ( d_text ); // Refresh our glyph set if there are new characters - - WindowEventArgs args(this); - onTextChanged(args); -} - - -/************************************************************************* - Set the current width of the Window. Interpretation of the input - value is dependant upon the current metrics system set for the Window. -*************************************************************************/ -void Window::setWidth(float width) -{ - setSize(Size(width, getHeight())); -} - - -/************************************************************************* - Set the current height of the Window. Interpretation of the input - value is dependant upon the current metrics system set for the Window. -*************************************************************************/ -void Window::setHeight(float height) -{ - setSize(Size(getWidth(), height)); -} - - -/************************************************************************* - Set the current size of the Window. Interpretation of the input value - is dependant upon the current metrics system set for the Window. -*************************************************************************/ -void Window::setSize(const Size& size) -{ - setSize(getMetricsMode(), size); -} - - -/************************************************************************* - Set the current 'x' position of the Window. Interpretation of the - input value is dependant upon the current metrics system set for the - Window. -*************************************************************************/ -void Window::setXPosition(float x) -{ - setPosition(Point(x, getYPosition())); -} - - -/************************************************************************* - Set the current 'y' position of the Window. Interpretation of the - input value is dependant upon the current metrics system set for the - Window. -*************************************************************************/ -void Window::setYPosition(float y) -{ - setPosition(Point(getXPosition(), y)); -} - - -/************************************************************************* - Set the current position of the Window. Interpretation of the input - value is dependant upon the current metrics system set for the Window. -*************************************************************************/ -void Window::setPosition(const Point& position) -{ - setPosition(getMetricsMode(), position); -} - - -/************************************************************************* - Set the current area for the Window, this allows for setting of - position and size at the same time. Interpretation of the input - value is dependant upon the current metrics system set for the Window. -*************************************************************************/ -void Window::setAreaRect(const Rect& area) -{ - setRect(getMetricsMode(), area); -} - - -/************************************************************************* - Set the font used by this Window. -*************************************************************************/ -void Window::setFont(const Font* font) -{ - if ( !d_font && font && !d_text.empty() ) - const_cast < Font* > ( font )->insertStringForGlyphs ( d_text ); // Refresh our glyph set if there are new characters - - d_font = font; - WindowEventArgs args(this); - onFontChanged(args); -} - - -/************************************************************************* - Set the font used by this Window. -*************************************************************************/ -void Window::setFont(const String& name) -{ - if (name.empty()) - { - setFont(NULL); - } - else - { - setFont(FontManager::getSingleton().getFont(name)); - } - -} - - -/************************************************************************* - Add the named Window as a child of this Window. If the Window is - already attached to a Window, it is detached before being added to - this Window. -*************************************************************************/ -void Window::addChildWindow(const String& name) -{ - addChildWindow(WindowManager::getSingleton().getWindow(name)); -} - - -/************************************************************************* - Add the specified Window as a child of this Window. If the Window - is already attached to a Window, it is detached before being added - to this Window. -*************************************************************************/ -void Window::addChildWindow(Window* window) -{ - // dont add ourselves as a child - if (window == this) - { - return; - } - addChild_impl(window); - WindowEventArgs args(window); - onChildAdded(args); - window->onZChange_impl(); -} - - -/************************************************************************* - Remove the named Window from this windows child list. -*************************************************************************/ -void Window::removeChildWindow(const String& name) -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->getName() == name) - { - removeChildWindow(d_children[i]); - return; - } - - } - -} - - -/************************************************************************* - Remove the specified Window form this windows child list. -*************************************************************************/ -void Window::removeChildWindow(Window* window) -{ - removeChild_impl(window); - WindowEventArgs args(window); - onChildRemoved(args); - window->onZChange_impl(); -} - - -/************************************************************************* - Remove the first child Window with the specified ID. If there is more - than one attached Window objects with the specified ID, only the fist - one encountered will be removed. -*************************************************************************/ -void Window::removeChildWindow(uint ID) -{ - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->getID() == ID) - { - removeChildWindow(d_children[i]); - return; - } - - } - -} - - -/************************************************************************* - Move the Window to the top of the z order. -*************************************************************************/ -void Window::moveToFront() -{ - moveToFront_impl(false); -} - - -/************************************************************************* - Implementation of move to front -*************************************************************************/ -void Window::moveToFront_impl(bool wasClicked) -{ - // if the window has no parent then we can have no siblings - if (d_parent == NULL) - { - // perform initial activation if required. - if (!isActive()) - { - ActivationEventArgs args(this); - args.otherWindow = NULL; - onActivated(args); - } - - return; - } - - // bring parent window to front of it's siblings - wasClicked ? d_parent->doRiseOnClick() : d_parent->moveToFront_impl(false); - - // get immediate child of parent that is currently active (if any) - Window* activeWnd = getActiveSibling(); - - // if a change in active window has occurred - if (activeWnd != this) - { - // notify ourselves that we have become active - ActivationEventArgs args(this); - args.otherWindow = activeWnd; - onActivated(args); - - // notify any previously active window that it is no longer active - if (activeWnd) - { - args.window = activeWnd; - args.otherWindow = this; - args.handled = false; - activeWnd->onDeactivated(args); - } - } - - // bring us to the front of our siblings - if (d_zOrderingEnabled) - { - // remove us from our parent's draw list - d_parent->removeWindowFromDrawList(*this); - // re-attach ourselves to our parent's draw list which will move us in front of - // sibling windows with the same 'always-on-top' setting as we have. - d_parent->addWindowToDrawList(*this); - // notify relevant windows about the z-order change. - onZChange_impl(); - } -} - - -/************************************************************************* - Move the Window to the bottom of the Z order. -*************************************************************************/ -void Window::moveToBack() -{ - // if the window is active, de-activate it. - if (isActive()) - { - ActivationEventArgs args(this); - args.otherWindow = NULL; - onDeactivated(args); - } - - // we only need to proceed if we have a parent (otherwise we have no siblings) - if (d_parent) - { - if (d_zOrderingEnabled) - { - // remove us from our parent's draw list - d_parent->removeWindowFromDrawList(*this); - // re-attach ourselves to our parent's draw list which will move us in behind - // sibling windows with the same 'always-on-top' setting as we have. - d_parent->addWindowToDrawList(*this, true); - // notify relevant windows about the z-order change. - onZChange_impl(); - } - - d_parent->moveToBack(); - } -} - - -/************************************************************************* - Captures input to this window -*************************************************************************/ -bool Window::captureInput(void) -{ - // we can only capture if we are the active window - if (!isActive()) { - return false; - } - - Window* current_capture = d_captureWindow; - d_captureWindow = this; - WindowEventArgs args(this); - - // inform any window which previously had capture that it doesn't anymore! - if ((current_capture != NULL) && (current_capture != this) && (!d_restoreOldCapture)) { - current_capture->onCaptureLost(args); - } - - if (d_restoreOldCapture) { - d_oldCapture = current_capture; - } - - onCaptureGained(args); - - return true; -} - - -/************************************************************************* - Releases input capture from this Window. If this Window does not - have inputs captured, nothing happens. -*************************************************************************/ -void Window::releaseInput(void) -{ - // if we are not the window that has capture, do nothing - if (!isCapturedByThis()) { - return; - } - - // restore old captured window if that mode is set - if (d_restoreOldCapture) { - d_captureWindow = d_oldCapture; - - // check for case when there was no previously captured window - if (d_oldCapture != NULL) { - d_oldCapture = NULL; - d_captureWindow->moveToFront(); - } - - } - else { - d_captureWindow = NULL; - } - - try - { - WindowEventArgs args(this); - onCaptureLost(args); - } - catch (UnknownObjectException) - { - // Guess fix for scrollbar throwing UnknownObjectException("WindowManager::getWindow ...") inside FalagardScrollbar::getValueFromThumb() - // (When called from Window::destroy()) - } -} - - -/************************************************************************* - Set whether this window will remember and restore the previous window - that had inputs captured. -*************************************************************************/ -void Window::setRestoreCapture(bool setting) -{ - d_restoreOldCapture = setting; - - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - d_children[i]->setRestoreCapture(setting); - } - -} - - -/************************************************************************* - Set the current alpha value for this window. -*************************************************************************/ -void Window::setAlpha(float alpha) -{ - d_alpha = alpha; - WindowEventArgs args(this); - onAlphaChanged(args); -} - - -/************************************************************************* - Sets whether this Window will inherit alpha from its parent windows. -*************************************************************************/ -void Window::setInheritsAlpha(bool setting) -{ - if (d_inheritsAlpha != setting) - { - // store old effective alpha so we can test if alpha value changes due to new setting. - float oldAlpha = getEffectiveAlpha(); - - // notify about the setting change. - d_inheritsAlpha = setting; - - WindowEventArgs args(this); - onInheritsAlphaChanged(args); - - // if effective alpha has changed fire notification about that too - if (oldAlpha != getEffectiveAlpha()) - { - args.handled = false; - onAlphaChanged(args); - } - - } - -} - - -/************************************************************************* - Signal the System object to redraw (at least) this Window on the next - render cycle. - - lil_Toady: A bit hacky here, had to clone the const function, - so it doesn't give linker errors in mta, there must - be a cleaner way to do that -*************************************************************************/ -void Window::requestRedraw(void) -{ - WindowEventArgs args(this); - onRedrawRequested(args); - - /* lil_Toady: This was the original cegui code - d_needsRedraw = true; - System::getSingleton().signalRedraw(); - */ -} - - -void Window::requestRedraw(void) const -{ - //d_needsRedraw = true; - //System::getSingleton().signalRedraw(); -} - - -void Window::forceRedraw(void) -{ - d_needsRedraw = true; - System::getSingleton().signalRedraw(); -} - -/************************************************************************* - Convert the given X co-ordinate from absolute to relative metrics. -*************************************************************************/ -float Window::absoluteToRelativeX(float val) const -{ - return absoluteToRelativeX_impl(this, val); -} - - -/************************************************************************* - Convert the given Y co-ordinate from absolute to relative metrics. -*************************************************************************/ -float Window::absoluteToRelativeY(float val) const -{ - return absoluteToRelativeY_impl(this, val); -} - - -/************************************************************************* - Convert the given position from absolute to relative metrics. -*************************************************************************/ -Point Window::absoluteToRelative(const Point& pt) const -{ - return absoluteToRelative_impl(this, pt); -} - - -/************************************************************************* - Convert the given size from absolute to relative metrics. -*************************************************************************/ -Size Window::absoluteToRelative(const Size& sze) const -{ - return absoluteToRelative_impl(this, sze); -} - - -/************************************************************************* - Convert the given area from absolute to relative metrics. -*************************************************************************/ -Rect Window::absoluteToRelative(const Rect& rect) const -{ - return absoluteToRelative_impl(this, rect); -} - - -/************************************************************************* - Convert the given X co-ordinate from relative to absolute metrics. -*************************************************************************/ -float Window::relativeToAbsoluteX(float val) const -{ - return relativeToAbsoluteX_impl(this, val); -} - - -/************************************************************************* - Convert the given Y co-ordinate from relative to absolute metrics. -*************************************************************************/ -float Window::relativeToAbsoluteY(float val) const -{ - return relativeToAbsoluteY_impl(this, val); -} - - -/************************************************************************* - Convert the given position from relative to absolute metrics. -*************************************************************************/ -Point Window::relativeToAbsolute(const Point& pt) const -{ - return relativeToAbsolute_impl(this, pt); -} - - -/************************************************************************* - Convert the given size from relative to absolute metrics. -*************************************************************************/ -Size Window::relativeToAbsolute(const Size& sze) const -{ - return relativeToAbsolute_impl(this, sze); -} - - -/************************************************************************* - Convert the given area from relative to absolute metrics. -*************************************************************************/ -Rect Window::relativeToAbsolute(const Rect& rect) const -{ - return relativeToAbsolute_impl(this, rect); -} - - -/************************************************************************* - Convert a window co-ordinate value, specified in whichever metrics - mode is active, to a screen relative pixel co-ordinate. -*************************************************************************/ -float Window::windowToScreenX(float x) const -{ - float baseX = 0; - - if (d_parent) - { - baseX = d_parent->windowToScreenX(baseX); - } - - switch(d_horzAlign) - { - case HA_CENTRE: - baseX += getAbsoluteXPosition() + ((getParentWidth() - getAbsoluteWidth()) * 0.5f); - break; - case HA_RIGHT: - baseX += getAbsoluteXPosition() + (getParentWidth() - getAbsoluteWidth()); - break; - default: - baseX += getAbsoluteXPosition(); - break; - } - - if (getMetricsMode() == Relative) - { - return baseX + relativeToAbsoluteX(x); - } - else - { - return baseX + x; - } - -} - - -/************************************************************************* - Convert a window co-ordinate value, specified in whichever metrics - mode is active, to a screen relative pixel co-ordinate. -*************************************************************************/ -float Window::windowToScreenY(float y) const -{ - float baseY = 0; - - if (d_parent) - { - baseY = d_parent->windowToScreenY(baseY); - } - - switch(d_vertAlign) - { - case VA_CENTRE: - baseY += getAbsoluteYPosition() + ((getParentHeight() - getAbsoluteHeight()) * 0.5f); - break; - case VA_BOTTOM: - baseY += getAbsoluteYPosition() + (getParentHeight() - getAbsoluteHeight()); - break; - default: - baseY += getAbsoluteYPosition(); - break; - } - - if (getMetricsMode() == Relative) - { - return baseY + relativeToAbsoluteY(y); - } - else - { - return baseY + y; - } - -} - - -/************************************************************************* - Convert a window co-ordinate position, specified in whichever metrics - mode is active, to a screen relative pixel co-ordinate position. -*************************************************************************/ -Point Window::windowToScreen(const Point& pt) const -{ - Point base(0, 0); - - if (d_parent) - { - base = d_parent->windowToScreen(base); - } - - switch(d_horzAlign) - { - case HA_CENTRE: - base.d_x += getAbsoluteXPosition() + ((getParentWidth() - getAbsoluteWidth()) * 0.5f); - break; - case HA_RIGHT: - base.d_x += getAbsoluteXPosition() + (getParentWidth() - getAbsoluteWidth()); - break; - default: - base.d_x += getAbsoluteXPosition(); - break; - } - - switch(d_vertAlign) - { - case VA_CENTRE: - base.d_y += getAbsoluteYPosition() + ((getParentHeight() - getAbsoluteHeight()) * 0.5f); - break; - case VA_BOTTOM: - base.d_y += getAbsoluteYPosition() + (getParentHeight() - getAbsoluteHeight()); - break; - default: - base.d_y += getAbsoluteYPosition(); - break; - } - - if (getMetricsMode() == Relative) - { - return base + relativeToAbsolute(pt); - } - else - { - return base + pt; - } - -} - - -/************************************************************************* - Convert a window size value, specified in whichever metrics mode is - active, to a size in pixels. -*************************************************************************/ -Size Window::windowToScreen(const Size& sze) const -{ - if (getMetricsMode() == Relative) - { - return Size(sze.d_width * getAbsoluteWidth(), sze.d_height * getAbsoluteHeight()); - } - else - { - return sze; - } - -} - - -/************************************************************************* - Convert a window area, specified in whichever metrics mode is - active, to a screen area. -*************************************************************************/ -Rect Window::windowToScreen(const Rect& rect) const -{ - Point base(0, 0); - - if (d_parent) - { - base = d_parent->windowToScreen(base); - } - - switch(d_horzAlign) - { - case HA_CENTRE: - base.d_x += getAbsoluteXPosition() + ((getParentWidth() - getAbsoluteWidth()) * 0.5f); - break; - case HA_RIGHT: - base.d_x += getAbsoluteXPosition() + (getParentWidth() - getAbsoluteWidth()); - break; - default: - base.d_x += getAbsoluteXPosition(); - break; - } - - switch(d_vertAlign) - { - case VA_CENTRE: - base.d_y += getAbsoluteYPosition() + ((getParentHeight() - getAbsoluteHeight()) * 0.5f); - break; - case VA_BOTTOM: - base.d_y += getAbsoluteYPosition() + (getParentHeight() - getAbsoluteHeight()); - break; - default: - base.d_y += getAbsoluteYPosition(); - break; - } - - if (getMetricsMode() == Relative) - { - return relativeToAbsolute(rect).offset(base); - } - else - { - Rect tmp(rect); - return tmp.offset(base); - } - -} - - -/************************************************************************* - Convert a screen relative pixel co-ordinate value to a window - co-ordinate value, specified in whichever metrics mode is active. -*************************************************************************/ -float Window::screenToWindowX(float x) const -{ - x -= windowToScreenX(0); - - if (getMetricsMode() == Relative) - { - x /= getAbsoluteWidth(); - } - - return x; -} - - -/************************************************************************* - Convert a screen relative pixel co-ordinate value to a window - co-ordinate value, specified in whichever metrics mode is active. -*************************************************************************/ -float Window::screenToWindowY(float y) const -{ - y -= windowToScreenY(0); - - if (getMetricsMode() == Relative) - { - y /= getAbsoluteHeight(); - } - - return y; -} - - -/************************************************************************* - Convert a screen relative pixel position to a window co-ordinate - position, specified in whichever metrics mode is active. -*************************************************************************/ -Point Window::screenToWindow(const Point& pt) const -{ - Point tmp(pt); - - tmp.d_x -= windowToScreenX(0); - tmp.d_y -= windowToScreenY(0); - - if (getMetricsMode() == Relative) - { - tmp.d_x /= getAbsoluteWidth(); - tmp.d_y /= getAbsoluteHeight(); - } - - return tmp; -} - - -/************************************************************************* - Convert a screen size to a window based size -*************************************************************************/ -Size Window::screenToWindow(const Size& sze) const -{ - Size tmp(sze); - - if (getMetricsMode() == Relative) - { - tmp.d_width /= getAbsoluteWidth(); - tmp.d_height /= getAbsoluteHeight(); - } - - return tmp; -} - - -/************************************************************************* - Convert a screen area to a window area, specified in whichever - metrics mode is active. -*************************************************************************/ -Rect Window::screenToWindow(const Rect& rect) const -{ - Rect tmp(rect); - - tmp.d_left -= windowToScreenX(0); - tmp.d_top -= windowToScreenY(0); - tmp.d_right -= windowToScreenX(0); - tmp.d_bottom -= windowToScreenY(0); - - if (getMetricsMode() == Relative) - { - tmp.d_left /= getAbsoluteWidth(); - tmp.d_top /= getAbsoluteHeight(); - tmp.d_right /= getAbsoluteWidth(); - tmp.d_bottom /= getAbsoluteHeight(); - } - - return tmp; -} - - -/************************************************************************* - Convert the given X co-ordinate from unified to relative metrics. -*************************************************************************/ -float Window::unifiedToRelativeX(const UDim& val) const -{ - return val.asRelative(d_pixelSize.d_width); -} - -/************************************************************************* - Convert the given Y co-ordinate from unified to relative metrics. -*************************************************************************/ -float Window::unifiedToRelativeY(const UDim& val) const -{ - return val.asRelative(d_pixelSize.d_height); -} - -/************************************************************************* - Convert the given UVector2 value from unified to relative metrics. -*************************************************************************/ -Vector2 Window::unifiedToRelative(const UVector2& val) const -{ - return val.asRelative(d_pixelSize); -} - -/************************************************************************* - Convert the given area from unfied to relative metrics. -*************************************************************************/ -Rect Window::unifiedToRelative(const URect& val) const -{ - return val.asRelative(d_pixelSize); -} - -/************************************************************************* - Convert the given X co-ordinate from unified to absolute metrics. -*************************************************************************/ -float Window::unifiedToAbsoluteX(const UDim& val) const -{ - return val.asAbsolute(d_pixelSize.d_width); -} - -/************************************************************************* - Convert the given Y co-ordinate from unified to absolute metrics. -*************************************************************************/ -float Window::unifiedToAbsoluteY(const UDim& val) const -{ - return val.asAbsolute(d_pixelSize.d_height); -} - -/************************************************************************* - Convert the given UVector2 value from unified to absolute metrics. -*************************************************************************/ -Vector2 Window::unifiedToAbsolute(const UVector2& val) const -{ - return val.asAbsolute(d_pixelSize); -} - -/************************************************************************* - Convert the given area from unfied to absolute metrics. -*************************************************************************/ -Rect Window::unifiedToAbsolute(const URect& val) const -{ - return val.asAbsolute(d_pixelSize); -} - -/************************************************************************* - Convert a window co-ordinate value, specified as a UDim, to a screen - relative pixel co-ordinate. -*************************************************************************/ -float Window::windowToScreenX(const UDim& x) const -{ - float baseX = d_parent ? d_parent->windowToScreenX(0) + getAbsoluteXPosition() : getAbsoluteXPosition(); - - switch(d_horzAlign) - { - case HA_CENTRE: - baseX += (getParentWidth() - d_pixelSize.d_width) * 0.5f; - break; - case HA_RIGHT: - baseX += getParentWidth() - d_pixelSize.d_width; - break; - default: - break; - } - - return baseX + x.asAbsolute(d_pixelSize.d_width); -} - -/************************************************************************* - Convert a window co-ordinate value, specified as a UDim, to a screen - relative pixel co-ordinate. -*************************************************************************/ -float Window::windowToScreenY(const UDim& y) const -{ - float baseY = d_parent ? d_parent->windowToScreenY(0) + getAbsoluteYPosition() : getAbsoluteYPosition(); - - switch(d_vertAlign) - { - case VA_CENTRE: - baseY += (getParentHeight() - d_pixelSize.d_height) * 0.5f; - break; - case VA_BOTTOM: - baseY += getParentHeight() - d_pixelSize.d_height; - break; - default: - break; - } - - return baseY + y.asAbsolute(d_pixelSize.d_height); -} - -/************************************************************************* - Convert a window co-ordinate point, specified as a UVector2, to a - screen relative pixel co-ordinate point. -*************************************************************************/ -Vector2 Window::windowToScreen(const UVector2& vec) const -{ - Vector2 base(0, 0); - base = d_parent ? d_parent->windowToScreen(base) + getAbsolutePosition() : getAbsolutePosition(); - - switch(d_horzAlign) - { - case HA_CENTRE: - base.d_x += (getParentWidth() - d_pixelSize.d_width) * 0.5f; - break; - case HA_RIGHT: - base.d_x += getParentWidth() - d_pixelSize.d_width; - break; - default: - break; - } - - switch(d_vertAlign) - { - case VA_CENTRE: - base.d_y += (getParentHeight() - d_pixelSize.d_height) * 0.5f; - break; - case VA_BOTTOM: - base.d_y += getParentHeight() - d_pixelSize.d_height; - break; - default: - break; - } - - return base + vec.asAbsolute(d_pixelSize); -} - -/************************************************************************* - Convert a window area, specified as a URect, to a screen area. -*************************************************************************/ -Rect Window::windowToScreen(const URect& rect) const -{ - Vector2 base(0, 0); - base = d_parent ? d_parent->windowToScreen(base) + getAbsolutePosition() : getAbsolutePosition(); - - switch(d_horzAlign) - { - case HA_CENTRE: - base.d_x += (getParentWidth() - d_pixelSize.d_width) * 0.5f; - break; - case HA_RIGHT: - base.d_x += getParentWidth() - d_pixelSize.d_width; - break; - default: - break; - } - - switch(d_vertAlign) - { - case VA_CENTRE: - base.d_y += (getParentHeight() - d_pixelSize.d_height) * 0.5f; - break; - case VA_BOTTOM: - base.d_y += getParentHeight() - d_pixelSize.d_height; - break; - default: - break; - } - - Rect tmp(rect.asAbsolute(d_pixelSize)); - return tmp.offset(base); -} - -/************************************************************************* - Convert a screen relative UDim co-ordinate value to a window - co-ordinate value, specified in whichever metrics mode is active. -*************************************************************************/ -float Window::screenToWindowX(const UDim& x) const -{ - return screenToWindowX(x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); -} - -/************************************************************************* - Convert a screen relative UDim co-ordinate value to a window - co-ordinate value, specified in whichever metrics mode is active. -*************************************************************************/ -float Window::screenToWindowY(const UDim& y) const -{ - return screenToWindowY(y.asAbsolute(System::getSingleton().getRenderer()->getHeight())); -} - -/************************************************************************* - Convert a screen relative UVector2 point to a window co-ordinate - point, specified in whichever metrics mode is active. -*************************************************************************/ -Vector2 Window::screenToWindow(const UVector2& vec) const -{ - return screenToWindow(vec.asAbsolute(System::getSingleton().getRenderer()->getSize())); -} - -/************************************************************************* - Convert a URect screen area to a window area, specified in whichever - metrics mode is active. -*************************************************************************/ -Rect Window::screenToWindow(const URect& rect) const -{ - return screenToWindow(rect.asAbsolute(System::getSingleton().getRenderer()->getSize())); -} - -/************************************************************************* - Causes the Window object to render itself. -*************************************************************************/ -void Window::render(void) -{ - // don't do anything if window is not visible - if (!isVisible()) { - return; - } - - // signal rendering started - WindowEventArgs args(this); - onRenderingStarted(args); - - // perform drawing for 'this' Window - Renderer* renderer = System::getSingleton().getRenderer(); - drawSelf(renderer->getCurrentZ()); - renderer->advanceZValue(); - - // render any child windows - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - d_drawList[i]->render(); - } - - // signal rendering ended - onRenderingEnded(args); -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void Window::drawSelf(float z) -{ - if (d_needsRedraw) - { - // dispose of already cached imagery. - d_renderCache.clearCachedImagery(); - // get derived class to re-populate cache. - populateRenderCache(); - // mark ourselves as no longer needed a redraw. - d_needsRedraw = false; - } - - // if render cache contains imagery. - if (d_renderCache.hasCachedImagery()) - { - Point absPos(getUnclippedPixelRect().getPosition()); - // calculate clipping area for this window - Rect clipper(getPixelRect()); - // If window is not totally clipped. - if (clipper.getWidth()) - { - // send cached imagery to the renderer. - d_renderCache.render(absPos, z, clipper); - } - } -} - - -/************************************************************************* - Set the parent window for this window object. -*************************************************************************/ -void Window::setParent(Window* parent) -{ - d_parent = parent; -} - - -/************************************************************************* - Return the pixel Width of the parent element. - This always returns a valid number. -*************************************************************************/ -float Window::getParentWidth(void) const -{ - if (d_parent == NULL) - { - return System::getSingleton().getRenderer()->getWidth(); - } - - return d_parent->getAbsoluteWidth(); -} - - -/************************************************************************* - Return the pixel Height of the parent element. - This always returns a valid number. -*************************************************************************/ -float Window::getParentHeight(void) const -{ - if (d_parent == NULL) - { - return System::getSingleton().getRenderer()->getHeight(); - } - - return d_parent->getAbsoluteHeight(); -} - - -/************************************************************************* - Return the pixel size of the parent element. - This always returns a valid object. -*************************************************************************/ -Size Window::getParentSize(void) const -{ - return getWindowSize_impl(d_parent); -} - - -/************************************************************************* - Add standard Window events -*************************************************************************/ -void Window::addStandardEvents( bool bCommon ) -{ - if ( bCommon == false ) - { - // window events - addEvent(EventFontChanged); - addEvent(EventAlphaChanged); - addEvent(EventIDChanged); - addEvent(EventActivated); - addEvent(EventDeactivated); - addEvent(EventShown); - addEvent(EventHidden); - addEvent(EventEnabled); - addEvent(EventDisabled); - addEvent(EventMetricsModeChanged); - addEvent(EventClippedByParentChanged); - addEvent(EventDestroyedByParentChanged); - addEvent(EventInheritsAlphaChanged); - addEvent(EventAlwaysOnTopChanged); - addEvent(EventInputCaptureGained); - addEvent(EventInputCaptureLost); - addEvent(EventRenderingStarted); - addEvent(EventRenderingEnded); - addEvent(EventChildAdded); - addEvent(EventChildRemoved); - addEvent(EventDestructionStarted); - addEvent(EventZOrderChanged); - addEvent(EventParentSized); - addEvent(EventDragDropItemEnters); - addEvent(EventDragDropItemLeaves); - addEvent(EventDragDropItemDropped); - addEvent(EventVerticalAlignmentChanged); - addEvent(EventHorizontalAlignmentChanged); - - // general input handling - addEvent(EventMouseMove); - addEvent(EventMouseWheel); - addEvent(EventMouseButtonUp); - addEvent(EventMouseDoubleClick); - addEvent(EventMouseTripleClick); - addEvent(EventKeyUp); - addEvent(EventCharacterKey); - - // MTA event - addEvent(EventRedrawRequested); - } - else - { - // window events - addEvent(EventSized); - addEvent(EventMoved); - addEvent(EventTextChanged); - - // general input handling - addEvent(EventMouseEnters); - addEvent(EventMouseLeaves); - addEvent(EventMouseButtonDown); - addEvent(EventMouseClick); - addEvent(EventKeyDown); - } -} - - -/************************************************************************* - Cleanup child windows -*************************************************************************/ -void Window::cleanupChildren(void) -{ - while(getChildCount() != 0) - { - Window* wnd = d_children[0]; - - // always remove child - removeChildWindow(wnd); - - // destroy child if that is required - if (wnd->isDestroyedByParent()) - { - WindowManager::getSingleton().destroyWindow(wnd); - } - - } - -} - - -/************************************************************************* - Add given window to child list at an appropriate position -*************************************************************************/ -void Window::addChild_impl(Window* wnd) -{ - // if window is already attached, detach it first (will fire normal events) - if (wnd->getParent() != NULL) - wnd->getParent()->removeChildWindow(wnd); - addWindowToDrawList(*wnd); - - // add window to child list - d_children.push_back(wnd); - - // set the parent window - wnd->setParent(this); - - // Force and update for the area Rects for 'wnd' so they're correct for it's new parent. - WindowEventArgs args(this); - wnd->onParentSized(args); -} - - -/************************************************************************* - Remove given window from child list -*************************************************************************/ -void Window::removeChild_impl(Window* wnd) -{ - // remove from draw list - removeWindowFromDrawList(*wnd); - - // if window has children - if (!d_children.empty()) - { - // find this window in the child list - ChildList::iterator position = std::find(d_children.begin(), d_children.end(), wnd); - - // if the window was found in the child list - if (position != d_children.end()) - { - // remove window from child list - d_children.erase(position); - // reset windows parent so it's no longer this window. - wnd->setParent(0); - } - } -} - - -/************************************************************************* - Notify 'this' and all siblings of a ZOrder change event -*************************************************************************/ -void Window::onZChange_impl(void) -{ - if (d_parent == NULL) - { - WindowEventArgs args(this); - onZChanged(args); - } - else - { - uint child_count = d_parent->getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - WindowEventArgs args(d_parent->d_children[i]); - d_parent->d_children[i]->onZChanged(args); - } - - } - -} - - -/************************************************************************* - -*************************************************************************/ -Rect Window::absoluteToRelative_impl(const Window* window, const Rect& rect) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - Rect tmp; - - if (sz.d_width) - { - tmp.d_left = PixelAligned(rect.d_left) / sz.d_width; - tmp.d_right = PixelAligned(rect.d_right) / sz.d_width; - } - else - { - tmp.d_left = tmp.d_right = 0; - } - - if (sz.d_height) - { - tmp.d_top = PixelAligned(rect.d_top) / sz.d_height; - tmp.d_bottom = PixelAligned(rect.d_bottom) / sz.d_height; - } - else - { - tmp.d_top = tmp.d_bottom= 0; - } - - return tmp; -} - - -/************************************************************************* - -*************************************************************************/ -Size Window::absoluteToRelative_impl(const Window* window, const Size& sz) const -{ - // get size object for whatever we are using as a base for the conversion - Size wndsz = getWindowSize_impl(window); - - Size tmp; - - if (wndsz.d_width) - { - tmp.d_width = PixelAligned(sz.d_width) / wndsz.d_width; - } - else - { - tmp.d_width = 0; - } - - if (wndsz.d_height) - { - tmp.d_height = PixelAligned(sz.d_height) / wndsz.d_height; - } - else - { - tmp.d_height = 0; - } - - return tmp; -} - - -/************************************************************************* - -*************************************************************************/ -Point Window::absoluteToRelative_impl(const Window* window, const Point& pt) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - Point tmp; - - if (sz.d_width) - { - tmp.d_x = PixelAligned(pt.d_x) / sz.d_width; - } - else - { - tmp.d_x = 0; - } - - if (sz.d_height) - { - tmp.d_y = PixelAligned(pt.d_y) / sz.d_height; - } - else - { - tmp.d_y = 0; - } - - return tmp; -} - - -/************************************************************************* - -*************************************************************************/ -float Window::absoluteToRelativeX_impl(const Window* window, float x) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - if (sz.d_width) - { - return PixelAligned(x) / sz.d_width; - } - else - { - return 0; - } -} - - -/************************************************************************* - -*************************************************************************/ -float Window::absoluteToRelativeY_impl(const Window* window, float y) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - if (sz.d_height) - { - return PixelAligned(y) / sz.d_height; - } - else - { - return 0; - } -} - - -/************************************************************************* - -*************************************************************************/ -Rect Window::relativeToAbsolute_impl(const Window* window, const Rect& rect) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - return Rect( - PixelAligned(rect.d_left * sz.d_width), - PixelAligned(rect.d_top * sz.d_height), - PixelAligned(rect.d_right * sz.d_width), - PixelAligned(rect.d_bottom * sz.d_height) - ); -} - - -/************************************************************************* - -*************************************************************************/ -Size Window::relativeToAbsolute_impl(const Window* window, const Size& sz) const -{ - // get size object for whatever we are using as a base for the conversion - Size wndsz = getWindowSize_impl(window); - - return Size( - PixelAligned(sz.d_width * wndsz.d_width), - PixelAligned(sz.d_height * wndsz.d_height) - ); -} - - -/************************************************************************* - -*************************************************************************/ -Point Window::relativeToAbsolute_impl(const Window* window, const Point& pt) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - return Point( - PixelAligned(pt.d_x * sz.d_width), - PixelAligned(pt.d_y * sz.d_height) - ); -} - - -/************************************************************************* - -*************************************************************************/ -float Window::relativeToAbsoluteX_impl(const Window* window, float x) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - return PixelAligned(x * sz.d_width); -} - - -/************************************************************************* - -*************************************************************************/ -float Window::relativeToAbsoluteY_impl(const Window* window, float y) const -{ - // get size object for whatever we are using as a base for the conversion - Size sz = getWindowSize_impl(window); - - return PixelAligned(y * sz.d_height); -} - - -/************************************************************************* - Return size of window. If window is NULL return size of display. -*************************************************************************/ -Size Window::getWindowSize_impl(const Window* window) const -{ - if (window == NULL) - { - return System::getSingleton().getRenderer()->getSize(); - } - else - { - return window->getAbsoluteSize(); - } - -} - - -/************************************************************************* - Return the current maximum size for this window. -*************************************************************************/ -Size Window::getMaximumSize(void) const -{ - if (getMetricsMode() == Absolute) - { - return d_maxSize.asAbsolute(System::getSingleton().getRenderer()->getSize()).asSize(); - } - else - { - return d_maxSize.asRelative(System::getSingleton().getRenderer()->getSize()).asSize(); - } - -} - - -/************************************************************************* - Return the current minimum size for this window. -*************************************************************************/ -Size Window::getMinimumSize(void) const -{ - if (getMetricsMode() == Absolute) - { - return d_minSize.asAbsolute(System::getSingleton().getRenderer()->getSize()).asSize(); - } - else - { - return d_minSize.asRelative(System::getSingleton().getRenderer()->getSize()).asSize(); - } - -} - - -/************************************************************************* - Set the minimum size for this window. -*************************************************************************/ -void Window::setMinimumSize(const Size& sz) -{ - UVector2 usz; - - if (getMetricsMode() == Absolute) - { - usz.d_x = cegui_absdim(PixelAligned(sz.d_width)); - usz.d_y = cegui_absdim(PixelAligned(sz.d_height)); - } - else - { - usz.d_x = cegui_reldim(sz.d_width); - usz.d_y = cegui_reldim(sz.d_height); - } - - setWindowMinSize(usz); -} - - -/************************************************************************* - Set the maximum size for this window. -*************************************************************************/ -void Window::setMaximumSize(const Size& sz) -{ - UVector2 usz; - - if (getMetricsMode() == Absolute) - { - usz.d_x = cegui_absdim(PixelAligned(sz.d_width)); - usz.d_y = cegui_absdim(PixelAligned(sz.d_height)); - } - else - { - usz.d_x = cegui_reldim(sz.d_width); - usz.d_y = cegui_reldim(sz.d_height); - } - - setWindowMaxSize(usz); -} - - -/************************************************************************* - Return a pointer to the mouse cursor image to use when the mouse is - within this window. -*************************************************************************/ -const Image* Window::getMouseCursor(bool useDefault) const -{ - if (d_mouseCursor != (const Image*)DefaultMouseCursor) - { - return d_mouseCursor; - } - else - { - return useDefault ? System::getSingleton().getDefaultMouseCursor() : 0; - } - -} - - -/************************************************************************* - Set the mouse cursor image to be used when the mouse enters this - window. -*************************************************************************/ -void Window::setMouseCursor(const String& imageset, const String& image_name) -{ - d_mouseCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image_name); -} - - -/************************************************************************* - Set the current ID for the Window. -*************************************************************************/ -void Window::setID(uint ID) -{ - if (d_ID != ID) - { - d_ID = ID; - - WindowEventArgs args(this); - onIDChanged(args); - } - -} - - -/************************************************************************* - set the current metrics mode employed by the Window -*************************************************************************/ -void Window::setMetricsMode(MetricsMode mode) -{ - if (d_metricsMode != mode) - { - MetricsMode oldMode = d_metricsMode; - d_metricsMode = mode; - - // only ever trigger the event if the mode is actually changed. - if ((d_metricsMode != Inherited) || (oldMode != getMetricsMode())) - { - WindowEventArgs args(this); - onMetricsChanged(args); - } - - } - -} - - -/************************************************************************* - Set whether or not this Window will automatically be destroyed when - its parent Window is destroyed. -*************************************************************************/ -void Window::setDestroyedByParent(bool setting) -{ - if (d_destroyedByParent != setting) - { - d_destroyedByParent = setting; - - WindowEventArgs args(this); - onParentDestroyChanged(args); - } - -} - - -/************************************************************************* - Return the inherited metrics mode. This is either the metrics mode - of our parent, or Relative if we have no parent. -*************************************************************************/ -MetricsMode Window::getInheritedMetricsMode(void) const -{ - return (d_parent == NULL) ? Relative : d_parent->getMetricsMode(); -} - - -/************************************************************************* - return the x position of the window using the specified metrics system. -*************************************************************************/ -float Window::getXPosition(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativeXPosition() : getAbsoluteXPosition(); -} - - -/************************************************************************* - return the y position of the window using the specified metrics system. -*************************************************************************/ -float Window::getYPosition(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativeYPosition() : getAbsoluteYPosition(); -} - - -/************************************************************************* - return the position of the window using the specified metrics system. -*************************************************************************/ -Point Window::getPosition(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativePosition() : getAbsolutePosition(); -} - - -/************************************************************************* - return the width of the Window using the specified metrics system. -*************************************************************************/ -float Window::getWidth(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativeWidth() : getAbsoluteWidth(); -} - - -/************************************************************************* - return the height of the Window using the specified metrics system. -*************************************************************************/ -float Window::getHeight(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativeHeight() : getAbsoluteHeight(); -} - - -/************************************************************************* - return the size of the Window using the specified metrics system. -*************************************************************************/ -Size Window::getSize(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativeSize() : getAbsoluteSize(); -} - - -/************************************************************************* - return a Rect object that describes the Window area using the - specified metrics system. -*************************************************************************/ -Rect Window::getRect(MetricsMode mode) const -{ - // get proper mode to use for inherited. - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - return (mode == Relative) ? getRelativeRect() : getAbsoluteRect(); -} - - -/************************************************************************* - set the x position of the window using the specified metrics system. -*************************************************************************/ -void Window::setXPosition(MetricsMode mode, float x) -{ - setPosition(mode, Point(x, getYPosition(mode))); -} - - -/************************************************************************* - set the y position of the window using the specified metrics system. -*************************************************************************/ -void Window::setYPosition(MetricsMode mode, float y) -{ - setPosition(mode, Point(getXPosition(mode), y)); -} - - -/************************************************************************* - set the position of the window using the specified metrics system. -*************************************************************************/ -void Window::setPosition(MetricsMode mode, const Point& position) -{ - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - if (mode == Relative) - { - setWindowPosition(UVector2(cegui_reldim(position.d_x), cegui_reldim(position.d_y))); - } - else - { - setWindowPosition(UVector2(cegui_absdim(PixelAligned(position.d_x)), cegui_absdim(PixelAligned(position.d_y)))); - } -} - - -/************************************************************************* - set the width of the Window using the specified metrics system. -*************************************************************************/ -void Window::setWidth(MetricsMode mode, float width) -{ - setSize(mode, Size(width, getHeight(mode))); -} - - -/************************************************************************* - set the height of the Window using the specified metrics system. -*************************************************************************/ -void Window::setHeight(MetricsMode mode, float height) -{ - setSize(mode, Size(getWidth(mode), height)); -} - - -/************************************************************************* - set the size of the Window using the specified metrics system. -*************************************************************************/ -void Window::setSize(MetricsMode mode, const Size& size) -{ - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - UVector2 usz(((mode == Relative) ? UVector2(cegui_reldim(size.d_width), cegui_reldim(size.d_height)) : UVector2(cegui_absdim(PixelAligned(size.d_width)), cegui_absdim(PixelAligned(size.d_height))))); - - setWindowSize(usz); -} - - -/************************************************************************* - set the Rect that describes the Window area using the specified - metrics system. -*************************************************************************/ -void Window::setRect(MetricsMode mode, const Rect& area) -{ - if (mode == Inherited) - { - mode = getInheritedMetricsMode(); - } - - URect uarea; - - if (mode == Relative) - { - uarea = URect( - cegui_reldim(area.d_left), - cegui_reldim(area.d_top), - cegui_reldim(area.d_right), - cegui_reldim(area.d_bottom) - ); - } - else - { - uarea = URect( - cegui_absdim(PixelAligned(area.d_left)), - cegui_absdim(PixelAligned(area.d_top)), - cegui_absdim(PixelAligned(area.d_right)), - cegui_absdim(PixelAligned(area.d_bottom)) - ); - } - - setWindowArea(uarea); -} - - -/************************************************************************* - Helper method to fire off a mouse button down event. -*************************************************************************/ -void Window::generateAutoRepeatEvent(MouseButton button) -{ - MouseEventArgs ma(this); - ma.position = MouseCursor::getSingleton().getPosition(); - ma.moveDelta = Vector2(0.0f, 0.0f); - ma.button = button; - ma.sysKeys = System::getSingleton().getSystemKeys(); - ma.wheelChange = 0; - onMouseButtonDown(ma); -} - - -/************************************************************************* - Add standard CEGUI::Window properties. -*************************************************************************/ -void Window::addStandardProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_absHeightProperty); - addProperty(&d_absMaxSizeProperty); - addProperty(&d_absMinSizeProperty); - addProperty(&d_absPositionProperty); - addProperty(&d_absRectProperty); - addProperty(&d_absSizeProperty); - addProperty(&d_absWidthProperty); - addProperty(&d_absXPosProperty); - addProperty(&d_absYPosProperty); - addProperty(&d_alphaProperty); - addProperty(&d_clippedByParentProperty); - addProperty(&d_destroyedByParentProperty); - addProperty(&d_fontProperty); - addProperty(&d_heightProperty); - addProperty(&d_IDProperty); - addProperty(&d_inheritsAlphaProperty); - addProperty(&d_metricsModeProperty); - addProperty(&d_mouseCursorProperty); - addProperty(&d_positionProperty); - addProperty(&d_rectProperty); - addProperty(&d_relHeightProperty); - addProperty(&d_relMaxSizeProperty); - addProperty(&d_relMinSizeProperty); - addProperty(&d_relPositionProperty); - addProperty(&d_relRectProperty); - addProperty(&d_relSizeProperty); - addProperty(&d_relWidthProperty); - addProperty(&d_relXPosProperty); - addProperty(&d_relYPosProperty); - addProperty(&d_restoreOldCaptureProperty); - addProperty(&d_sizeProperty); - addProperty(&d_textProperty); - addProperty(&d_visibleProperty); - addProperty(&d_widthProperty); - addProperty(&d_xPosProperty); - addProperty(&d_yPosProperty); - addProperty(&d_zOrderChangeProperty); - addProperty(&d_autoRepeatProperty); - addProperty(&d_autoRepeatDelayProperty); - addProperty(&d_autoRepeatRateProperty); - addProperty(&d_distInputsProperty); - addProperty(&d_tooltipTypeProperty); - addProperty(&d_tooltipProperty); - addProperty(&d_inheritsTooltipProperty); - addProperty(&d_riseOnClickProperty); - addProperty(&d_vertAlignProperty); - addProperty(&d_horzAlignProperty); - addProperty(&d_unifiedAreaRectProperty); - addProperty(&d_unifiedPositionProperty); - addProperty(&d_unifiedXPositionProperty); - addProperty(&d_unifiedYPositionProperty); - addProperty(&d_unifiedSizeProperty); - addProperty(&d_unifiedWidthProperty); - addProperty(&d_unifiedHeightProperty); - addProperty(&d_unifiedMinSizeProperty); - addProperty(&d_unifiedMaxSizeProperty); - addProperty(&d_mousePassThroughEnabledProperty); - } - else - { - addProperty(&d_alwaysOnTopProperty); - addProperty(&d_disabledProperty); - addProperty(&d_wantsMultiClicksProperty); - } -} - - -/************************************************************************* - Return whether z-order changes are enabled. -*************************************************************************/ -bool Window::isZOrderingEnabled(void) const -{ - return d_zOrderingEnabled; -} - - -/************************************************************************* - Set whether z-order changes are enabled. -*************************************************************************/ -void Window::setZOrderingEnabled(bool setting) -{ - if (d_zOrderingEnabled != setting) - { - d_zOrderingEnabled = setting; - } - -} - - -/************************************************************************* - Return whether this window will receive multi-click events or - multiple 'down' events instead. -*************************************************************************/ -bool Window::wantsMultiClickEvents(void) const -{ - return d_wantsMultiClicks; -} - - -/************************************************************************* - Set whether this window will receive multi-click events or - multiple 'down' events instead. -*************************************************************************/ -void Window::setWantsMultiClickEvents(bool setting) -{ - if (d_wantsMultiClicks != setting) - { - d_wantsMultiClicks = setting; - - // TODO: Maybe add a 'setting changed' event for this? - } - -} - - -/************************************************************************* - Return whether mouse button down event autorepeat is enabled for - this window. -*************************************************************************/ -bool Window::isMouseAutoRepeatEnabled(void) const -{ - return d_autoRepeat; -} - - -/************************************************************************* - Return the current auto-repeat delay setting for this window. -*************************************************************************/ -float Window::getAutoRepeatDelay(void) const -{ - return d_repeatDelay; -} - - -/************************************************************************* - Return the current auto-repeat rate setting for this window. -*************************************************************************/ -float Window::getAutoRepeatRate(void) const -{ - return d_repeatRate; -} - - -/************************************************************************* - Set whether mouse button down event autorepeat is enabled for this - window. -*************************************************************************/ -void Window::setMouseAutoRepeatEnabled(bool setting) -{ - if (d_autoRepeat != setting) - { - d_autoRepeat = setting; - d_repeatButton = NoButton; - - // TODO: Maybe add a 'setting changed' event for this? - } - -} - - -/************************************************************************* - Set the current auto-repeat delay setting for this window. -*************************************************************************/ -void Window::setAutoRepeatDelay(float delay) -{ - if (d_repeatDelay != delay) - { - d_repeatDelay = delay; - - // TODO: Maybe add a 'setting changed' event for this? - } - -} - - -/************************************************************************* - Set the current auto-repeat rate setting for this window. -*************************************************************************/ -void Window::setAutoRepeatRate(float rate) -{ - if (d_repeatRate != rate) - { - d_repeatRate = rate; - - // TODO: Maybe add a 'setting changed' event for this? - } - -} - - -/************************************************************************* - Cause window to update itself and any attached children -*************************************************************************/ -void Window::update(float elapsed) -{ - // perform update for 'this' Window - updateSelf(elapsed); - - // update child windows - uint child_count = getChildCount(); - - for (uint i = 0; i < child_count; ++i) - { - d_children[i]->update(elapsed); - } - -} - - -/************************************************************************* - Perform actual update processing for this Window. -*************************************************************************/ -void Window::updateSelf(float elapsed) -{ - // Mouse button autorepeat processing. - if (d_autoRepeat && d_repeatButton != NoButton) - { - d_repeatElapsed += elapsed; - - if (d_repeating) - { - if (d_repeatElapsed > d_repeatRate) - { - d_repeatElapsed -= d_repeatRate; - // trigger the repeated event - generateAutoRepeatEvent(d_repeatButton); - } - } - else - { - if (d_repeatElapsed > d_repeatDelay) - { - d_repeatElapsed = 0; - d_repeating = true; - // trigger the repeated event - generateAutoRepeatEvent(d_repeatButton); - } - } - } -} - -bool Window::distributesCapturedInputs(void) const -{ - return d_distCapturedInputs; -} - -void Window::setDistributesCapturedInputs(bool setting) -{ - if (d_distCapturedInputs != setting) - { - d_distCapturedInputs = setting; - - // TODO: Maybe add a 'setting changed' event for this? - } -} - -void Window::notifyDragDropItemEnters(DragContainer* item) -{ - if (item) - { - DragDropEventArgs args(this); - args.dragDropItem = item; - onDragDropItemEnters(args); - } -} - -void Window::notifyDragDropItemLeaves(DragContainer* item) -{ - if (item) - { - DragDropEventArgs args(this); - args.dragDropItem = item; - onDragDropItemLeaves(args); - } -} - -void Window::notifyDragDropItemDropped(DragContainer* item) -{ - if (item) - { - DragDropEventArgs args(this); - args.dragDropItem = item; - onDragDropItemDropped(args); - } -} - -void Window::destroy(void) -{ - // because we know that people do not read the API ref properly, - // here is some protection to ensure that WindowManager does the - // destruction and not anyone else. - WindowManager& wmgr = WindowManager::getSingleton(); - - if (wmgr.isWindowPresent(this->getName())) - { - wmgr.destroyWindow(this); - - // now return, the rest of what we need to do will happen - // once WindowManager re-calls this method. - return; - } - - releaseInput(); - - // signal our imminent destruction - WindowEventArgs args(this); - onDestructionStarted(args); - - // double check we are detached from parent - if (d_parent != NULL) - { - d_parent->removeChildWindow(this); - } - - cleanupChildren(); -} - -bool Window::isUsingDefaultTooltip(void) const -{ - return d_customTip == 0; -} - -Tooltip* Window::getTooltip(void) const -{ - return isUsingDefaultTooltip() ? System::getSingleton().getDefaultTooltip() : d_customTip; -} - -void Window::setTooltip(Tooltip* tooltip) -{ - // destroy current custom tooltip if one exists and we created it - if (d_customTip && d_weOwnTip) - WindowManager::getSingleton().destroyWindow(d_customTip); - - // set new custom tooltip - d_weOwnTip = false; - d_customTip = tooltip; -} - -void Window::setTooltipType(const String& tooltipType) -{ - // destroy current custom tooltip if one exists and we created it - if (d_customTip && d_weOwnTip) - WindowManager::getSingleton().destroyWindow(d_customTip); - - if (tooltipType.empty()) - { - d_customTip = 0; - d_weOwnTip = false; - } - else - { - try - { - d_customTip = static_cast(WindowManager::getSingleton().createWindow(tooltipType, getName() + "__auto_tooltip__")); - d_weOwnTip = true; - } - catch (UnknownObjectException x) - { - d_customTip = 0; - d_weOwnTip = false; - } - } -} - -String Window::getTooltipType(void) const -{ - return isUsingDefaultTooltip() ? String("") : d_customTip->getType(); -} - -void Window::setTooltipText(const String& tip) -{ - d_tooltipText = tip; - - Tooltip* tooltip = getTooltip(); - - if (tooltip && tooltip->getTargetWindow() == this) - { - tooltip->setText(tip); - } -} - -const String& Window::getTooltipText(void) const -{ - if (d_inheritsTipText && d_parent && d_tooltipText.empty()) - { - return d_parent->getTooltipText(); - } - else - { - return d_tooltipText; - } -} - -bool Window::inheritsTooltipText(void) const -{ - return d_inheritsTipText; -} - -void Window::setInheritsTooltipText(bool setting) -{ - if (d_inheritsTipText != setting) - { - d_inheritsTipText = setting; - - // TODO: Maybe add a 'setting changed' event for this? - } -} - -void Window::doRiseOnClick(void) -{ - // does this window rise on click? - if (d_riseOnClick) - { - moveToFront_impl(true); - } - else if (d_parent) - { - d_parent->doRiseOnClick(); - } -} - -void Window::setWindowArea_impl(const UVector2& pos, const UVector2& size, bool topLeftSizing, bool fireEvents) -{ - // notes of what we did - bool moved = false, sized; - - // save original size so we can work out how to behave later on - Size oldSize(d_pixelSize); - - // calculate pixel sizes for everything, so we have a common format for comparisons. - Vector2 absMax(d_maxSize.asAbsolute(System::getSingleton().getRenderer()->getSize())); - Vector2 absMin(d_minSize.asAbsolute(System::getSingleton().getRenderer()->getSize())); - d_pixelSize = size.asAbsolute(getParentSize()).asSize(); - - // limit new pixel size to: minSize <= newSize <= maxSize - if (d_pixelSize.d_width < absMin.d_x) - d_pixelSize.d_width = absMin.d_x; - else if (d_pixelSize.d_width > absMax.d_x) - d_pixelSize.d_width = absMax.d_x; - if (d_pixelSize.d_height < absMin.d_y) - d_pixelSize.d_height = absMin.d_y; - else if (d_pixelSize.d_height > absMax.d_y) - d_pixelSize.d_height = absMax.d_y; - - d_area.setSize(size); - sized = (d_pixelSize != oldSize); - - // If this is a top/left edge sizing op, only modify position if the size actually changed. - // If it is not a sizing op, then position may always change. - if (!topLeftSizing || sized) - { - // only update position if a change has occurred. - if (pos != d_area.d_min) - { - d_area.setPosition(pos); - moved = true; - } - } - - // fire events as required - if (fireEvents) - { - WindowEventArgs args(this); - - if (moved) - { - onMoved(args); - // reset handled so 'sized' event can re-use (since wo do not care about it) - args.handled = false; - } - - if (sized) - { - onSized(args); - } - } -} - -void Window::setWindowArea(const UDim& xpos, const UDim& ypos, const UDim& width, const UDim& height) -{ - setWindowArea(UVector2(xpos, ypos), UVector2(width, height)); -} - -void Window::setWindowArea(const UVector2& pos, const UVector2& size) -{ - setWindowArea_impl(pos, size); -} - -void Window::setWindowArea(const URect& area) -{ - setWindowArea(area.d_min, area.getSize()); -} - -void Window::setWindowPosition(const UVector2& pos) -{ - setWindowArea_impl(pos, d_area.getSize()); -} - -void Window::setWindowXPosition(const UDim& x) -{ - setWindowArea_impl(UVector2(x, d_area.d_min.d_y), d_area.getSize()); -} - -void Window::setWindowYPosition(const UDim& y) -{ - setWindowArea_impl(UVector2(d_area.d_min.d_x, y), d_area.getSize()); -} - -void Window::setWindowSize(const UVector2& size) -{ - setWindowArea_impl(d_area.getPosition(), size); -} - -void Window::setWindowWidth(const UDim& width) -{ - setWindowArea_impl(d_area.getPosition(), UVector2(width, d_area.getSize().d_y)); -} - -void Window::setWindowHeight(const UDim& height) -{ - setWindowArea_impl(d_area.getPosition(), UVector2(d_area.getSize().d_x, height)); -} - -void Window::setWindowMaxSize(const UVector2& size) -{ - d_maxSize = size; - - // set window area back on itself to cause new maximum size to be applied if required. - setWindowArea(d_area); -} - -void Window::setWindowMinSize(const UVector2& size) -{ - d_minSize = size; - - // set window area back on itself to cause new minimum size to be applied if required. - setWindowArea(d_area); -} - -const URect& Window::getWindowArea() const -{ - return d_area; -} - -const UVector2& Window::getWindowPosition() const -{ - return d_area.d_min; -} - -const UDim& Window::getWindowXPosition() const -{ - return d_area.d_min.d_x; -} - -const UDim& Window::getWindowYPosition() const -{ - return d_area.d_min.d_y; -} - -UVector2 Window::getWindowSize() const -{ - return d_area.getSize(); -} - -UDim Window::getWindowWidth() const -{ - return d_area.getSize().d_x; -} - -UDim Window::getWindowHeight() const -{ - return d_area.getSize().d_y; -} - -const UVector2& Window::getWindowMaxSize() const -{ - return d_maxSize; -} - -const UVector2& Window::getWindowMinSize() const -{ - return d_minSize; -} - -void Window::setVerticalAlignment(const VerticalAlignment alignment) -{ - if (d_vertAlign != alignment) - { - d_vertAlign = alignment; - - WindowEventArgs args(this); - onVerticalAlignmentChanged(args); - } -} - -void Window::setHorizontalAlignment(const HorizontalAlignment alignment) -{ - if (d_horzAlign != alignment) - { - d_horzAlign = alignment; - - WindowEventArgs args(this); - onHorizontalAlignmentChanged(args); - } -} - -const String& Window::getLookNFeel() -{ - return d_lookName; -} - -void Window::setLookNFeel(const String& falagardType, const String& look) -{ - if (d_lookName.empty()) - { - d_falagardType = falagardType; - d_lookName = look; - Logger::getSingleton().logEvent("Assigning LookNFeel '" + look +"' to window '" + d_name + "'.", Informative); - - // Work to initialse the look and feel... - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(look); - // Add property definitions, apply property initialisers and create child widgets. - wlf.initialiseWidget(*this); - } - else - { - throw InvalidRequestException("Window::setLookNFeel - The window '" + d_name + "' already has a look assigned (" + d_lookName + ")."); - } -} - -void Window::setModalState(bool state) -{ - bool already_modal = getModalState(); - - // if going modal and not already the modal target - if (state == true && !already_modal) - { - activate(); - System::getSingleton().setModalTarget(this); - } - // clear the modal target if we were it - else if (already_modal) - { - System::getSingleton().setModalTarget(NULL); - } -} - -void Window::performChildWindowLayout() -{ - if (!d_lookName.empty()) - { - // here we just grab the look and feel and get it to layout its defined children - try - { - const WidgetLookFeel& wlf = WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - // get look'n'feel to layout any child windows it created. - wlf.layoutChildWidgets(*this); - } - catch (UnknownObjectException) - { - Logger::getSingleton().logEvent("Window::performChildWindowLayout - assigned widget look was not found.", Errors); - } - } -} - -const String& Window::getUserString(const String& name) const -{ - UserStringMap::const_iterator iter = d_userStrings.find(name); - - if (iter != d_userStrings.end()) - { - return (*iter).second; - } - else - { - throw UnknownObjectException("Window::getUserString - a user string named '" + name + "' has not been set for this Window."); - } -} - -bool Window::isUserStringDefined(const String& name) const -{ - return d_userStrings.find(name) != d_userStrings.end(); -} - -void Window::setUserString(const String& name, const String& value) -{ - d_userStrings[name] = value; -} - -void Window::writeXMLToStream(OutStream& out_stream) const -{ - // output opening Window tag - out_stream << "" << std::endl; - - // write out properties. - writePropertiesXML(out_stream); - // write out attached child windows. - writeChildWindowsXML(out_stream); - // now ouput closing Window tag - out_stream << "" << std::endl; -} - -int Window::writePropertiesXML(OutStream& out_stream) const -{ - int propertiesWritten = 0; - PropertyIterator iter = PropertySet::getIterator(); - - while(!iter.isAtEnd()) - { - try - { - // only write property if it's not at the default state - if (!iter.getCurrentValue()->isDefault(this)) - { - iter.getCurrentValue()->writeXMLToStream(this, out_stream); - ++propertiesWritten; - } - } - catch (InvalidRequestException) - { - // This catches error(s) from the MultiLineColumnList for example - Logger::getSingleton().logEvent("Window::writePropertiesXML - property receiving failed. Continuing...", Errors); - } - - ++iter; - } - - return propertiesWritten; -} - -int Window::writeChildWindowsXML(OutStream& out_stream) const -{ - int windowsWritten = 0; - - for (uint i = 0; i < getChildCount(); ++i) - { - Window* child = d_children[i]; - - // conditional to ensure that auto created windows are not written. - if (child->getName().find("__auto_") == String::npos) - { - child->writeXMLToStream(out_stream); - ++windowsWritten; - } - } - - return windowsWritten; -} - -void Window::addWindowToDrawList(Window& wnd, bool at_back) -{ - // add behind other windows in same group - if (at_back) - { - // calculate position where window should be added for drawing - ChildList::iterator pos = d_drawList.begin(); - if (wnd.isAlwaysOnTop()) - { - // find first topmost window - while ((pos != d_drawList.end()) && (!(*pos)->isAlwaysOnTop())) - ++pos; - } - // add window to draw list - d_drawList.insert(pos, &wnd); - } - // add in front of other windows in group - else - { - // calculate position where window should be added for drawing - ChildList::reverse_iterator position = d_drawList.rbegin(); - if (!wnd.isAlwaysOnTop()) - { - // find last non-topmost window - while ((position != d_drawList.rend()) && ((*position)->isAlwaysOnTop())) - ++position; - } - // add window to draw list - d_drawList.insert(position.base(), &wnd); - } -} - -void Window::removeWindowFromDrawList(const Window& wnd) -{ - // if draw list is not empty - if (!d_drawList.empty()) - { - // attempt to find the window in the draw list - ChildList::iterator position = std::find(d_drawList.begin(), d_drawList.end(), &wnd); - - // remove the window if it was found in the draw list - if (position != d_drawList.end()) - d_drawList.erase(position); - } -} - -Window* Window::getActiveSibling() -{ - // initialise with this if we are active, else 0 - Window* activeWnd = isActive() ? this : 0; - - // if active window not already known, and we have a parent window - if (!activeWnd && d_parent) - { - // scan backwards through the draw list, as this will - // usually result in the fastest result. - uint idx = d_parent->getChildCount(); - while (idx-- > 0) - { - // if this child is active - if (d_parent->d_drawList[idx]->isActive()) - { - // set the return value - activeWnd = d_parent->d_drawList[idx]; - // exit loop early, as we have found what we needed - break; - } - } - } - - // return whatever we discovered - return activeWnd; -} - -void Window::rename(const String& new_name) -{ - WindowManager& winMgr = WindowManager::getSingleton(); - /* - * Client code should never call this, but again, since we know people do - * not read and stick to the API reference, here is some built-in protection - * which ensures that things are handled via the WindowManager anyway. - */ - if (winMgr.isWindowPresent(d_name)) - { - winMgr.renameWindow(this, new_name); - // now we return, since the work was already done when WindowManager - // re-called this function in the proper manner. - return; - } - - if (winMgr.isWindowPresent(new_name)) - throw AlreadyExistsException("Window::rename - a Window named '" + - new_name + "' already exists within the system."); - - // rename Falagard created child windows - if (!d_lookName.empty()) - { - const WidgetLookFeel& wlf = - WidgetLookManager::getSingleton().getWidgetLook(d_lookName); - - // get WidgetLookFeel to rename the children it created - wlf.renameChildren(*this, new_name); - } - - // how to detect other auto created windows. - const String autoPrefix(d_name + "__auto_"); - // length of current name - const size_t oldNameLength = d_name.length(); - - // now rename all remaining auto-created windows attached - for (size_t i = 0; i < getChildCount(); ++i) - { - // is this an auto created window that we created? - if (!d_children[i]->d_name.compare(0, autoPrefix.length(), autoPrefix)) - { - winMgr.renameWindow(d_children[i], - new_name + - d_children[i]->d_name.substr(oldNameLength)); - } - } - - // log this under insane level - Logger::getSingleton().logEvent("Renamed window: " + d_name + - " as: " + new_name, - Informative); - - // finally, set our new name - d_name = new_name; -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - - Begin event triggers section - -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// - -void Window::onSized(WindowEventArgs& e) -{ - // inform children their parent has been re-sized - uint child_count = getChildCount(); - for (uint i = 0; i < child_count; ++i) - { - WindowEventArgs args(this); - d_children[i]->onParentSized(args); - } - - performChildWindowLayout(); - - requestRedraw(); - - fireEvent(EventSized, e, EventNamespace); -} - - -void Window::onMoved(WindowEventArgs& e) -{ - // we no longer want a total redraw here, instead we just get each window - // to resubmit it's imagery to the Renderer. - System::getSingleton().signalRedraw(); - fireEvent(EventMoved, e, EventNamespace); -} - - -void Window::onTextChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventTextChanged, e, EventNamespace); -} - - -void Window::onFontChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventFontChanged, e, EventNamespace); -} - - -void Window::onAlphaChanged(WindowEventArgs& e) -{ - // scan child list and call this method for all children that inherit alpha - int child_count = getChildCount(); - - for (int i = 0; i < child_count; ++i) - { - if (d_children[i]->inheritsAlpha()) - { - WindowEventArgs args(d_children[i]); - d_children[i]->onAlphaChanged(args); - } - - } - - requestRedraw(); - fireEvent(EventAlphaChanged, e, EventNamespace); -} - - -void Window::onIDChanged(WindowEventArgs& e) -{ - fireEvent(EventIDChanged, e, EventNamespace); -} - - -void Window::onShown(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventShown, e, EventNamespace); -} - - -void Window::onHidden(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventHidden, e, EventNamespace); - - // Fix by MTA: Deactivate to stop retrieving input - deactivate(); -} - - -void Window::onEnabled(WindowEventArgs& e) -{ - // signal all non-disabled children that they are now enabled (via inherited state) - uint child_count = getChildCount(); - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->d_enabled) - { - WindowEventArgs args(d_children[i]); - d_children[i]->onEnabled(args); - } - } - - requestRedraw(); - fireEvent(EventEnabled, e, EventNamespace); -} - - -void Window::onDisabled(WindowEventArgs& e) -{ - // signal all non-disabled children that they are now disabled (via inherited state) - uint child_count = getChildCount(); - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->d_enabled) - { - WindowEventArgs args(d_children[i]); - d_children[i]->onDisabled(args); - } - } - - requestRedraw(); - fireEvent(EventDisabled, e, EventNamespace); -} - - -void Window::onMetricsChanged(WindowEventArgs& e) -{ - fireEvent(EventMetricsModeChanged, e, EventNamespace); -} - - -void Window::onClippingChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventClippedByParentChanged, e, EventNamespace); -} - - -void Window::onParentDestroyChanged(WindowEventArgs& e) -{ - fireEvent(EventDestroyedByParentChanged, e, EventNamespace); -} - - -void Window::onInheritsAlphaChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventInheritsAlphaChanged, e, EventNamespace); -} - - -void Window::onAlwaysOnTopChanged(WindowEventArgs& e) -{ - // we no longer want a total redraw here, instead we just get each window - // to resubmit it's imagery to the Renderer. - System::getSingleton().signalRedraw(); - fireEvent(EventAlwaysOnTopChanged, e, EventNamespace); -} - - -void Window::onCaptureGained(WindowEventArgs& e) -{ - fireEvent(EventInputCaptureGained, e, EventNamespace); -} - - -void Window::onCaptureLost(WindowEventArgs& e) -{ - // reset auto-repeat state - d_repeatButton = NoButton; - - // handle restore of previous capture window as required. - if (d_restoreOldCapture && (d_oldCapture != NULL)) { - d_oldCapture->onCaptureLost(e); - d_oldCapture = NULL; - } - - // handle case where mouse is now in a different window - // (this is a bit of a hack that uses the mouse input injector to handle this for us). - System::getSingleton().injectMouseMove(0, 0); - - fireEvent(EventInputCaptureLost, e, EventNamespace); -} - - -void Window::onRenderingStarted(WindowEventArgs& e) -{ - fireEvent(EventRenderingStarted, e, EventNamespace); -} - - -void Window::onRenderingEnded(WindowEventArgs& e) -{ - fireEvent(EventRenderingEnded, e, EventNamespace); -} - - -void Window::onZChanged(WindowEventArgs& e) -{ - // we no longer want a total redraw here, instead we just get each window - // to resubmit it's imagery to the Renderer. - System::getSingleton().signalRedraw(); - fireEvent(EventZOrderChanged, e, EventNamespace); -} - - -void Window::onDestructionStarted(WindowEventArgs& e) -{ - fireEvent(EventDestructionStarted, e, EventNamespace); -} - - -void Window::onActivated(ActivationEventArgs& e) -{ - d_active = true; - requestRedraw(); - fireEvent(EventActivated, e, EventNamespace); -} - - -void Window::onDeactivated(ActivationEventArgs& e) -{ - // first de-activate all children - uint child_count = getChildCount(); - for (uint i = 0; i < child_count; ++i) - { - if (d_children[i]->isActive()) - { - d_children[i]->onDeactivated(e); - } - - } - - d_active = false; - requestRedraw(); - fireEvent(EventDeactivated, e, EventNamespace); -} - - -void Window::onParentSized(WindowEventArgs& e) -{ - // set window area back on itself to cause minimum and maximum size - // constraints to be applied as required. (fire no events though) - setWindowArea_impl(d_area.getPosition(), d_area.getSize(), false, false); - - // now see if events should be fired. - if ((d_area.d_min.d_x.d_scale != 0) || (d_area.d_min.d_y.d_scale != 0)) - { - WindowEventArgs args(this); - onMoved(args); - } - - if ((d_area.d_max.d_x.d_scale != 0) || (d_area.d_max.d_y.d_scale != 0)) - { - WindowEventArgs args(this); - onSized(args); - } - - fireEvent(EventParentSized, e, EventNamespace); -} - - -void Window::onChildAdded(WindowEventArgs& e) -{ - // we no longer want a total redraw here, instead we just get each window - // to resubmit it's imagery to the Renderer. - System::getSingleton().signalRedraw(); - fireEvent(EventChildAdded, e, EventNamespace); -} - - -void Window::onChildRemoved(WindowEventArgs& e) -{ - // we no longer want a total redraw here, instead we just get each window - // to resubmit it's imagery to the Renderer. - System::getSingleton().signalRedraw(); - fireEvent(EventChildRemoved, e, EventNamespace); -} - - -void Window::onMouseEnters(MouseEventArgs& e) -{ - // set the mouse cursor - MouseCursor::getSingleton().setImage(getMouseCursor()); - - // perform tooltip control - Tooltip* tip = getTooltip(); - if (tip) - { - tip->setTargetWindow(this); - } - - fireEvent(EventMouseEnters, e, EventNamespace); -} - - -void Window::onMouseLeaves(MouseEventArgs& e) -{ - // perform tooltip control - Tooltip* tip = getTooltip(); - if (tip) - { - tip->setTargetWindow(0); - } - - fireEvent(EventMouseLeaves, e, EventNamespace); -} - - -void Window::onMouseMove(MouseEventArgs& e) -{ - // perform tooltip control - Tooltip* tip = getTooltip(); - if (tip) - { - tip->resetTimer(); - } - - fireEvent(EventMouseMove, e, EventNamespace); -} - - -void Window::onMouseWheel(MouseEventArgs& e) -{ - fireEvent(EventMouseWheel, e, EventNamespace); -} - - -void Window::onMouseButtonDown(MouseEventArgs& e) -{ - // perform tooltip control - Tooltip* tip = getTooltip(); - if (tip) - { - tip->setTargetWindow(0); - } - - if (e.button == LeftButton) - { - doRiseOnClick(); - } - - // if auto repeat is enabled and we are not currently tracking - // the button that was just pushed (need this button check because - // it could be us that generated this event via auto-repeat). - if (d_autoRepeat && d_repeatButton != e.button) - { - d_repeatButton = e.button; - d_repeatElapsed = 0; - d_repeating = false; - } - - fireEvent(EventMouseButtonDown, e, EventNamespace); -} - - -void Window::onMouseButtonUp(MouseEventArgs& e) -{ - // reset auto-repeat state - d_repeatButton = NoButton; - - fireEvent(EventMouseButtonUp, e, EventNamespace); -} - - -void Window::onMouseClicked(MouseEventArgs& e) -{ - fireEvent(EventMouseClick, e, EventNamespace); -} - - -void Window::onMouseDoubleClicked(MouseEventArgs& e) -{ - fireEvent(EventMouseDoubleClick, e, EventNamespace); -} - - -void Window::onMouseTripleClicked(MouseEventArgs& e) -{ - fireEvent(EventMouseTripleClick, e, EventNamespace); -} - - -void Window::onKeyDown(KeyEventArgs& e) -{ - fireEvent(EventKeyDown, e, EventNamespace); -} - - -void Window::onKeyUp(KeyEventArgs& e) -{ - fireEvent(EventKeyUp, e, EventNamespace); -} - - -void Window::onCharacter(KeyEventArgs& e) -{ - fireEvent(EventCharacterKey, e, EventNamespace); -} - -void Window::onDragDropItemEnters(DragDropEventArgs& e) -{ - fireEvent(EventDragDropItemEnters, e, EventNamespace); -} - -void Window::onDragDropItemLeaves(DragDropEventArgs& e) -{ - fireEvent(EventDragDropItemLeaves, e, EventNamespace); -} - -void Window::onDragDropItemDropped(DragDropEventArgs& e) -{ - fireEvent(EventDragDropItemDropped, e, EventNamespace); -} - -void Window::onVerticalAlignmentChanged(WindowEventArgs& e) -{ - fireEvent(EventVerticalAlignmentChanged, e, EventNamespace); -} - -void Window::onHorizontalAlignmentChanged(WindowEventArgs& e) -{ - fireEvent(EventHorizontalAlignmentChanged, e, EventNamespace); -} - -void Window::onRedrawRequested(WindowEventArgs& e) -{ - fireEvent(EventRedrawRequested, e, EventNamespace); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIWindowFactory.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIWindowFactory.cpp deleted file mode 100644 index 4fc9e3c692..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIWindowFactory.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowFactory.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the WindowFactory common functionality -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIWindowFactory.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIWindowFactoryManager.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIWindowFactoryManager.cpp deleted file mode 100644 index 29cd4bc504..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIWindowFactoryManager.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowFactoryManager.cpp - created: 22/2/2004 - author: Paul D Turner - - purpose: Implements the WindowFactoryManager -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIWindowFactoryManager.h" -#include "CEGUIWindowFactory.h" -#include "CEGUIExceptions.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> WindowFactoryManager* Singleton::ms_Singleton = NULL; - - -/************************************************************************* - Adds a WindowFactory object to the registry -*************************************************************************/ -void WindowFactoryManager::addFactory(WindowFactory* factory) -{ - // throw exception if passed factory is null. - if (factory == NULL) - { - throw NullObjectException((utf8*)"WindowFactoryManager::addFactory - The provided WindowFactory pointer was NULL"); - } - - // throw exception if type name for factory is already in use - if (d_factoryRegistry.find(factory->getTypeName()) != d_factoryRegistry.end()) - { - throw AlreadyExistsException((utf8*)"WindowFactoryManager::addFactory - A WindowFactory for type '" + factory->getTypeName() + (utf8*)"' is already registered."); - } - - // add the factory to the registry - d_factoryRegistry[factory->getTypeName()] = factory; - - Logger::getSingleton().logEvent((utf8*)"WindowFactory for '" + factory->getTypeName() +"' windows added."); -} - - -/************************************************************************* - removes a WindowFactory from the registry (by name) -*************************************************************************/ -void WindowFactoryManager::removeFactory(const String& name) -{ - d_factoryRegistry.erase(name); - - Logger::getSingleton().logEvent((utf8*)"WindowFactory for '" + name +"' windows removed."); -} - - -/************************************************************************* - removes a WindowFactory from the registry (by pointer) -*************************************************************************/ -void WindowFactoryManager::removeFactory(WindowFactory* factory) -{ - if (factory != NULL) - { - removeFactory(factory->getTypeName()); - } - -} - - -/************************************************************************* - returns a pointer to the requested WindowFactory object -*************************************************************************/ -WindowFactory* WindowFactoryManager::getFactory(const String& type) const -{ - // first, dereference aliased types, as needed. - String targetType(getDereferencedAliasType(type)); - - // try for a 'real' type - WindowFactoryRegistry::const_iterator pos = d_factoryRegistry.find(targetType); - - // found an actual factory for this type - if (pos != d_factoryRegistry.end()) - { - return pos->second; - } - // no concrete type, try for a falagard mapped type - else - { - FalagardMapRegistry::const_iterator falagard = d_falagardRegistry.find(targetType); - - // found falagard mapping for this type - if (falagard != d_falagardRegistry.end()) - { - // recursively call getFactory on the target base type - return getFactory(falagard->second.d_baseType); - } - // type not found anywhere, give up with an exception. - else - { - throw UnknownObjectException("WindowFactoryManager::getFactory - A WindowFactory object, an alias, or mapping for '" + type + "' Window objects is not registered with the system."); - } - } -} - - -/************************************************************************* - Returns true if a WindowFactory, an alias, or a falagard mapping for - a specified window type is present -*************************************************************************/ -bool WindowFactoryManager::isFactoryPresent(const String& name) const -{ - // first, dereference aliased types, as needed. - String targetType(getDereferencedAliasType(name)); - - // now try for a 'real' type - if (d_factoryRegistry.find(targetType) != d_factoryRegistry.end()) - { - return true; - } - // not a concrete type, so return whether it's a Falagard mapped type. - else - { - return (d_falagardRegistry.find(targetType) != d_falagardRegistry.end()); - } -} - - -WindowFactoryManager& WindowFactoryManager::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -WindowFactoryManager* WindowFactoryManager::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - - -/************************************************************************* - Return a WindowFactoryManager::WindowFactoryIterator object to - iterate over the available WindowFactory types. -*************************************************************************/ -WindowFactoryManager::WindowFactoryIterator WindowFactoryManager::getIterator(void) const -{ - return WindowFactoryIterator(d_factoryRegistry.begin(), d_factoryRegistry.end()); -} - - -/************************************************************************* - Return a WindowFactoryManager::TypeAliasIterator object to iterate - over the defined aliases for window types. -*************************************************************************/ -WindowFactoryManager::TypeAliasIterator WindowFactoryManager::getAliasIterator(void) const -{ - return TypeAliasIterator(d_aliasRegistry.begin(), d_aliasRegistry.end()); -} - - -/************************************************************************* - Add a window type alias mapping -*************************************************************************/ -void WindowFactoryManager::addWindowTypeAlias(const String& aliasName, const String& targetType) -{ - // throw if target type does not exist - if (!isFactoryPresent(targetType)) - { - throw UnknownObjectException((utf8*)"WindowFactoryManager::addWindowTypeAlias - alias '" + aliasName + "' could not be created because the target type '" + targetType + "' is unknown within the system."); - } - - TypeAliasRegistry::iterator pos = d_aliasRegistry.find(aliasName); - - if (pos == d_aliasRegistry.end()) - { - d_aliasRegistry[aliasName].d_targetStack.push_back(targetType); - } - // alias already exists, add our new entry to the list already there - else - { - pos->second.d_targetStack.push_back(targetType); - } - - Logger::getSingleton().logEvent((utf8*)"Window type alias named '" + aliasName + "' added for window type '" + targetType +"'."); -} - - -/************************************************************************* - Remove a window type alias mapping -*************************************************************************/ -void WindowFactoryManager::removeWindowTypeAlias(const String& aliasName, const String& targetType) -{ - // find alias name - TypeAliasRegistry::iterator pos = d_aliasRegistry.find(aliasName); - - // if alias name exists - if (pos != d_aliasRegistry.end()) - { - // find the specified target for this alias - std::vector::iterator aliasPos = std::find(pos->second.d_targetStack.begin(), pos->second.d_targetStack.end(), targetType); - - // if the target exists for this alias - if (aliasPos != pos->second.d_targetStack.end()) - { - // erase the target mapping - pos->second.d_targetStack.erase(aliasPos); - - Logger::getSingleton().logEvent((utf8*)"Window type alias named '" + aliasName + "' removed for window type '" + targetType +"'."); - - // if the list of targets for this alias is now empty - if (pos->second.d_targetStack.empty()) - { - // erase the alias name also - d_aliasRegistry.erase(aliasName); - - Logger::getSingleton().logEvent((utf8*)"Window type alias named '" + aliasName + "' has no more targets and has been removed.", Informative); - } - - } - - } - -} - -void WindowFactoryManager::addFalagardWindowMapping(const String& newType, const String& targetType, const String& lookName) -{ - WindowFactoryManager::FalagardWindowMapping mapping; - mapping.d_windowType = newType; - mapping.d_baseType = targetType; - mapping.d_lookName = lookName; - - // see if the type we're creating already exists - if (d_falagardRegistry.find(newType) != d_falagardRegistry.end()) - { - // type already exists, log the fact that it's going to be replaced. - Logger::getSingleton().logEvent("Falagard mapping for type '" + newType + "' already exists - current mapping will be replaced."); - } - - Logger::getSingleton().logEvent("Creating falagard mapping for type '" + newType + "' using base type '" + targetType + "' and LookN'Feel '" + lookName + "'."); - - d_falagardRegistry[newType] = mapping; -} - -void WindowFactoryManager::removeFalagardWindowMapping(const String& type) -{ - FalagardMapRegistry::iterator iter = d_falagardRegistry.find(type); - - if (iter != d_falagardRegistry.end()) - { - Logger::getSingleton().logEvent("Removing falagard mapping for type '" + type + "'."); - d_falagardRegistry.erase(iter); - } -} - -WindowFactoryManager::FalagardMappingIterator WindowFactoryManager::getFalagardMappingIterator() const -{ - return FalagardMappingIterator(d_falagardRegistry.begin(), d_falagardRegistry.end()); -} - -bool WindowFactoryManager::isFalagardMappedType(const String& type) const -{ - return d_falagardRegistry.find(getDereferencedAliasType(type)) != d_falagardRegistry.end(); -} - -const String& WindowFactoryManager::getMappedLookForType(const String& type) const -{ - FalagardMapRegistry::const_iterator iter = - d_falagardRegistry.find(getDereferencedAliasType(type)); - - if (iter != d_falagardRegistry.end()) - { - return (*iter).second.d_lookName; - } - // type does not exist as a mapped type (or an alias for one) - else - { - throw InvalidRequestException("WindowFactoryManager::getMappedLookForType - Window factory type '" + type + "' is not a falagard mapped type (or an alias for one)."); - } -} - -String WindowFactoryManager::getDereferencedAliasType(const String& type) const -{ - TypeAliasRegistry::const_iterator alias = d_aliasRegistry.find(type); - - // if this is an aliased type, ensure to fully dereference by recursively - // calling ourselves on the active target for the given type. - if (alias != d_aliasRegistry.end()) - return getDereferencedAliasType(alias->second.getActiveTarget()); - - // we're not an alias, so return the input type unchanged - return type; -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Methods for AliasTargetStack class -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -const String& WindowFactoryManager::AliasTargetStack::getActiveTarget(void) const -{ - return d_targetStack.back(); -} - - -uint WindowFactoryManager::AliasTargetStack::getStackedTargetCount(void) const -{ - return (uint)d_targetStack.size(); -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIWindowManager.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIWindowManager.cpp deleted file mode 100644 index 9a180adbd2..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIWindowManager.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowManager.cpp - created: 21/2/2004 - author: Paul D Turner - - purpose: Implements the WindowManager class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIWindowManager.h" -#include "CEGUIWindowFactoryManager.h" -#include "CEGUIWindowFactory.h" -#include "CEGUIWindow.h" -#include "CEGUIExceptions.h" -#include "CEGUIGUILayout_xmlHandler.h" -#include "CEGUIXMLParser.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Static Data Definitions -*************************************************************************/ -// singleton instance pointer -template<> WindowManager* Singleton::ms_Singleton = NULL; - - -/************************************************************************* - Definition of constant data for WindowManager -*************************************************************************/ -// Declared in WindowManager -const char WindowManager::GUILayoutSchemaName[] = "GUILayout.xsd"; -const String WindowManager::GeneratedWindowNameBase("__cewin_uid_"); - - -/************************************************************************* - Constructor -*************************************************************************/ -WindowManager::WindowManager(void) : - d_uid_counter(0) -{ - m_editBox = NULL; - Logger::getSingleton().logEvent((utf8*)"CEGUI::WindowManager singleton created"); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -WindowManager::~WindowManager(void) -{ - destroyAllWindows(); - cleanDeadPool(); - - Logger::getSingleton().logEvent((utf8*)"CEGUI::WindowManager singleton destroyed"); -} - - -/************************************************************************* - Create a new window of the specified type -*************************************************************************/ -Window* WindowManager::createWindow(const String& type, const String& name) -{ - String finalName(name.empty() ? generateUniqueWindowName() : name); - - if (isWindowPresent(finalName)) - { - throw AlreadyExistsException("WindowManager::createWindow - A Window object with the name '" + finalName +"' already exists within the system."); - } - - WindowFactoryManager& wfMgr = WindowFactoryManager::getSingleton(); - WindowFactory* factory = wfMgr.getFactory(type); - - Window* newWindow = factory->createWindow(finalName); - Logger::getSingleton().logEvent("Window '" + finalName +"' of type '" + type + "' has been created.", Informative); - - // see if we need to assign a look to this window - if (wfMgr.isFalagardMappedType(type)) - { - // this was a mapped type, so assign a look to the window so it can finalise - // its initialisation - newWindow->setLookNFeel(type, wfMgr.getMappedLookForType(type)); - } - - // perform initialisation step - newWindow->initialise(); - - d_windowRegistry[finalName] = newWindow; - - // Hack to store the first editbox so that we can force text redraw - if ( !m_editBox && type == "CGUI/Editbox" ) - { - m_editBox = newWindow; - } - - return newWindow; -} - - -/************************************************************************* - Destroy the given window by pointer -*************************************************************************/ -void WindowManager::destroyWindow(Window* window) -{ - if (window != NULL) - { - // If our first editbox is destroyed, we need a new one - if ( window == m_editBox ) - { - m_editBox = NULL; - } - // this is done because the name is used for the log after the window is destroyed, - // if we just did getName() we would get a const ref to the Window's internal name - // string which is destroyed along with the window so wouldn't exist when the log tried - // to use it (as I soon discovered). - String name = window->getName(); - - destroyWindow(name); - } - -} - - -/************************************************************************* - Destroy the given window by name -*************************************************************************/ -void WindowManager::destroyWindow(const String& window) -{ - WindowRegistry::iterator wndpos = d_windowRegistry.find(window); - - if (wndpos != d_windowRegistry.end()) - { - Window* wnd = wndpos->second; - - // remove entry from the WindowRegistry. - d_windowRegistry.erase(wndpos); - - // do 'safe' part of cleanup - wnd->destroy(); - - // add window to dead pool - d_deathrow.push_back(wnd); - - // notify system object of the window destruction - System::getSingleton().notifyWindowDestroyed(wnd); - - Logger::getSingleton().logEvent((utf8*)"Window '" + window + "' has been added to dead pool.", Informative); - } - -} - - -/************************************************************************* - Return a pointer to the named window -*************************************************************************/ -Window* WindowManager::getWindow(const String& name) const -{ - WindowRegistry::const_iterator pos = d_windowRegistry.find(name); - - if (pos == d_windowRegistry.end()) - { - throw UnknownObjectException("WindowManager::getWindow - A Window object with the name '" + name +"' does not exist within the system"); - } - - return pos->second; -} - - -/************************************************************************* - Return true if a window with the given name is present -*************************************************************************/ -bool WindowManager::isWindowPresent(const String& name) const -{ - return (d_windowRegistry.find(name) != d_windowRegistry.end()); -} - - -/************************************************************************* - Destroy all Window objects -*************************************************************************/ -void WindowManager::destroyAllWindows(void) -{ - String window_name; - while (!d_windowRegistry.empty()) - { - window_name = d_windowRegistry.begin()->first; - destroyWindow(window_name); - } - -} - - -/************************************************************************* - Creates a set of windows (a Gui layout) from the information in the - specified XML file. -*************************************************************************/ -Window* WindowManager::loadWindowLayout(const String& filename, const String& name_prefix, const String& resourceGroup, PropertyCallback* callback, void* userdata) -{ - if (filename.empty() || (filename == (utf8*)"")) - { - throw InvalidRequestException((utf8*)"WindowManager::loadWindowLayout - Filename supplied for gui-layout loading must be valid."); - } - - // log the fact we are about to load a layout - Logger::getSingleton().logEvent((utf8*)"---- Beginning loading of GUI layout from '" + filename + "' ----", Informative); - - // create handler object - GUILayout_xmlHandler handler(name_prefix, callback, userdata); - - // do parse (which uses handler to create actual data) - try - { - System::getSingleton().getXMLParser()->parseXMLFile(handler, filename, GUILayoutSchemaName, resourceGroup); - } - catch(...) - { - Logger::getSingleton().logEvent("WindowManager::loadWindowLayout - loading of layout from file '" + filename +"' failed.", Errors); - throw; - } - - // log the completion of loading - Logger::getSingleton().logEvent((utf8*)"---- Successfully completed loading of GUI layout from '" + filename + "' ----", Standard); - - return handler.getLayoutRootWindow(); -} - - -WindowManager& WindowManager::getSingleton(void) -{ - return Singleton::getSingleton(); -} - - -WindowManager* WindowManager::getSingletonPtr(void) -{ - return Singleton::getSingletonPtr(); -} - -bool WindowManager::isDeadPoolEmpty(void) const -{ - return d_deathrow.empty(); -} - -void WindowManager::cleanDeadPool(void) -{ - WindowVector::reverse_iterator curr = d_deathrow.rbegin(); - for (; curr != d_deathrow.rend(); ++curr) - { -// in debug mode, log what gets cleaned from the dead pool (insane level) -#if defined(DEBUG) || defined (_DEBUG) - CEGUI_LOGINSANE("Window '" + (*curr)->getName() + "' about to be finally destroyed from dead pool."); -#endif - - WindowFactory* factory = WindowFactoryManager::getSingleton().getFactory((*curr)->getType()); - factory->destroyWindow(*curr); - } - - // all done here, so clear all pointers from dead pool - d_deathrow.clear(); -} - -void WindowManager::writeWindowLayoutToStream(const Window& window, OutStream& out_stream, bool writeParent) const -{ - // output xml header - out_stream << "" << std::endl; - // output GUILayout start element - out_stream << "getName() << "\" "; - } - // close opening tag - out_stream << ">" << std::endl; - // write windows - window.writeXMLToStream(out_stream); - // write closing GUILayout element - out_stream << "" << std::endl; -} - -void WindowManager::writeWindowLayoutToStream(const String& window, OutStream& out_stream, bool writeParent) const -{ - writeWindowLayoutToStream(*getWindow(window), out_stream, writeParent); -} - -String WindowManager::generateUniqueWindowName() -{ - // build name - std::ostringstream uidname; - uidname << GeneratedWindowNameBase.c_str() << d_uid_counter; - - // update counter for next time - unsigned long old_uid = d_uid_counter; - ++d_uid_counter; - - // log if we ever wrap-around (which should be pretty unlikely) - if (d_uid_counter < old_uid) - Logger::getSingleton().logEvent("UID counter for generated window names has wrapped around - the fun shall now commence!"); - - // return generated name as a CEGUI::String. - return String(uidname.str()); -} - -void WindowManager::renameWindow(const String& window, const String& new_name) -{ - renameWindow(getWindow(window), new_name); -} - -void WindowManager::renameWindow(Window* window, const String& new_name) -{ - if (window) - { - WindowRegistry::iterator pos = d_windowRegistry.find(window->getName()); - - if (pos != d_windowRegistry.end()) - { - // erase old window name from registry - d_windowRegistry.erase(pos); - // rename the window - window->rename(new_name); - // add window to registry under new name - d_windowRegistry[new_name] = window; - } - } -} - -/************************************************************************* - Return a WindowManager::WindowIterator object to iterate over the - currently defined Windows. -*************************************************************************/ -WindowManager::WindowIterator WindowManager::getIterator(void) const -{ - return WindowIterator(d_windowRegistry.begin(), d_windowRegistry.end()); -} -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIWindowProperties.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIWindowProperties.cpp deleted file mode 100644 index a11efad814..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIWindowProperties.cpp +++ /dev/null @@ -1,957 +0,0 @@ -/************************************************************************ - filename: CEGUIWindowProperties.cpp - created: 5/7/2004 - author: Paul D Turner - - purpose: Implementation of available window base class properties -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIWindowProperties.h" -#include "CEGUIWindow.h" -#include "CEGUIFont.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIExceptions.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of WindowProperties namespace section -namespace WindowProperties -{ - -String RelativeMinSize::get(const PropertyReceiver* receiver) const -{ - CEGUI::Size msz(static_cast(receiver)->getMinimumSize()); - - if (static_cast(receiver)->getMetricsMode() == Absolute) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width /= dsz.d_width; - msz.d_height /= dsz.d_height; - } - - return PropertyHelper::sizeToString(msz); -} - - -void RelativeMinSize::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::Size msz(PropertyHelper::stringToSize(value)); - - if (static_cast(receiver)->getMetricsMode() == Absolute) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width *= dsz.d_width; - msz.d_height *= dsz.d_height; - } - - static_cast(receiver)->setMinimumSize(msz); -} - - -String RelativeMaxSize::get(const PropertyReceiver* receiver) const -{ - CEGUI::Size msz(static_cast(receiver)->getMaximumSize()); - - if (static_cast(receiver)->getMetricsMode() == Absolute) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width /= dsz.d_width; - msz.d_height /= dsz.d_height; - } - - return PropertyHelper::sizeToString(msz); -} - - -void RelativeMaxSize::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::Size msz(PropertyHelper::stringToSize(value)); - - if (static_cast(receiver)->getMetricsMode() == Absolute) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width *= dsz.d_width; - msz.d_height *= dsz.d_height; - } - - static_cast(receiver)->setMaximumSize(msz); -} - - -String AbsoluteMinSize::get(const PropertyReceiver* receiver) const -{ - CEGUI::Size msz(static_cast(receiver)->getMinimumSize()); - - if (static_cast(receiver)->getMetricsMode() == Relative) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width *= dsz.d_width; - msz.d_height *= dsz.d_height; - } - - return PropertyHelper::sizeToString(msz); -} - - -void AbsoluteMinSize::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::Size msz(PropertyHelper::stringToSize(value)); - - if (static_cast(receiver)->getMetricsMode() == Relative) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width /= dsz.d_width; - msz.d_height /= dsz.d_height; - } - - static_cast(receiver)->setMinimumSize(msz); -} - - -String AbsoluteMaxSize::get(const PropertyReceiver* receiver) const -{ - CEGUI::Size msz(static_cast(receiver)->getMaximumSize()); - - if (static_cast(receiver)->getMetricsMode() == Relative) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width *= dsz.d_width; - msz.d_height *= dsz.d_height; - } - - return PropertyHelper::sizeToString(msz); -} - - -void AbsoluteMaxSize::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::Size msz(PropertyHelper::stringToSize(value)); - - if (static_cast(receiver)->getMetricsMode() == Relative) - { - CEGUI::Size dsz(System::getSingleton().getRenderer()->getSize()); - - msz.d_width /= dsz.d_width; - msz.d_height /= dsz.d_height; - } - - static_cast(receiver)->setMaximumSize(msz); -} - -bool AbsoluteMaxSize::isDefault(const PropertyReceiver* receiver) const -{ - return get(receiver) == getDefault(receiver); -} - -String AbsoluteMaxSize::getDefault(const PropertyReceiver* receiver) const -{ - return PropertyHelper::sizeToString(System::getSingleton().getRenderer()->getSize()); -} - -String MetricsMode::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::metricsModeToString(static_cast(receiver)->getMetricsMode()); -} - - -void MetricsMode::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMetricsMode(PropertyHelper::stringToMetricsMode(value)); -} - - -String ID::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getID()); -} - - -void ID::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setID(PropertyHelper::stringToUint(value)); -} - - -String Alpha::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAlpha()); -} - - -void Alpha::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAlpha(PropertyHelper::stringToFloat(value)); -} - - -String Font::get(const PropertyReceiver* receiver) const -{ - const CEGUI::Font* fnt = static_cast(receiver)->getFont(); - - if (fnt != NULL) - { - return fnt->getName(); - } - else - { - return String(); - } - -} - - -void Font::set(PropertyReceiver* receiver, const String& value) -{ - try - { - if (value.empty()) - { - static_cast(receiver)->setFont(System::getSingleton().getDefaultFont()); - } - else - { - static_cast(receiver)->setFont(value); - } - } - catch (UnknownObjectException) - { } -} - -bool Font::isDefault(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getFont(false) == 0; -} - - -String Text::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getText(); -} - - -void Text::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setText(value); -} - - -String MouseCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getMouseCursor(); - - if (img != NULL) - { - return PropertyHelper::imageToString(img); - } - else - { - return String(); - } - -} - -void MouseCursorImage::set(PropertyReceiver* receiver, const String& value) -{ - if (!value.empty()) - { - static_cast(receiver)->setMouseCursor(PropertyHelper::stringToImage(value)); - } -} - -bool MouseCursorImage::isDefault(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getMouseCursor(false) == 0; -} - - -String ClippedByParent::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isClippedByParent()); -} - - -void ClippedByParent::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setClippedByParent(PropertyHelper::stringToBool(value)); -} - - -String InheritsAlpha::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->inheritsAlpha()); -} - - -void InheritsAlpha::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setInheritsAlpha(PropertyHelper::stringToBool(value)); -} - - -String AlwaysOnTop::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isAlwaysOnTop()); -} - - -void AlwaysOnTop::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAlwaysOnTop(PropertyHelper::stringToBool(value)); -} - - -String Disabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isDisabled()); -} - - -void Disabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setEnabled(!PropertyHelper::stringToBool(value)); -} - -bool Disabled::isDefault(const PropertyReceiver* receiver) const -{ - return !static_cast(receiver)->isDisabled(true); -} - - -String Visible::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isVisible()); -} - - -void Visible::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setVisible(PropertyHelper::stringToBool(value)); -} - -bool Visible::isDefault(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->isVisible(true); -} - - -String RestoreOldCapture::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->restoresOldCapture()); -} - - -void RestoreOldCapture::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRestoreCapture(PropertyHelper::stringToBool(value)); -} - - -String DestroyedByParent::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isDestroyedByParent()); -} - - -void DestroyedByParent::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDestroyedByParent(PropertyHelper::stringToBool(value)); -} - - -String Width::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getWidth()); -} - - -void Width::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWidth(PropertyHelper::stringToFloat(value)); -} - - -String RelativeWidth::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getRelativeWidth()); -} - - -void RelativeWidth::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWidth(Relative, PropertyHelper::stringToFloat(value)); -} - - -String AbsoluteWidth::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAbsoluteWidth()); -} - - -void AbsoluteWidth::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWidth(Absolute, PropertyHelper::stringToFloat(value)); -} - - -String Height::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getHeight()); -} - - -void Height::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHeight(PropertyHelper::stringToFloat(value)); -} - - -String RelativeHeight::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getRelativeHeight()); -} - - -void RelativeHeight::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHeight(Relative, PropertyHelper::stringToFloat(value)); -} - - -String AbsoluteHeight::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAbsoluteHeight()); -} - - -void AbsoluteHeight::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHeight(Absolute, PropertyHelper::stringToFloat(value)); -} - - -String Size::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::sizeToString(static_cast(receiver)->getSize()); -} - - -void Size::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSize(PropertyHelper::stringToSize(value)); -} - - -String RelativeSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::sizeToString(static_cast(receiver)->getRelativeSize()); -} - - -void RelativeSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSize(Relative, PropertyHelper::stringToSize(value)); -} - - -String AbsoluteSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::sizeToString(static_cast(receiver)->getAbsoluteSize()); -} - - -void AbsoluteSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSize(Absolute, PropertyHelper::stringToSize(value)); -} - - -String XPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getXPosition()); -} - - -void XPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setXPosition(PropertyHelper::stringToFloat(value)); -} - - -String RelativeXPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getRelativeXPosition()); -} - - -void RelativeXPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setXPosition(Relative, PropertyHelper::stringToFloat(value)); -} - - -String AbsoluteXPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAbsoluteXPosition()); -} - - -void AbsoluteXPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setXPosition(Absolute, PropertyHelper::stringToFloat(value)); -} - - -String YPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getYPosition()); -} - - -void YPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setYPosition(PropertyHelper::stringToFloat(value)); -} - - -String RelativeYPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getRelativeYPosition()); -} - - -void RelativeYPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setYPosition(Relative, PropertyHelper::stringToFloat(value)); -} - - -String AbsoluteYPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAbsoluteYPosition()); -} - - -void AbsoluteYPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setYPosition(Absolute, PropertyHelper::stringToFloat(value)); -} - - -String Position::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::pointToString(static_cast(receiver)->getPosition()); -} - - -void Position::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setPosition(PropertyHelper::stringToPoint(value)); -} - - -String RelativePosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::pointToString(static_cast(receiver)->getRelativePosition()); -} - - -void RelativePosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setPosition(Relative, PropertyHelper::stringToPoint(value)); -} - - -String AbsolutePosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::pointToString(static_cast(receiver)->getAbsolutePosition()); -} - - -void AbsolutePosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setPosition(Absolute, PropertyHelper::stringToPoint(value)); -} - - -String Rect::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::rectToString(static_cast(receiver)->getRect()); -} - - -void Rect::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAreaRect(PropertyHelper::stringToRect(value)); -} - - -String RelativeRect::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::rectToString(static_cast(receiver)->getRelativeRect()); -} - - -void RelativeRect::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRect(Relative, PropertyHelper::stringToRect(value)); -} - - -String AbsoluteRect::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::rectToString(static_cast(receiver)->getAbsoluteRect()); -} - - -void AbsoluteRect::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRect(Absolute, PropertyHelper::stringToRect(value)); -} - - -String ZOrderChangeEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isZOrderingEnabled()); -} - - -void ZOrderChangeEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setZOrderingEnabled(PropertyHelper::stringToBool(value)); -} - - -String WantsMultiClickEvents::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->wantsMultiClickEvents()); -} - - -void WantsMultiClickEvents::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWantsMultiClickEvents(PropertyHelper::stringToBool(value)); -} - - -String MouseButtonDownAutoRepeat::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isMouseAutoRepeatEnabled()); -} - - -void MouseButtonDownAutoRepeat::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMouseAutoRepeatEnabled(PropertyHelper::stringToBool(value)); -} - - -String AutoRepeatDelay::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAutoRepeatDelay()); -} - - -void AutoRepeatDelay::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAutoRepeatDelay(PropertyHelper::stringToFloat(value)); -} - - -String AutoRepeatRate::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAutoRepeatRate()); -} - - -void AutoRepeatRate::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAutoRepeatRate(PropertyHelper::stringToFloat(value)); -} - - -String DistributeCapturedInputs::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->distributesCapturedInputs()); -} - - -void DistributeCapturedInputs::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDistributesCapturedInputs(PropertyHelper::stringToBool(value)); -} - - -String CustomTooltipType::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getTooltipType(); -} - - -void CustomTooltipType::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTooltipType(value); -} - -String Tooltip::get(const PropertyReceiver* receiver) const -{ - const Window* wnd = static_cast(receiver); - - if (!wnd->getParent() || !wnd->inheritsTooltipText() || (wnd->getTooltipText() != wnd->getParent()->getTooltipText())) - { - return wnd->getTooltipText(); - } - else - { - return String(""); - } -} - - -void Tooltip::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTooltipText(value); -} - - -String InheritsTooltipText::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->inheritsTooltipText()); -} - - -void InheritsTooltipText::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setInheritsTooltipText(PropertyHelper::stringToBool(value)); -} - - -String RiseOnClick::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isRiseOnClickEnabled()); -} - - -void RiseOnClick::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRiseOnClickEnabled(PropertyHelper::stringToBool(value)); -} - - -String VerticalAlignment::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getVerticalAlignment()) - { - case VA_CENTRE: - return String("Centre"); - break; - - case VA_BOTTOM: - return String("Bottom"); - break; - - default: - return String("Top"); - } -} - -void VerticalAlignment::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::VerticalAlignment align; - - if (value == "Centre") - { - align = VA_CENTRE; - } - else if (value == "Bottom") - { - align = VA_BOTTOM; - } - else - { - align = VA_TOP; - } - - static_cast(receiver)->setVerticalAlignment(align); -} - - -String HorizontalAlignment::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getHorizontalAlignment()) - { - case HA_CENTRE: - return String("Centre"); - break; - - case HA_RIGHT: - return String("Right"); - break; - - default: - return String("Left"); - } -} - -void HorizontalAlignment::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::HorizontalAlignment align; - - if (value == "Centre") - { - align = HA_CENTRE; - } - else if (value == "Right") - { - align = HA_RIGHT; - } - else - { - align = HA_LEFT; - } - - static_cast(receiver)->setHorizontalAlignment(align); -} - - -String UnifiedAreaRect::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::urectToString(static_cast(receiver)->getWindowArea()); -} - -void UnifiedAreaRect::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowArea(PropertyHelper::stringToURect(value)); -} - - -String UnifiedPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uvector2ToString(static_cast(receiver)->getWindowPosition()); -} - -void UnifiedPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowPosition(PropertyHelper::stringToUVector2(value)); -} - - -String UnifiedXPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::udimToString(static_cast(receiver)->getWindowXPosition()); -} - -void UnifiedXPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowXPosition(PropertyHelper::stringToUDim(value)); -} - - -String UnifiedYPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::udimToString(static_cast(receiver)->getWindowYPosition()); -} - -void UnifiedYPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowYPosition(PropertyHelper::stringToUDim(value)); -} - - -String UnifiedSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uvector2ToString(static_cast(receiver)->getWindowSize()); -} - -void UnifiedSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowSize(PropertyHelper::stringToUVector2(value)); -} - - -String UnifiedWidth::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::udimToString(static_cast(receiver)->getWindowWidth()); -} - -void UnifiedWidth::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowWidth(PropertyHelper::stringToUDim(value)); -} - - -String UnifiedHeight::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::udimToString(static_cast(receiver)->getWindowHeight()); -} - -void UnifiedHeight::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowHeight(PropertyHelper::stringToUDim(value)); -} - - -String UnifiedMinSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uvector2ToString(static_cast(receiver)->getWindowMinSize()); -} - -void UnifiedMinSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowMinSize(PropertyHelper::stringToUVector2(value)); -} - - -String UnifiedMaxSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uvector2ToString(static_cast(receiver)->getWindowMaxSize()); -} - -void UnifiedMaxSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWindowMaxSize(PropertyHelper::stringToUVector2(value)); -} - - -String MousePassThroughEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isMousePassThroughEnabled()); -} - -void MousePassThroughEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMousePassThroughEnabled(PropertyHelper::stringToBool(value)); -} - - -} // End of WindowProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIXMLAttributes.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIXMLAttributes.cpp deleted file mode 100644 index cda7086a8f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIXMLAttributes.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/************************************************************************ - filename: CEGUIXMLAttributes.cpp - created: Sat Mar 12 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIXMLAttributes.h" -#include "CEGUIExceptions.h" -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - XMLAttributes::XMLAttributes(void) - {} - - XMLAttributes::~XMLAttributes(void) - {} - - void XMLAttributes::add(const String& attrName, const String& attrValue) - { - d_attrs[attrName] = attrValue; - } - - void XMLAttributes::remove(const String& attrName) - { - AttributeMap::iterator pos = d_attrs.find(attrName); - - if (pos != d_attrs.end()) - d_attrs.erase(pos); - } - - bool XMLAttributes::exists(const String& attrName) const - { - return d_attrs.find(attrName) != d_attrs.end(); - } - - size_t XMLAttributes::getCount(void) const - { - return d_attrs.size(); - } - - const String& XMLAttributes::getName(size_t index) const - { - if (index >= d_attrs.size()) - { - throw InvalidRequestException("XMLAttributes::getName - The specified index is out of range for this XMLAttributes block."); - } - - AttributeMap::const_iterator iter = d_attrs.begin(); - std::advance(iter, index); - - return (*iter).first; - } - - const String& XMLAttributes::getValue(size_t index) const - { - if (index >= d_attrs.size()) - { - throw InvalidRequestException("XMLAttributes::getValue - The specified index is out of range for this XMLAttributes block."); - } - - AttributeMap::const_iterator iter = d_attrs.begin(); - std::advance(iter, index); - - return (*iter).second; - } - - const String& XMLAttributes::getValue(const String& attrName) const - { - AttributeMap::const_iterator pos = d_attrs.find(attrName); - - if (pos != d_attrs.end()) - { - return (*pos).second; - } - else - { - throw UnknownObjectException("XMLAttributes::getValue - no value exists for an attribute named '" + attrName + "'."); - } - } - - const String& XMLAttributes::getValueAsString(const String& attrName, const String& def) const - { - return (exists(attrName)) ? getValue(attrName) : def; - } - - - bool XMLAttributes::getValueAsBool(const String& attrName, bool def) const - { - if (!exists(attrName)) - { - return def; - } - - const String& val = getValue(attrName); - - if (val == "false" || val == "0") - { - return false; - } - else if (val == "true" || val == "1") - { - return true; - } - else - { - throw InvalidRequestException("XMLAttributes::getValueAsInteger - failed to convert attribute '" + attrName + "' with value '" + getValue(attrName) + "' to bool."); - } - } - - int XMLAttributes::getValueAsInteger(const String& attrName, int def) const - { - if (!exists(attrName)) - { - return def; - } - - int val; - std::istringstream strm(getValue(attrName).c_str()); - - strm >> val; - - // success? - if (strm.fail()) - { - throw InvalidRequestException("XMLAttributes::getValueAsInteger - failed to convert attribute '" + attrName + "' with value '" + getValue(attrName) + "' to integer."); - } - - return val; - } - - float XMLAttributes::getValueAsFloat(const String& attrName, float def) const - { - if (!exists(attrName)) - { - return def; - } - - float val; - std::istringstream strm(getValue(attrName).c_str()); - - strm >> val; - - // success? - if (strm.fail()) - { - throw InvalidRequestException("XMLAttributes::getValueAsInteger - failed to convert attribute '" + attrName + "' with value '" + getValue(attrName) + "' to float."); - } - - return val; - } - - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIXMLHandler.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIXMLHandler.cpp deleted file mode 100644 index 4ec861afd5..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIXMLHandler.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/************************************************************************ - filename: CEGUIXMLHandler.cpp - created: 12/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIXMLHandler.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - // default handler does nothing. - - XMLHandler::XMLHandler(void) - {} - - XMLHandler::~XMLHandler(void) - {} - - void XMLHandler::elementStart(const String& element, const XMLAttributes& attributes) - {} - - void XMLHandler::elementEnd(const String& element) - {} - -} // End of CEGUI namespace section - diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIXMLParser.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIXMLParser.cpp deleted file mode 100644 index 66e7542850..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIXMLParser.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************ - filename: CEGUIXMLParser.cpp - created: 12/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIXMLParser.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - - XMLParser::XMLParser(void) : - d_identifierString("Unknown XML parser (vendor did not set the ID string!)"), - d_initialised(false) - {} - - XMLParser::~XMLParser(void) - {} - - bool XMLParser::initialise(void) - { - // do this to ensure only one initialise call is made - if (!d_initialised) - { - d_initialised = initialiseImpl(); - } - - return d_initialised; - } - - void XMLParser::cleanup(void) - { - if (d_initialised) - { - cleanupImpl(); - d_initialised = false; - } - } - - const String& XMLParser::getIdentifierString() const - { - return d_identifierString; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIXercesParser.hpp b/vendor/cegui-0.4.0-custom/src/CEGUIXercesParser.hpp deleted file mode 100644 index 619d1a9ed9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIXercesParser.hpp +++ /dev/null @@ -1,335 +0,0 @@ -/************************************************************************ - filename: CEGUIXercesParser.cpp - created: Sat Mar 12 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "CEGUIXercesParser.h" -#include "CEGUIString.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" -#include "CEGUIResourceProvider.h" -#include "CEGUISystem.h" -#include "CEGUIXMLHandler.h" -#include "CEGUIXMLAttributes.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - //////////////////////////////////////////////////////////////////////////////// - // - // XercesParser methods - // - //////////////////////////////////////////////////////////////////////////////// - - XercesParser::XercesParser(void) - { - // set ID string - d_identifierString = "CEGUI::XercesParser - Official Xerces-C++ based parser module for CEGUI"; - } - - XercesParser::~XercesParser(void) - {} - - void XercesParser::parseXMLFile(XMLHandler& handler, const String& filename, const String& schemaName, const String& resourceGroup) - { - XERCES_CPP_NAMESPACE_USE; - - XercesHandler xercesHandler(handler); - - // create parser - SAX2XMLReader* reader = createReader(xercesHandler); - - try - { - // set up schema - initialiseSchema(reader, schemaName, filename, resourceGroup); - // do parse - doParse(reader, filename, resourceGroup); - } - catch(const XMLException& exc) - { - if (exc.getCode() != XMLExcepts::NoError) - { - delete reader; - - char* excmsg = XMLString::transcode(exc.getMessage()); - String message((utf8*)"XercesParser::parseXMLFile - An error occurred at line nr. " + PropertyHelper::uintToString((uint)exc.getSrcLine()) + " while parsing XML file '" + filename + "'. Additional information: "); - message += excmsg; - XMLString::release(&excmsg); - - throw FileIOException(message); - } - - } - catch(const SAXParseException& exc) - { - delete reader; - - char* excmsg = XMLString::transcode(exc.getMessage()); - String message((utf8*)"XercesParser::parseXMLFile - An error occurred at line nr. " + PropertyHelper::uintToString((uint)exc.getLineNumber()) + " while parsing XML file '" + filename + "'. Additional information: "); - message += excmsg; - XMLString::release(&excmsg); - - throw FileIOException(message); - } - catch(...) - { - delete reader; - - Logger::getSingleton().logEvent("XercesParser::parseXMLFile - An unexpected error occurred while parsing XML file '" + filename + "'.", Errors); - throw; - } - - // cleanup - delete reader; - } - - bool XercesParser::initialiseImpl(void) - { - XERCES_CPP_NAMESPACE_USE; - - // initialise Xerces-C XML system - try - { - XMLPlatformUtils::Initialize(); - } - catch(XMLException& exc) - { - // prepare a message about the failure - char* excmsg = XMLString::transcode(exc.getMessage()); - String message((utf8*)"An exception occurred while initialising the Xerces-C XML system. Additional information: "); - message += (utf8*)excmsg; - XMLString::release(&excmsg); - - // throw a std::exception (because it won't try and use logger, which may not be available) - throw message.c_str(); - } - - return true; - } - - void XercesParser::cleanupImpl(void) - { - // cleanup XML stuff - XERCES_CPP_NAMESPACE_USE; - XMLPlatformUtils::Terminate(); - } - - void XercesParser::populateAttributesBlock(const XERCES_CPP_NAMESPACE::Attributes& src, XMLAttributes& dest) - { - String attributeName; - String attributeValue; - - for (uint i = 0; i < src.getLength(); ++i) - { - attributeName = transcodeXmlCharToString(src.getLocalName(i)); - attributeValue = transcodeXmlCharToString(src.getValue(i)); - dest.add(attributeName, attributeValue); - } - } - - String XercesParser::transcodeXmlCharToString(const XMLCh* const xmlch_str) - { - XERCES_CPP_NAMESPACE_USE; - - XMLTransService::Codes res; - XMLTranscoder* transcoder = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(XMLRecognizer::UTF_8, res, 4096, XMLPlatformUtils::fgMemoryManager ); - - if (res == XMLTransService::Ok) - { - String out; - utf8 outBuff[128]; - unsigned int outputLength; - unsigned int eaten = 0; - unsigned int offset = 0; - unsigned int inputLength = XMLString::stringLen(xmlch_str); - - while (inputLength) - { - outputLength = transcoder->transcodeTo(xmlch_str + offset, inputLength, outBuff, 128, eaten, XMLTranscoder::UnRep_RepChar); - out.append(outBuff, outputLength); - offset += eaten; - inputLength -= eaten; - } - - delete transcoder; - - return out; - } - else - { - throw GenericException((utf8*)"XercesParser::transcodeXmlCharToString - Internal Error: Could not create UTF-8 string transcoder."); - } - - } - - void XercesParser::initialiseSchema(XERCES_CPP_NAMESPACE::SAX2XMLReader* reader, const String& schemaName, const String& xmlFilename, const String& resourceGroup) - { - XERCES_CPP_NAMESPACE_USE; - - // enable schema use and set validation options - reader->setFeature(XMLUni::fgXercesSchema, true); - reader->setFeature(XMLUni::fgSAX2CoreValidation, true); - reader->setFeature(XMLUni::fgXercesValidationErrorAsFatal, true); - - // load in the raw schema data - RawDataContainer rawSchemaData; - // try base filename first - try - { - Logger::getSingleton().logEvent("XercesParser::initialiseSchema - Attempting to load schema from file '" + schemaName + "'."); - System::getSingleton().getResourceProvider()->loadRawDataContainer(schemaName, rawSchemaData, resourceGroup); - } - // oops, no file. Try an alternative instead... - catch(InvalidRequestException) - { - // get path from filename - String schemaFilename; - size_t pos = xmlFilename.rfind("/"); - if (pos == String::npos) pos = xmlFilename.rfind("\\"); - if (pos != String::npos) schemaFilename.assign(xmlFilename, 0, pos + 1); - // append schema filename - schemaFilename += schemaName; - // re-try the load operation. - Logger::getSingleton().logEvent("XercesParser::initialiseSchema - Attempting to load schema from file '" + schemaFilename + "'."); - System::getSingleton().getResourceProvider()->loadRawDataContainer(schemaFilename, rawSchemaData, resourceGroup); - } - // wrap schema data in a xerces MemBufInputSource object - MemBufInputSource schemaData( - rawSchemaData.getDataPtr(), - static_cast(rawSchemaData.getSize()), - schemaName.c_str(), - false); - reader->loadGrammar(schemaData, Grammar::SchemaGrammarType, true); - // enable grammar reuse - reader->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true); - - // set schema for usage - XMLCh* pval = XMLString::transcode(schemaName.c_str()); - reader->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation, pval); - XMLString::release(&pval); - Logger::getSingleton().logEvent("XercesParser::initialiseSchema - XML schema file '" + schemaName + "' has been initialised."); - - // use resource provider to release loaded schema data (if it supports this) - System::getSingleton().getResourceProvider()->unloadRawDataContainer(rawSchemaData); - } - - XERCES_CPP_NAMESPACE::SAX2XMLReader* XercesParser::createReader(XERCES_CPP_NAMESPACE::DefaultHandler& handler) - { - XERCES_CPP_NAMESPACE_USE; - - SAX2XMLReader* reader = XMLReaderFactory::createXMLReader(); - - // set basic settings we want from parser - reader->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); - - // set handlers - reader->setContentHandler(&handler); - reader->setErrorHandler(&handler); - - return reader; - } - - void XercesParser::doParse(XERCES_CPP_NAMESPACE::SAX2XMLReader* parser, const String& xmlFilename, const String& resourceGroup) - { - XERCES_CPP_NAMESPACE_USE; - - // use resource provider to load file data - RawDataContainer rawXMLData; - System::getSingleton().getResourceProvider()->loadRawDataContainer(xmlFilename, rawXMLData, resourceGroup); - MemBufInputSource fileData( - rawXMLData.getDataPtr(), - static_cast(rawXMLData.getSize()), - xmlFilename.c_str(), - false); - - // perform parse - try - { - parser->parse(fileData); - } - catch(...) - { - // use resource provider to release loaded XML source (if it supports this) - System::getSingleton().getResourceProvider()->unloadRawDataContainer(rawXMLData); - - throw; - } - - // use resource provider to release loaded XML source (if it supports this) - System::getSingleton().getResourceProvider()->unloadRawDataContainer(rawXMLData); - } - - - //////////////////////////////////////////////////////////////////////////////// - // - // XercesHandler methods - // - //////////////////////////////////////////////////////////////////////////////// - - XercesHandler::XercesHandler(XMLHandler& handler) : - d_handler(handler) - {} - - XercesHandler::~XercesHandler(void) - {} - - void XercesHandler::startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const XERCES_CPP_NAMESPACE::Attributes& attrs) - { - XMLAttributes cegui_attributes; - XercesParser::populateAttributesBlock(attrs, cegui_attributes); - - String element(XercesParser::transcodeXmlCharToString(localname)); - - d_handler.elementStart(element, cegui_attributes); - } - - void XercesHandler::endElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname) - { - String element(XercesParser::transcodeXmlCharToString(localname)); - - d_handler.elementEnd(element); - } - - void XercesHandler::warning (const XERCES_CPP_NAMESPACE::SAXParseException &exc) - { - XERCES_CPP_NAMESPACE_USE; - - // prepare a message about the warning - char* excmsg = XMLString::transcode(exc.getMessage()); - String message("Xerces warning: "); - message += (utf8*)excmsg; - XMLString::release(&excmsg); - Logger::getSingleton().logEvent(message); - } - - void XercesHandler::error (const XERCES_CPP_NAMESPACE::SAXParseException &exc) - { - throw exc; - } - - void XercesHandler::fatalError (const XERCES_CPP_NAMESPACE::SAXParseException &exc) - { - throw exc; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/CEGUIcolour.cpp b/vendor/cegui-0.4.0-custom/src/CEGUIcolour.cpp deleted file mode 100644 index b8b089c5ab..0000000000 --- a/vendor/cegui-0.4.0-custom/src/CEGUIcolour.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/************************************************************************ - filename: CEGUIcolour.cpp - created: 20/8/2004 - author: Paul D Turner (with code from Jeff Leigh) - - purpose: Implementation of colour class methods. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIcolour.h" -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Construction & Destruction -*************************************************************************/ -colour::colour(void) : - d_alpha(1.0f), - d_red(0.0f), - d_green(0.0f), - d_blue(0.0f), - d_argb(0xFF000000), - d_argbValid(true) -{ -} - - -colour::colour(const colour& val) -{ - this->operator=(val); -} - - -colour::colour(float red, float green, float blue, float alpha) : - d_alpha(alpha), - d_red(red), - d_green(green), - d_blue(blue), - d_argbValid(false) -{ -} - - -colour::colour(argb_t argb) -{ - setARGB(argb); -} - - -float colour::getHue(void) const -{ - float pRed = d_red; - float pGreen = d_green; - float pBlue = d_blue; - - float pMax = ceguimax(ceguimax(d_red, d_green), d_blue); - float pMin = ceguimin(ceguimin(d_red, d_green), d_blue); - - float pHue; - - if( pMax == pMin ) - { - pHue = 0; - } - else - { - if( pMax == pRed ) - { - pHue = (pGreen - pBlue) / (pMax - pMin); - } - else if( pMax == pGreen ) - { - pHue = 2 + (pBlue - pRed) / (pMax - pMin); - } - else - { - pHue = 4 + (pRed - pGreen) / (pMax - pMin); - } - } - - float Hue = pHue / 6; - if( Hue < 0 ) - Hue += 1; - - return Hue; -} - - -float colour::getSaturation(void) const -{ - float pMax = ceguimax(ceguimax(d_red, d_green), d_blue); - float pMin = ceguimin(ceguimin(d_red, d_green), d_blue); - - float pLum = (pMax + pMin) / 2; - float pSat; - - if( pMax == pMin ) - { - pSat = 0; - } - else - { - if( pLum < 0.5 ) - pSat = (pMax - pMin) / (pMax + pMin); - else - pSat = (pMax - pMin) / (2 - pMax - pMin); - } - - return pSat; -} - - -float colour::getLumination(void) const -{ - float pMax = ceguimax(ceguimax(d_red, d_green), d_blue); - float pMin = ceguimin(ceguimin(d_red, d_green), d_blue); - - float pLum = (pMax + pMin) / 2; - return pLum; -} - - -void colour::setARGB(argb_t argb) -{ - d_argb = argb; - - d_blue = static_cast(argb & 0xFF) / 255.0f; - argb >>= 8; - d_green = static_cast(argb & 0xFF) / 255.0f; - argb >>= 8; - d_red = static_cast(argb & 0xFF) / 255.0f; - argb >>= 8; - d_alpha = static_cast(argb & 0xFF) / 255.0f; - - d_argbValid = true; -} - - -void colour::setHSL(float hue, float saturation, float luminance, float alpha) -{ - d_alpha = alpha; - - float temp3[3]; - - float pHue = hue; - float pSat = saturation; - float pLum = luminance; - - if( pSat == 0 ) - { - d_red = pLum; - d_green = pLum; - d_blue = pLum; - } - else - { - float temp2; - if( pLum < 0.5f ) - { - temp2 = pLum * (1 + pSat); - } - else - { - temp2 = pLum + pSat - pLum * pSat; - } - - float temp1 = 2 * pLum - temp2; - - temp3[0] = pHue + (1.0f / 3); - temp3[1] = pHue; - temp3[2] = pHue - (1.0f / 3); - - for( int n = 0; n < 3; n ++ ) - { - if( temp3[n] < 0 ) - temp3[n] ++; - if( temp3[n] > 1 ) - temp3[n] --; - - if( (temp3[n] * 6) < 1 ) - { - temp3[n] = temp1 + (temp2 - temp1) * 6 * temp3[n]; - } - else - { - if( (temp3[n] * 2) < 1 ) - { - temp3[n] = temp2; - } - else - { - if( (temp3[n] * 3) < 2 ) - { - temp3[n] = temp1 + (temp2 - temp1) * ((2.0f / 3) - temp3[n]) * 6; - } - else - { - temp3[n] = temp1; - } - } - } - } - - d_red = temp3[0]; - d_green = temp3[1]; - d_blue = temp3[2]; - } - - d_argbValid = false; -} - - -argb_t colour::calculateARGB(void) const -{ - return ( - static_cast(d_alpha * 255) << 24 | - static_cast(d_red * 255) << 16 | - static_cast(d_green * 255) << 8 | - static_cast(d_blue * 255) - ); -} - - -void colour::invertColour(void) -{ - d_red = 1.0f - d_red; - d_green = 1.0f - d_green; - d_blue = 1.0f - d_blue; -} - - -void colour::invertColourWithAlpha(void) -{ - d_alpha = 1.0f - d_alpha; - d_red = 1.0f - d_red; - d_green = 1.0f - d_green; - d_blue = 1.0f - d_blue; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/StdInc.cpp b/vendor/cegui-0.4.0-custom/src/StdInc.cpp deleted file mode 100644 index 93e0c17adf..0000000000 --- a/vendor/cegui-0.4.0-custom/src/StdInc.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// -// StdInc.cpp -// -// CEGUIBase PCH creation -// - -#include "StdInc.h" diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBase.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBase.cpp deleted file mode 100644 index a894c215e8..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBase.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/************************************************************************ - filename: CEGUIButtonBase.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of ButtonBase widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIButtonBase.h" -#include "CEGUIMouseCursor.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -ButtonBaseProperties::NormalTextColour ButtonBase::d_normalTextColourProperty; -ButtonBaseProperties::HoverTextColour ButtonBase::d_hoverTextColourProperty; -ButtonBaseProperties::PushedTextColour ButtonBase::d_pushedTextColourProperty; -ButtonBaseProperties::DisabledTextColour ButtonBase::d_disabledTextColourProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// default colours for text label rendering -const colour ButtonBase::DefaultNormalLabelColour = 0xFFFFFFFF; -const colour ButtonBase::DefaultHoverLabelColour = 0xFFFFFFFF; -const colour ButtonBase::DefaultPushedLabelColour = 0xFFFFFFFF; -const colour ButtonBase::DefaultDisabledLabelColour = 0xFF7F7F7F; - - -/************************************************************************* - Constructor -*************************************************************************/ -ButtonBase::ButtonBase(const String& type, const String& name) : - Window(type, name), - d_pushed(false), - d_hovering(false), - d_normalColour(DefaultNormalLabelColour), - d_hoverColour(DefaultHoverLabelColour), - d_pushedColour(DefaultPushedLabelColour), - d_disabledColour(DefaultDisabledLabelColour) -{ - addButtonBaseProperties(); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -ButtonBase::~ButtonBase(void) -{ -} - - -/************************************************************************* - Update the internal state of the Widget -*************************************************************************/ -void ButtonBase::updateInternalState(const Point& mouse_pos) -{ - bool oldstate = d_hovering; - - // assume not hovering - d_hovering = false; - - // if input is captured, but not by 'this', then we never hover highlight - const Window* capture_wnd = getCaptureWindow(); - - if ((capture_wnd == NULL) || (capture_wnd == this)) - { - Window* sheet = System::getSingleton().getGUISheet(); - - if (sheet != NULL) - { - // check if hovering highlight is required, which is basically ("mouse over widget" XOR "widget pushed"). - if ((this == sheet->getChildAtPosition(mouse_pos)) != d_pushed) - { - d_hovering = true; - } - - } - - } - - // if state has changed, trigger a re-draw - if (oldstate != d_hovering) - { - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - normal state. -*************************************************************************/ -void ButtonBase::setNormalTextColour(const colour& colour) -{ - if (d_normalColour != colour) - { - d_normalColour = colour; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - hover / highlighted states. -*************************************************************************/ -void ButtonBase::setHoverTextColour(const colour& colour) -{ - if (d_hoverColour != colour) - { - d_hoverColour = colour; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - pushed state. -*************************************************************************/ -void ButtonBase::setPushedTextColour(const colour& colour) -{ - if (d_pushedColour != colour) - { - d_pushedColour = colour; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - disabled state. -*************************************************************************/ -void ButtonBase::setDisabledTextColour(const colour& colour) -{ - if (d_disabledColour != colour) - { - d_disabledColour = colour; - requestRedraw(); - } - -} - - -/************************************************************************* - Perform the rendering for this widget. -*************************************************************************/ -void ButtonBase::drawSelf(float z) -{ - if (isHovering()) - { - drawHover(z); - } - else if (isPushed()) - { - drawPushed(z); - } - else if (isDisabled()) - { - drawDisabled(z); - } - else - { - drawNormal(z); - } - -} - - -/************************************************************************* - Handler for when the mouse moves -*************************************************************************/ -void ButtonBase::onMouseMove(MouseEventArgs& e) -{ - // this is needed to discover whether mouse is in the widget area or not. - // The same thing used to be done each frame in the rendering method, - // but in this version the rendering method may not be called every frame - // so we must discover the internal widget state here - which is actually - // more efficient anyway. - - // base class processing - Window::onMouseMove(e); - - updateInternalState(e.position); - e.handled = true; -} - - -/************************************************************************* - Handler for mouse button pressed events -*************************************************************************/ -void ButtonBase::onMouseButtonDown(MouseEventArgs& e) -{ - // default processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - if (captureInput()) - { - d_pushed = true; - updateInternalState(e.position); - requestRedraw(); - } - - // event was handled by us. - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void ButtonBase::onMouseButtonUp(MouseEventArgs& e) -{ - // default processing - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - releaseInput(); - - // event was handled by us. - e.handled = true; - } - -} - -/************************************************************************* - Handler for when mouse capture is lost -*************************************************************************/ -void ButtonBase::onCaptureLost(WindowEventArgs& e) -{ - // Default processing - Window::onCaptureLost(e); - - d_pushed = false; - updateInternalState(MouseCursor::getSingleton().getPosition()); - requestRedraw(); - - // event was handled by us. - e.handled = true; -} - - -/************************************************************************* - Handler for when mouse leaves the widget -*************************************************************************/ -void ButtonBase::onMouseLeaves(MouseEventArgs& e) -{ - // deafult processing - Window::onMouseLeaves(e); - - d_hovering = false; - requestRedraw(); - - e.handled = true; -} - - -/************************************************************************* - Add properties for this class -*************************************************************************/ -void ButtonBase::addButtonBaseProperties( bool bCommon ) -{ - if ( bCommon == true ) - { - addProperty(&d_normalTextColourProperty); - addProperty(&d_hoverTextColourProperty); - addProperty(&d_pushedTextColourProperty); - addProperty(&d_disabledTextColourProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBaseProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBaseProperties.cpp deleted file mode 100644 index 0ddb42f638..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIButtonBaseProperties.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/************************************************************************ - filename: CEGUIButtonBaseProperties.cpp - created: 9/7/2004 - author: Paul D Turner - - purpose: Implements properties for button base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIButtonBaseProperties.h" -#include "elements/CEGUIButtonBase.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIExceptions.h" -#include -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ButtonBaseProperties namespace section -namespace ButtonBaseProperties -{ - -String NormalTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalTextColour()); -} - - -void NormalTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalTextColour(PropertyHelper::stringToColour(value)); -} - - -String HoverTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getHoverTextColour()); -} - - -void HoverTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHoverTextColour(PropertyHelper::stringToColour(value)); -} - - -String PushedTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getPushedTextColour()); -} - - -void PushedTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setPushedTextColour(PropertyHelper::stringToColour(value)); -} - - -String DisabledTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getDisabledTextColour()); -} - - -void DisabledTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDisabledTextColour(PropertyHelper::stringToColour(value)); -} - - -} // End of ButtonBaseProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUICheckbox.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUICheckbox.cpp deleted file mode 100644 index 96fe29ea18..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUICheckbox.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/************************************************************************ - filename: CEGUICheckbox.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Checkbox base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUICheckbox.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Checkbox::EventNamespace("Checkbox"); - -/************************************************************************* - Definitions for Properties -*************************************************************************/ -CheckboxProperties::Selected Checkbox::d_selectedProperty; - - -/************************************************************************* - Event name constants -*************************************************************************/ -// generated internally by Window -const String Checkbox::EventCheckStateChanged( (utf8*)"CheckStateChanged" ); - - -/************************************************************************* - Constructor -*************************************************************************/ -Checkbox::Checkbox(const String& type, const String& name) : - ButtonBase(type, name), - d_selected(false) -{ - // add events for this widget - addCheckboxEvents(); - - addCheckboxProperties(); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -Checkbox::~Checkbox(void) -{ -} - - -/************************************************************************* - set whether the check-box is selected or not -*************************************************************************/ -void Checkbox::setSelected(bool select) -{ - if (select != d_selected) - { - d_selected = select; - requestRedraw(); - - WindowEventArgs args(this); - onSelectStateChange(args); - } - -} - - -/************************************************************************* - event triggered internally when state of check-box changes -*************************************************************************/ -void Checkbox::onSelectStateChange(WindowEventArgs& e) -{ - fireEvent(EventCheckStateChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for mouse button up events -*************************************************************************/ -void Checkbox::onMouseButtonUp(MouseEventArgs& e) -{ - if ((e.button == LeftButton) && isPushed()) - { - Window* sheet = System::getSingleton().getGUISheet(); - - if (sheet != NULL) - { - // if mouse was released over this widget - if (this == sheet->getChildAtPosition(e.position)) - { - // toggle selected state - setSelected(d_selected ^ true); - } - - } - - e.handled = true; - } - - // default handling - ButtonBase::onMouseButtonUp(e); -} - - -/************************************************************************* - Add check-box specific events -*************************************************************************/ -void Checkbox::addCheckboxEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventCheckStateChanged); -} - -/************************************************************************* - Add properties -*************************************************************************/ -void Checkbox::addCheckboxProperties( bool bCommon ) -{ - if ( bCommon == false ) addProperty(&d_selectedProperty); -} - - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUICheckboxProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUICheckboxProperties.cpp deleted file mode 100644 index 563d29f985..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUICheckboxProperties.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/************************************************************************ - filename: CEGUICheckboxProperties.cpp - created: 9/7/2004 - author: Paul D Turner - - purpose: Implements properties for the Checkbox class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUICheckboxProperties.h" -#include "elements/CEGUICheckbox.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIExceptions.h" -#include -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of CheckboxProperties namespace section -namespace CheckboxProperties -{ - String Selected::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isSelected()); - } - - - void Selected::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setSelected(PropertyHelper::stringToBool(value)); - } - -} // End of CheckboxProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIComboDropList.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIComboDropList.cpp deleted file mode 100644 index 5d42696586..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIComboDropList.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/************************************************************************ - filename: CEGUIComboDropList.cpp - created: 13/6/2004 - author: Paul D Turner - - purpose: Implements the Combobox Drop-List widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIComboDropList.h" -#include "elements/CEGUIScrollbar.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String ComboDropList::EventNamespace("ComboDropList"); - -/************************************************************************* - Constants -*************************************************************************/ -// Event names -const String ComboDropList::EventListSelectionAccepted( (utf8*)"ListSelectionAccepted" ); - - -/************************************************************************* - Constructor for ComboDropList base class -*************************************************************************/ -ComboDropList::ComboDropList(const String& type, const String& name) : - Listbox(type, name) -{ - d_autoArm = false; - d_armed = false; - - addComboDropListEvents(); - hide(); - - // pass captured inputs to children to enable scrollbars - setDistributesCapturedInputs(true); -} - - -/************************************************************************* - Destructor for ComboDropList base class -*************************************************************************/ -ComboDropList::~ComboDropList(void) -{ -} - - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void ComboDropList::initialise(void) -{ - Listbox::initialise(); - - // set-up scroll bars so they return capture to us. - d_vertScrollbar->setRestoreCapture(true); - d_horzScrollbar->setRestoreCapture(true); -} - - -/************************************************************************* - Add drop-list specific events -*************************************************************************/ -void ComboDropList::addComboDropListEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventListSelectionAccepted); -} - - -/************************************************************************* - Handler for when list selection is confirmed. -*************************************************************************/ -void ComboDropList::onListSelectionAccepted(WindowEventArgs& e) -{ - fireEvent(EventListSelectionAccepted, e, EventNamespace); -} - - -/************************************************************************* - Handler for mouse movement events -*************************************************************************/ -void ComboDropList::onMouseMove(MouseEventArgs& e) -{ - Listbox::onMouseMove(e); - - // if mouse is within our area (but not our children) - if (isHit(e.position)) - { - if (getChildAtPosition(e.position) == NULL) - { - // handle auto-arm - if (d_autoArm) - { - d_armed = true; - } - - if (d_armed) - { - // - // Convert mouse position to absolute window pixels - // - Point localPos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localPos = relativeToAbsolute(localPos); - } - - // check for an item under the mouse - ListboxItem* selItem = getItemAtPoint(localPos); - - // if an item is under mouse, select it - if (selItem != NULL) - { - setItemSelectState(selItem, true); - } - else - { - clearAllSelections(); - } - - } - } - - e.handled = true; - } - // not within the list area - else - { - // if left mouse button is down, clear any selection - if (e.sysKeys & LeftMouse) - { - clearAllSelections(); - } - - } - -} - - -/************************************************************************* - Handler for mouse button pressed events -*************************************************************************/ -void ComboDropList::onMouseButtonDown(MouseEventArgs& e) -{ - Listbox::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - if (!isHit(e.position)) - { - clearAllSelections(); - releaseInput(); - } - else - { - d_armed = true; - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void ComboDropList::onMouseButtonUp(MouseEventArgs& e) -{ - Listbox::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - if (d_armed && (getChildAtPosition(e.position) == NULL)) - { - releaseInput(); - - // if something was selected, confirm that selection. - if (getSelectedCount() > 0) - { - WindowEventArgs args(this); - onListSelectionAccepted(args); - } - - } - // if we are not already armed, in response to a left button up event, we auto-arm. - else - { - d_armed = true; - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when input capture is lost -*************************************************************************/ -void ComboDropList::onCaptureLost(WindowEventArgs& e) -{ - Listbox::onCaptureLost(e); - d_armed = false; - hide(); - e.handled = true; -} - - -/************************************************************************* - Handler for when window is activated -*************************************************************************/ -void ComboDropList::onActivated(ActivationEventArgs& e) -{ - Listbox::onActivated(e); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUICombobox.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUICombobox.cpp deleted file mode 100644 index 9b8877056f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUICombobox.cpp +++ /dev/null @@ -1,1127 +0,0 @@ -/************************************************************************ - filename: CEGUICombobox.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Combobox base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUICombobox.h" -#include "elements/CEGUIEditbox.h" -#include "elements/CEGUIPushButton.h" -#include "elements/CEGUIComboDropList.h" -#include "elements/CEGUIListboxItem.h" - - -/************************************************************************* - General information. - - The Combobox class is, for the most part, a huge proxy to the - component Editbox and ComboDropList (Listbox) widgets. The Combobox - widget itself actually does very little. -*************************************************************************/ - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Combobox::EventNamespace("Combobox"); - -/************************************************************************* - Definitions for Properties for this class -*************************************************************************/ -ComboboxProperties::ReadOnly Combobox::d_readOnlyProperty; -ComboboxProperties::ValidationString Combobox::d_validationStringProperty; -ComboboxProperties::CaratIndex Combobox::d_caratIndexProperty; -ComboboxProperties::EditSelectionStart Combobox::d_selStartProperty; -ComboboxProperties::EditSelectionLength Combobox::d_selLengthProperty; -ComboboxProperties::MaxEditTextLength Combobox::d_maxTextLengthProperty; -ComboboxProperties::NormalEditTextColour Combobox::d_normalTextColourProperty; -ComboboxProperties::SelectedEditTextColour Combobox::d_selectedTextColourProperty; -ComboboxProperties::ActiveEditSelectionColour Combobox::d_activeSelectionColourProperty; -ComboboxProperties::InactiveEditSelectionColour Combobox::d_inactiveSelectionColourProperty; -ComboboxProperties::SortList Combobox::d_sortProperty; -ComboboxProperties::ForceVertScrollbar Combobox::d_forceVertProperty; -ComboboxProperties::ForceHorzScrollbar Combobox::d_forceHorzProperty; -ComboboxProperties::SingleClickMode Combobox::d_singleClickOperationProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// event names from edit box -const String Combobox::EventReadOnlyModeChanged( (utf8*)"ReadOnlyChanged" ); -const String Combobox::EventValidationStringChanged( (utf8*)"ValidationStringChanged" ); -const String Combobox::EventMaximumTextLengthChanged( (utf8*)"MaximumTextLengthChanged" ); -const String Combobox::EventTextInvalidated( (utf8*)"TextInvalidatedEvent" ); -const String Combobox::EventInvalidEntryAttempted( (utf8*)"InvalidEntryAttempted" ); -const String Combobox::EventCaratMoved( (utf8*)"CaratMoved" ); -const String Combobox::EventTextSelectionChanged( (utf8*)"TextSelectionChanged" ); -const String Combobox::EventEditboxFull( (utf8*)"EditboxFullEvent" ); -const String Combobox::EventTextAccepted( (utf8*)"TextAcceptedEvent" ); - -// event names from list box -const String Combobox::EventListContentsChanged( (utf8*)"ListContentsChanged" ); -const String Combobox::EventListSelectionChanged( (utf8*)"ListSelectionChanged" ); -const String Combobox::EventSortModeChanged( (utf8*)"SortModeChanged" ); -const String Combobox::EventVertScrollbarModeChanged( (utf8*)"VertScrollbarModeChanged" ); -const String Combobox::EventHorzScrollbarModeChanged( (utf8*)"HorzScrollbarModeChanged" ); - -// events we produce / generate ourselves -const String Combobox::EventDropListDisplayed( (utf8*)"DropListDisplayed" ); -const String Combobox::EventDropListRemoved( (utf8*)"DropListRemoved" ); -const String Combobox::EventListSelectionAccepted( (utf8*)"ListSelectionAccepted" ); - - -/************************************************************************* - Constructor for Combobox base class -*************************************************************************/ -Combobox::Combobox(const String& type, const String& name) : - Window(type, name) -{ - d_singleClickOperation = false; - - addComboboxEvents(); - addComboboxProperties(); -} - - -/************************************************************************* - Destructor for Combobox base class -*************************************************************************/ -Combobox::~Combobox(void) -{ -} - - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void Combobox::initialise(void) -{ - d_editbox = createEditbox(getName() + "__auto_editbox__"); - d_droplist = createDropList(getName() + "__auto_droplist__"); - d_button = createPushButton(getName() + "__auto_button__"); - d_droplist->setFont(getFont()); - d_editbox->setFont(getFont()); - - addChildWindow(d_editbox); - addChildWindow(d_droplist); - addChildWindow(d_button); - - // internal event wiring - d_button->subscribeEvent(PushButton::EventMouseButtonDown, Event::Subscriber(&CEGUI::Combobox::button_PressHandler, this)); - d_droplist->subscribeEvent(ComboDropList::EventListSelectionAccepted, Event::Subscriber(&CEGUI::Combobox::droplist_SelectionAcceptedHandler, this)); - d_droplist->subscribeEvent(Window::EventHidden, Event::Subscriber(&CEGUI::Combobox::droplist_HiddenHandler, this)); - d_editbox->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(&CEGUI::Combobox::editbox_MouseDownHandler, this)); - - // event forwarding setup - d_editbox->subscribeEvent(Editbox::EventReadOnlyModeChanged, Event::Subscriber(&CEGUI::Combobox::editbox_ReadOnlyChangedHandler, this)); - d_editbox->subscribeEvent(Editbox::EventValidationStringChanged, Event::Subscriber(&CEGUI::Combobox::editbox_ValidationStringChangedHandler, this)); - d_editbox->subscribeEvent(Editbox::EventMaximumTextLengthChanged, Event::Subscriber(&CEGUI::Combobox::editbox_MaximumTextLengthChangedHandler, this)); - d_editbox->subscribeEvent(Editbox::EventTextInvalidated, Event::Subscriber(&CEGUI::Combobox::editbox_TextInvalidatedEventHandler, this)); - d_editbox->subscribeEvent(Editbox::EventInvalidEntryAttempted, Event::Subscriber(&CEGUI::Combobox::editbox_InvalidEntryAttemptedHandler, this)); - d_editbox->subscribeEvent(Editbox::EventCaratMoved, Event::Subscriber(&CEGUI::Combobox::editbox_CaratMovedHandler, this)); - d_editbox->subscribeEvent(Editbox::EventTextSelectionChanged, Event::Subscriber(&CEGUI::Combobox::editbox_TextSelectionChangedHandler, this)); - d_editbox->subscribeEvent(Editbox::EventEditboxFull, Event::Subscriber(&CEGUI::Combobox::editbox_EditboxFullEventHandler, this)); - d_editbox->subscribeEvent(Editbox::EventTextAccepted, Event::Subscriber(&CEGUI::Combobox::editbox_TextAcceptedEventHandler, this)); - d_editbox->subscribeEvent(Editbox::EventTextChanged, Event::Subscriber(&CEGUI::Combobox::editbox_TextChangedEventHandler, this)); - d_droplist->subscribeEvent(Listbox::EventListContentsChanged, Event::Subscriber(&CEGUI::Combobox::listbox_ListContentsChangedHandler, this)); - d_droplist->subscribeEvent(Listbox::EventSelectionChanged, Event::Subscriber(&CEGUI::Combobox::listbox_ListSelectionChangedHandler, this)); - d_droplist->subscribeEvent(Listbox::EventSortModeChanged, Event::Subscriber(&CEGUI::Combobox::listbox_SortModeChangedHandler, this)); - d_droplist->subscribeEvent(Listbox::EventVertScrollbarModeChanged, Event::Subscriber(&CEGUI::Combobox::listbox_VertScrollModeChangedHandler, this)); - d_droplist->subscribeEvent(Listbox::EventHorzScrollbarModeChanged, Event::Subscriber(&CEGUI::Combobox::listbox_HorzScrollModeChangedHandler, this)); - - // put components in their initial positions - performChildWindowLayout(); -} - - -/************************************************************************* - Show the drop-down list -*************************************************************************/ -void Combobox::showDropList(void) -{ - // Display the box - d_droplist->show(); - d_droplist->activate(); - d_droplist->captureInput(); - - // Fire off event - WindowEventArgs args(this); - onDropListDisplayed(args); -} - - -/************************************************************************* - Hide the drop-down list -*************************************************************************/ -void Combobox::hideDropList(void) -{ - // the natural order of things when this happens will ensure the list is - // hidden and events are fired. - d_droplist->releaseInput(); -} - - -/************************************************************************* - return true if the Editbox has input focus. -*************************************************************************/ -bool Combobox::hasInputFocus(void) const -{ - return d_editbox->hasInputFocus(); -} - - -/************************************************************************* - return true if the Editbox is read-only. -*************************************************************************/ -bool Combobox::isReadOnly(void) const -{ - return d_editbox->isReadOnly(); -} - - -/************************************************************************* - return true if the Editbox text is valid given the currently set - validation string. -*************************************************************************/ -bool Combobox::isTextValid(void) const -{ - return d_editbox->isTextValid(); -} - - -/************************************************************************* - return the currently set validation string -*************************************************************************/ -const String& Combobox::getValidationString(void) const -{ - return d_editbox->getValidationString(); -} - - -/************************************************************************* - return the current position of the carat. -*************************************************************************/ -size_t Combobox::getCaratIndex(void) const -{ - return d_editbox->getCaratIndex(); -} - - -/************************************************************************* - return the current selection start point. -*************************************************************************/ -size_t Combobox::getSelectionStartIndex(void) const -{ - return d_editbox->getSelectionStartIndex(); -} - - -/************************************************************************* - return the current selection end point. -*************************************************************************/ -size_t Combobox::getSelectionEndIndex(void) const -{ - return d_editbox->getSelectionEndIndex(); -} - - -/************************************************************************* - return the length of the current selection (in code points / characters). -*************************************************************************/ -size_t Combobox::getSelectionLength(void) const -{ - return d_editbox->getSelectionLength(); -} - - -/************************************************************************* - return the maximum text length set for this Editbox. -*************************************************************************/ -size_t Combobox::getMaxTextLength(void) const -{ - return d_editbox->getMaxTextLength(); -} - - -/************************************************************************* - return the currently set colour to be used for rendering Editbox text - in the normal, unselected state. -*************************************************************************/ -colour Combobox::getNormalTextColour(void) const -{ - return d_editbox->getNormalTextColour(); -} - - -/************************************************************************* - return the currently set colour to be used for rendering the Editbox - text when within the selected region. -*************************************************************************/ -colour Combobox::getSelectedTextColour(void) const -{ - return d_editbox->getSelectedTextColour(); -} - - -/************************************************************************* - return the currently set colour to be used for rendering the Editbox - selection highlight when the Editbox is active. -*************************************************************************/ -colour Combobox::getNormalSelectBrushColour(void) const -{ - return d_editbox->getNormalSelectBrushColour(); -} - - -/************************************************************************* - return the currently set colour to be used for rendering the Editbox - selection highlight when the Editbox is inactive. -*************************************************************************/ -colour Combobox::getInactiveSelectBrushColour(void) const -{ - return d_editbox->getInactiveSelectBrushColour(); -} - - -/************************************************************************* - Specify whether the Editbox is read-only. -*************************************************************************/ -void Combobox::setReadOnly(bool setting) -{ - d_editbox->setReadOnly(setting); -} - - -/************************************************************************* - Set the text validation string. -*************************************************************************/ -void Combobox::setValidationString(const String& validation_string) -{ - d_editbox->setValidationString(validation_string); -} - - -/************************************************************************* - Set the current position of the carat. -*************************************************************************/ -void Combobox::setCaratIndex(size_t carat_pos) -{ - d_editbox->setCaratIndex(carat_pos); -} - - -/************************************************************************* - Define the current selection for the Editbox -*************************************************************************/ -void Combobox::setSelection(size_t start_pos, size_t end_pos) -{ - d_editbox->setSelection(start_pos, end_pos); -} - - -/************************************************************************* - set the maximum text length for this Editbox. -*************************************************************************/ -void Combobox::setMaxTextLength(size_t max_len) -{ - d_editbox->setMaxTextLength(max_len); -} - - -/************************************************************************* - Set the colour to be used for rendering Editbox text in the normal, - unselected state. -*************************************************************************/ -void Combobox::setNormalTextColour(colour col) -{ - d_editbox->setNormalTextColour(col); -} - - -/************************************************************************* - Set the colour to be used for rendering the Editbox text when within - the selected region. -*************************************************************************/ -void Combobox::setSelectedTextColour(colour col) -{ - d_editbox->setSelectedTextColour(col); -} - - -/************************************************************************* - Set the colour to be used for rendering the Editbox selection - highlight when the Editbox is active. -*************************************************************************/ -void Combobox::setNormalSelectBrushColour(colour col) -{ - d_editbox->setNormalSelectBrushColour(col); -} - - -/************************************************************************* - Set the colour to be used for rendering the Editbox selection - highlight when the Editbox is inactive. -*************************************************************************/ -void Combobox::setInactiveSelectBrushColour(colour col) -{ - d_editbox->setInactiveSelectBrushColour(col); -} - - -/************************************************************************* - Return number of items attached to the list box -*************************************************************************/ -size_t Combobox::getItemCount(void) const -{ - return d_droplist->getItemCount(); -} - - -/************************************************************************* - Return a pointer to the currently selected item. -*************************************************************************/ -ListboxItem* Combobox::getSelectedItem(void) const -{ - return d_droplist->getFirstSelectedItem(); -} - - -/************************************************************************* - Return the item at index position \a index. -*************************************************************************/ -ListboxItem* Combobox::getListboxItemFromIndex(size_t index) const -{ - return d_droplist->getListboxItemFromIndex(index); -} - - -/************************************************************************* - Return the index of ListboxItem 'item' -*************************************************************************/ -size_t Combobox::getItemIndex(const ListboxItem* item) const -{ - return d_droplist->getItemIndex(item); -} - - -/************************************************************************* - return whether list sorting is enabled -*************************************************************************/ -bool Combobox::isSortEnabled(void) const -{ - return d_droplist->isSortEnabled(); -} - - -/************************************************************************* - return whether the string at index position 'index' is selected -*************************************************************************/ -bool Combobox::isItemSelected(size_t index) const -{ - return d_droplist->isItemSelected(index); -} - - -/************************************************************************* - Search the list for an item with the specified text -*************************************************************************/ -ListboxItem* Combobox::findItemWithText(const String& text, const ListboxItem* start_item) -{ - return d_droplist->findItemWithText(text, start_item); -} - - -/************************************************************************* - Return whether the specified ListboxItem is in the List -*************************************************************************/ -bool Combobox::isListboxItemInList(const ListboxItem* item) const -{ - return d_droplist->isListboxItemInList(item); -} - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -void Combobox::resetList(void) -{ - d_droplist->resetList(); -} - - -/************************************************************************* - Add the given ListboxItem to the list. -*************************************************************************/ -void Combobox::addItem(ListboxItem* item) -{ - d_droplist->addItem(item); -} - - -/************************************************************************* - Insert an item into the list box after a specified item already in - the list. -*************************************************************************/ -void Combobox::insertItem(ListboxItem* item, const ListboxItem* position) -{ - d_droplist->insertItem(item, position); -} - - -/************************************************************************* - Removes the given item from the list box. -*************************************************************************/ -void Combobox::removeItem(const ListboxItem* item) -{ - d_droplist->removeItem(item); -} - - -/************************************************************************* - Clear the selected state for all items. -*************************************************************************/ -void Combobox::clearAllSelections(void) -{ - d_droplist->clearAllSelections(); -} - - -/************************************************************************* - Set whether the list should be sorted. -*************************************************************************/ -void Combobox::setSortingEnabled(bool setting) -{ - d_droplist->setSortingEnabled(setting); -} - - -/************************************************************************* - Set whether the vertical scroll bar should always be shown. -*************************************************************************/ -void Combobox::setShowVertScrollbar(bool setting) -{ - d_droplist->setShowVertScrollbar(setting); -} - - -/************************************************************************* - Set whether the horizontal scroll bar should always be shown. -*************************************************************************/ -void Combobox::setShowHorzScrollbar(bool setting) -{ - d_droplist->setShowHorzScrollbar(setting); -} - - -/************************************************************************* - Set the select state of an attached ListboxItem. -*************************************************************************/ -void Combobox::setItemSelectState(ListboxItem* item, bool state) -{ - d_droplist->setItemSelectState(item, state); -} - - -/************************************************************************* - Set the select state of an attached ListboxItem. -*************************************************************************/ -void Combobox::setItemSelectState(size_t item_index, bool state) -{ - d_droplist->setItemSelectState(item_index, state); -} - - -/************************************************************************* - Causes the list box to update it's internal state after changes have - been made to one or more attached ListboxItem objects. -*************************************************************************/ -void Combobox::handleUpdatedListItemData(void) -{ - d_droplist->handleUpdatedItemData(); -} - - -/************************************************************************* - Add combo box specific events -*************************************************************************/ -void Combobox::addComboboxEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventReadOnlyModeChanged); - addEvent(EventValidationStringChanged); - addEvent(EventMaximumTextLengthChanged); - addEvent(EventTextInvalidated); - addEvent(EventInvalidEntryAttempted); - addEvent(EventCaratMoved); - addEvent(EventTextSelectionChanged); - addEvent(EventEditboxFull); - addEvent(EventListContentsChanged); - addEvent(EventListSelectionChanged); - addEvent(EventSortModeChanged); - addEvent(EventVertScrollbarModeChanged); - addEvent(EventHorzScrollbarModeChanged); - addEvent(EventDropListDisplayed); - addEvent(EventDropListRemoved); - addEvent(EventListSelectionAccepted); - } - else - { - addEvent(EventTextAccepted); - } -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onReadOnlyChanged(WindowEventArgs& e) -{ - fireEvent(EventReadOnlyModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onValidationStringChanged(WindowEventArgs& e) -{ - fireEvent(EventValidationStringChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onMaximumTextLengthChanged(WindowEventArgs& e) -{ - fireEvent(EventMaximumTextLengthChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onTextInvalidatedEvent(WindowEventArgs& e) -{ - fireEvent(EventTextInvalidated, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onInvalidEntryAttempted(WindowEventArgs& e) -{ - fireEvent(EventInvalidEntryAttempted, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onCaratMoved(WindowEventArgs& e) -{ - fireEvent(EventCaratMoved, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onTextSelectionChanged(WindowEventArgs& e) -{ - fireEvent(EventTextSelectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onEditboxFullEvent(WindowEventArgs& e) -{ - fireEvent(EventEditboxFull, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onTextAcceptedEvent(WindowEventArgs& e) -{ - fireEvent(EventTextAccepted, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onListContentsChanged(WindowEventArgs& e) -{ - fireEvent(EventListContentsChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onListSelectionChanged(WindowEventArgs& e) -{ - fireEvent(EventListSelectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onSortModeChanged(WindowEventArgs& e) -{ - fireEvent(EventSortModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onVertScrollbarModeChanged(WindowEventArgs& e) -{ - fireEvent(EventVertScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onHorzScrollbarModeChanged(WindowEventArgs& e) -{ - fireEvent(EventHorzScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onDropListDisplayed(WindowEventArgs& e) -{ - fireEvent(EventDropListDisplayed, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onDroplistRemoved(WindowEventArgs& e) -{ - fireEvent(EventDropListRemoved, e, EventNamespace); -} - - -/************************************************************************* - Handler for when -*************************************************************************/ -void Combobox::onListSelectionAccepted(WindowEventArgs& e) -{ - fireEvent(EventListSelectionAccepted, e, EventNamespace); -} - - -/************************************************************************* - Handler for when widget font is changed -*************************************************************************/ -void Combobox::onFontChanged(WindowEventArgs& e) -{ - // Propagate to children - d_editbox->setFont(getFont()); - d_droplist->setFont(getFont()); - - // Call base class handler - Window::onFontChanged(e); -} - - -/************************************************************************* - Handler for when text changes -*************************************************************************/ -void Combobox::onTextChanged(WindowEventArgs& e) -{ - // update ourselves only if needed (prevents perpetual event loop & stack overflow) - if (d_editbox->getText() != getText()) - { - // done before doing base class processing so event subscribers see 'updated' version of this. - d_editbox->setText(getText()); - e.handled = true; - - Window::onTextChanged(e); - } - -} - - - -/************************************************************************* - Handler function for button clicks. -*************************************************************************/ -bool Combobox::button_PressHandler(const EventArgs& e) -{ - showDropList(); - - // if there is an item with the same text as the edit box, pre-select it - ListboxItem* item = d_droplist->findItemWithText(d_editbox->getText(), NULL); - - if (item != NULL) - { - d_droplist->setItemSelectState(item, true); - d_droplist->ensureItemIsVisible(item); - } - // no matching item, so select nothing - else - { - d_droplist->clearAllSelections(); - } - - return true; -} - - -/************************************************************************* - Handler for selections made in the drop-list -*************************************************************************/ -bool Combobox::droplist_SelectionAcceptedHandler(const EventArgs& e) -{ - // copy the text from the selected item into the edit box - ListboxItem* item = ((ComboDropList*)((WindowEventArgs&)e).window)->getFirstSelectedItem(); - - if (item != NULL) - { - // Put the text from the list item into the edit box - d_editbox->setText(item->getText()); - - // select text if it's editable, and move carat to end - if (!isReadOnly()) - { - d_editbox->setSelection(0, item->getText().length()); - d_editbox->setCaratIndex(item->getText().length()); - } - - d_editbox->setCaratIndex(0); - - // fire off an event of our own - WindowEventArgs args(this); - onListSelectionAccepted(args); - - // finally, activate the edit box - d_editbox->activate(); - } - - return true; -} - - -/************************************************************************* - Handler for when drop-list hides itself -*************************************************************************/ -bool Combobox::droplist_HiddenHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onDroplistRemoved(args); - - return true; -} - - -/************************************************************************* - Handler for mouse button down events in editbox -*************************************************************************/ -bool Combobox::editbox_MouseDownHandler(const EventArgs& e) -{ - // only interested in left button - if (((const MouseEventArgs&)e).button == LeftButton) - { - // if edit box is read-only, show list - if (d_editbox->isReadOnly()) - { - showDropList(); - - // if there is an item with the same text as the edit box, pre-select it - ListboxItem* item = d_droplist->findItemWithText(d_editbox->getText(), NULL); - - if (item != NULL) - { - d_droplist->setItemSelectState(item, true); - d_droplist->ensureItemIsVisible(item); - } - // no matching item, so select nothing - else - { - d_droplist->clearAllSelections(); - } - - return true; - } - } - - return false; -} - - -/************************************************************************* - Return whether the vertical scroll bar is always shown. -*************************************************************************/ -bool Combobox::isVertScrollbarAlwaysShown(void) const -{ - return d_droplist->isVertScrollbarAlwaysShown(); -} - - -/************************************************************************* - Return whether the horizontal scroll bar is always shown. -*************************************************************************/ -bool Combobox::isHorzScrollbarAlwaysShown(void) const -{ - return d_droplist->isHorzScrollbarAlwaysShown(); -} - - -/************************************************************************* - Add properties for this class -*************************************************************************/ -void Combobox::addComboboxProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_sortProperty); - addProperty(&d_forceHorzProperty); - addProperty(&d_forceVertProperty); - addProperty(&d_readOnlyProperty); - addProperty(&d_validationStringProperty); - addProperty(&d_maxTextLengthProperty); - addProperty(&d_selStartProperty); - addProperty(&d_selLengthProperty); - addProperty(&d_selectedTextColourProperty); - addProperty(&d_activeSelectionColourProperty); - addProperty(&d_inactiveSelectionColourProperty); - addProperty(&d_caratIndexProperty); - addProperty(&d_singleClickOperationProperty); - } - else - { - addProperty(&d_normalTextColourProperty); - } -} - - -/************************************************************************* - Activate the edit box component of the Combobox. -*************************************************************************/ -void Combobox::activateEditbox(void) -{ - if (!d_editbox->isActive()) - { - d_editbox->activate(); - } -} - - - -/************************************************************************* - Widget activation handler -*************************************************************************/ -void Combobox::onActivated(ActivationEventArgs& e) -{ - if (!isActive()) - { - Window::onActivated(e); - activateEditbox(); - } - -} - - -/************************************************************************* - Return operation mode for the combo box -*************************************************************************/ -bool Combobox::getSingleClickEnabled(void) const -{ - return d_singleClickOperation; -} - - -/************************************************************************* - Return whether drop-list is visible. -*************************************************************************/ -bool Combobox::isDropDownListVisible(void) const -{ - return d_droplist->isVisible(); -} - - -/************************************************************************* - Set the operation mode for the combo box. -*************************************************************************/ -void Combobox::setSingleClickEnabled(bool setting) -{ - d_singleClickOperation = setting; - d_droplist->setAutoArmEnabled(setting); -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Handlers to relay child widget events so they appear to come from us -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -bool Combobox::editbox_ReadOnlyChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onReadOnlyChanged(args); - - return true; -} - - -bool Combobox::editbox_ValidationStringChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onValidationStringChanged(args); - - return true; -} - - -bool Combobox::editbox_MaximumTextLengthChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onMaximumTextLengthChanged(args); - - return true; -} - - -bool Combobox::editbox_TextInvalidatedEventHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onTextInvalidatedEvent(args); - - return true; -} - - -bool Combobox::editbox_InvalidEntryAttemptedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onInvalidEntryAttempted(args); - - return true; -} - - -bool Combobox::editbox_CaratMovedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onCaratMoved(args); - - return true; -} - - -bool Combobox::editbox_TextSelectionChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onTextSelectionChanged(args); - - return true; -} - - -bool Combobox::editbox_EditboxFullEventHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onEditboxFullEvent(args); - - return true; -} - - -bool Combobox::editbox_TextAcceptedEventHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onTextAcceptedEvent(args); - - return true; -} - - -bool Combobox::editbox_TextChangedEventHandler(const EventArgs& e) -{ - // set this windows text to match - setText(((const WindowEventArgs&)e).window->getText()); - - return true; -} - - -bool Combobox::listbox_ListContentsChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onListContentsChanged(args); - - return true; -} - - -bool Combobox::listbox_ListSelectionChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onListSelectionChanged(args); - - return true; -} - - -bool Combobox::listbox_SortModeChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onSortModeChanged(args); - - return true; -} - - -bool Combobox::listbox_VertScrollModeChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onVertScrollbarModeChanged(args); - - return true; -} - - -bool Combobox::listbox_HorzScrollModeChangedHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onHorzScrollbarModeChanged(args); - - return true; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIComboboxProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIComboboxProperties.cpp deleted file mode 100644 index d10571d14a..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIComboboxProperties.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/************************************************************************ - filename: CEGUIComboboxProperties.cpp - created: 11/7/2004 - author: Paul D Turner - - purpose: Implementation of Combobox properties classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIComboboxProperties.h" -#include "elements/CEGUICombobox.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ComboboxProperties namespace section -namespace ComboboxProperties -{ -String ReadOnly::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isReadOnly()); -} - - -void ReadOnly::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setReadOnly(PropertyHelper::stringToBool(value)); -} - - -String ValidationString::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getValidationString(); -} - - -void ValidationString::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setValidationString(value); -} - - -String CaratIndex::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getCaratIndex())); -} - - -void CaratIndex::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCaratIndex(PropertyHelper::stringToUint(value)); -} - - -String EditSelectionStart::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getSelectionStartIndex())); -} - - -void EditSelectionStart::set(PropertyReceiver* receiver, const String& value) -{ - Combobox* eb = static_cast(receiver); - uint selStart = PropertyHelper::stringToUint(value); - eb->setSelection(selStart, selStart + eb->getSelectionLength()); -} - - -String EditSelectionLength::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getSelectionLength())); -} - - -void EditSelectionLength::set(PropertyReceiver* receiver, const String& value) -{ - Combobox* eb = static_cast(receiver); - uint selLen = PropertyHelper::stringToUint(value); - eb->setSelection(eb->getSelectionStartIndex(), eb->getSelectionStartIndex() + selLen); -} - - -String MaxEditTextLength::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getMaxTextLength())); -} - - -void MaxEditTextLength::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMaxTextLength(PropertyHelper::stringToUint(value)); -} - - -String NormalEditTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalTextColour()); -} - - -void NormalEditTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalTextColour(PropertyHelper::stringToColour(value)); -} - - -String SelectedEditTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getSelectedTextColour()); -} - - -void SelectedEditTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSelectedTextColour(PropertyHelper::stringToColour(value)); -} - - -String ActiveEditSelectionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalSelectBrushColour()); -} - - -void ActiveEditSelectionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalSelectBrushColour(PropertyHelper::stringToColour(value)); -} - - -String InactiveEditSelectionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getInactiveSelectBrushColour()); -} - - -void InactiveEditSelectionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setInactiveSelectBrushColour(PropertyHelper::stringToColour(value)); -} - - -String SortList::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isSortEnabled()); -} - - -void SortList::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSortingEnabled(PropertyHelper::stringToBool(value)); -} - - -String ForceVertScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isVertScrollbarAlwaysShown()); -} - - -void ForceVertScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setShowVertScrollbar(PropertyHelper::stringToBool(value)); -} - - -String ForceHorzScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isHorzScrollbarAlwaysShown()); -} - - -void ForceHorzScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setShowHorzScrollbar(PropertyHelper::stringToBool(value)); -} - - -String SingleClickMode::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->getSingleClickEnabled()); -} - - -void SingleClickMode::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSingleClickEnabled(PropertyHelper::stringToBool(value)); -} - - -} // End of ComboboxProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainer.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainer.cpp deleted file mode 100644 index d0ae9785f9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainer.cpp +++ /dev/null @@ -1,454 +0,0 @@ -/************************************************************************ - filename: CEGUIDragContainer.cpp - created: 14/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIDragContainer.h" -#include "CEGUIImageset.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - ////////////////////////////////////////////////////////////////////////// - // Window type string - const String DragContainer::WidgetTypeName("DragContainer"); - // Event Strings - const String DragContainer::EventNamespace("DragContainer"); - const String DragContainer::EventDragStarted("DragStarted"); - const String DragContainer::EventDragEnded("DragEnded"); - const String DragContainer::EventDragPositionChanged("DragPositionChanged"); - const String DragContainer::EventDragEnabledChanged("DragEnabledChanged"); - const String DragContainer::EventDragAlphaChanged("DragAlphaChanged"); - const String DragContainer::EventDragMouseCursorChanged("DragMouseCursorChanged"); - const String DragContainer::EventDragThresholdChanged("DragThresholdChanged"); - const String DragContainer::EventDragDropTargetChanged("DragDropTargetChanged"); - // Properties - DragContainerProperties::DragAlpha DragContainer::d_dragAlphaProperty; - DragContainerProperties::DragCursorImage DragContainer::d_dragCursorImageProperty; - DragContainerProperties::DraggingEnabled DragContainer::d_dragEnabledProperty; - DragContainerProperties::DragThreshold DragContainer::d_dragThresholdProperty; - - ////////////////////////////////////////////////////////////////////////// - - DragContainer::DragContainer(const String& type, const String& name) : - Window(type, name), - d_draggingEnabled(true), - d_leftMouseDown(false), - d_dragging(false), - d_dragThreshold(8.0f), - d_dragAlpha(0.5f), - d_dropTarget(0), - d_dragCursorImage((const Image*)DefaultMouseCursor) - { - addDragContainerEvents(); - addDragContainerProperties(); - } - - DragContainer::~DragContainer(void) - { - } - - bool DragContainer::isDraggingEnabled(void) const - { - return d_draggingEnabled; - } - - void DragContainer::setDraggingEnabled(bool setting) - { - if (d_draggingEnabled != setting) - { - d_draggingEnabled = setting; - WindowEventArgs args(this); - onDragEnabledChanged(args); - } - } - - bool DragContainer::isBeingDragged(void) const - { - return d_dragging; - } - - float DragContainer::getPixelDragThreshold(void) const - { - return d_dragThreshold; - } - - void DragContainer::setPixelDragThreshold(float pixels) - { - if (d_dragThreshold != pixels) - { - d_dragThreshold = pixels; - WindowEventArgs args(this); - onDragThresholdChanged(args); - } - } - - float DragContainer::getDragAlpha(void) const - { - return d_dragAlpha; - } - - void DragContainer::setDragAlpha(float alpha) - { - if (d_dragAlpha != alpha) - { - d_dragAlpha = alpha; - WindowEventArgs args(this); - onDragAlphaChanged(args); - } - } - - const Image* DragContainer::getDragCursorImage(void) const - { - if (d_dragCursorImage == (const Image*)DefaultMouseCursor) - { - return System::getSingleton().getDefaultMouseCursor(); - } - else - { - return d_dragCursorImage; - } - } - - void DragContainer::setDragCursorImage(const Image* image) - { - if (d_dragCursorImage != image) - { - d_dragCursorImage = image; - WindowEventArgs args(this); - onDragMouseCursorChanged(args); - } - } - - void DragContainer::setDragCursorImage(MouseCursorImage image) - { - setDragCursorImage((const Image*)image); - } - - void DragContainer::setDragCursorImage(const String& imageset, const String& image) - { - setDragCursorImage(&ImagesetManager::getSingleton().getImageset(imageset)->getImage(image)); - } - - Window* DragContainer::getCurrentDropTarget(void) const - { - return d_dropTarget; - } - - void DragContainer::addDragContainerEvents(bool bCommon) - { - if ( bCommon == false ) - { - addEvent(EventDragStarted); - addEvent(EventDragEnded); - addEvent(EventDragPositionChanged); - addEvent(EventDragEnabledChanged); - addEvent(EventDragAlphaChanged); - addEvent(EventDragMouseCursorChanged); - addEvent(EventDragThresholdChanged); - addEvent(EventDragDropTargetChanged); - } - } - - void DragContainer::addDragContainerProperties( bool bCommon ) - { - if ( bCommon == false ) - { - addProperty(&d_dragEnabledProperty); - addProperty(&d_dragAlphaProperty); - addProperty(&d_dragThresholdProperty); - addProperty(&d_dragCursorImageProperty); - } - } - - bool DragContainer::isDraggingThresholdExceeded(const Point& local_mouse) - { - // calculate amount mouse has moved. - float deltaX = fabsf(local_mouse.d_x - d_dragPoint.d_x); - float deltaY = fabsf(local_mouse.d_y - d_dragPoint.d_y); - - // see if mouse has moved far enough to start dragging operation - return (deltaX > d_dragThreshold || deltaY > d_dragThreshold) ? true : false; - } - - void DragContainer::initialiseDragging(void) - { - // only proceed if dragging is actually enabled - if (d_draggingEnabled) - { - // initialise drag moving state - d_storedClipState = d_clippedByParent; - setClippedByParent(false); - d_storedAlpha = d_alpha; - setAlpha(d_dragAlpha); - d_startPosition = getPosition(Absolute); - - d_dragging = true; - - // Now drag mode is set, change cursor as required - updateActiveMouseCursor(); - } - } - - void DragContainer::doDragging(const Point& local_mouse) - { - setPosition(Absolute, getPosition(Absolute) + (local_mouse - d_dragPoint)); - - WindowEventArgs args(this); - onDragPositionChanged(args); - } - - void DragContainer::updateActiveMouseCursor(void) const - { - MouseCursor::getSingleton().setImage(d_dragging ? getDragCursorImage() : getMouseCursor()); - } - - void DragContainer::drawSelf(float z) - { - // No rendering for this window - } - - void DragContainer::onMouseButtonDown(MouseEventArgs& e) - { - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - // ensure all inputs come to us for now - if (captureInput()) - { - // get position of mouse as co-ordinates local to this window. - Point localPos = (getMetricsMode() == Relative) ? - relativeToAbsolute(screenToWindow(e.position)) : - screenToWindow(e.position); - - // store drag point for possible sizing or moving operation. - d_dragPoint = localPos; - d_leftMouseDown = true; - } - - e.handled = true; - } - - } - - void DragContainer::onMouseButtonUp(MouseEventArgs& e) - { - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - if (d_dragging) - { - // fire off event - WindowEventArgs args(this); - onDragEnded(args); - } - - // release our capture on the input data - releaseInput(); - e.handled = true; - } - } - - void DragContainer::onMouseMove(MouseEventArgs& e) - { - Window::onMouseMove(e); - - // get position of mouse as co-ordinates local to this window. - Point localMousePos = (getMetricsMode() == Relative) ? - relativeToAbsolute(screenToWindow(e.position)) : - screenToWindow(e.position); - - // handle dragging - if (d_dragging) - { - doDragging(localMousePos); - } - // not dragging - else - { - // if mouse button is down (but we're not yet being dragged) - if (d_leftMouseDown) - { - if (isDraggingThresholdExceeded(localMousePos)) - { - // Trigger the event - WindowEventArgs args(this); - onDragStarted(args); - } - } - } - } - - void DragContainer::onCaptureLost(WindowEventArgs& e) - { - Window::onCaptureLost(e); - - // reset state - if (d_dragging) - { - // restore windows 'normal' state. - d_dragging = false; - setPosition(Absolute, d_startPosition); - setClippedByParent(d_storedClipState); - setAlpha(d_storedAlpha); - - // restore normal mouse cursor - updateActiveMouseCursor(); - } - - d_leftMouseDown = false; - d_dropTarget = 0; - - e.handled = true; - } - - void DragContainer::onAlphaChanged(WindowEventArgs& e) - { - // store new value and re-set dragging alpha as required. - if (d_dragging) - { - d_storedAlpha = d_alpha; - d_alpha = d_dragAlpha; - } - - Window::onAlphaChanged(e); - } - - void DragContainer::onClippingChanged(WindowEventArgs& e) - { - // store new value and re-set clipping for drag as required. - if (d_dragging) - { - d_storedClipState = d_clippedByParent; - d_clippedByParent = false; - } - - Window::onClippingChanged(e); - } - - void DragContainer::onDragStarted(WindowEventArgs& e) - { - initialiseDragging(); - - fireEvent(EventDragStarted, e, EventNamespace); - } - - void DragContainer::onDragEnded(WindowEventArgs& e) - { - fireEvent(EventDragEnded, e, EventNamespace); - - // did we drop over a window? - if (d_dropTarget) - { - // Notify that item was dropped in the target window - d_dropTarget->notifyDragDropItemDropped(this); - } - } - - void DragContainer::onDragPositionChanged(WindowEventArgs& e) - { - fireEvent(EventDragPositionChanged, e, EventNamespace); - - Window* root; - - if (0 != (root = System::getSingleton().getGUISheet())) - { - // this hack with the 'enabled' state is so that getChildAtPosition - // returns something useful instead of a pointer back to 'this'. - // This hack is only acceptable because I am CrazyEddie! - bool wasEnabled = d_enabled; - d_enabled = false; - // find out which child of root window has the mouse in it - Window* eventWindow = root->getChildAtPosition(MouseCursor::getSingleton().getPosition()); - d_enabled = wasEnabled; - - // use root itself if no child was hit - if (!eventWindow) - { - eventWindow = root; - } - - // if the window with the mouse is different to current drop target - if (eventWindow != d_dropTarget) - { - DragDropEventArgs args(eventWindow); - args.dragDropItem = this; - onDragDropTargetChanged(args); - } - } - } - - void DragContainer::onDragEnabledChanged(WindowEventArgs& e) - { - fireEvent(EventDragEnabledChanged, e, EventNamespace); - - // abort current drag operation if dragging gets disabled part way through - if (!d_draggingEnabled && d_dragging) - { - releaseInput(); - } - } - - void DragContainer::onDragAlphaChanged(WindowEventArgs& e) - { - fireEvent(EventDragAlphaChanged, e, EventNamespace); - - if (d_dragging) - { - d_alpha = d_storedAlpha; - onAlphaChanged(e); - } - } - - void DragContainer::onDragMouseCursorChanged(WindowEventArgs& e) - { - fireEvent(EventDragMouseCursorChanged, e, EventNamespace); - - updateActiveMouseCursor(); - } - - void DragContainer::onDragThresholdChanged(WindowEventArgs& e) - { - fireEvent(EventDragThresholdChanged, e, EventNamespace); - } - - void DragContainer::onDragDropTargetChanged(DragDropEventArgs& e) - { - fireEvent(EventDragDropTargetChanged, e, EventNamespace); - - // Notify old target that drop item has left - if (d_dropTarget) - { - d_dropTarget->notifyDragDropItemLeaves(this); - } - - // update to new target - d_dropTarget = e.window; - - // Notify new target window that someone has dragged a DragContainer over it - d_dropTarget->notifyDragDropItemEnters(this); - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainerProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainerProperties.cpp deleted file mode 100644 index 69e45f2ed6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIDragContainerProperties.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************************************ - filename: CEGUIDragContainerProperties.cpp - created: 15/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIDragContainerProperties.h" -#include "elements/CEGUIDragContainer.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of DragContainerProperties namespace section -namespace DragContainerProperties -{ - String DraggingEnabled::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isDraggingEnabled()); - } - - void DraggingEnabled::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setDraggingEnabled(PropertyHelper::stringToBool(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String DragAlpha::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getDragAlpha()); - } - - void DragAlpha::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setDragAlpha(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String DragThreshold::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getPixelDragThreshold()); - } - - void DragThreshold::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setPixelDragThreshold(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String DragCursorImage::get(const PropertyReceiver* receiver) const - { - const Image* img = static_cast(receiver)->getDragCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(); - } - - void DragCursorImage::set(PropertyReceiver* receiver, const String& value) - { - if (!value.empty()) - { - static_cast(receiver)->setDragCursorImage(PropertyHelper::stringToImage(value)); - } - } - -} // End of DragContainerProperties namespace section - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIEditbox.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIEditbox.cpp deleted file mode 100644 index 6d5b57a7e6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIEditbox.cpp +++ /dev/null @@ -1,1177 +0,0 @@ -/************************************************************************ - filename: CEGUIEditbox.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Editbox base class widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIEditbox.h" -#include "CEGUITextUtils.h" -#include "CEGUIExceptions.h" -#include "CEGUIFont.h" -#include "../pcre/pcre.h" -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Editbox::EventNamespace("Editbox"); - -/*! -\brief - Internal struct to contain compiled regex string -*/ -struct RegexValidator -{ - RegexValidator(void) : d_regex(0) {} - ~RegexValidator(void) { release(); } - - void release() - { - if (d_regex != 0) - { - pcre_free(d_regex); - d_regex = 0; - } - - } - - pcre* d_regex; -}; - -/************************************************************************* - TODO: - - Clipboard support - Undo support -*************************************************************************/ -/************************************************************************* - Definition of Properties -*************************************************************************/ -EditboxProperties::ReadOnly Editbox::d_readOnlyProperty; -EditboxProperties::MaskText Editbox::d_maskTextProperty; -EditboxProperties::MaskCodepoint Editbox::d_maskCodepointProperty; -EditboxProperties::ValidationString Editbox::d_validationStringProperty; -EditboxProperties::CaratIndex Editbox::d_caratIndexProperty; -EditboxProperties::SelectionStart Editbox::d_selectionStartProperty; -EditboxProperties::SelectionLength Editbox::d_selectionLengthProperty; -EditboxProperties::MaxTextLength Editbox::d_maxTextLengthProperty; -EditboxProperties::NormalTextColour Editbox::d_normalTextColourProperty; -EditboxProperties::SelectedTextColour Editbox::d_selectedTextColourProperty; -EditboxProperties::ActiveSelectionColour Editbox::d_activeSelectionColourProperty; -EditboxProperties::InactiveSelectionColour Editbox::d_inactiveSelectionColourProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// default colours -const argb_t Editbox::DefaultNormalTextColour = 0xFFFFFFFF; -const argb_t Editbox::DefaultSelectedTextColour = 0xFF000000; -const argb_t Editbox::DefaultNormalSelectionColour = 0xFF6060FF; -const argb_t Editbox::DefaultInactiveSelectionColour = 0xFF808080; - - -/************************************************************************* - Event name constants -*************************************************************************/ -const String Editbox::EventReadOnlyModeChanged( (utf8*)"ReadOnlyChanged" ); -const String Editbox::EventMaskedRenderingModeChanged( (utf8*)"MaskRenderChanged" ); -const String Editbox::EventMaskCodePointChanged( (utf8*)"MaskCPChanged" ); -const String Editbox::EventValidationStringChanged( (utf8*)"ValidatorChanged" ); -const String Editbox::EventMaximumTextLengthChanged( (utf8*)"MaxTextLenChanged" ); -const String Editbox::EventTextInvalidated( (utf8*)"TextInvalidated" ); -const String Editbox::EventInvalidEntryAttempted( (utf8*)"InvalidInputAttempt" ); -const String Editbox::EventCaratMoved( (utf8*)"TextCaratMoved" ); -const String Editbox::EventTextSelectionChanged( (utf8*)"TextSelectChanged" ); -const String Editbox::EventEditboxFull( (utf8*)"EditboxFull" ); -const String Editbox::EventTextAccepted( (utf8*)"TextAccepted" ); - - -/************************************************************************* - Constructor for Editbox class. -*************************************************************************/ -Editbox::Editbox(const String& type, const String& name) : - Window(type, name), - d_readOnly(false), - d_maskText(false), - d_maskCodePoint('*'), - d_maxTextLen(String::max_size()), - d_caratPos(0), - d_selectionStart(0), - d_selectionEnd(0), - d_dragging(false), - d_normalTextColour(DefaultNormalTextColour), - d_selectTextColour(DefaultSelectedTextColour), - d_selectBrushColour(DefaultNormalSelectionColour), - d_inactiveSelectBrushColour(DefaultInactiveSelectionColour) -{ - d_validator = new RegexValidator; - - addEditboxEvents(); - addEditboxProperties(); - - // default to accepting all characters - setValidationString((utf8*)".*"); -} - - -/************************************************************************* - Destructor for Editbox class. -*************************************************************************/ -Editbox::~Editbox(void) -{ - delete d_validator; -} - - -/************************************************************************* - return true if the Editbox has input focus. -*************************************************************************/ -bool Editbox::hasInputFocus(void) const -{ - return isActive(); -} - - -/************************************************************************* - return true if the Editbox text is valid given the currently set - validation string. -*************************************************************************/ -bool Editbox::isTextValid(void) const -{ - return isStringValid(d_text); -} - - -/************************************************************************* - return the current selection start point. -*************************************************************************/ -size_t Editbox::getSelectionStartIndex(void) const -{ - return (d_selectionStart != d_selectionEnd) ? d_selectionStart : d_caratPos; -} - - -/************************************************************************* - return the current selection end point. -*************************************************************************/ -size_t Editbox::getSelectionEndIndex(void) const -{ - return (d_selectionStart != d_selectionEnd) ? d_selectionEnd : d_caratPos; -} - - -/************************************************************************* - return the length of the current selection - (in code points / characters). -*************************************************************************/ -size_t Editbox::getSelectionLength(void) const -{ - return d_selectionEnd - d_selectionStart; -} - - -/************************************************************************* - Specify whether the Editbox is read-only. -*************************************************************************/ -void Editbox::setReadOnly(bool setting) -{ - // if setting is changed - if (d_readOnly != setting) - { - d_readOnly = setting; - WindowEventArgs args(this); - onReadOnlyChanged(args); - } - -} - - -/************************************************************************* - Specify whether the text for the Editbox will be rendered masked. -*************************************************************************/ -void Editbox::setTextMasked(bool setting) -{ - // if setting is changed - if (d_maskText != setting) - { - d_maskText = setting; - WindowEventArgs args(this); - onMaskedRenderingModeChanged(args); - } - -} - - -/************************************************************************* - Set the text validation string. -*************************************************************************/ -void Editbox::setValidationString(const String& validation_string) -{ - if (d_validationString != validation_string) - { - d_validationString = validation_string; - d_validator->release(); - - // try to compile this new regex string - const char* prce_error; - int pcre_erroff; - d_validator->d_regex = pcre_compile(d_validationString.c_str(), PCRE_UTF8, &prce_error, &pcre_erroff, 0); - - // handle failure - if (d_validator->d_regex == 0) - { - throw InvalidRequestException("The Editbox named '" + getName() + "' had the following bad validation expression set: '" + validation_string + "'. Additional Information: " + prce_error); - } - - // notification - WindowEventArgs args(this); - onValidationStringChanged(args); - - if (!isTextValid()) - { - // also notify if text is now invalid. - onTextInvalidatedEvent(args); - } - - } - -} - - -/************************************************************************* - Set the current position of the carat. -*************************************************************************/ -void Editbox::setCaratIndex(size_t carat_pos) -{ - // make sure new position is valid - if (carat_pos > d_text.length()) - { - carat_pos = d_text.length(); - } - - // if new position is different - if (d_caratPos != carat_pos) - { - d_caratPos = carat_pos; - - // Trigger "carat moved" event - WindowEventArgs args(this); - onCaratMoved(args); - } - -} - - -/************************************************************************* - Define the current selection for the Editbox -*************************************************************************/ -void Editbox::setSelection(size_t start_pos, size_t end_pos) -{ - // ensure selection start point is within the valid range - if (start_pos > d_text.length()) - { - start_pos = d_text.length(); - } - - // ensure selection end point is within the valid range - if (end_pos > d_text.length()) - { - end_pos = d_text.length(); - } - - // ensure start is before end - if (start_pos > end_pos) - { - size_t tmp = end_pos; - end_pos = start_pos; - start_pos = tmp; - } - - // only change state if values are different. - if ((start_pos != d_selectionStart) || (end_pos != d_selectionEnd)) - { - // setup selection - d_selectionStart = start_pos; - d_selectionEnd = end_pos; - - // Trigger "selection changed" event - WindowEventArgs args(this); - onTextSelectionChanged(args); - } - -} - - -/************************************************************************* - set the utf32 code point used when rendering masked text. -*************************************************************************/ -void Editbox::setMaskCodePoint(utf32 code_point) -{ - if (code_point != d_maskCodePoint) - { - d_maskCodePoint = code_point; - - // Trigger "mask code point changed" event - WindowEventArgs args(this); - onMaskCodePointChanged(args); - } - -} - - -/************************************************************************* - set the maximum text length for this Editbox. -*************************************************************************/ -void Editbox::setMaxTextLength(size_t max_len) -{ - if (d_maxTextLen != max_len) - { - d_maxTextLen = max_len; - - // Trigger max length changed event - WindowEventArgs args(this); - onMaximumTextLengthChanged(args); - - // trim string - if (d_text.length() > d_maxTextLen) - { - d_text.resize(d_maxTextLen); - onTextChanged(args); - - // see if new text is valid - if (!isTextValid()) - { - // Trigger Text is invalid event. - onTextInvalidatedEvent(args); - } - - } - - } - -} - - -/************************************************************************* - Clear the current selection setting -*************************************************************************/ -void Editbox::clearSelection(void) -{ - // perform action only if required. - if (getSelectionLength() != 0) - { - setSelection(0, 0); - } - -} - - -/************************************************************************* - Erase the currently selected text. -*************************************************************************/ -void Editbox::eraseSelectedText(bool modify_text) -{ - if (getSelectionLength() != 0) - { - // setup new carat position and remove selection highlight. - setCaratIndex(getSelectionStartIndex()); - clearSelection(); - - // erase the selected characters (if required) - if (modify_text) - { - d_text_raw.erase(getSelectionStartIndex(), getSelectionLength()); - d_text = d_text_raw.bidify(); - - // trigger notification that text has changed. - WindowEventArgs args(this); - onTextChanged(args); - } - - } - -} - - -/************************************************************************* - return true if the given string matches the validation regular - expression. -*************************************************************************/ -bool Editbox::isStringValid(const String& str) const -{ - // if the regex is not valid, then an exception is thrown - if (d_validator->d_regex == 0) - { - throw InvalidRequestException("Editbox::isStringValid - An attempt was made to use the invalid RegEx '" + d_validationString + "'."); - } - - const char* utf8str = str.c_str(); - int match[3]; - int len = static_cast(strlen(utf8str)); - int result = pcre_exec(d_validator->d_regex, NULL, utf8str, len, 0, 0, match, 3); - - if (result >= 0) - { - // this ensures that any regex match is for the entire string - return (match[1] - match[0] == len); - } - // invalid string if there's no match or if string or regex is NULL. - else if ((result == PCRE_ERROR_NOMATCH) || (result == PCRE_ERROR_NULL)) - { - return false; - } - // anything else is an error. - else - { - throw InvalidRequestException("Editbox::isStringValid - An internal error occurred while attempting to match the invalid RegEx '" + d_validationString + "'."); - } - -} - - -/************************************************************************* - Handler for mouse button pushed events -*************************************************************************/ -void Editbox::onMouseButtonDown(MouseEventArgs& e) -{ - // base class handling - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - // grab inputs - if (captureInput()) - { - // handle mouse down - clearSelection(); - d_dragging = true; - d_dragAnchorIdx = getTextIndexFromPosition(e.position); - setCaratIndex(d_dragAnchorIdx); - } - - e.handled = true; - } - -} - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void Editbox::onMouseButtonUp(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - releaseInput(); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse double-clicks -*************************************************************************/ -void Editbox::onMouseDoubleClicked(MouseEventArgs& e) -{ - // base class processing - Window::onMouseDoubleClicked(e); - - if (e.button == LeftButton) - { - // if masked, set up to select all - if (isTextMasked()) - { - d_dragAnchorIdx = 0; - setCaratIndex(d_text.length()); - } - // not masked, so select the word that was double-clicked. - else - { - d_dragAnchorIdx = TextUtils::getWordStartIdx(d_text, (d_caratPos == d_text.length()) ? d_caratPos : d_caratPos + 1); - d_caratPos = TextUtils::getNextWordStartIdx(d_text, d_caratPos); - } - - // perform actual selection operation. - setSelection(d_dragAnchorIdx, d_caratPos); - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse triple-clicks -*************************************************************************/ -void Editbox::onMouseTripleClicked(MouseEventArgs& e) -{ - // base class processing - Window::onMouseTripleClicked(e); - - if (e.button == LeftButton) - { - d_dragAnchorIdx = 0; - setCaratIndex(d_text.length()); - setSelection(d_dragAnchorIdx, d_caratPos); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse movements -*************************************************************************/ -void Editbox::onMouseMove(MouseEventArgs& e) -{ - // base class processing - Window::onMouseMove(e); - - if (d_dragging) - { - setCaratIndex(getTextIndexFromPosition(e.position)); - setSelection(d_caratPos, d_dragAnchorIdx); - } - - e.handled = true; -} - -/************************************************************************* - Handler for when input capture is lost -*************************************************************************/ -void Editbox::onCaptureLost(WindowEventArgs& e) -{ - d_dragging = false; - - // base class processing - Window::onCaptureLost(e); - - e.handled = true; -} - -/************************************************************************* - Handler for type characters -*************************************************************************/ -void Editbox::onCharacter(KeyEventArgs& e) -{ - // base class processing - Window::onCharacter(e); - - // only need to take notice if we have focus - bool bHasCodePoint = ( e.codepoint > 128 ) || getFont()->isCodepointAvailable(e.codepoint); - if (hasInputFocus() && bHasCodePoint && !isReadOnly()) - { - // backup current text - String tmp(d_text_raw); - tmp.erase(getSelectionStartIndex(), getSelectionLength()); - - // if there is room - if (tmp.length() < d_maxTextLen) - { - tmp.insert(getSelectionStartIndex(), 1, e.codepoint); - - if (isStringValid(tmp)) - { - // erase selection using mode that does not modify d_text (we just want to update state) - eraseSelectedText(false); - - // advance carat (done first so we can "do stuff" in event handlers!) - d_caratPos++; - - // set text to the newly modified string - setText(tmp); - } - else - { - // Trigger invalid modification attempted event. - WindowEventArgs args(this); - onInvalidEntryAttempted(args); - } - - } - else - { - // Trigger text box full event - WindowEventArgs args(this); - onEditboxFullEvent(args); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for key-down events -*************************************************************************/ -void Editbox::onKeyDown(KeyEventArgs& e) -{ - // base class processing - Window::onKeyDown(e); - - if (hasInputFocus() && !isReadOnly()) - { - WindowEventArgs args(this); - switch (e.scancode) - { - case Key::LeftShift: - case Key::RightShift: - if (getSelectionLength() == 0) - { - d_dragAnchorIdx = getCaratIndex(); - } - break; - - case Key::Backspace: - handleBackspace(); - break; - - case Key::Delete: - handleDelete(); - break; - - case Key::Tab: - case Key::Return: - case Key::NumpadEnter: - // Fire 'input accepted' event - onTextAcceptedEvent(args); - break; - - case Key::ArrowLeft: - if (e.sysKeys & Control) - { - handleWordLeft(e.sysKeys); - } - else - { - handleCharLeft(e.sysKeys); - } - break; - - case Key::ArrowRight: - if (e.sysKeys & Control) - { - handleWordRight(e.sysKeys); - } - else - { - handleCharRight(e.sysKeys); - } - break; - - case Key::Home: - handleHome(e.sysKeys); - break; - - case Key::End: - handleEnd(e.sysKeys); - break; - - // default case is now to leave event as (possibly) unhandled. - default: - return; - } - - e.handled = true; - } - -} - - -/************************************************************************* - Processing for backspace key -*************************************************************************/ -void Editbox::handleBackspace(void) -{ - if (!isReadOnly()) - { - String tmp(d_text_raw); - - if (getSelectionLength() != 0) - { - tmp.erase(getSelectionStartIndex(), getSelectionLength()); - - if (isStringValid(tmp)) - { - // erase selection using mode that does not modify d_text (we just want to update state) - eraseSelectedText(false); - - // set text to the newly modified string - setText(tmp); - } - else - { - // Trigger invalid modification attempted event. - WindowEventArgs args(this); - onInvalidEntryAttempted(args); - } - - } - else if (getCaratIndex() > 0) - { - tmp.erase(d_caratPos - 1, 1); - - if (isStringValid(tmp)) - { - setCaratIndex(d_caratPos - 1); - - // set text to the newly modified string - setText(tmp); - } - else - { - // Trigger invalid modification attempted event. - WindowEventArgs args(this); - onInvalidEntryAttempted(args); - } - - } - - } - -} - - -/************************************************************************* - Processing for Delete key -*************************************************************************/ -void Editbox::handleDelete(void) -{ - if (!isReadOnly()) - { - String tmp(d_text_raw); - - if (getSelectionLength() != 0) - { - tmp.erase(getSelectionStartIndex(), getSelectionLength()); - - if (isStringValid(tmp)) - { - // erase selection using mode that does not modify d_text (we just want to update state) - eraseSelectedText(false); - - // set text to the newly modified string - setText(tmp); - } - else - { - // Trigger invalid modification attempted event. - WindowEventArgs args(this); - onInvalidEntryAttempted(args); - } - - } - else if (getCaratIndex() < tmp.length()) - { - tmp.erase(d_caratPos, 1); - - if (isStringValid(tmp)) - { - // set text to the newly modified string - setText(tmp); - } - else - { - // Trigger invalid modification attempted event. - WindowEventArgs args(this); - onInvalidEntryAttempted(args); - } - - } - - } - -} - - -/************************************************************************* - Move the carat one character to the left. -*************************************************************************/ -void Editbox::handleCharLeft(uint sysKeys) -{ - if (d_caratPos > 0) - { - setCaratIndex(d_caratPos - 1); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Move the carat one word to the left -*************************************************************************/ -void Editbox::handleWordLeft(uint sysKeys) -{ - if (d_caratPos > 0) - { - setCaratIndex(TextUtils::getWordStartIdx(d_text, getCaratIndex())); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Move the carat one character to the right. -*************************************************************************/ -void Editbox::handleCharRight(uint sysKeys) -{ - if (d_caratPos < d_text.length()) - { - setCaratIndex(d_caratPos + 1); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Move the carat one word to the right -*************************************************************************/ -void Editbox::handleWordRight(uint sysKeys) -{ - if (d_caratPos < d_text.length()) - { - setCaratIndex(TextUtils::getNextWordStartIdx(d_text, getCaratIndex())); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Move the carat to the start of the text -*************************************************************************/ -void Editbox::handleHome(uint sysKeys) -{ - if (d_caratPos > 0) - { - setCaratIndex(0); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Move the carat to the end of the text. -*************************************************************************/ -void Editbox::handleEnd(uint sysKeys) -{ - if (d_caratPos < d_text.length()) - { - setCaratIndex(d_text.length()); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Add edit box specific events -*************************************************************************/ -void Editbox::addEditboxEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventMaskedRenderingModeChanged); - addEvent(EventMaskCodePointChanged); - addEvent(EventValidationStringChanged); - addEvent(EventMaximumTextLengthChanged); - addEvent(EventTextInvalidated); - addEvent(EventInvalidEntryAttempted); - addEvent(EventCaratMoved); - addEvent(EventTextSelectionChanged); - addEvent(EventEditboxFull); - } - else - { - addEvent(EventReadOnlyModeChanged); - addEvent(EventTextAccepted); - } -} - - -/************************************************************************* - Event fired internally when the read only state of the Editbox has - been changed -*************************************************************************/ -void Editbox::onReadOnlyChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventReadOnlyModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the masked rendering mode (password mode) - has been changed -*************************************************************************/ -void Editbox::onMaskedRenderingModeChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventMaskedRenderingModeChanged , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the code point to use for masked - rendering has been changed. -*************************************************************************/ -void Editbox::onMaskCodePointChanged(WindowEventArgs& e) -{ - // if we are in masked mode, trigger a GUI redraw. - if (isTextMasked()) - { - requestRedraw(); - } - - fireEvent(EventMaskCodePointChanged , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the validation string is changed. -*************************************************************************/ -void Editbox::onValidationStringChanged(WindowEventArgs& e) -{ - fireEvent(EventValidationStringChanged , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the maximum text length for the edit box - is changed. -*************************************************************************/ -void Editbox::onMaximumTextLengthChanged(WindowEventArgs& e) -{ - fireEvent(EventMaximumTextLengthChanged , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when something has caused the current text to - now fail validation -*************************************************************************/ -void Editbox::onTextInvalidatedEvent(WindowEventArgs& e) -{ - fireEvent(EventTextInvalidated, e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the user attempted to make a change to - the edit box that would have caused it to fail validation. -*************************************************************************/ -void Editbox::onInvalidEntryAttempted(WindowEventArgs& e) -{ - fireEvent(EventInvalidEntryAttempted , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the carat (insert point) position changes. -*************************************************************************/ -void Editbox::onCaratMoved(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventCaratMoved , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the current text selection changes. -*************************************************************************/ -void Editbox::onTextSelectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventTextSelectionChanged , e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the edit box text has reached the set - maximum length. -*************************************************************************/ -void Editbox::onEditboxFullEvent(WindowEventArgs& e) -{ - fireEvent(EventEditboxFull, e, EventNamespace); -} - - -/************************************************************************* - Event fired internally when the user accepts the edit box text by - pressing Return, Enter, or Tab. -*************************************************************************/ -void Editbox::onTextAcceptedEvent(WindowEventArgs& e) -{ - fireEvent(EventTextAccepted, e, EventNamespace); -} - - -/************************************************************************* - Set the colour to be used for rendering Editbox text in the normal, - unselected state. -*************************************************************************/ -void Editbox::setNormalTextColour(const colour& col) -{ - d_normalTextColour = col; - requestRedraw(); -} - - -/************************************************************************* - Set the colour to be used for rendering the Editbox text when within - the selected region. -*************************************************************************/ -void Editbox::setSelectedTextColour(const colour& col) -{ - d_selectTextColour = col; - requestRedraw(); -} - - -/************************************************************************* - Set the colour to be used for rendering the Editbox selection highlight - when the Editbox is active. -*************************************************************************/ -void Editbox::setNormalSelectBrushColour(const colour& col) -{ - d_selectBrushColour = col; - requestRedraw(); -} - - -/************************************************************************* - Set the colour to be used for rendering the Editbox selection highlight - when the Editbox is inactive. -*************************************************************************/ -void Editbox::setInactiveSelectBrushColour(const colour& col) -{ - d_inactiveSelectBrushColour = col; - requestRedraw(); -} - - -/************************************************************************* - Handler for when text is changed programmatically -*************************************************************************/ -void Editbox::onTextChanged(WindowEventArgs& e) -{ - // base class processing - Window::onTextChanged(e); - - // clear selection - clearSelection(); - - // make sure carat is within the text - if (getCaratIndex() > d_text.length()) - { - setCaratIndex(d_text.length()); - } - - e.handled = true; -} - -/************************************************************************* - Add properties -*************************************************************************/ -void Editbox::addEditboxProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_readOnlyProperty); - addProperty(&d_maskTextProperty); - addProperty(&d_maskCodepointProperty); - addProperty(&d_validationStringProperty); - addProperty(&d_caratIndexProperty); - addProperty(&d_selectionStartProperty); - addProperty(&d_selectionLengthProperty); - addProperty(&d_maxTextLengthProperty); - } - else - { - addProperty(&d_normalTextColourProperty); - addProperty(&d_selectedTextColourProperty); - addProperty(&d_activeSelectionColourProperty); - addProperty(&d_inactiveSelectionColourProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIEditboxProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIEditboxProperties.cpp deleted file mode 100644 index 9fa46b62e5..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIEditboxProperties.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/************************************************************************ - filename: CEGUIEditboxProperties.cpp - created: 9/7/2004 - author: Paul D Turner - - purpose: Implements properties for the Editbox class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIEditboxProperties.h" -#include "elements/CEGUIEditbox.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIExceptions.h" -#include -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of EditboxProperties namespace section -namespace EditboxProperties -{ - -String ReadOnly::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isReadOnly()); -} - - -void ReadOnly::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setReadOnly(PropertyHelper::stringToBool(value)); -} - - -String MaskText::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isTextMasked()); -} - - -void MaskText::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTextMasked(PropertyHelper::stringToBool(value)); -} - - -String MaskCodepoint::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getMaskCodePoint()); -} - - -void MaskCodepoint::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMaskCodePoint(PropertyHelper::stringToUint(value)); -} - - -String ValidationString::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getValidationString(); -} - - -void ValidationString::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setValidationString(value); -} - - -String CaratIndex::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getCaratIndex())); -} - - -void CaratIndex::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCaratIndex(PropertyHelper::stringToUint(value)); -} - - -String SelectionStart::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getSelectionStartIndex())); -} - - -void SelectionStart::set(PropertyReceiver* receiver, const String& value) -{ - Editbox* eb = static_cast(receiver); - uint selStart = PropertyHelper::stringToUint(value); - eb->setSelection(selStart, selStart + eb->getSelectionLength()); -} - - -String SelectionLength::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getSelectionLength())); -} - - -void SelectionLength::set(PropertyReceiver* receiver, const String& value) -{ - Editbox* eb = static_cast(receiver); - uint selLen = PropertyHelper::stringToUint(value); - eb->setSelection(eb->getSelectionStartIndex(), eb->getSelectionStartIndex() + selLen); -} - - -String MaxTextLength::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getMaxTextLength())); -} - - -void MaxTextLength::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMaxTextLength(PropertyHelper::stringToUint(value)); -} - - -String NormalTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalTextColour()); -} - - -void NormalTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalTextColour(PropertyHelper::stringToColour(value)); -} - - -String SelectedTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getSelectedTextColour()); -} - - -void SelectedTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSelectedTextColour(PropertyHelper::stringToColour(value)); -} - - -String ActiveSelectionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalSelectBrushColour()); -} - - -void ActiveSelectionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalSelectBrushColour(PropertyHelper::stringToColour(value)); -} - - -String InactiveSelectionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getInactiveSelectBrushColour()); -} - - -void InactiveSelectionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setInactiveSelectBrushColour(PropertyHelper::stringToColour(value)); -} - -} // End of EditboxProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindow.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindow.cpp deleted file mode 100644 index 4e5d08b048..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindow.cpp +++ /dev/null @@ -1,964 +0,0 @@ -/************************************************************************ - filename: CEGUIFrameWindow.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of FrameWindow base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIFrameWindow.h" -#include "elements/CEGUITitlebar.h" -#include "elements/CEGUIPushButton.h" -#include "CEGUIMouseCursor.h" -#include "CEGUIWindowManager.h" -#include "CEGUIExceptions.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String FrameWindow::EventNamespace("FrameWindow"); - -/************************************************************************* - Definitions for Properties -*************************************************************************/ -FrameWindowProperties::SizingEnabled FrameWindow::d_sizingEnabledProperty; -FrameWindowProperties::FrameEnabled FrameWindow::d_frameEnabledProperty; -FrameWindowProperties::TitlebarEnabled FrameWindow::d_titlebarEnabledProperty; -FrameWindowProperties::CloseButtonEnabled FrameWindow::d_closeButtonEnabledProperty; -FrameWindowProperties::RollUpState FrameWindow::d_rollUpStateProperty; -FrameWindowProperties::RollUpEnabled FrameWindow::d_rollUpEnabledProperty; -FrameWindowProperties::DragMovingEnabled FrameWindow::d_dragMovingEnabledProperty; -FrameWindowProperties::SizingBorderThickness FrameWindow::d_sizingBorderThicknessProperty; -FrameWindowProperties::TitlebarFont FrameWindow::d_titlebarFontProperty; -FrameWindowProperties::CaptionColour FrameWindow::d_captionColourProperty; -FrameWindowProperties::NSSizingCursorImage FrameWindow::d_nsSizingCursorProperty; -FrameWindowProperties::EWSizingCursorImage FrameWindow::d_ewSizingCursorProperty; -FrameWindowProperties::NWSESizingCursorImage FrameWindow::d_nwseSizingCursorProperty; -FrameWindowProperties::NESWSizingCursorImage FrameWindow::d_neswSizingCursorProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// additional event names for this window -const String FrameWindow::EventRollupToggled( (utf8*)"RollupToggled" ); -const String FrameWindow::EventCloseClicked( (utf8*)"CloseClicked" ); - -// other bits -const float FrameWindow::DefaultSizingBorderSize = 8.0f; - - -/************************************************************************* - Constructor -*************************************************************************/ -FrameWindow::FrameWindow(const String& type, const String& name) : - Window(type, name) -{ - d_frameEnabled = true; - d_rollupEnabled = true; - d_rolledup = false; - d_sizingEnabled = true; - d_beingSized = false; - d_dragMovable = true; - - d_borderSize = DefaultSizingBorderSize; - - d_nsSizingCursor = d_ewSizingCursor = d_neswSizingCursor = d_nwseSizingCursor = NULL; - - addFrameWindowEvents(); - addFrameWindowProperties(); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -FrameWindow::~FrameWindow(void) -{ -} - - -/************************************************************************* - Initialises the Window based object ready for use. -*************************************************************************/ -void FrameWindow::initialise(void) -{ - // create child windows - d_titlebar = createTitlebar(getName() + "__auto_titlebar__"); - d_closeButton = createCloseButton(getName() + "__auto_closebutton__"); - - // add child controls - if (d_titlebar != NULL) - { - d_titlebar->setDraggingEnabled(d_dragMovable); - addChildWindow(d_titlebar); - } - - if (d_closeButton != NULL) - { - addChildWindow(d_closeButton); - - // bind handler to close button 'Click' event - d_closeButton->subscribeEvent(PushButton::EventClicked, Event::Subscriber(&CEGUI::FrameWindow::closeClickHandler, this)); - } - - performChildWindowLayout(); -} - - -/************************************************************************* - Enables or disables sizing for this window. -*************************************************************************/ -void FrameWindow::setSizingEnabled(bool setting) -{ - d_sizingEnabled = setting; -} - - -/************************************************************************* - Enables or disables the frame for this window. -*************************************************************************/ -void FrameWindow::setFrameEnabled(bool setting) -{ - d_frameEnabled = setting; - requestRedraw(); -} - - -/************************************************************************* - Enables or disables the title bar for the frame window. -*************************************************************************/ -void FrameWindow::setTitleBarEnabled(bool setting) -{ - try - { - Window* titlebar = WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__"); - titlebar->setEnabled(setting); - titlebar->setVisible(setting); - } - catch (UnknownObjectException) - {} -} - - -/************************************************************************* - Enables or disables the close button for the frame window. -*************************************************************************/ -void FrameWindow::setCloseButtonEnabled(bool setting) -{ - try - { - Window* closebtn = WindowManager::getSingleton().getWindow(getName() + "__auto_closebutton__"); - closebtn->setEnabled(setting); - closebtn->setVisible(setting); - } - catch (UnknownObjectException) - {} -} - - -/************************************************************************* - Enables or disables roll-up (shading) for this window. -*************************************************************************/ -void FrameWindow::setRollupEnabled(bool setting) -{ - if ((setting == false) && isRolledup()) - { - toggleRollup(); - } - - d_rollupEnabled = setting; -} - - -/************************************************************************* - Toggles the state of the window between rolled-up (shaded) and normal - sizes. This requires roll-up to be enabled. -*************************************************************************/ -void FrameWindow::toggleRollup(void) -{ - if (isRollupEnabled()) - { - d_rolledup ^= true; - - // event notification. - WindowEventArgs args(this); - onRollupToggled(args); - } - -} - - -/************************************************************************* - Set the font to use for the title bar text -*************************************************************************/ -void FrameWindow::setTitlebarFont(const String& name) -{ - try - { - WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__")->setFont(name); - } - catch (UnknownObjectException) - {} -} - - -/************************************************************************* - Set the font to use for the title bar text -*************************************************************************/ -void FrameWindow::setTitlebarFont(Font* font) -{ - try - { - WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__")->setFont(font); - } - catch (UnknownObjectException) - {} -} - - -/************************************************************************* - Move the window by the pixel offsets specified in 'offset'. -*************************************************************************/ -void FrameWindow::offsetPixelPosition(const Vector2& offset) -{ - UVector2 uOffset; - - if (getMetricsMode() == Relative) - { - Size sz = getParentSize(); - - uOffset.d_x = cegui_reldim((sz.d_width != 0) ? offset.d_x / sz.d_width : 0); - uOffset.d_y = cegui_reldim((sz.d_height != 0) ? offset.d_y / sz.d_height : 0); - } - else - { - uOffset.d_x = cegui_absdim(PixelAligned(offset.d_x)); - uOffset.d_y = cegui_absdim(PixelAligned(offset.d_y)); - } - - setWindowPosition(d_area.getPosition() + uOffset); -} - - -/************************************************************************* - check local pixel co-ordinate point 'pt' and return one of the - SizingLocation enumerated values depending where the point falls on - the sizing border. -*************************************************************************/ -FrameWindow::SizingLocation FrameWindow::getSizingBorderAtPoint(const Point& pt) const -{ - Rect frame(getSizingRect()); - - // we can only size if the frame is enabled and sizing is on - if (isSizingEnabled() && isFrameEnabled()) - { - // point must be inside the outer edge - if (frame.isPointInRect(pt)) - { - // adjust rect to get inner edge - frame.d_left += d_borderSize; - frame.d_top += d_borderSize; - frame.d_right -= d_borderSize; - frame.d_bottom -= d_borderSize; - - // detect which edges we are on - bool top = (pt.d_y < frame.d_top); - bool bottom = (pt.d_y >= frame.d_bottom); - bool left = (pt.d_x < frame.d_left); - bool right = (pt.d_x >= frame.d_right); - - // return appropriate 'SizingLocation' value - if (top && left) - { - return SizingTopLeft; - } - else if (top && right) - { - return SizingTopRight; - } - else if (bottom && left) - { - return SizingBottomLeft; - } - else if (bottom && right) - { - return SizingBottomRight; - } - else if (top) - { - return SizingTop; - } - else if (bottom) - { - return SizingBottom; - } - else if (left) - { - return SizingLeft; - } - else if (right) - { - return SizingRight; - } - - } - - } - - // deafult: None. - return SizingNone; -} - - -/************************************************************************* - move the window's left edge by 'delta'. The rest of the window - does not move, thus this changes the size of the Window. -*************************************************************************/ -void FrameWindow::moveLeftEdge(float delta) -{ - float orgWidth = getAbsoluteWidth(); - float adjustment; - float* minDim; - float* maxDim; - URect area(d_area); - - // ensure that we only size to the set constraints. - // - // NB: We are required to do this here due to our virtually unique sizing nature; the - // normal system for limiting the window size is unable to supply the information we - // require for updating our internal state used to manage the dragging, etc. - float maxWidth(d_maxSize.d_x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); - float minWidth(d_minSize.d_x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); - float newWidth = orgWidth - delta; - - if (newWidth > maxWidth) - delta = orgWidth - maxWidth; - else if (newWidth < minWidth) - delta = orgWidth - minWidth; - - // we use the active metrics mode to decide which component of the window edge to modify - if (getMetricsMode() == Relative) - { - float base = getParentWidth(); - adjustment = (base != 0) ? delta / base : 0; - minDim = &area.d_min.d_x.d_scale; - maxDim = &area.d_max.d_x.d_scale; - } - else - { - adjustment = PixelAligned(delta); - minDim = &area.d_min.d_x.d_offset; - maxDim = &area.d_max.d_x.d_offset; - } - - if (d_horzAlign == HA_RIGHT) - { - *maxDim -= adjustment; - } - else if (d_horzAlign == HA_CENTRE) - { - *maxDim -= adjustment * 0.5f; - *minDim += adjustment * 0.5f; - } - else - { - *minDim += adjustment; - } - - setWindowArea_impl(area.d_min, area.getSize(), d_horzAlign == HA_LEFT); -} -/************************************************************************* - move the window's right edge by 'delta'. The rest of the window - does not move, thus this changes the size of the Window. -*************************************************************************/ -void FrameWindow::moveRightEdge(float delta) -{ - // store this so we can work out how much size actually changed - float orgWidth = getAbsoluteWidth(); - float adjustment; - float* minDim; - float* maxDim; - URect area(d_area); - - // ensure that we only size to the set constraints. - // - // NB: We are required to do this here due to our virtually unique sizing nature; the - // normal system for limiting the window size is unable to supply the information we - // require for updating our internal state used to manage the dragging, etc. - float maxWidth(d_maxSize.d_x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); - float minWidth(d_minSize.d_x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); - float newWidth = orgWidth + delta; - - if (newWidth > maxWidth) - delta = maxWidth - orgWidth; - else if (newWidth < minWidth) - delta = minWidth - orgWidth; - - // we use the active metrics mode to decide which component of the window edge to modify - if (getMetricsMode() == Relative) - { - float base = getParentWidth(); - adjustment = (base != 0) ? delta / base : 0; - minDim = &area.d_min.d_x.d_scale; - maxDim = &area.d_max.d_x.d_scale; - } - else - { - adjustment = PixelAligned(delta); - minDim = &area.d_min.d_x.d_offset; - maxDim = &area.d_max.d_x.d_offset; - } - - *maxDim += adjustment; - - if (d_horzAlign == HA_RIGHT) - { - *maxDim += adjustment; - *minDim += adjustment; - } - else if (d_horzAlign == HA_CENTRE) - { - *maxDim += adjustment * 0.5f; - *minDim += adjustment * 0.5f; - } - - setWindowArea_impl(area.d_min, area.getSize(), d_horzAlign == HA_RIGHT); - - // move the dragging point so mouse remains 'attached' to edge of window - d_dragPoint.d_x += getAbsoluteWidth() - orgWidth; -} - -/************************************************************************* - move the window's top edge by 'delta'. The rest of the window - does not move, thus this changes the size of the Window. -*************************************************************************/ -void FrameWindow::moveTopEdge(float delta) -{ - float orgHeight = getAbsoluteHeight(); - float adjustment; - float* minDim; - float* maxDim; - URect area(d_area); - - // ensure that we only size to the set constraints. - // - // NB: We are required to do this here due to our virtually unique sizing nature; the - // normal system for limiting the window size is unable to supply the information we - // require for updating our internal state used to manage the dragging, etc. - float maxHeight(d_maxSize.d_y.asAbsolute(System::getSingleton().getRenderer()->getHeight())); - float minHeight(d_minSize.d_y.asAbsolute(System::getSingleton().getRenderer()->getHeight())); - float newHeight = orgHeight - delta; - - if (newHeight > maxHeight) - delta = orgHeight - maxHeight; - else if (newHeight < minHeight) - delta = orgHeight - minHeight; - - // we use the active metrics mode to decide which component of the window edge to modify - if (getMetricsMode() == Relative) - { - float base = getParentHeight(); - adjustment = (base != 0) ? delta / base : 0; - minDim = &area.d_min.d_y.d_scale; - maxDim = &area.d_max.d_y.d_scale; - } - else - { - adjustment = PixelAligned(delta); - minDim = &area.d_min.d_y.d_offset; - maxDim = &area.d_max.d_y.d_offset; - } - - if (d_vertAlign == VA_BOTTOM) - { - *maxDim -= adjustment; - } - else if (d_vertAlign == VA_CENTRE) - { - *maxDim -= adjustment * 0.5f; - *minDim += adjustment * 0.5f; - } - else - { - *minDim += adjustment; - } - - setWindowArea_impl(area.d_min, area.getSize(), d_vertAlign == VA_TOP); -} - - -/************************************************************************* - move the window's bottom edge by 'delta'. The rest of the window - does not move, thus this changes the size of the Window. -*************************************************************************/ -void FrameWindow::moveBottomEdge(float delta) -{ - // store this so we can work out how much size actually changed - float orgHeight = getAbsoluteHeight(); - float adjustment; - float* minDim; - float* maxDim; - URect area(d_area); - - // ensure that we only size to the set constraints. - // - // NB: We are required to do this here due to our virtually unique sizing nature; the - // normal system for limiting the window size is unable to supply the information we - // require for updating our internal state used to manage the dragging, etc. - float maxHeight(d_maxSize.d_y.asAbsolute(System::getSingleton().getRenderer()->getHeight())); - float minHeight(d_minSize.d_y.asAbsolute(System::getSingleton().getRenderer()->getHeight())); - float newHeight = orgHeight + delta; - - if (newHeight > maxHeight) - delta = maxHeight - orgHeight; - else if (newHeight < minHeight) - delta = minHeight - orgHeight; - - // we use the active metrics mode to decide which component of the window edge to modify - if (getMetricsMode() == Relative) - { - float base = getParentHeight(); - adjustment = (base != 0) ? delta / base : 0; - minDim = &area.d_min.d_y.d_scale; - maxDim = &area.d_max.d_y.d_scale; - } - else - { - adjustment = PixelAligned(delta); - minDim = &area.d_min.d_y.d_offset; - maxDim = &area.d_max.d_y.d_offset; - } - - *maxDim += adjustment; - - if (d_vertAlign == VA_BOTTOM) - { - *maxDim += adjustment; - *minDim += adjustment; - } - else if (d_vertAlign == VA_CENTRE) - { - *maxDim += adjustment * 0.5f; - *minDim += adjustment * 0.5f; - } - - setWindowArea_impl(area.d_min, area.getSize(), d_vertAlign == VA_BOTTOM); - - // move the dragging point so mouse remains 'attached' to edge of window - d_dragPoint.d_y += getAbsoluteHeight() - orgHeight; -} - - -/************************************************************************* - Add frame window specific events -*************************************************************************/ -void FrameWindow::addFrameWindowEvents(bool bCommon) -{ - if ( bCommon == false ) addEvent(EventRollupToggled); - if ( bCommon == true ) addEvent(EventCloseClicked); -} - - -/************************************************************************* - Handler to map close button clicks to FrameWindow 'CloseCliked' events -*************************************************************************/ -bool FrameWindow::closeClickHandler(const EventArgs& e) -{ - WindowEventArgs args(this); - onCloseClicked(args); - - return true; -} - - -/************************************************************************* - Set the appropriate mouse cursor for the given window-relative pixel - point. -*************************************************************************/ -void FrameWindow::setCursorForPoint(const Point& pt) const -{ - switch(getSizingBorderAtPoint(pt)) - { - case SizingTop: - case SizingBottom: - MouseCursor::getSingleton().setImage(d_nsSizingCursor); - break; - - case SizingLeft: - case SizingRight: - MouseCursor::getSingleton().setImage(d_ewSizingCursor); - break; - - case SizingTopLeft: - case SizingBottomRight: - MouseCursor::getSingleton().setImage(d_nwseSizingCursor); - break; - - case SizingTopRight: - case SizingBottomLeft: - MouseCursor::getSingleton().setImage(d_neswSizingCursor); - break; - - default: - MouseCursor::getSingleton().setImage(getMouseCursor()); - break; - } - -} - - -/************************************************************************* - Event generated internally whenever the roll-up / shade state of the - window changes. -*************************************************************************/ -void FrameWindow::onRollupToggled(WindowEventArgs& e) -{ - requestRedraw(); - - fireEvent(EventRollupToggled, e, EventNamespace); -} - - -/************************************************************************* - Event generated internally whenever the close button is clicked. -*************************************************************************/ -void FrameWindow::onCloseClicked(WindowEventArgs& e) -{ - fireEvent(EventCloseClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler for mouse move events -*************************************************************************/ -void FrameWindow::onMouseMove(MouseEventArgs& e) -{ - // default processing (this is now essential as it controls event firing). - Window::onMouseMove(e); - - // if we are not the window containing the mouse, do NOT change the cursor - if (System::getSingleton().getWindowContainingMouse() != this) - { - return; - } - - if (isSizingEnabled()) - { - Point localMousePos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localMousePos = relativeToAbsolute(localMousePos); - } - - if (d_beingSized) - { - SizingLocation dragEdge = getSizingBorderAtPoint(d_dragPoint); - - // calculate sizing deltas... - float deltaX = localMousePos.d_x - d_dragPoint.d_x; - float deltaY = localMousePos.d_y - d_dragPoint.d_y; - - // size left or right edges - if (isLeftSizingLocation(dragEdge)) - { - moveLeftEdge(deltaX); - } - else if (isRightSizingLocation(dragEdge)) - { - moveRightEdge(deltaX); - } - - // size top or bottom edges - if (isTopSizingLocation(dragEdge)) - { - moveTopEdge(deltaY); - } - else if (isBottomSizingLocation(dragEdge)) - { - moveBottomEdge(deltaY); - } - - } - else - { - setCursorForPoint(localMousePos); - } - - } - - // mark event as handled - e.handled = true; -} - - -/************************************************************************* - Handler for mouse button down events -*************************************************************************/ -void FrameWindow::onMouseButtonDown(MouseEventArgs& e) -{ - // default processing (this is now essential as it controls event firing). - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - if (isSizingEnabled()) - { - // get position of mouse as co-ordinates local to this window. - Point localPos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localPos = relativeToAbsolute(localPos); - } - - // if the mouse is on the sizing border - if (getSizingBorderAtPoint(localPos) != SizingNone) - { - // ensure all inputs come to us for now - if (captureInput()) - { - // setup the 'dragging' state variables - d_beingSized = true; - d_dragPoint = localPos; - } - - } - - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse button up events -*************************************************************************/ -void FrameWindow::onMouseButtonUp(MouseEventArgs& e) -{ - // default processing (this is now essential as it controls event firing). - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - // release our capture on the input data - releaseInput(); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse capture is lost -*************************************************************************/ -void FrameWindow::onCaptureLost(WindowEventArgs& e) -{ - // default processing (this is now essential as it controls event firing). - Window::onCaptureLost(e); - - // reset sizing state - d_beingSized = false; - - e.handled = true; -} - - -/************************************************************************* - Handler for when text changes -*************************************************************************/ -void FrameWindow::onTextChanged(WindowEventArgs& e) -{ - // pass this onto titlebar component. - WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__")->setText(getText()); - // redo child layout - performChildWindowLayout(); -} - - -/************************************************************************* - Handler for when this Window is activated -*************************************************************************/ -void FrameWindow::onActivated(ActivationEventArgs& e) -{ - Window::onActivated(e); - d_titlebar->requestRedraw(); -} - - -/************************************************************************* - Handler for when this Window is deactivated -*************************************************************************/ -void FrameWindow::onDeactivated(ActivationEventArgs& e) -{ - Window::onDeactivated(e); - d_titlebar->requestRedraw(); -} - - -/************************************************************************* - Set whether this FrameWindow can be moved by dragging the title bar. -*************************************************************************/ -void FrameWindow::setDragMovingEnabled(bool setting) -{ - if (d_dragMovable != setting) - { - d_dragMovable = setting; - - try - { - static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__"))->setDraggingEnabled(setting); - } - catch (UnknownObjectException) - {} - } - -} - - -/************************************************************************* - Return the font being used for the title bar text -*************************************************************************/ -const Font* FrameWindow::getTitlebarFont(void) const -{ - try - { - return WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__")->getFont(); - } - catch (UnknownObjectException) - { - return 0; - } -} - - -/************************************************************************* - Add properties for this class -*************************************************************************/ -void FrameWindow::addFrameWindowProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_sizingEnabledProperty); - addProperty(&d_frameEnabledProperty); - addProperty(&d_titlebarEnabledProperty); - addProperty(&d_closeButtonEnabledProperty); - addProperty(&d_rollUpStateProperty); - addProperty(&d_dragMovingEnabledProperty); - addProperty(&d_sizingBorderThicknessProperty); - addProperty(&d_titlebarFontProperty); - addProperty(&d_captionColourProperty); - } - else - { - addProperty(&d_rollUpEnabledProperty); - addProperty(&d_nsSizingCursorProperty); - addProperty(&d_ewSizingCursorProperty); - addProperty(&d_nwseSizingCursorProperty); - addProperty(&d_neswSizingCursorProperty); - } -} - - -/************************************************************************* - Return the current colour used for rendering the caption text -*************************************************************************/ -colour FrameWindow::getCaptionColour(void) const -{ - return static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__"))->getCaptionColour(); -} - - -/************************************************************************* - Sets the colour to be used for rendering the caption text. -*************************************************************************/ -void FrameWindow::setCaptionColour(colour col) -{ - static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_titlebar__"))->setCaptionColour(col); -} - - -const Image* FrameWindow::getNSSizingCursorImage() const -{ - return d_nsSizingCursor; -} - -const Image* FrameWindow::getEWSizingCursorImage() const -{ - return d_ewSizingCursor; -} - -const Image* FrameWindow::getNWSESizingCursorImage() const -{ - return d_nwseSizingCursor; -} - -const Image* FrameWindow::getNESWSizingCursorImage() const -{ - return d_neswSizingCursor; -} - -void FrameWindow::setNSSizingCursorImage(const Image* image) -{ - d_nsSizingCursor = image; -} - -void FrameWindow::setEWSizingCursorImage(const Image* image) -{ - d_ewSizingCursor = image; -} - -void FrameWindow::setNWSESizingCursorImage(const Image* image) -{ - d_nwseSizingCursor = image; -} - -void FrameWindow::setNESWSizingCursorImage(const Image* image) -{ - d_neswSizingCursor = image; -} - -void FrameWindow::setNSSizingCursorImage(const String& imageset, const String& image) -{ - d_nsSizingCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); -} - -void FrameWindow::setEWSizingCursorImage(const String& imageset, const String& image) -{ - d_ewSizingCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); -} - -void FrameWindow::setNWSESizingCursorImage(const String& imageset, const String& image) -{ - d_nwseSizingCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); -} - -void FrameWindow::setNESWSizingCursorImage(const String& imageset, const String& image) -{ - d_neswSizingCursor = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindowProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindowProperties.cpp deleted file mode 100644 index fdc90e80f9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIFrameWindowProperties.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/************************************************************************ - filename: CEGUIFrameWindowProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements properties for FrameWindow class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIFrameWindowProperties.h" -#include "elements/CEGUIFrameWindow.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIExceptions.h" -#include "CEGUIFont.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of FrameWindowProperties namespace section -namespace FrameWindowProperties -{ -String SizingEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isSizingEnabled()); -} - - -void SizingEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSizingEnabled(PropertyHelper::stringToBool(value)); -} - - -String FrameEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isFrameEnabled()); -} - - -void FrameEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setFrameEnabled(PropertyHelper::stringToBool(value)); -} - - -String TitlebarEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isTitleBarEnabled()); -} - - -void TitlebarEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTitleBarEnabled(PropertyHelper::stringToBool(value)); -} - - -String CloseButtonEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isCloseButtonEnabled()); -} - - -void CloseButtonEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCloseButtonEnabled(PropertyHelper::stringToBool(value)); -} - - -String DragMovingEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isDragMovingEnabled()); -} - - -void DragMovingEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDragMovingEnabled(PropertyHelper::stringToBool(value)); -} - - -String RollUpEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isRollupEnabled()); -} - - -void RollUpEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRollupEnabled(PropertyHelper::stringToBool(value)); -} - - -String RollUpState::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isRolledup()); -} - - -void RollUpState::set(PropertyReceiver* receiver, const String& value) -{ - bool reqState = PropertyHelper::stringToBool(value); - - if (reqState != static_cast(receiver)->isRolledup()) - { - static_cast(receiver)->toggleRollup(); - } - -} - - -String SizingBorderThickness::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getSizingBorderThickness()); -} - - -void SizingBorderThickness::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSizingBorderThickness(PropertyHelper::stringToFloat(value)); -} - - -String TitlebarFont::get(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getTitlebarFont()->getName(); -} - - -void TitlebarFont::set(PropertyReceiver* receiver, const String& value) -{ - if (value.empty()) - { - static_cast(receiver)->setTitlebarFont(System::getSingleton().getDefaultFont()); - } - else - { - static_cast(receiver)->setTitlebarFont(value); - } -} - -String CaptionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getCaptionColour()); -} - -void CaptionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCaptionColour(PropertyHelper::stringToColour(value)); -} - -String NSSizingCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getNSSizingCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(""); -} - -void NSSizingCursorImage::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setNSSizingCursorImage(PropertyHelper::stringToImage(value)); -} - -String EWSizingCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getEWSizingCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(""); -} - -void EWSizingCursorImage::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setEWSizingCursorImage(PropertyHelper::stringToImage(value)); -} - -String NWSESizingCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getNWSESizingCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(""); -} - -void NWSESizingCursorImage::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setNWSESizingCursorImage(PropertyHelper::stringToImage(value)); -} - -String NESWSizingCursorImage::get(const PropertyReceiver* receiver) const -{ - const Image* img = static_cast(receiver)->getNESWSizingCursorImage(); - return img ? PropertyHelper::imageToString(img) : String(""); -} - -void NESWSizingCursorImage::set(PropertyReceiver* receiver, const String &value) -{ - static_cast(receiver)->setNESWSizingCursorImage(PropertyHelper::stringToImage(value)); -} - - -} // End of FrameWindowProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIGUISheet.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIGUISheet.cpp deleted file mode 100644 index 6f3759ad31..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIGUISheet.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/************************************************************************ - filename: CEGUIGUISheet.cpp - created: 28/8/2004 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIGUISheet.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants -*************************************************************************/ -// type name for this widget -const String GUISheet::WidgetTypeName( (utf8*)"DefaultWindow" ); - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemEntry.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemEntry.cpp deleted file mode 100644 index 9e60a7d882..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemEntry.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/************************************************************************ - filename: CEGUIItemEntry.cpp - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Implementation of ItemEntry widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIItemEntry.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Constructor for ItemEntry base class. -*************************************************************************/ -ItemEntry::ItemEntry(const String& type, const String& name) - : Window(type, name) -{ -} - - -/************************************************************************* - Destructor for ItemEntry base class. -*************************************************************************/ -ItemEntry::~ItemEntry(void) -{ -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBase.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBase.cpp deleted file mode 100644 index 9a2bdac4e3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBase.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/************************************************************************ - filename: CEGUIItemListBase.cpp - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on original Listbox code by Paul D Turner) - - purpose: Implementation of ItemListBase widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIExceptions.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIItemListBase.h" -#include "elements/CEGUIItemEntry.h" - -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -ItemListBaseProperties::AutoResizeEnabled ItemListBase::d_autoResizeEnabledProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// event names -const String ItemListBase::EventNamespace("ItemListBase"); -const String ItemListBase::EventListContentsChanged( (utf8*)"ListItemsChanged" ); - - -/************************************************************************* - Constructor for ItemListBase base class. -*************************************************************************/ -ItemListBase::ItemListBase(const String& type, const String& name) - : Window(type, name), - d_autoResize(false) -{ - // add new events specific to ItemListBase. - addItemListBaseEvents(); - - // add properties for ItemListBase class - addItemListBaseProperties(); -} - - -/************************************************************************* - Destructor for ItemListBase base class. -*************************************************************************/ -ItemListBase::~ItemListBase(void) -{ - resetList_impl(); -} - - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void ItemListBase::initialise(void) -{ - //layoutItemWidgets(); -} - - -/************************************************************************* - Return the item at index position 'index'. -*************************************************************************/ -ItemEntry* ItemListBase::getItemFromIndex(size_t index) const -{ - if (index < d_listItems.size()) - { - return d_listItems[index]; - } - else - { - throw InvalidRequestException((utf8*)"ItemListBase::getItemFromIndex - the specified index is out of range for this ItemListBase."); - } -} - - -/************************************************************************* - Return the index of ItemEntry \a item -*************************************************************************/ -size_t ItemListBase::getItemIndex(const ItemEntry* item) const -{ - ItemEntryList::const_iterator pos = std::find(d_listItems.begin(), d_listItems.end(), item); - - if (pos != d_listItems.end()) - { - return std::distance(d_listItems.begin(), pos); - } - else - { - throw InvalidRequestException((utf8*)"ItemListBase::getItemIndex - the specified ItemEntry is not attached to this ItemListBase."); - } - -} - - -/************************************************************************* - Search the list for an item with the specified text -*************************************************************************/ -ItemEntry* ItemListBase::findItemWithText(const String& text, const ItemEntry* start_item) -{ - // if start_item is NULL begin search at begining, else start at item after start_item - size_t index = (start_item == NULL) ? 0 : (getItemIndex(start_item) + 1); - - while (index < d_listItems.size()) - { - // return pointer to this item if it's text matches - if (d_listItems[index]->getText() == text) - { - return d_listItems[index]; - } - // no matching text, advance to next item - else - { - index++; - } - - } - - // no items matched. - return NULL; -} - - -/************************************************************************* - Return whether the specified ItemEntry is in the List -*************************************************************************/ -bool ItemListBase::isItemInList(const ItemEntry* item) const -{ - return std::find(d_listItems.begin(), d_listItems.end(), item) != d_listItems.end(); -} - - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -void ItemListBase::resetList(void) -{ - if (resetList_impl()) - { - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Add the given ItemEntry to the list. -*************************************************************************/ -void ItemListBase::addItem(ItemEntry* item) -{ - if (item != NULL) - { - // just stick it on the end. - d_listItems.push_back(item); - addChildWindow(item); - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Insert an item into the list box after a specified item already in - the list. -*************************************************************************/ -void ItemListBase::insertItem(ItemEntry* item, const ItemEntry* position) -{ - if (item != NULL) - { - // if position is NULL begin insert at begining, else insert after item 'position' - ItemEntryList::iterator ins_pos; - - if (position == NULL) - { - ins_pos = d_listItems.begin(); - } - else - { - ins_pos = std::find(d_listItems.begin(), d_listItems.end(), position); - - // throw if item 'position' is not in the list - if (ins_pos == d_listItems.end()) - { - throw InvalidRequestException((utf8*)"ItemListBase::insertItem - the specified ItemEntry for parameter 'position' is not attached to this ItemListBase."); - } - - } - - d_listItems.insert(ins_pos, item); - addChildWindow(item); - - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Removes the given item from the list box. -*************************************************************************/ -void ItemListBase::removeItem(ItemEntry* item) -{ - if (item != NULL) - { - ItemEntryList::iterator pos = std::find(d_listItems.begin(), d_listItems.end(), item); - - // if item is in the list - if (pos != d_listItems.end()) - { - // remove item - d_listItems.erase(pos); - - removeChildWindow(item); - WindowManager::getSingleton().destroyWindow(item); - - WindowEventArgs args(this); - onListContentsChanged(args); - } - - } - -} - -/************************************************************************* - Set wheter or not this ItemListBase widget should automatically - resize to fit its content. -*************************************************************************/ -void ItemListBase::setAutoResizeEnabled(bool setting) -{ - bool old = d_autoResize; - d_autoResize = setting; - - // if not already enabled, trigger a resize - if ( d_autoResize && !old ) - { - sizeToContent(); - } - -} - -/************************************************************************* - Causes the list box to update it's internal state after changes have - been made to one or more attached ItemEntry objects. -*************************************************************************/ -void ItemListBase::handleUpdatedItemData(void) -{ - WindowEventArgs args(this); - onListContentsChanged(args); -} - - -/************************************************************************* - Add list box specific events -*************************************************************************/ -void ItemListBase::addItemListBaseEvents(bool bCommon) -{ - if ( bCommon == false ) addEvent(EventListContentsChanged); -} - - -/************************************************************************* - Handler called internally when the list contents are changed -*************************************************************************/ -void ItemListBase::onListContentsChanged(WindowEventArgs& e) -{ - requestRedraw(); - - // if auto resize is enabled - do it - if ( d_autoResize ) - { - sizeToContent(); - } - - layoutItemWidgets(); - fireEvent(EventListContentsChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when we are sized -*************************************************************************/ -void ItemListBase::onSized(WindowEventArgs& e) -{ - // base class handling - Window::onSized(e); - - //layoutItemWidgets(); - - e.handled = true; -} - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -bool ItemListBase::resetList_impl(void) -{ - // just return false if the list is already empty - if (getItemCount() == 0) - { - return false; - } - // we have items to be removed and possible deleted - else - { - // delete any items we are supposed to ---------- DESTROYS ALL ITEMS !!! - for (size_t i = 0; i < getItemCount(); ++i) - { - removeChildWindow(d_listItems[i]); - WindowManager::getSingleton().destroyWindow(d_listItems[i]); - } - - // clear out the list. - d_listItems.clear(); - - return true; - } - -} - - -/************************************************************************* - Add ItemListBase specific properties -*************************************************************************/ -void ItemListBase::addItemListBaseProperties( bool bCommon ) -{ - if ( bCommon == false ) addProperty(&d_autoResizeEnabledProperty); -} - - -/************************************************************************* - Internal version of adding a child window. -*************************************************************************/ -void ItemListBase::addChild_impl(Window* wnd) -{ - Window::addChild_impl(wnd); - - // if this is an ItemEntry we add it like one. only if it is not already in the list! - if (wnd->testClassName("ItemEntry")&&!isItemInList((ItemEntry*)wnd)) - { - // perform normal addItem - please no more infinite recursion !#?¤ - d_listItems.push_back((ItemEntry*)wnd); - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBaseProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBaseProperties.cpp deleted file mode 100644 index a73e55654c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIItemListBaseProperties.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/************************************************************************ - filename: CEGUIItemListBaseProperties.cpp - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIItemListBaseProperties.h" -#include "elements/CEGUIItemListBase.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ItemListBaseProperties namespace section -namespace ItemListBaseProperties -{ - String AutoResizeEnabled::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isAutoResizeEnabled()); - } - - void AutoResizeEnabled::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setAutoResizeEnabled(PropertyHelper::stringToBool(value)); - } - -} // End of ItemListBaseProperties namespace section - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeader.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeader.cpp deleted file mode 100644 index 205911fcbe..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeader.cpp +++ /dev/null @@ -1,1102 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeader.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of ListHeader widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListHeader.h" -#include "CEGUIExceptions.h" - -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String ListHeader::EventNamespace("ListHeader"); - -/************************************************************************* - Properties for this class -*************************************************************************/ -ListHeaderProperties::SortSettingEnabled ListHeader::d_sortSettingProperty; -ListHeaderProperties::ColumnsSizable ListHeader::d_sizableProperty; -ListHeaderProperties::ColumnsMovable ListHeader::d_movableProperty; -ListHeaderProperties::SortColumnID ListHeader::d_sortColumnIDProperty; -ListHeaderProperties::SortDirection ListHeader::d_sortDirectionProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// Event names -const String ListHeader::EventSortColumnChanged( (utf8*)"SortColumnChanged" ); -const String ListHeader::EventSortDirectionChanged( (utf8*)"SortDirectionChanged" ); -const String ListHeader::EventSegmentSized( (utf8*)"SegmentSized" ); -const String ListHeader::EventSegmentClicked( (utf8*)"SegmentClicked" ); -const String ListHeader::EventSplitterDoubleClicked( (utf8*)"SplitterDoubleClicked" ); -const String ListHeader::EventSegmentSequenceChanged( (utf8*)"SegmentSequenceChanged" ); -const String ListHeader::EventSegmentAdded( (utf8*)"SegmentAdded" ); -const String ListHeader::EventSegmentRemoved( (utf8*)"SegmentRemoved" ); -const String ListHeader::EventSortSettingChanged( (utf8*)"SortSettingChanged" ); -const String ListHeader::EventDragMoveSettingChanged( (utf8*)"DragMoveSettingChanged" ); -const String ListHeader::EventDragSizeSettingChanged( (utf8*)"DragSizeSettingChanged" ); -const String ListHeader::EventSegmentRenderOffsetChanged( (utf8*)"SegmentOffsetChanged" ); - -// values -const float ListHeader::ScrollSpeed = 8.0f; -const float ListHeader::MinimumSegmentPixelWidth = 20.0f; - - -/************************************************************************* - Constructor for the list header base class. -*************************************************************************/ -ListHeader::ListHeader(const String& type, const String& name) : - Window(type, name), - d_sortSegment(NULL), - d_sizingEnabled(true), - d_sortingEnabled(true), - d_movingEnabled(true), - d_uniqueIDNumber(0), - d_segmentOffset(0.0f), - d_sortDir(ListHeaderSegment::None) -{ - addListHeaderEvents(); - addHeaderProperties(); -} - - -/************************************************************************* - Destructor for the list header base class. -*************************************************************************/ -ListHeader::~ListHeader(void) -{ -} - - -/************************************************************************* - Return the current number of segments in the header. -*************************************************************************/ -uint ListHeader::getColumnCount(void) const -{ - return (uint)d_segments.size(); -} - - -/************************************************************************* - Given a zero based column index, return the ListHeaderSegment. -*************************************************************************/ -ListHeaderSegment& ListHeader::getSegmentFromColumn(uint column) const -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::getSegmentFromColumn - requested column index is out of range for this ListHeader."); - } - else - { - return *d_segments[column]; - } - -} - - -/************************************************************************* - Return the ListHeaderSegment with the requested ID. -*************************************************************************/ -ListHeaderSegment& ListHeader::getSegmentFromID(uint id) const -{ - for (uint i = 0; i < getColumnCount(); ++i) - { - if (d_segments[i]->getID() == id) - { - return *d_segments[i]; - } - - } - - // No such segment found, throw exception - throw InvalidRequestException((utf8*)"ListHeader::getSegmentFromID - no segment with the requested ID is attached to this ListHeader."); -} - - -/************************************************************************* - Return the sort-key segment. -*************************************************************************/ -ListHeaderSegment& ListHeader::getSortSegment(void) const -{ - if (d_sortSegment == NULL) - { - throw InvalidRequestException((utf8*)"ListHeader::getSortSegment - Sort segment was NULL! (No segments are attached to the ListHeader?)"); - } - else - { - return *d_sortSegment; - } - -} - - -/************************************************************************* - Given a segment, return it's zero based column index. -*************************************************************************/ -uint ListHeader::getColumnFromSegment(const ListHeaderSegment& segment) const -{ - for (uint i = 0; i < getColumnCount(); ++i) - { - if (d_segments[i] == &segment) - { - return i; - } - - } - - // No such segment found, throw exception - throw InvalidRequestException((utf8*)"ListHeader::getColumnFromSegment - the given ListHeaderSegment is not attached to this ListHeader."); -} - - -/************************************************************************* - Return the column index that has a segment with the requested ID. -*************************************************************************/ -uint ListHeader::getColumnFromID(uint id) const -{ - for (uint i = 0; i < getColumnCount(); ++i) - { - if (d_segments[i]->getID() == id) - { - return i; - } - - } - - // No such segment found, throw exception - throw InvalidRequestException((utf8*)"ListHeader::getColumnFromID - no column with the requested ID is available on this ListHeader."); -} - - -/************************************************************************* - Return the current sort-key column -*************************************************************************/ -uint ListHeader::getSortColumn(void) const -{ - return getColumnFromSegment(getSortSegment()); -} - - -/************************************************************************* - return the zero based column index of the segment with the requested - text. -*************************************************************************/ -uint ListHeader::getColumnWithText(const String& text) const -{ - for (uint i = 0; i < getColumnCount(); ++i) - { - if (d_segments[i]->getText() == text) - { - return i; - } - - } - - // No such segment found, throw exception - throw InvalidRequestException((utf8*)"ListHeader::getColumnWithText - no column with the text '" + text + "' is attached to this ListHeader."); -} - - -/************************************************************************* - return the pixel offset to the given segment -*************************************************************************/ -float ListHeader::getPixelOffsetToSegment(const ListHeaderSegment& segment) const -{ - float offset = 0.0f; - - for (uint i = 0; i < getColumnCount(); ++i) - { - if (d_segments[i] == &segment) - { - return offset; - } - - offset += d_segments[i]->getAbsoluteWidth(); - } - - // No such segment found, throw exception - throw InvalidRequestException((utf8*)"ListHeader::getPixelOffsetToSegment - the given ListHeaderSegment is not attached to this ListHeader."); -} - - -/************************************************************************* - return the pixel offset to the segment with the given column index -*************************************************************************/ -float ListHeader::getPixelOffsetToColumn(uint column) const -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::getPixelOffsetToColumn - requested column index is out of range for this ListHeader."); - } - else - { - float offset = 0.0f; - - for (uint i = 0; i < column; ++i) - { - offset += d_segments[i]->getAbsoluteWidth(); - } - - return offset; - } - -} - - -/************************************************************************* - Return the total pixel width of all segments -*************************************************************************/ -float ListHeader::getTotalSegmentsPixelExtent(void) const -{ - float extent = 0.0f; - - for (uint i = 0; i < getColumnCount(); ++i) - { - extent += d_segments[i]->getAbsoluteWidth(); - } - - return extent; -} - - -/************************************************************************* - Return the pixel width of the segment at the specified column index. -*************************************************************************/ -float ListHeader::getColumnPixelWidth(uint column) const -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::getColumnPixelWidth - requested column index is out of range for this ListHeader."); - } - else - { - return d_segments[column]->getAbsoluteWidth(); - } - -} - - -/************************************************************************* - return the current sort direction -*************************************************************************/ -ListHeaderSegment::SortDirection ListHeader::getSortDirection(void) const -{ - return d_sortDir; -} - - -/************************************************************************* - Return whether sorting is enabled for this header. -*************************************************************************/ -bool ListHeader::isSortingEnabled(void) const -{ - return d_sortingEnabled; -} - - -/************************************************************************* - Return whether segment sizing is enabled for this header -*************************************************************************/ -bool ListHeader::isColumnSizingEnabled(void) const -{ - return d_sizingEnabled; -} - - -/************************************************************************* - Return whether segment dragging is enabled for this header. -*************************************************************************/ -bool ListHeader::isColumnDraggingEnabled(void) const -{ - return d_movingEnabled; -} - - -/************************************************************************* - Set whether the ability to change sort segment / direction is enabled -*************************************************************************/ -void ListHeader::setSortingEnabled(bool setting) -{ - if (d_sortingEnabled != setting) - { - d_sortingEnabled = setting; - - // make the setting change for all component segments. - for (uint i = 0; i setClickable(d_sortingEnabled); - } - - // Fire setting changed event. - WindowEventArgs args(this); - onSortSettingChanged(args); - } - -} - - -/************************************************************************* - Set the sort direction on the current sort segment / column. -*************************************************************************/ -void ListHeader::setSortDirection(ListHeaderSegment::SortDirection direction) -{ - d_sortDir = direction; - - // set direction of current sort segment - if (d_sortSegment != NULL) - { - d_sortSegment->setSortDirection(direction); - } - - // Fire sort direction changed event. - WindowEventArgs args(this); - onSortDirectionChanged(args); -} - - -/************************************************************************* - Set the current sort segment. -*************************************************************************/ -void ListHeader::setSortSegment(const ListHeaderSegment& segment) -{ - setSortColumn(getColumnFromSegment(segment)); -} - - -/************************************************************************* - Set the current sort segment via column index. -*************************************************************************/ -void ListHeader::setSortColumn(uint column) -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::setSortColumn - specified column index is out of range for this ListHeader."); - } - else - { - // set sort direction on 'old' sort segment to none. - if (d_sortSegment != NULL) - { - d_sortSegment->setSortDirection(ListHeaderSegment::None); - } - - // set-up new sort segment - d_sortSegment = d_segments[column]; - d_sortSegment->setSortDirection(d_sortDir); - - // Fire sort column changed event - WindowEventArgs args(this); - onSortColumnChanged(args); - } - -} - - -/************************************************************************* - Set the current sort segment via ID code. -*************************************************************************/ -void ListHeader::setSortColumnFromID(uint id) -{ - setSortSegment(getSegmentFromID(id)); -} - - -/************************************************************************* - Set whether or not segments may be sized. -*************************************************************************/ -void ListHeader::setColumnSizingEnabled(bool setting) -{ - if (d_sizingEnabled != setting) - { - d_sizingEnabled = setting; - - // make the setting change for all component segments. - for (uint i = 0; i setSizingEnabled(d_sizingEnabled); - } - - // Fire setting changed event. - WindowEventArgs args(this); - onDragSizeSettingChanged(args); - } - -} - - -/************************************************************************* - Set whether columns may be dragged into new orders. -*************************************************************************/ -void ListHeader::setColumnDraggingEnabled(bool setting) -{ - if (d_movingEnabled != setting) - { - d_movingEnabled = setting; - - // make the setting change for all component segments. - for (uint i = 0; i setDragMovingEnabled(d_movingEnabled); - } - - // Fire setting changed event. - WindowEventArgs args(this); - onDragMoveSettingChanged(args); - } - -} - - -/************************************************************************* - Add a new column segment to the header. -*************************************************************************/ -void ListHeader::addColumn(const String& text, uint id, float width) -{ - // add just inserts at end. - insertColumn(text, id, width, getColumnCount()); -} - - -/************************************************************************* - Insert a new column segment into the header -*************************************************************************/ -void ListHeader::insertColumn(const String& text, uint id, float width, uint position) -{ - // if position is too big, insert at end. - if (position > getColumnCount()) - { - position = getColumnCount(); - } - - ListHeaderSegment* seg = createInitialisedSegment(text, id, width); - d_segments.insert((d_segments.begin() + position), seg); - - // add window as a child of this - addChildWindow(seg); - - layoutSegments(); - - // Fire segment added event. - WindowEventArgs args(this); - onSegmentAdded(args); - - // if sort segment is invalid, make it valid now we have a segment attached - if (d_sortSegment == NULL) - { - setSortColumn(position); - } -} - - -/************************************************************************* - Remove a column from the header -*************************************************************************/ -void ListHeader::removeColumn(uint column) -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::removeColumn - specified column index is out of range for this ListHeader."); - } - else - { - ListHeaderSegment* seg = d_segments[column]; - - // remove from the list of segments - d_segments.erase(d_segments.begin() + column); - - // have we removed the sort column? - if (d_sortSegment == seg) - { - // any other columns? - if (getColumnCount() > 0) - { - // put first column in as sort column - d_sortDir = ListHeaderSegment::None; - setSortColumn(0); - } - // no columns, set sort segment to NULL - else - { - d_sortSegment = NULL; - } - - } - - // detach segment window from the header (this) - removeChildWindow(seg); - - // destroy the segment (done in derived class, since that's where it was created). - destroyListSegment(seg); - - layoutSegments(); - - // Fire segment removed event. - WindowEventArgs args(this); - onSegmentRemoved(args); - } - -} - - -/************************************************************************* - Move a column segment to a new position -*************************************************************************/ -void ListHeader::moveColumn(uint column, uint position) -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::moveColumn - specified column index is out of range for this ListHeader."); - } - else - { - // if position is too big, move to end. - if (position >= getColumnCount()) - { - position = getColumnCount() - 1; - } - - ListHeaderSegment* seg = d_segments[column]; - - // remove original copy of segment - d_segments.erase(d_segments.begin() + column); - - // insert the segment at it's new position - d_segments.insert(d_segments.begin() + position, seg); - - // Fire sequence changed event - HeaderSequenceEventArgs args(this, column, position); - onSegmentSequenceChanged(args); - - layoutSegments(); - } - -} - - -/************************************************************************* - Insert a new column segment into the header -*************************************************************************/ -void ListHeader::insertColumn(const String& text, uint id, float width, const ListHeaderSegment& position) -{ - insertColumn(text, id, width, getColumnFromSegment(position)); -} - - -/************************************************************************* - Remove a segment from the header -*************************************************************************/ -void ListHeader::removeSegment(const ListHeaderSegment& segment) -{ - removeColumn(getColumnFromSegment(segment)); -} - - -/************************************************************************* - Move a column segment to a new position. -*************************************************************************/ -void ListHeader::moveColumn(uint column, const ListHeaderSegment& position) -{ - moveColumn(column, getColumnFromSegment(position)); -} - - -/************************************************************************* - Move a segment to a new position -*************************************************************************/ -void ListHeader::moveSegment(const ListHeaderSegment& segment, uint position) -{ - moveColumn(getColumnFromSegment(segment), position); -} - - -/************************************************************************* - Move a segment to a new position -*************************************************************************/ -void ListHeader::moveSegment(const ListHeaderSegment& segment, const ListHeaderSegment& position) -{ - moveColumn(getColumnFromSegment(segment), getColumnFromSegment(position)); -} - - -/************************************************************************* - Set the current segment offset value (metrics dependant) -*************************************************************************/ -void ListHeader::setSegmentOffset(float offset) -{ - if (d_segmentOffset != offset) - { - d_segmentOffset = offset; - layoutSegments(); - requestRedraw(); - - // Fire event. - WindowEventArgs args(this); - onSegmentOffsetChanged(args); - } - -} - - -/************************************************************************* - Set the pixel width of the specified column. -*************************************************************************/ -void ListHeader::setColumnPixelWidth(uint column, float width) -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::setColumnPixelWidth - specified column index is out of range for this ListHeader."); - } - else - { - d_segments[column]->setWidth(Absolute, width); - - layoutSegments(); - - // Fire segment sized event. - WindowEventArgs args(d_segments[column]); - onSegmentSized(args); - } - -} - - -/************************************************************************* - Set the title of the specified column. -*************************************************************************/ -void ListHeader::setColumnTitle(uint column, const char* szText) -{ - if (column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"ListHeader::setColumnTitle - specified column index is out of range for this ListHeader."); - } - else - { - d_segments[column]->setText((utf8*)szText); - } -} - - -/************************************************************************* - Get the title of the specified column. -*************************************************************************/ -const char* ListHeader::getColumnTitle(uint column) -{ - return d_segments[column]->getText().c_str(); -} - -/************************************************************************* - Create initialise and return a ListHeaderSegment object, with all - events subscribed and ready to use. -*************************************************************************/ -ListHeaderSegment* ListHeader::createInitialisedSegment(const String& text, uint id, float width) -{ - // Build unique name - std::stringstream name; - name << getName().c_str() << "__auto_seg_" << d_uniqueIDNumber; - - // create segment. - ListHeaderSegment* newseg = createNewSegment(name.str()); - d_uniqueIDNumber++; - - // setup segment; - newseg->setMetricsMode(Relative); - newseg->setSize(Size(width, 1.0f)); - newseg->setMinimumSize(absoluteToRelative_impl(NULL, Size(MinimumSegmentPixelWidth, 0.0f))); - newseg->setText(text); - newseg->setID(id); - - // subscribe events we listen to - newseg->subscribeEvent(ListHeaderSegment::EventSegmentSized, Event::Subscriber(&CEGUI::ListHeader::segmentSizedHandler, this)); - newseg->subscribeEvent(ListHeaderSegment::EventSegmentDragStop, Event::Subscriber(&CEGUI::ListHeader::segmentMovedHandler, this)); - newseg->subscribeEvent(ListHeaderSegment::EventSegmentClicked, Event::Subscriber(&CEGUI::ListHeader::segmentClickedHandler, this)); - newseg->subscribeEvent(ListHeaderSegment::EventSplitterDoubleClicked, Event::Subscriber(&CEGUI::ListHeader::segmentDoubleClickHandler, this)); - newseg->subscribeEvent(ListHeaderSegment::EventSegmentDragPositionChanged, Event::Subscriber(&CEGUI::ListHeader::segmentDragHandler, this)); - - return newseg; -} - - -/************************************************************************* - Layout the segments -*************************************************************************/ -void ListHeader::layoutSegments(void) -{ - Point pos(-d_segmentOffset, 0.0f); - - for (uint i = 0; i < getColumnCount(); ++i) - { - d_segments[i]->setPosition(pos); - pos.d_x += d_segments[i]->getWidth(); - } - -} - - -/************************************************************************* - Handler called when the sort column is changed. -*************************************************************************/ -void ListHeader::onSortColumnChanged(WindowEventArgs& e) -{ - fireEvent(EventSortColumnChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the sort direction is changed. -*************************************************************************/ -void ListHeader::onSortDirectionChanged(WindowEventArgs& e) -{ - fireEvent(EventSortDirectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a segment is sized by the user. - e.window points to the segment. -*************************************************************************/ -void ListHeader::onSegmentSized(WindowEventArgs& e) -{ - fireEvent(EventSegmentSized, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a segment is clicked by the user. - e.window points to the segment. -*************************************************************************/ -void ListHeader::onSegmentClicked(WindowEventArgs& e) -{ - fireEvent(EventSegmentClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a segment splitter / sizer is double-clicked. - e.window points to the segment. -*************************************************************************/ -void ListHeader::onSplitterDoubleClicked(WindowEventArgs& e) -{ - fireEvent(EventSplitterDoubleClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the segment / column order changes. -*************************************************************************/ -void ListHeader::onSegmentSequenceChanged(WindowEventArgs& e) -{ - fireEvent(EventSegmentSequenceChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a new segment is added to the header. -*************************************************************************/ -void ListHeader::onSegmentAdded(WindowEventArgs& e) -{ - fireEvent(EventSegmentAdded, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a segment is removed from the header. -*************************************************************************/ -void ListHeader::onSegmentRemoved(WindowEventArgs& e) -{ - fireEvent(EventSegmentRemoved, e, EventNamespace); -} - - -/************************************************************************* - Handler called then setting that controls the users ability to - modify the search column & direction changes. -*************************************************************************/ -void ListHeader::onSortSettingChanged(WindowEventArgs& e) -{ - fireEvent(EventSortSettingChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the setting that controls the users ability to - drag and drop segments changes. -*************************************************************************/ -void ListHeader::onDragMoveSettingChanged(WindowEventArgs& e) -{ - fireEvent(EventDragMoveSettingChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the setting that controls the users ability t - size segments changes. -*************************************************************************/ -void ListHeader::onDragSizeSettingChanged(WindowEventArgs& e) -{ - fireEvent(EventDragSizeSettingChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the base rendering offset for the segments - (scroll position) changes. -*************************************************************************/ -void ListHeader::onSegmentOffsetChanged(WindowEventArgs& e) -{ - fireEvent(EventSegmentRenderOffsetChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler method for when a segment is sized. -*************************************************************************/ -bool ListHeader::segmentSizedHandler(const EventArgs& e) -{ - layoutSegments(); - - // Fire segment sized event. - WindowEventArgs args(((WindowEventArgs&)e).window); - onSegmentSized(args); - - return true; -} - - -/************************************************************************* - Handler method for when a segment is dragged & dropped. -*************************************************************************/ -bool ListHeader::segmentMovedHandler(const EventArgs& e) -{ - Point mousePos(MouseCursor::getSingleton().getPosition()); - - // segment must be dropped within the window - if (isHit(mousePos)) - { - // get mouse position as something local - Point localMousePos(screenToWindow(mousePos)); - - // set up to allow for current offsets - float currwidth = -d_segmentOffset; - - // get required figures as pixels - if (getMetricsMode() == Relative) - { - localMousePos = relativeToAbsolute(localMousePos); - currwidth = relativeToAbsoluteX(currwidth); - } - - // calculate column where dragged segment was dropped - uint col; - for (col = 0; col < getColumnCount(); ++col) - { - currwidth += d_segments[col]->getAbsoluteWidth(); - - if (localMousePos.d_x < currwidth) - { - // this is the column, exit loop early - break; - } - - } - - // find original column for dragged segment. - ListHeaderSegment* seg = ((ListHeaderSegment*)((WindowEventArgs&)e).window); - uint curcol = getColumnFromSegment(*seg); - - // move column - moveColumn(curcol, col); - } - - return true; -} - - -/************************************************************************* - Hanlder for when a segment is clicked (to change sort segment / direction) -*************************************************************************/ -bool ListHeader::segmentClickedHandler(const EventArgs& e) -{ - // double-check we allow this action - if (d_sortingEnabled) - { - ListHeaderSegment* seg = ((ListHeaderSegment*)((WindowEventArgs&)e).window); - - // is this a new sort column? - if (d_sortSegment != seg) - { - d_sortDir = ListHeaderSegment::Descending; - setSortSegment(*seg); - } - // not a new segment, toggle current direction - else if (d_sortSegment != NULL) - { - ListHeaderSegment::SortDirection currDir = d_sortSegment->getSortDirection(); - - // set new direction based on the current value. - switch (currDir) - { - case ListHeaderSegment::None: - setSortDirection(ListHeaderSegment::Descending); - break; - - case ListHeaderSegment::Ascending: - setSortDirection(ListHeaderSegment::Descending); - break; - - case ListHeaderSegment::Descending: - setSortDirection(ListHeaderSegment::Ascending); - break; - } - - } - - // Notify that a segment has been clicked - WindowEventArgs args(((WindowEventArgs&)e).window); - onSegmentClicked(args); - } - - return true; -} - - -/************************************************************************* - Handler called when a segment splitter is double-clicked. -*************************************************************************/ -bool ListHeader::segmentDoubleClickHandler(const EventArgs& e) -{ - WindowEventArgs args(((WindowEventArgs&)e).window); - onSplitterDoubleClicked(args); - - return true; -} - - -/************************************************************************* - Handler called whenever the mouse moves while dragging a segment -*************************************************************************/ -bool ListHeader::segmentDragHandler(const EventArgs& e) -{ - // what we do here is monitor the position and scroll if we can when mouse is outside area. - - // get mouse position as something local - Point localMousePos(screenToWindow(MouseCursor::getSingleton().getPosition())); - - MetricsMode mmode = getMetricsMode(); - - // get required figures as pixels - if (mmode == Relative) - { - localMousePos = relativeToAbsolute(localMousePos); - } - - // scroll left? - if (localMousePos.d_x < 0.0f) - { - if (d_segmentOffset > 0.0f) - { - float adjust = ScrollSpeed; - - if (mmode == Relative) - { - adjust = absoluteToRelativeX(adjust); - } - - setSegmentOffset(ceguimax(0.0f, d_segmentOffset - adjust)); - } - - } - // scroll right? - else if (localMousePos.d_x >= getAbsoluteWidth()) - { - float adjust = ScrollSpeed; - float pixOffset = d_segmentOffset; - float maxOffset = ceguimax(0.0f, getTotalSegmentsPixelExtent() - getAbsoluteWidth()); - - // convert values as required so calculations can be done in a consistent way - if (mmode == Relative) - { - maxOffset = absoluteToRelativeX(maxOffset); - pixOffset = relativeToAbsoluteX(pixOffset); - adjust = absoluteToRelativeX(adjust); - } - - // if we have not scrolled to the limit - if (d_segmentOffset < maxOffset) - { - // scroll, but never beyond the limit - setSegmentOffset(ceguimin(maxOffset, d_segmentOffset + adjust)); - } - - } - - return true; -} - - -/************************************************************************* - Add ListHeader specific events -*************************************************************************/ -void ListHeader::addListHeaderEvents(bool bCommon) -{ - if ( bCommon == true ) - { - addEvent(EventSortColumnChanged); - addEvent(EventSortDirectionChanged); - addEvent(EventSegmentSized); - addEvent(EventSegmentClicked); - addEvent(EventSplitterDoubleClicked); - addEvent(EventSegmentSequenceChanged); - addEvent(EventSegmentRenderOffsetChanged); - } - else - { - addEvent(EventSegmentAdded); - addEvent(EventSegmentRemoved); - addEvent(EventSortSettingChanged); - addEvent(EventDragMoveSettingChanged); - addEvent(EventDragSizeSettingChanged); - } -} - -/************************************************************************* - Add ListHeader specific properties -*************************************************************************/ -void ListHeader::addHeaderProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_sizableProperty); - addProperty(&d_movableProperty); - addProperty(&d_sortSettingProperty); - addProperty(&d_sortColumnIDProperty); - addProperty(&d_sortDirectionProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderProperties.cpp deleted file mode 100644 index 195c85cd00..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderProperties.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeaderProperties.cpp - created: 11/7/2004 - author: Paul D Turner - - purpose: Implements the properties for the ListHeader class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListHeaderProperties.h" -#include "elements/CEGUIListHeader.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ListHeaderProperties namespace section -namespace ListHeaderProperties -{ -String SortSettingEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isSortingEnabled()); -} - - -void SortSettingEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSortingEnabled(PropertyHelper::stringToBool(value)); -} - - -String ColumnsSizable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isColumnSizingEnabled()); -} - - -void ColumnsSizable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setColumnSizingEnabled(PropertyHelper::stringToBool(value)); -} - - -String ColumnsMovable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isColumnDraggingEnabled()); -} - - -void ColumnsMovable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setColumnDraggingEnabled(PropertyHelper::stringToBool(value)); -} - - -String SortColumnID::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getSortSegment().getID()); -} - - -void SortColumnID::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSortColumnFromID(PropertyHelper::stringToUint(value)); -} - - -String SortDirection::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getSortDirection()) - { - case ListHeaderSegment::Ascending: - return String((utf8*)"Ascending"); - break; - - case ListHeaderSegment::Descending: - return String((utf8*)"Descending"); - break; - - default: - return String((utf8*)"None"); - break; - } - -} - - -void SortDirection::set(PropertyReceiver* receiver, const String& value) -{ - ListHeaderSegment::SortDirection dir; - - if (value == (utf8*)"Ascending") - { - dir = ListHeaderSegment::Ascending; - } - else if (value == (utf8*)"Descending") - { - dir = ListHeaderSegment::Descending; - } - else - { - dir = ListHeaderSegment::None; - } - - static_cast(receiver)->setSortDirection(dir); -} - -} // End of ListHeaderProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegment.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegment.cpp deleted file mode 100644 index 77e1d6c89f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegment.cpp +++ /dev/null @@ -1,667 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeaderSegment.cpp - created: 15/6/2004 - author: Paul D Turner - - purpose: Implementation of List header segment widget. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListHeaderSegment.h" -#include "CEGUIMouseCursor.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String ListHeaderSegment::EventNamespace("ListHeaderSegment"); - -/************************************************************************* - Properties for this class -*************************************************************************/ -ListHeaderSegmentProperties::Clickable ListHeaderSegment::d_clickableProperty; -ListHeaderSegmentProperties::Dragable ListHeaderSegment::d_dragableProperty; -ListHeaderSegmentProperties::Sizable ListHeaderSegment::d_sizableProperty; -ListHeaderSegmentProperties::SortDirection ListHeaderSegment::d_sortDirectionProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// Event names -const String ListHeaderSegment::EventSegmentClicked( (utf8*)"SegmentClicked" ); -const String ListHeaderSegment::EventSplitterDoubleClicked( (utf8*)"SplitterDoubleClicked" ); -const String ListHeaderSegment::EventSizingSettingChanged( (utf8*)"SizingSettingChanged" ); -const String ListHeaderSegment::EventSortDirectionChanged( (utf8*)"SortDirectionChanged" ); -const String ListHeaderSegment::EventMovableSettingChanged( (utf8*)"MovableSettingChanged" ); -const String ListHeaderSegment::EventSegmentDragStart( (utf8*)"SegmentDragStart" ); -const String ListHeaderSegment::EventSegmentDragStop( (utf8*)"SegmentDragStop" ); -const String ListHeaderSegment::EventSegmentDragPositionChanged( (utf8*)"SegmentDragPositionChanged" ); -const String ListHeaderSegment::EventSegmentSized( (utf8*)"SegmentSized" ); -const String ListHeaderSegment::EventClickableSettingChanged( (utf8*)"ClickableSettingChanged" ); - -// Defaults -const float ListHeaderSegment::DefaultSizingArea = 8.0f; -const float ListHeaderSegment::SegmentMoveThreshold = 12.0f; - - -/************************************************************************* - Constructor for list header segment base class -*************************************************************************/ -ListHeaderSegment::ListHeaderSegment(const String& type, const String& name) : - Window(type, name), - d_sizingMouseCursor(NULL), - d_movingMouseCursor(NULL), - d_splitterSize(DefaultSizingArea), - d_splitterHover(false), - d_dragSizing(false), - d_sortDir(None), - d_segmentHover(false), - d_segmentPushed(false), - d_sizingEnabled(true), - d_movingEnabled(true), - d_dragMoving(false), - d_allowClicks(true) -{ - addHeaderSegmentEvents(); - addHeaderSegmentProperties(); -} - - -/************************************************************************* - Destructor for list header segment base class. -*************************************************************************/ -ListHeaderSegment::~ListHeaderSegment(void) -{ -} - - -/************************************************************************* - Set whether this segment can be sized. -*************************************************************************/ -void ListHeaderSegment::setSizingEnabled(bool setting) -{ - if (d_sizingEnabled != setting) - { - d_sizingEnabled = setting; - - // if sizing is now disabled, ensure sizing operation is cancelled - if (!d_sizingEnabled && d_dragSizing) - { - releaseInput(); - } - - WindowEventArgs args(this); - onSizingSettingChanged(args); - } - -} - - -/************************************************************************* - Set the current sort direction set for this segment. -*************************************************************************/ -void ListHeaderSegment::setSortDirection(SortDirection sort_dir) -{ - if (d_sortDir != sort_dir) - { - d_sortDir = sort_dir; - - WindowEventArgs args(this); - onSortDirectionChanged(args); - - requestRedraw(); - } - -} - - -/************************************************************************* - Set whether drag moving is allowed for this segment. -*************************************************************************/ -void ListHeaderSegment::setDragMovingEnabled(bool setting) -{ - if (d_movingEnabled != setting) - { - d_movingEnabled = setting; - - WindowEventArgs args(this); - onMovableSettingChanged(args); - } - -} - - -/************************************************************************* - Set whether the segment is clickable. -*************************************************************************/ -void ListHeaderSegment::setClickable(bool setting) -{ - if (d_allowClicks != setting) - { - d_allowClicks = setting; - - WindowEventArgs args(this); - onClickableSettingChanged(args); - } - -} - - -/************************************************************************* - Add list header segment specific events -*************************************************************************/ -void ListHeaderSegment::addHeaderSegmentEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventSizingSettingChanged); - addEvent(EventSegmentDragStart); - addEvent(EventMovableSettingChanged); - addEvent(EventClickableSettingChanged); - } - else - { - addEvent(EventSortDirectionChanged); - addEvent(EventSegmentSized); - addEvent(EventSegmentDragStop); - addEvent(EventSegmentDragPositionChanged); - addEvent(EventSplitterDoubleClicked); - addEvent(EventSegmentClicked); - } -} - - - -/************************************************************************* - Handler called when segment is clicked. -*************************************************************************/ -void ListHeaderSegment::onSegmentClicked(WindowEventArgs& e) -{ - fireEvent(EventSegmentClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the sizer/splitter is double-clicked. -*************************************************************************/ -void ListHeaderSegment::onSplitterDoubleClicked(WindowEventArgs& e) -{ - fireEvent(EventSplitterDoubleClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler called when sizing setting changes. -*************************************************************************/ -void ListHeaderSegment::onSizingSettingChanged(WindowEventArgs& e) -{ - fireEvent(EventSizingSettingChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the sort direction value changes. -*************************************************************************/ -void ListHeaderSegment::onSortDirectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSortDirectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the drag-movable setting is changed. -*************************************************************************/ -void ListHeaderSegment::onMovableSettingChanged(WindowEventArgs& e) -{ - fireEvent(EventMovableSettingChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the user starts dragging the segment. -*************************************************************************/ -void ListHeaderSegment::onSegmentDragStart(WindowEventArgs& e) -{ - fireEvent(EventSegmentDragStart, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the user stops dragging the segment - (releases mouse button) -*************************************************************************/ -void ListHeaderSegment::onSegmentDragStop(WindowEventArgs& e) -{ - fireEvent(EventSegmentDragStop, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the drag position changes. -*************************************************************************/ -void ListHeaderSegment::onSegmentDragPositionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSegmentDragPositionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the segment is sized. -*************************************************************************/ -void ListHeaderSegment::onSegmentSized(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSegmentSized, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the clickable setting for the segment changes -*************************************************************************/ -void ListHeaderSegment::onClickableSettingChanged(WindowEventArgs& e) -{ - fireEvent(EventClickableSettingChanged, e, EventNamespace); -} - - -/************************************************************************* - Processing for drag-sizing the segment -*************************************************************************/ -void ListHeaderSegment::doDragSizing(const Point& local_mouse) -{ - float delta = local_mouse.d_x - d_dragPoint.d_x; - - // store this so we can work out how much size actually changed - float orgWidth = getAbsoluteWidth(); - - // ensure that we only size to the set constraints. - // - // NB: We are required to do this here due to our virtually unique sizing nature; the - // normal system for limiting the window size is unable to supply the information we - // require for updating our internal state used to manage the dragging, etc. - float maxWidth(d_maxSize.d_x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); - float minWidth(d_minSize.d_x.asAbsolute(System::getSingleton().getRenderer()->getWidth())); - float newWidth = orgWidth + delta; - - if (newWidth > maxWidth) - delta = maxWidth - orgWidth; - else if (newWidth < minWidth) - delta = minWidth - orgWidth; - - // update segment area rect - URect area(d_area.d_min.d_x, d_area.d_min.d_y, d_area.d_max.d_x + UDim(0,PixelAligned(delta)), d_area.d_max.d_y); - setWindowArea_impl(area.d_min, area.getSize()); - - // move the dragging point so mouse remains 'attached' to edge of segment - d_dragPoint.d_x += getAbsoluteWidth() - orgWidth; - - WindowEventArgs args(this); - onSegmentSized(args); -} - - -/************************************************************************* - Processing for drag-moving the segment -*************************************************************************/ -void ListHeaderSegment::doDragMoving(const Point& local_mouse) -{ - // calculate movement deltas. - float deltaX = local_mouse.d_x - d_dragPoint.d_x; - float deltaY = local_mouse.d_y - d_dragPoint.d_y; - - // update 'ghost' position - d_dragPosition.d_x += deltaX; - d_dragPosition.d_y += deltaY; - - // update drag point. - d_dragPoint.d_x += deltaX; - d_dragPoint.d_y += deltaY; - - WindowEventArgs args(this); - onSegmentDragPositionChanged(args); -} - - -/************************************************************************* - Initialise and enter the drag moving state. -*************************************************************************/ -void ListHeaderSegment::initDragMoving(void) -{ - if (d_movingEnabled) - { - // initialise drag moving state - d_dragMoving = true; - d_segmentPushed = false; - d_segmentHover = false; - d_dragPosition.d_x = 0.0f; - d_dragPosition.d_y = 0.0f; - - // setup new cursor - MouseCursor::getSingleton().setImage(d_movingMouseCursor); - - // Trigger the event - WindowEventArgs args(this); - onSegmentDragStart(args); - } - -} - - -/************************************************************************* - Initialise the state for hovering over sizing area. -*************************************************************************/ -void ListHeaderSegment::initSizingHoverState(void) -{ - // only react if settings are changing. - if (!d_splitterHover && !d_segmentPushed) - { - d_splitterHover = true; - - // change the mouse cursor. - MouseCursor::getSingleton().setImage(d_sizingMouseCursor); - - // trigger redraw so 'sizing' area can be highlighted if needed. - requestRedraw(); - } - - // reset segment hover as needed. - if (d_segmentHover) - { - d_segmentHover = false; - requestRedraw(); - } - -} - - -/************************************************************************* - Initialise the state for hovering over main segment area -*************************************************************************/ -void ListHeaderSegment::initSegmentHoverState(void) -{ - // reset sizing area hover state if needed. - if (d_splitterHover) - { - d_splitterHover = false; - MouseCursor::getSingleton().setImage(getMouseCursor()); - requestRedraw(); - } - - // set segment hover state if not already set. - if ((!d_segmentHover) && isClickable()) - { - d_segmentHover = true; - requestRedraw(); - } -} - - -/************************************************************************* - Return true if move threshold for initiating drag-moving has been - exceeded. -*************************************************************************/ -bool ListHeaderSegment::isDragMoveThresholdExceeded(const Point& local_mouse) -{ - // see if mouse has moved far enough to start move operation - // calculate movement deltas. - float deltaX = local_mouse.d_x - d_dragPoint.d_x; - float deltaY = local_mouse.d_y - d_dragPoint.d_y; - - if ((deltaX > SegmentMoveThreshold) || (deltaX < -SegmentMoveThreshold) || - (deltaY > SegmentMoveThreshold) || (deltaY < -SegmentMoveThreshold)) - { - return true; - } - else - { - return false; - } - -} - - -/************************************************************************* - Handler for when mouse position changes in widget area (or captured) -*************************************************************************/ -void ListHeaderSegment::onMouseMove(MouseEventArgs& e) -{ - // base class processing - Window::onMouseMove(e); - - // - // convert mouse position to something local - // - Point localMousePos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localMousePos = relativeToAbsolute(localMousePos); - } - - // handle drag sizing - if (d_dragSizing) - { - doDragSizing(localMousePos); - } - // handle drag moving - else if (d_dragMoving) - { - doDragMoving(localMousePos); - } - // not sizing, is mouse in the widget area? - else if (isHit(e.position)) - { - // mouse in sizing area & sizing is enabled - if ((localMousePos.d_x > (getAbsoluteWidth() - d_splitterSize)) && d_sizingEnabled) - { - initSizingHoverState(); - } - // mouse not in sizing area and/or sizing not enabled - else - { - initSegmentHoverState(); - - // if we are pushed but not yet drag moving - if (d_segmentPushed && !d_dragMoving) - { - if (isDragMoveThresholdExceeded(localMousePos)) - { - initDragMoving(); - } - - } - - } - - } - // mouse is no longer within the widget area... - else - { - // only change settings if change is required - if (d_splitterHover) - { - d_splitterHover = false; - MouseCursor::getSingleton().setImage(getMouseCursor()); - requestRedraw(); - } - - // reset segment hover state if not already done. - if (d_segmentHover) - { - d_segmentHover = false; - requestRedraw(); - } - - } - - e.handled = true; -} - - -/************************************************************************* - Handler for when mouse buttons are pushed -*************************************************************************/ -void ListHeaderSegment::onMouseButtonDown(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - // ensure all inputs come to us for now - if (captureInput()) - { - // get position of mouse as co-ordinates local to this window. - Point localPos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localPos = relativeToAbsolute(localPos); - } - - // store drag point for possible sizing or moving operation. - d_dragPoint = localPos; - - // if the mouse is in the sizing area - if (d_splitterHover) - { - if (isSizingEnabled()) - { - // setup the 'dragging' state variables - d_dragSizing = true; - } - - } - else - { - d_segmentPushed = true; - } - - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse buttons area released -*************************************************************************/ -void ListHeaderSegment::onMouseButtonUp(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - // if we were pushed and mouse was released within our segment area - if (d_segmentPushed && d_segmentHover) - { - WindowEventArgs args(this); - onSegmentClicked(args); - } - else if (d_dragMoving) - { - MouseCursor::getSingleton().setImage(getMouseCursor()); - - WindowEventArgs args(this); - onSegmentDragStop(args); - } - - // release our capture on the input data - releaseInput(); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when a mouse button is double-clicked -*************************************************************************/ -void ListHeaderSegment::onMouseDoubleClicked(MouseEventArgs& e) -{ - // base class processing - Window::onMouseDoubleClicked(e); - - // if double-clicked on splitter / sizing area - if ((e.button == LeftButton) && d_splitterHover) - { - WindowEventArgs args(this); - onSplitterDoubleClicked(args); - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse leaves the widget area (uncaptured) -*************************************************************************/ -void ListHeaderSegment::onMouseLeaves(MouseEventArgs& e) -{ - // base class processing - Window::onMouseLeaves(e); - - d_splitterHover = false; - d_dragSizing = false; - d_segmentHover = false; - requestRedraw(); -} - - -/************************************************************************* - Handler for when mouse input capture is lost -*************************************************************************/ -void ListHeaderSegment::onCaptureLost(WindowEventArgs& e) -{ - // base class processing - Window::onCaptureLost(e); - - // reset segment state - d_dragSizing = false; - d_segmentPushed = false; - d_dragMoving = false; - - e.handled = true; -} - -/************************************************************************* - adds properties for the class -*************************************************************************/ -void ListHeaderSegment::addHeaderSegmentProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_clickableProperty); - addProperty(&d_sizableProperty); - addProperty(&d_dragableProperty); - addProperty(&d_sortDirectionProperty); - } -} - - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegmentProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegmentProperties.cpp deleted file mode 100644 index 20e27f1ee5..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListHeaderSegmentProperties.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/************************************************************************ - filename: CEGUIListHeaderSegmentProperties.cpp - created: 11/7/2004 - author: Paul D Turner - - purpose: Implements properties for the header segment class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListHeaderSegmentProperties.h" -#include "elements/CEGUIListHeaderSegment.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ListHeaderSegmentProperties namespace section -namespace ListHeaderSegmentProperties -{ -String Sizable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isSizingEnabled()); -} - - -void Sizable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSizingEnabled(PropertyHelper::stringToBool(value)); -} - - -String Clickable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isClickable()); -} - - -void Clickable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setClickable(PropertyHelper::stringToBool(value)); -} - - -String Dragable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isDragMovingEnabled()); -} - - -void Dragable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDragMovingEnabled(PropertyHelper::stringToBool(value)); -} - - -String SortDirection::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getSortDirection()) - { - case ListHeaderSegment::Ascending: - return String((utf8*)"Ascending"); - break; - - case ListHeaderSegment::Descending: - return String((utf8*)"Descending"); - break; - - default: - return String((utf8*)"None"); - break; - } - -} - - -void SortDirection::set(PropertyReceiver* receiver, const String& value) -{ - ListHeaderSegment::SortDirection dir; - - if (value == (utf8*)"Ascending") - { - dir = ListHeaderSegment::Ascending; - } - else if (value == (utf8*)"Descending") - { - dir = ListHeaderSegment::Descending; - } - else - { - dir = ListHeaderSegment::None; - } - - static_cast(receiver)->setSortDirection(dir); -} - - -} // End of ListHeaderSegmentProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListbox.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListbox.cpp deleted file mode 100644 index 1cd4aa245c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListbox.cpp +++ /dev/null @@ -1,1202 +0,0 @@ -/************************************************************************ - filename: CEGUIListbox.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Listbox widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIExceptions.h" -#include "CEGUIWindowManager.h" -#include "elements/CEGUIListbox.h" -#include "elements/CEGUIListboxItem.h" -#include "elements/CEGUIScrollbar.h" -#include "elements/CEGUITooltip.h" - -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Listbox::EventNamespace("Listbox"); - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -ListboxProperties::Sort Listbox::d_sortProperty; -ListboxProperties::MultiSelect Listbox::d_multiSelectProperty; -ListboxProperties::ForceVertScrollbar Listbox::d_forceVertProperty; -ListboxProperties::ForceHorzScrollbar Listbox::d_forceHorzProperty; -ListboxProperties::ItemTooltips Listbox::d_itemTooltipsProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// event names -const String Listbox::EventListContentsChanged( (utf8*)"ListItemsChanged" ); -const String Listbox::EventSelectionChanged( (utf8*)"ItemSelectionChanged" ); -const String Listbox::EventSortModeChanged( (utf8*)"SortModeChanged" ); -const String Listbox::EventMultiselectModeChanged( (utf8*)"MuliselectModeChanged" ); -const String Listbox::EventVertScrollbarModeChanged( (utf8*)"VertScrollModeChanged" ); -const String Listbox::EventHorzScrollbarModeChanged( (utf8*)"HorzScrollModeChanged" ); - - -/************************************************************************* - Constructor for Listbox base class. -*************************************************************************/ -Listbox::Listbox(const String& type, const String& name) - : Window(type, name), - d_sorted(false), - d_multiselect(false), - d_forceVertScroll(false), - d_forceHorzScroll(false), - d_itemTooltips(false), - d_lastSelected(NULL) -{ - // add new events specific to list box. - addListboxEvents(); - - addListboxProperties(); -} - - -/************************************************************************* - Destructor for Listbox base class. -*************************************************************************/ -Listbox::~Listbox(void) -{ - resetList_impl(); -} - - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void Listbox::initialise(void) -{ - // create the component sub-widgets - d_vertScrollbar = createVertScrollbar(getName() + "__auto_vscrollbar__"); - d_horzScrollbar = createHorzScrollbar(getName() + "__auto_hscrollbar__"); - - addChildWindow(d_vertScrollbar); - addChildWindow(d_horzScrollbar); - - d_vertScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&Listbox::handle_scrollChange, this)); - d_horzScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&Listbox::handle_scrollChange, this)); - - configureScrollbars(); - performChildWindowLayout(); -} - - -/************************************************************************* - Return the number of selected items in the list box. -*************************************************************************/ -size_t Listbox::getSelectedCount(void) const -{ - size_t count = 0; - - for (size_t index = 0; index < d_listItems.size(); ++index) - { - if (d_listItems[index]->isSelected()) - { - count++; - } - - } - - return count; -} - - -/************************************************************************* - Return a pointer to the first selected item. -*************************************************************************/ -ListboxItem* Listbox::getFirstSelectedItem(void) const -{ - return getNextSelected(NULL); -} - - -/************************************************************************* - Return a pointer to the next selected item after item 'start_item' -*************************************************************************/ -ListboxItem* Listbox::getNextSelected(const ListboxItem* start_item) const -{ - // if start_item is NULL begin search at begining, else start at item after start_item - size_t index = (start_item == NULL) ? 0 : (getItemIndex(start_item) + 1); - - while (index < d_listItems.size()) - { - // return pointer to this item if it's selected. - if (d_listItems[index]->isSelected()) - { - return d_listItems[index]; - } - // not selected, advance to next - else - { - index++; - } - - } - - // no more selected items. - return NULL; -} - - -/************************************************************************* - Return the item at index position 'index'. -*************************************************************************/ -ListboxItem* Listbox::getListboxItemFromIndex(size_t index) const -{ - if (index < d_listItems.size()) - { - return d_listItems[index]; - } - else - { - throw InvalidRequestException((utf8*)"Listbox::getListboxItemFromIndex - the specified index is out of range for this Listbox."); - } -} - - -/************************************************************************* - Return the index of ListboxItem \a item -*************************************************************************/ -size_t Listbox::getItemIndex(const ListboxItem* item) const -{ - LBItemList::const_iterator pos = std::find(d_listItems.begin(), d_listItems.end(), item); - - if (pos != d_listItems.end()) - { - return std::distance(d_listItems.begin(), pos); - } - else - { - throw InvalidRequestException((utf8*)"Listbox::getItemIndex - the specified ListboxItem is not attached to this Listbox."); - } - -} - - -/************************************************************************* - return whether the string at index position \a index is selected -*************************************************************************/ -bool Listbox::isItemSelected(size_t index) const -{ - if (index < d_listItems.size()) - { - return d_listItems[index]->isSelected(); - } - else - { - throw InvalidRequestException((utf8*)"Listbox::isItemSelected - the specified index is out of range for this Listbox."); - } - -} - - -/************************************************************************* - Search the list for an item with the specified text -*************************************************************************/ -ListboxItem* Listbox::findItemWithText(const String& text, const ListboxItem* start_item) -{ - // if start_item is NULL begin search at begining, else start at item after start_item - size_t index = (start_item == NULL) ? 0 : (getItemIndex(start_item) + 1); - - while (index < d_listItems.size()) - { - // return pointer to this item if it's text matches - if (d_listItems[index]->getText() == text) - { - return d_listItems[index]; - } - // no matching text, advance to next item - else - { - index++; - } - - } - - // no items matched. - return NULL; -} - - -/************************************************************************* - Return whether the specified ListboxItem is in the List -*************************************************************************/ -bool Listbox::isListboxItemInList(const ListboxItem* item) const -{ - return std::find(d_listItems.begin(), d_listItems.end(), item) != d_listItems.end(); -} - - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -void Listbox::resetList(void) -{ - if (resetList_impl()) - { - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Add the given ListboxItem to the list. -*************************************************************************/ -void Listbox::addItem(ListboxItem* item) -{ - if (item != NULL) - { - // establish ownership - item->setOwnerWindow(this); - - // if sorting is enabled, re-sort the list - if (isSortEnabled()) - { - d_listItems.insert(std::upper_bound(d_listItems.begin(), d_listItems.end(), item, &lbi_less), item); - - } - // not sorted, just stick it on the end. - else - { - d_listItems.push_back(item); - } - - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Insert an item into the list box after a specified item already in - the list. -*************************************************************************/ -void Listbox::insertItem(ListboxItem* item, const ListboxItem* position) -{ - // if the list is sorted, it's the same as a normal add operation - if (isSortEnabled()) - { - addItem(item); - } - else if (item != NULL) - { - // establish ownership - item->setOwnerWindow(this); - - // if position is NULL begin insert at begining, else insert after item 'position' - LBItemList::iterator ins_pos; - - if (position == NULL) - { - ins_pos = d_listItems.begin(); - } - else - { - ins_pos = std::find(d_listItems.begin(), d_listItems.end(), position); - - // throw if item 'position' is not in the list - if (ins_pos == d_listItems.end()) - { - throw InvalidRequestException((utf8*)"Listbox::insertItem - the specified ListboxItem for parameter 'position' is not attached to this Listbox."); - } - - } - - d_listItems.insert(ins_pos, item); - - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Removes the given item from the list box. -*************************************************************************/ -void Listbox::removeItem(const ListboxItem* item) -{ - if (item != NULL) - { - LBItemList::iterator pos = std::find(d_listItems.begin(), d_listItems.end(), item); - - // if item is in the list - if (pos != d_listItems.end()) - { - // disown item - (*pos)->setOwnerWindow(NULL); - - // remove item - d_listItems.erase(pos); - - // if item was the last selected item, reset that to NULL - if (item == d_lastSelected) - { - d_lastSelected = NULL; - } - - // if item is supposed to be deleted by us - if (item->isAutoDeleted()) - { - // clean up this item. - delete item; - } - - WindowEventArgs args(this); - onListContentsChanged(args); - } - - } - -} - - -/************************************************************************* - Clear the selected state for all items. -*************************************************************************/ -void Listbox::clearAllSelections(void) -{ - // only fire events and update if we actually made any changes - if (clearAllSelections_impl()) - { - WindowEventArgs args(this); - onSelectionChanged(args); - } - -} - - -/************************************************************************* - Set whether the list should be sorted. -*************************************************************************/ -void Listbox::setSortingEnabled(bool setting) -{ - // only react if the setting will change - if (d_sorted != setting) - { - d_sorted = setting; - - // if we are enabling sorting, we need to sort the list - if (d_sorted) - { - std::stable_sort(d_listItems.begin(), d_listItems.end(), &lbi_greater); - } - - WindowEventArgs args(this); - onSortModeChanged(args); - } - -} - - -/************************************************************************* - Set whether the list should allow multiple selections or just a - single selection -*************************************************************************/ -void Listbox::setMultiselectEnabled(bool setting) -{ - // only react if the setting is changed - if (d_multiselect != setting) - { - d_multiselect = setting; - - // if we change to single-select, deselect all except the first selected item. - WindowEventArgs args(this); - if ((!d_multiselect) && (getSelectedCount() > 1)) - { - ListboxItem* itm = getFirstSelectedItem(); - - while ((itm = getNextSelected(itm))) - { - itm->setSelected(false); - } - - onSelectionChanged(args); - - } - - onMultiselectModeChanged(args); - } - -} - -void Listbox::setItemTooltipsEnabled(bool setting) -{ - d_itemTooltips = setting; -} - - - -/************************************************************************* - Set whether the vertical scroll bar should always be shown. -*************************************************************************/ -void Listbox::setShowVertScrollbar(bool setting) -{ - if (d_forceVertScroll != setting) - { - d_forceVertScroll = setting; - - configureScrollbars(); - WindowEventArgs args(this); - onVertScrollbarModeChanged(args); - } - -} - - -/************************************************************************* - Set whether the horizontal scroll bar should always be shown. -*************************************************************************/ -void Listbox::setShowHorzScrollbar(bool setting) -{ - if (d_forceHorzScroll != setting) - { - d_forceHorzScroll = setting; - - configureScrollbars(); - WindowEventArgs args(this); - onHorzScrollbarModeChanged(args); - } - -} - - -/************************************************************************* - Set the select state of an attached ListboxItem. -*************************************************************************/ -void Listbox::setItemSelectState(ListboxItem* item, bool state) -{ - LBItemList::iterator pos = std::find(d_listItems.begin(), d_listItems.end(), item); - - if (pos != d_listItems.end()) - { - setItemSelectState(std::distance(d_listItems.begin(), pos), state); - } - else - { - throw InvalidRequestException((utf8*)"Listbox::setItemSelectState - the specified ListboxItem is not attached to this Listbox."); - } -} - - -/************************************************************************* - Set the select state of an attached ListboxItem. -*************************************************************************/ -void Listbox::setItemSelectState(size_t item_index, bool state) -{ - if (item_index < getItemCount()) - { - // only do this if the setting is changing - if (d_listItems[item_index]->isSelected() != state) - { - // conditions apply for single-select mode - if (state && !d_multiselect) - { - clearAllSelections_impl(); - } - - d_listItems[item_index]->setSelected(state); - WindowEventArgs args(this); - onSelectionChanged(args); - } - - } - else - { - throw InvalidRequestException((utf8*)"Listbox::setItemSelectState - the value passed in the 'item_index' parameter is out of range for this Listbox."); - } - -} - - -/************************************************************************* - Causes the list box to update it's internal state after changes have - been made to one or more attached ListboxItem objects. -*************************************************************************/ -void Listbox::handleUpdatedItemData(void) -{ - configureScrollbars(); - requestRedraw(); -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void Listbox::populateRenderCache() -{ - // get the derived class to render general stuff before we handle the items - cacheListboxBaseImagery(); - - // - // Render list items - // - Vector3 itemPos; - Size itemSize; - Rect itemClipper, itemRect; - float widest = getWidestItemWidth(); - - // calculate position of area we have to render into - Rect itemsArea(getListRenderArea()); - - // set up some initial positional details for items - itemPos.d_x = itemsArea.d_left - d_horzScrollbar->getScrollPosition(); - itemPos.d_y = itemsArea.d_top - d_vertScrollbar->getScrollPosition(); - itemPos.d_z = System::getSingleton().getRenderer()->getZLayer(3) - System::getSingleton().getRenderer()->getCurrentZ(); - - float alpha = getEffectiveAlpha(); - - // loop through the items - size_t itemCount = getItemCount(); - - for (size_t i = 0; i < itemCount; ++i) - { - itemSize.d_height = d_listItems[i]->getPixelSize().d_height; - - // allow item to have full width of box if this is wider than items - itemSize.d_width = ceguimax(itemsArea.getWidth(), widest); - - // calculate destination area for this item. - itemRect.d_left = itemPos.d_x; - itemRect.d_top = itemPos.d_y; - itemRect.setSize(itemSize); - itemClipper = itemRect.getIntersection(itemsArea); - - // skip this item if totally clipped - if (itemClipper.getWidth() == 0) - { - itemPos.d_y += itemSize.d_height; - continue; - } - - // draw this item - d_listItems[i]->draw(d_renderCache, itemRect, itemPos.d_z, alpha, &itemClipper); - - // update position ready for next item - itemPos.d_y += itemSize.d_height; - } - -} - - -/************************************************************************* - display required integrated scroll bars according to current state - of the list box and update their values. -*************************************************************************/ -void Listbox::configureScrollbars(void) -{ - Scrollbar* vertScrollbar; - Scrollbar* horzScrollbar; - - try - { - vertScrollbar = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_vscrollbar__")); - horzScrollbar = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_hscrollbar__")); - } - catch (UnknownObjectException) - { - // no scrollbars? Can't configure then! - return; - } - - float totalHeight = getTotalItemsHeight(); - float widestItem = getWidestItemWidth(); - - // - // First show or hide the scroll bars as needed (or requested) - // - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getListRenderArea().getHeight()) || d_forceVertScroll) - { - vertScrollbar->show(); - - // show or hide horizontal scroll bar as required (or as specified by option) - if ((widestItem > getListRenderArea().getWidth()) || d_forceHorzScroll) - { - horzScrollbar->show(); - } - else - { - horzScrollbar->hide(); - } - - } - else - { - // show or hide horizontal scroll bar as required (or as specified by option) - if ((widestItem > getListRenderArea().getWidth()) || d_forceHorzScroll) - { - horzScrollbar->show(); - - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getListRenderArea().getHeight()) || d_forceVertScroll) - { - vertScrollbar->show(); - } - else - { - vertScrollbar->hide(); - } - - } - else - { - vertScrollbar->hide(); - horzScrollbar->hide(); - } - - } - - // - // Set up scroll bar values - // - Rect renderArea(getListRenderArea()); - - vertScrollbar->setDocumentSize(totalHeight); - vertScrollbar->setPageSize(renderArea.getHeight()); - vertScrollbar->setStepSize(ceguimax(1.0f, renderArea.getHeight() / 10.0f)); - vertScrollbar->setScrollPosition(vertScrollbar->getScrollPosition()); - - horzScrollbar->setDocumentSize(widestItem); - horzScrollbar->setPageSize(renderArea.getWidth()); - horzScrollbar->setStepSize(ceguimax(1.0f, renderArea.getWidth() / 10.0f)); - horzScrollbar->setScrollPosition(horzScrollbar->getScrollPosition()); -} - - -/************************************************************************* - select all strings between positions 'start' and 'end' (inclusive) -*************************************************************************/ -void Listbox::selectRange(size_t start, size_t end) -{ - // only continue if list has some items - if (d_listItems.size() > 0) - { - // if start is out of range, start at begining. - if (start > d_listItems.size()) - { - start = 0; - } - - // if end is out of range end at the last item. - if (end >= d_listItems.size()) - { - end = d_listItems.size() - 1; - } - - // ensure start becomes before the end. - if (start > end) - { - size_t tmp; - tmp = start; - start = end; - end = tmp; - } - - // perform selections - for( ; start <= end; ++start) - { - d_listItems[start]->setSelected(true); - } - - } - -} - - -/************************************************************************* - Return the sum of all item heights -*************************************************************************/ -float Listbox::getTotalItemsHeight(void) const -{ - float height = 0; - - for (size_t i = 0; i < getItemCount(); ++i) - { - height += d_listItems[i]->getPixelSize().d_height; - } - - return height; -} - - -/************************************************************************* - Return the width of the widest item -*************************************************************************/ -float Listbox::getWidestItemWidth(void) const -{ - float widest = 0; - - for (size_t i = 0; i < getItemCount(); ++i) - { - float thisWidth = d_listItems[i]->getPixelSize().d_width; - - if (thisWidth > widest) - { - widest = thisWidth; - } - - } - - return widest; -} - - -/************************************************************************* - Clear the selected state for all items (implementation) -*************************************************************************/ -bool Listbox::clearAllSelections_impl(void) -{ - // flag used so we can track if we did anything. - bool modified = false; - - for (size_t index = 0; index < d_listItems.size(); ++index) - { - if (d_listItems[index]->isSelected()) - { - d_listItems[index]->setSelected(false); - modified = true; - } - - } - - return modified; -} - - -/************************************************************************* - Return the ListboxItem under the given window local pixel co-ordinate. -*************************************************************************/ -ListboxItem* Listbox::getItemAtPoint(const Point& pt) const -{ - Rect renderArea(getListRenderArea()); - - // point must be within the rendering area of the Listbox. - if (renderArea.isPointInRect(pt)) - { - float y = renderArea.d_top - d_vertScrollbar->getScrollPosition(); - - // test if point is above first item - if (pt.d_y >= y) - { - for (size_t i = 0; i < getItemCount(); ++i) - { - y += d_listItems[i]->getPixelSize().d_height; - - if (pt.d_y < y) - { - return d_listItems[i]; - } - - } - } - } - - return NULL; -} - - -/************************************************************************* - Add list box specific events -*************************************************************************/ -void Listbox::addListboxEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventListContentsChanged); - addEvent(EventSelectionChanged); - addEvent(EventSortModeChanged); - addEvent(EventMultiselectModeChanged); - addEvent(EventVertScrollbarModeChanged); - addEvent(EventHorzScrollbarModeChanged); - } -} - - -/************************************************************************* - Handler called internally when the list contents are changed -*************************************************************************/ -void Listbox::onListContentsChanged(WindowEventArgs& e) -{ - configureScrollbars(); - requestRedraw(); - fireEvent(EventListContentsChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called internally when the currently selected item or items - changes. -*************************************************************************/ -void Listbox::onSelectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSelectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called internally when the sort mode setting changes. -*************************************************************************/ -void Listbox::onSortModeChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSortModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called internally when the multi-select mode setting changes. -*************************************************************************/ -void Listbox::onMultiselectModeChanged(WindowEventArgs& e) -{ - fireEvent(EventMultiselectModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called internally when the forced display of the vertical - scroll bar setting changes. -*************************************************************************/ -void Listbox::onVertScrollbarModeChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventVertScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called internally when the forced display of the horizontal - scroll bar setting changes. -*************************************************************************/ -void Listbox::onHorzScrollbarModeChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventHorzScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler for when we are sized -*************************************************************************/ -void Listbox::onSized(WindowEventArgs& e) -{ - // base class handling - Window::onSized(e); - - configureScrollbars(); - - e.handled = true; -} - - -/************************************************************************* - Handler for when mouse button is pressed -*************************************************************************/ -void Listbox::onMouseButtonDown(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - bool modified = false; - - // clear old selections if no control key is pressed or if multi-select is off - if (!(e.sysKeys & Control) || !d_multiselect) - { - modified = clearAllSelections_impl(); - } - - Point localPos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localPos = relativeToAbsolute(localPos); - } - - ListboxItem* item = getItemAtPoint(localPos); - - if (item != NULL) - { - modified = true; - - // select range or item, depending upon keys and last selected item - if (((e.sysKeys & Shift) && (d_lastSelected != NULL)) && d_multiselect) - { - selectRange(getItemIndex(item), getItemIndex(d_lastSelected)); - } - else - { - item->setSelected(item->isSelected() ^ true); - } - - // update last selected item - d_lastSelected = item->isSelected() ? item : NULL; - } - - // fire event if needed - if (modified) - { - WindowEventArgs args(this); - onSelectionChanged(args); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse wheel changes -*************************************************************************/ -void Listbox::onMouseWheel(MouseEventArgs& e) -{ - // base class processing. - Window::onMouseWheel(e); - - if (d_vertScrollbar->isVisible() && (d_vertScrollbar->getDocumentSize() > d_vertScrollbar->getPageSize())) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + d_vertScrollbar->getStepSize() * -e.wheelChange); - } - else if (d_horzScrollbar->isVisible() && (d_horzScrollbar->getDocumentSize() > d_horzScrollbar->getPageSize())) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + d_horzScrollbar->getStepSize() * -e.wheelChange); - } - - e.handled = true; -} - -/************************************************************************* - Handler for mouse movement -*************************************************************************/ -void Listbox::onMouseMove(MouseEventArgs& e) -{ - if (d_itemTooltips) - { - static ListboxItem* lastItem = NULL; - - Point posi = relativeToAbsolute(screenToWindow(e.position)); - ListboxItem* item = getItemAtPoint(posi); - if (item != lastItem) - { - if (item != NULL) - { - setTooltipText(item->getTooltipText()); - } - else - { - setTooltipText(""); - } - lastItem = item; - } - - // must check the result from getTooltip(), as the tooltip object could - // be 0 at any time for various reasons. - Tooltip* tooltip = getTooltip(); - - if (tooltip) - { - if (tooltip->getTargetWindow() != this) - tooltip->setTargetWindow(this); - else - tooltip->positionSelf(); - } - } - - Window::onMouseMove(e); -} - - -/************************************************************************* - Ensure the item at the specified index is visible within the list box. -*************************************************************************/ -void Listbox::ensureItemIsVisible(size_t item_index) -{ - // handle simple "scroll to the bottom" case - if (item_index >= getItemCount()) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getDocumentSize() - d_vertScrollbar->getPageSize()); - } - else - { - float bottom; - float listHeight = getListRenderArea().getHeight(); - float top = 0; - - // get height to top of item - size_t i; - for (i = 0; i < item_index; ++i) - { - top += d_listItems[i]->getPixelSize().d_height; - } - - // calculate height to bottom of item - bottom = top + d_listItems[i]->getPixelSize().d_height; - - // account for current scrollbar value - float currPos = d_vertScrollbar->getScrollPosition(); - top -= currPos; - bottom -= currPos; - - // if top is above the view area, or if item is too big to fit - if ((top < 0.0f) || ((bottom - top) > listHeight)) - { - // scroll top of item to top of box. - d_vertScrollbar->setScrollPosition(currPos + top); - } - // if bottom is below the view area - else if (bottom >= listHeight) - { - // position bottom of item at the bottom of the list - d_vertScrollbar->setScrollPosition(currPos + bottom - listHeight); - } - - // Item is already fully visible - nothing more to do. - } - -} - - -/************************************************************************* - Ensure the item at the specified index is visible within the list box. -*************************************************************************/ -void Listbox::ensureItemIsVisible(const ListboxItem* item) -{ - ensureItemIsVisible(getItemIndex(item)); -} - - -/************************************************************************* - Return whether the vertical scroll bar is always shown. -*************************************************************************/ -bool Listbox::isVertScrollbarAlwaysShown(void) const -{ - return d_forceVertScroll; -} - - -/************************************************************************* - Return whether the horizontal scroll bar is always shown. -*************************************************************************/ -bool Listbox::isHorzScrollbarAlwaysShown(void) const -{ - return d_forceHorzScroll; -} - -/************************************************************************* - Add properties for this class -*************************************************************************/ -void Listbox::addListboxProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_sortProperty); - addProperty(&d_multiSelectProperty); - addProperty(&d_forceHorzProperty); - addProperty(&d_forceVertProperty); - addProperty(&d_itemTooltipsProperty); - } -} - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -bool Listbox::resetList_impl(void) -{ - // just return false if the list is already empty - if (getItemCount() == 0) - { - return false; - } - // we have items to be removed and possible deleted - else - { - // delete any items we are supposed to - for (size_t i = 0; i < getItemCount(); ++i) - { - // if item is supposed to be deleted by us - if (d_listItems[i]->isAutoDeleted()) - { - // clean up this item. - delete d_listItems[i]; - } - - } - - // clear out the list. - d_listItems.clear(); - - d_lastSelected = NULL; - - return true; - } - -} - -/************************************************************************* - Handler for scroll position changes. -*************************************************************************/ -bool Listbox::handle_scrollChange(const EventArgs& args) -{ - // simply trigger a redraw of the Listbox. - requestRedraw(); - return true; -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Functions used for predicates in std algorithms -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - used for < comparisons between ListboxItem pointers -*************************************************************************/ -bool lbi_less(const ListboxItem* a, const ListboxItem* b) -{ - return *a < *b; -} - -/************************************************************************* - used for > comparisons between ListboxItem pointers -*************************************************************************/ -bool lbi_greater(const ListboxItem* a, const ListboxItem* b) -{ - return *a > *b; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxImageItem.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxImageItem.cpp deleted file mode 100644 index 296c8d712b..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxImageItem.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxImageItem.cpp - created: 25/2/2006 - author: C E Etheredge - - purpose: Implementation of List box image items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListboxImageItem.h" -#include "CEGUIWindow.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImage.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constructor -*************************************************************************/ -ListboxImageItem::ListboxImageItem(const Image* image, uint item_id, void* item_data, bool disabled, bool auto_delete) : - ListboxItem("", item_id, item_data, disabled, auto_delete), - d_image(image) -{ -} - - -/************************************************************************* - Return a pointer to the image being used by this ListboxImageItem -*************************************************************************/ -const Image* ListboxImageItem::getImage(void) const -{ - if (d_image != NULL) - { - return d_image; - } - return d_image; -} - - -/************************************************************************* - Return the rendered pixel size of this list box item. -*************************************************************************/ -Size ListboxImageItem::getPixelSize(void) -{ - if ( !d_bSizeChanged ) - return d_savedPixelSize; - - Size tmp(0,0); - - if (d_image != NULL) - { - tmp.d_height = PixelAligned(d_image->getHeight()); - tmp.d_width = PixelAligned(d_image->getWidth()); - } - - d_bSizeChanged = false; - d_savedPixelSize = tmp; - return tmp; -} - - -/************************************************************************* - Draw the list box item in its current state. -*************************************************************************/ -void ListboxImageItem::draw(const Vector3& position, float alpha, const Rect& clipper) const -{ - if (d_selected && (d_selectBrush != NULL)) - { - d_selectBrush->draw(clipper, position.d_z, clipper, getModulateAlphaColourRect(d_selectCols, alpha)); - } - - if (d_image != NULL) - { - d_image->draw(position, clipper); - } -} - -void ListboxImageItem::draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const -{ - if (d_selected && d_selectBrush != 0) - { - cache.cacheImage(*d_selectBrush, targetRect, zBase, getModulateAlphaColourRect(d_selectCols, alpha), clipper); - } - - if (d_image != NULL) - { - cache.cacheImage(*d_image, targetRect, zBase, ColourRect(colour(1,1,1,alpha)), clipper); - } -} - - -bool ListboxImageItem::operator < ( const ListboxItem& rhs ) const -{ - // Compare the pointers - ListboxImageItem* item = ( ListboxImageItem* ) &rhs; - return d_image < item->getImage(); -} - - -bool ListboxImageItem::operator > ( const ListboxItem& rhs ) const -{ - // Compare the pointers - ListboxImageItem* item = ( ListboxImageItem* ) &rhs; - return d_image > item->getImage(); -} - - -} // End of CEGUI namespace section \ No newline at end of file diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxItem.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxItem.cpp deleted file mode 100644 index 313d9fd8a3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxItem.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxItem.cpp - created: 12/6/2004 - author: Paul D Turner - - purpose: Implementation of base class for list items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListboxItem.h" -#include "CEGUISystem.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants -*************************************************************************/ -const colour ListboxItem::DefaultSelectionColour = 0xFF607FFF; - -/************************************************************************* - Base class constructor -*************************************************************************/ -ListboxItem::ListboxItem(const String& text, uint item_id, void* item_data, bool disabled, bool auto_delete) : - d_itemText_raw(text), - d_itemID(item_id), - d_itemData(item_data), - d_selected(false), - d_disabled(disabled), - d_autoDelete(auto_delete), - d_owner(NULL), - d_selectCols(DefaultSelectionColour, DefaultSelectionColour, DefaultSelectionColour, DefaultSelectionColour), - d_selectBrush(NULL), - d_bSizeChanged(true), - d_savedPixelSize(10,10) -{ - d_itemText = d_itemText_raw.bidify(); -} - - -void ListboxItem::setText(const String& text, const char* sortText) -{ - d_bSizeChanged |= (d_itemText_raw != text); - d_itemText_raw = text; - d_itemText = d_itemText_raw.bidify(); - if ( sortText ) - d_itemSortText.assign ( sortText ); - else - d_itemSortText.clear (); -} - - -/************************************************************************* - Set the selection highlighting brush image. -*************************************************************************/ -void ListboxItem::setSelectionBrushImage(const String& imageset, const String& image) -{ - setSelectionBrushImage(&ImagesetManager::getSingleton().getImageset(imageset)->getImage(image)); -} - - -/************************************************************************* - Return a ColourRect object describing the colours in 'cols' after - having their alpha component modulated by the value 'alpha'. -*************************************************************************/ -ColourRect ListboxItem::getModulateAlphaColourRect(const ColourRect& cols, float alpha) const -{ - return ColourRect - ( - calculateModulatedAlphaColour(cols.d_top_left, alpha), - calculateModulatedAlphaColour(cols.d_top_right, alpha), - calculateModulatedAlphaColour(cols.d_bottom_left, alpha), - calculateModulatedAlphaColour(cols.d_bottom_right, alpha) - ); -} - - -/************************************************************************* - Return a colour value describing the colour specified by 'col' after - having its alpha component modulated by the value 'alpha'. -*************************************************************************/ -colour ListboxItem::calculateModulatedAlphaColour(colour col, float alpha) const -{ - colour temp(col); - temp.setAlpha(temp.getAlpha() * alpha); - return temp; -} - - -/************************************************************************* - Set the colours used for selection highlighting. -*************************************************************************/ -void ListboxItem::setSelectionColours(colour top_left_colour, colour top_right_colour, colour bottom_left_colour, colour bottom_right_colour) -{ - d_selectCols.d_top_left = top_left_colour; - d_selectCols.d_top_right = top_right_colour; - d_selectCols.d_bottom_left = bottom_left_colour; - d_selectCols.d_bottom_right = bottom_right_colour; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxNumberItem.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxNumberItem.cpp deleted file mode 100644 index 3d652f6f30..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxNumberItem.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxNumberItem.cpp - created: 25/2/2006 - author: C E Etheredge - - purpose: Implementation of List box text items containing numbers -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListboxNumberItem.h" -#include "CEGUIFontManager.h" -#include "CEGUIFont.h" -#include "CEGUIWindow.h" -#include "CEGUIImage.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants -*************************************************************************/ -const colour ListboxNumberItem::DefaultTextColour = 0xFFFFFFFF; - - -/************************************************************************* - Constructor -*************************************************************************/ -ListboxNumberItem::ListboxNumberItem(const String& text, uint item_id, void* item_data, bool disabled, bool auto_delete) : - ListboxItem(text, item_id, item_data, disabled, auto_delete), - d_textCols(DefaultTextColour, DefaultTextColour, DefaultTextColour, DefaultTextColour), - d_font(NULL) -{ -} - - -/************************************************************************* - Return a pointer to the font being used by this ListboxNumberItem -*************************************************************************/ -const Font* ListboxNumberItem::getFont(void) const -{ - // prefer out own font - if (d_font != NULL) - { - return d_font; - } - // try our owner window's font setting (may be null if owner uses no existant default font) - else if (d_owner != NULL) - { - return d_owner->getFont(); - } - // no owner, just use the default (which may be NULL anyway) - else - { - return System::getSingleton().getDefaultFont(); - } - -} - - -/************************************************************************* - Set the font to be used by this ListboxNumberItem -*************************************************************************/ -void ListboxNumberItem::setFont(const String& font_name) -{ - setFont(FontManager::getSingleton().getFont(font_name)); -} - -/************************************************************************* - Return the rendered pixel size of this list box item. -*************************************************************************/ -Size ListboxNumberItem::getPixelSize(void) -{ - if ( !d_bSizeChanged ) - return d_savedPixelSize; - - Size tmp(0,0); - - const Font* fnt = getFont(); - - if (fnt != NULL) - { - tmp.d_height = PixelAligned(fnt->getLineSpacing()); - tmp.d_width = PixelAligned(fnt->getTextExtent(d_itemText)); - } - - d_bSizeChanged = false; - d_savedPixelSize = tmp; - return tmp; -} - -/************************************************************************* - Draw the list box item in its current state. -*************************************************************************/ -void ListboxNumberItem::draw(const Vector3& position, float alpha, const Rect& clipper) const -{ - if (d_selected && (d_selectBrush != NULL)) - { - d_selectBrush->draw(clipper, position.d_z, clipper, getModulateAlphaColourRect(d_selectCols, alpha)); - } - - const Font* fnt = getFont(); - - if (fnt != NULL) - { - Vector3 finalPos(position); - finalPos.d_y -= PixelAligned((fnt->getLineSpacing() - fnt->getBaseline()) * 0.5f); - fnt->drawText(d_itemText, finalPos, clipper, getModulateAlphaColourRect(d_textCols, alpha)); - } - -} - -void ListboxNumberItem::draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const -{ - if (d_selected && d_selectBrush != 0) - { - cache.cacheImage(*d_selectBrush, targetRect, zBase, getModulateAlphaColourRect(d_selectCols, alpha), clipper); - } - - const Font* font = getFont(); - - if (font) - { - Rect finalPos(targetRect); - finalPos.d_top -= (font->getLineSpacing() - font->getBaseline()) * 0.5f; - cache.cacheText(d_itemText, font, LeftAligned, finalPos, zBase, getModulateAlphaColourRect(d_textCols, alpha), clipper); - } -} - - -/************************************************************************* - Set the colours used for text rendering. -*************************************************************************/ -void ListboxNumberItem::setTextColours(colour top_left_colour, colour top_right_colour, colour bottom_left_colour, colour bottom_right_colour) -{ - d_textCols.d_top_left = top_left_colour; - d_textCols.d_top_right = top_right_colour; - d_textCols.d_bottom_left = bottom_left_colour; - d_textCols.d_bottom_right = bottom_right_colour; -} - - -bool ListboxNumberItem::operator < ( const ListboxItem& rhs ) const -{ - return atoi ( getSortText().c_str () ) < atoi ( rhs.getSortText ().c_str () ); -} - - -bool ListboxNumberItem::operator > ( const ListboxItem& rhs ) const -{ - return atoi ( getSortText().c_str () ) > atoi ( rhs.getSortText ().c_str () ); -} - - -} // End of CEGUI namespace section \ No newline at end of file diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxProperties.cpp deleted file mode 100644 index 1bd314c851..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxProperties.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxProperties.cpp - created: 11/7/2004 - author: Paul D Turner - - purpose: Implements Listbox Property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListboxProperties.h" -#include "elements/CEGUIListbox.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ListboxProperties namespace section -namespace ListboxProperties -{ -String Sort::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isSortEnabled()); -} - - -void Sort::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSortingEnabled(PropertyHelper::stringToBool(value)); -} - - -String MultiSelect::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isMultiselectEnabled()); -} - - -void MultiSelect::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMultiselectEnabled(PropertyHelper::stringToBool(value)); -} - - -String ForceVertScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isVertScrollbarAlwaysShown()); -} - - -void ForceVertScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setShowVertScrollbar(PropertyHelper::stringToBool(value)); -} - - -String ForceHorzScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isHorzScrollbarAlwaysShown()); -} - - -void ForceHorzScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setShowHorzScrollbar(PropertyHelper::stringToBool(value)); -} - -String ItemTooltips::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isItemTooltipsEnabled()); -} - - -void ItemTooltips::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setItemTooltipsEnabled(PropertyHelper::stringToBool(value)); -} - -} // End of ListboxProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxTextItem.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxTextItem.cpp deleted file mode 100644 index b6c7daeaa3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIListboxTextItem.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/************************************************************************ - filename: CEGUIListboxTextItem.cpp - created: 12/6/2004 - author: Paul D Turner - - purpose: Implementation of List box text items -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIListboxTextItem.h" -#include "CEGUIFontManager.h" -#include "CEGUIFont.h" -#include "CEGUIWindow.h" -#include "CEGUIImage.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants -*************************************************************************/ -const colour ListboxTextItem::DefaultTextColour = 0xFFFFFFFF; - - -/************************************************************************* - Constructor -*************************************************************************/ -ListboxTextItem::ListboxTextItem(const String& text, uint item_id, void* item_data, bool disabled, bool auto_delete) : - ListboxItem(text, item_id, item_data, disabled, auto_delete), - d_textCols(DefaultTextColour, DefaultTextColour, DefaultTextColour, DefaultTextColour), - d_font(NULL) -{ -} - - -/************************************************************************* - Return a pointer to the font being used by this ListboxTextItem -*************************************************************************/ -const Font* ListboxTextItem::getFont(void) const -{ - // prefer out own font - if (d_font != NULL) - { - return d_font; - } - // try our owner window's font setting (may be null if owner uses no existant default font) - else if (d_owner != NULL) - { - return d_owner->getFont(); - } - // no owner, just use the default (which may be NULL anyway) - else - { - return System::getSingleton().getDefaultFont(); - } - -} - - -/************************************************************************* - Set the font to be used by this ListboxTextItem -*************************************************************************/ -void ListboxTextItem::setFont(const String& font_name) -{ - setFont(FontManager::getSingleton().getFont(font_name)); -} - -/************************************************************************* - Return the rendered pixel size of this list box item. -*************************************************************************/ -Size ListboxTextItem::getPixelSize(void) -{ - if ( !d_bSizeChanged ) - return d_savedPixelSize; - - Size tmp(0,0); - - const Font* fnt = getFont(); - - if (fnt != NULL) - { - tmp.d_height = PixelAligned(fnt->getLineSpacing()); - tmp.d_width = PixelAligned(fnt->getTextExtent(d_itemText)); - } - - d_bSizeChanged = false; - d_savedPixelSize = tmp; - return tmp; -} - - -/************************************************************************* - Draw the list box item in its current state. -*************************************************************************/ -void ListboxTextItem::draw(const Vector3& position, float alpha, const Rect& clipper) const -{ - if (d_selected && (d_selectBrush != NULL)) - { - d_selectBrush->draw(clipper, position.d_z, clipper, getModulateAlphaColourRect(d_selectCols, alpha)); - } - - const Font* fnt = getFont(); - - if (fnt != NULL) - { - Vector3 finalPos(position); - finalPos.d_y -= PixelAligned((fnt->getLineSpacing() - fnt->getBaseline()) * 0.5f); - fnt->drawText(d_itemText, finalPos, clipper, getModulateAlphaColourRect(d_textCols, alpha)); - } - -} - -void ListboxTextItem::draw(RenderCache& cache,const Rect& targetRect, float zBase, float alpha, const Rect* clipper) const -{ - if (d_selected && d_selectBrush != 0) - { - cache.cacheImage(*d_selectBrush, targetRect, zBase, getModulateAlphaColourRect(d_selectCols, alpha), clipper); - } - - const Font* font = getFont(); - - if (font) - { - Rect finalPos(targetRect); - finalPos.d_top -= (font->getLineSpacing() - font->getBaseline()) * 0.5f; - cache.cacheText(d_itemText, font, LeftAligned, finalPos, zBase, getModulateAlphaColourRect(d_textCols, alpha), clipper); - } -} - - -/************************************************************************* - Set the colours used for text rendering. -*************************************************************************/ -void ListboxTextItem::setTextColours(colour top_left_colour, colour top_right_colour, colour bottom_left_colour, colour bottom_right_colour) -{ - d_textCols.d_top_left = top_left_colour; - d_textCols.d_top_right = top_right_colour; - d_textCols.d_bottom_left = bottom_left_colour; - d_textCols.d_bottom_right = bottom_right_colour; -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBase.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBase.cpp deleted file mode 100644 index ee27621f59..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBase.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuBase.cpp - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Implementation of MenuBase widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMenuBase.h" -#include "elements/CEGUIPopupMenu.h" -#include "elements/CEGUIMenuItem.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -Definition of Properties for this class -*************************************************************************/ -MenuBaseProperties::ItemSpacing MenuBase::d_itemSpacingProperty; -MenuBaseProperties::HorzPadding MenuBase::d_horzPaddingProperty; -MenuBaseProperties::VertPadding MenuBase::d_vertPaddingProperty; -MenuBaseProperties::BorderWidth MenuBase::d_borderWidthProperty; -MenuBaseProperties::BackgroundColours MenuBase::d_backgroundColoursProperty; -MenuBaseProperties::AllowMultiplePopups MenuBase::d_allowMultiplePopupsProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -const colour MenuBase::DefaultBackgroundColour = 0xFFFFFFFF; - -// event strings -const String MenuBase::EventNamespace("MenuBase"); -const String MenuBase::EventPopupOpened( (utf8*)"PopupOpened" ); -const String MenuBase::EventPopupClosed( (utf8*)"PopupClosed" ); - -/************************************************************************* - Constructor for MenuBase base class. -*************************************************************************/ -MenuBase::MenuBase(const String& type, const String& name) - : ItemListBase(type, name), - d_itemSpacing(0.0f), - d_horzPadding(0.0f), - d_vertPadding(0.0f), - d_borderWidth(0.0f), - d_backgroundColours(DefaultBackgroundColour), - d_popup(NULL), - d_allowMultiplePopups(false) -{ - // add new events specific to MenuBase. - addMenuBaseEvents(); - - // add properties for MenuBase class - addMenuBaseProperties(); -} - - -/************************************************************************* - Destructor for MenuBase base class. -*************************************************************************/ -MenuBase::~MenuBase(void) -{ -} - - -/************************************************************************* - Change the currently open MenuItem PopupMenu -*************************************************************************/ -void MenuBase::changePopupMenuItem(MenuItem* item) -{ - if (!d_allowMultiplePopups&&d_popup==item) - return; - - if (!d_allowMultiplePopups&&d_popup!=NULL) - { - d_popup->closePopupMenu(false); - WindowEventArgs we(d_popup->getPopupMenu()); - d_popup = NULL; - onPopupClosed(we); - } - - if (item!=NULL) - { - d_popup = item; - d_popup->getPopupMenu()->openPopupMenu(); - WindowEventArgs we(d_popup->getPopupMenu()); - onPopupOpened(we); - } - -} - - -/************************************************************************* - Add MenuBase specific events -*************************************************************************/ -void MenuBase::addMenuBaseEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventPopupOpened); - addEvent(EventPopupClosed); - } -} - - -/************************************************************************* - handler invoked internally when the a MenuItem attached to this - MenuBase opens its popup. -*************************************************************************/ -void MenuBase::onPopupOpened(WindowEventArgs& e) -{ - fireEvent(EventPopupOpened, e, EventNamespace); -} - - -/************************************************************************* - handler invoked internally when the a MenuItem attached to this - MenuBase closes its popup. -*************************************************************************/ -void MenuBase::onPopupClosed(WindowEventArgs& e) -{ - fireEvent(EventPopupClosed, e, EventNamespace); -} - - -void MenuBase::addMenuBaseProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_itemSpacingProperty); - addProperty(&d_horzPaddingProperty); - addProperty(&d_vertPaddingProperty); - addProperty(&d_borderWidthProperty); - addProperty(&d_backgroundColoursProperty); - addProperty(&d_allowMultiplePopupsProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBaseProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBaseProperties.cpp deleted file mode 100644 index c9bc87979c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuBaseProperties.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuBaseProperties.cpp - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMenuBaseProperties.h" -#include "elements/CEGUIMenuBase.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of MenuBaseProperties namespace section -namespace MenuBaseProperties -{ - -String ItemSpacing::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getItemSpacing()); -} - -void ItemSpacing::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setItemSpacing(PropertyHelper::stringToFloat(value)); -} - - -String HorzPadding::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getHorzPadding()); -} - -void HorzPadding::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHorzPadding(PropertyHelper::stringToFloat(value)); -} - - -String VertPadding::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getVertPadding()); -} - -void VertPadding::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setVertPadding(PropertyHelper::stringToFloat(value)); -} - - -String BorderWidth::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getBorderWidth()); -} - -void BorderWidth::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setBorderWidth(PropertyHelper::stringToFloat(value)); -} - - -String BackgroundColours::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourRectToString(static_cast(receiver)->getBackgroundColours()); -} - -void BackgroundColours::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setBackgroundColours(PropertyHelper::stringToColourRect(value)); -} - -String AllowMultiplePopups::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isMultiplePopupsAllowed()); -} - -void AllowMultiplePopups::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAllowMultiplePopups(PropertyHelper::stringToBool(value)); -} - -} // End of MenuBaseProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItem.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItem.cpp deleted file mode 100644 index db86d603a0..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItem.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuItem.cpp - created: 2/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Implementation of MenuItem widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMenuItem.h" -#include "elements/CEGUIMenubar.h" -#include "elements/CEGUIPopupMenu.h" - -#include "CEGUILogger.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -Definition of Properties for this class -*************************************************************************/ -MenuItemProperties::HoverColour MenuItem::d_hoverColourProperty; -MenuItemProperties::PushedColour MenuItem::d_pushedColourProperty; -MenuItemProperties::OpenedColour MenuItem::d_openedColourProperty; -MenuItemProperties::NormalTextColour MenuItem::d_normalTextColourProperty; -MenuItemProperties::DisabledTextColour MenuItem::d_disabledTextColourProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// default colours for rendering -const colour MenuItem::DefaultHoverColour = 0xFFFFFFFF; -const colour MenuItem::DefaultPushedColour = 0xFFFFFFFF; -const colour MenuItem::DefaultOpenedColour = 0xFFEFEFEF; -const colour MenuItem::DefaultNormalTextColour = 0xFFFFFFFF; -const colour MenuItem::DefaultDisabledTextColour = 0xFF7F7F7F; - -// event strings -const String MenuItem::EventNamespace("MenuItem"); -const String MenuItem::EventClicked( (utf8*)"Clicked" ); - - -/************************************************************************* - Constructor for MenuItem base class. -*************************************************************************/ -MenuItem::MenuItem(const String& type, const String& name) - : TextItem(type, name), - d_pushed(false), - d_hovering(false), - d_opened(false), - d_hoverColour(DefaultHoverColour), - d_pushedColour(DefaultPushedColour), - d_openedColour(DefaultOpenedColour), - d_normalTextColour(DefaultNormalTextColour), - d_disabledTextColour(DefaultDisabledTextColour), - d_popup(NULL) -{ - // menuitems dont want multi-click events - setWantsMultiClickEvents(false); - - // add the additional events generated by this derived class - addMenuItemEvents(); - - addMenuItemProperties(); -} - - -/************************************************************************* - Destructor for MenuItem base class. -*************************************************************************/ -MenuItem::~MenuItem(void) -{ -} - - -/************************************************************************* - Update the internal state of the Widget -*************************************************************************/ -void MenuItem::updateInternalState(const Point& mouse_pos) -{ - bool oldstate = d_hovering; - - // assume not hovering - d_hovering = false; - - // if input is captured, but not by 'this', then we never hover highlight - const Window* capture_wnd = getCaptureWindow(); - - if ((capture_wnd == NULL) || (capture_wnd == this)) - { - Window* sheet = System::getSingleton().getGUISheet(); - - if (sheet != NULL) - { - // check if hovering highlight is required, which is basically ("mouse over widget" XOR "widget pushed"). - if ((this == sheet->getChildAtPosition(mouse_pos)) != d_pushed) - { - d_hovering = true; - - // are we attached to a menu ? - if (getParent()->testClassName("MenuBase")) - { - MenuBase* menu = (MenuBase*)getParent(); - - // is item really in list ? - if (menu->isItemInList(this)) - { - // does this menubar only allow one popup open? and is there a popup open? - if ( !menu->isMultiplePopupsAllowed() && menu->getPopupMenuItem()!=NULL ) - { - // open this popup instead - openPopupMenu(); - } - - } - - } - - } - - } - - } - - // if state has changed, trigger a re-draw - if (oldstate != d_hovering) - { - requestRedraw(); - } - -} - - -/************************************************************************* - Set the popup menu for this item. -*************************************************************************/ -void MenuItem::setPopupMenu(PopupMenu* popup) -{ - // already attached? - if (isChild(popup)) - { - d_popup = popup; - return; - } - - // attach as child - addChildWindow(popup); - d_popup = popup; -} - -/************************************************************************* - Open the PopupMenu attached to this item. -*************************************************************************/ -void MenuItem::openPopupMenu() -{ - // no popup? or already open... - if ( d_popup == NULL || d_opened ) - return; - - // if we are attached to a menubar, we let it handle the "activation" - MenuBase* menu = (Menubar*)getParent(); - if (getParent()->testClassName("Menubar") && menu->isItemInList(this)) - { - // align the popup to the bottom-left of the menuitem - Point pos(0,getAbsoluteRect().getHeight()); - d_popup->setPosition(Absolute,pos); - - menu->changePopupMenuItem(this); - } - // or maybe a popup menu? - else if (getParent()->testClassName("PopupMenu") && menu->isItemInList(this)) - { - // align the popup to the top-right of the menuitem - const Rect absrect = getAbsoluteRect(); - Point pos(absrect.getWidth(),0); - d_popup->setPosition(Absolute,pos); - - menu->changePopupMenuItem(this); - } - // otherwise we do ourselves - else - { - // match up with Menubar::changePopupMenu - d_popup->openPopupMenu(); - } - - d_opened = true; - requestRedraw(); -} - - -/************************************************************************* - Close the PopupMenu attached to this item. -*************************************************************************/ -void MenuItem::closePopupMenu(bool notify) -{ - // no popup? or not open... - if ( d_popup == NULL || !d_opened ) - return; - - // should we notify the parent menubar? otherwise... - // if we are attached to a menubar, we let it handle the "deactivation" - // only if the menubar does not allow multiple popups - MenuBase* menu = (MenuBase*)getParent(); - if (notify && getParent()->testClassName("MenuBase") && menu->isItemInList(this) && !menu->isMultiplePopupsAllowed()) - { - menu->changePopupMenuItem(NULL); - } - // otherwise we do ourselves - else - { - // match up with Menubar::changePopupMenu - //d_popup->hide(); - d_popup->closePopupMenu(); - } - - d_opened = false; - requestRedraw(); -} - - -/************************************************************************* - Toggles the PopupMenu. -*************************************************************************/ -bool MenuItem::togglePopupMenu(void) -{ - if (d_opened) - { - closePopupMenu(); - return false; - } - - openPopupMenu(); - return true; -} - -/************************************************************************* - Set the colour to use for the label text when rendering in the - hover / highlighted states. -*************************************************************************/ -void MenuItem::setHoverColour(const colour& col) -{ - if (d_hoverColour != col) - { - d_hoverColour = col; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - pushed state. -*************************************************************************/ -void MenuItem::setPushedColour(const colour& col) -{ - if (d_pushedColour != col) - { - d_pushedColour = col; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - opened state. -*************************************************************************/ -void MenuItem::setOpenedColour(const colour& col) -{ - if (d_openedColour != col) - { - d_openedColour = col; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - normal state. -*************************************************************************/ -void MenuItem::setNormalTextColour(const colour& col) -{ - if (d_normalTextColour != col) - { - d_normalTextColour = col; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the colour to use for the label text when rendering in the - disabled state. -*************************************************************************/ -void MenuItem::setDisabledTextColour(const colour& col) -{ - if (d_disabledTextColour != col) - { - d_disabledTextColour = col; - requestRedraw(); - } - -} - - -/************************************************************************* - Recursive function that closes all popups down the hierarcy starting - with this one. -*************************************************************************/ -void MenuItem::closeAllMenuItemPopups() -{ - // are we attached to a PopupMenu? - PopupMenu* pop = (PopupMenu*)getParent(); - if (getParent()->testClassName("PopupMenu") && pop->isItemInList(this)) - { - // is this parent popup attached to a menu item? - MenuItem* item = (MenuItem*)pop->getParent(); - if (item!=NULL && pop->getParent()->testClassName("MenuItem")) - { - // close popup - item->closePopupMenu(); - // recurse - item->closeAllMenuItemPopups(); - } - // otherwise we just hide the parent popup - else - { - pop->closePopupMenu(); - } - } -} - - -/************************************************************************* - Add menuitem specific events -*************************************************************************/ -void MenuItem::addMenuItemEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventClicked); -} - - -/************************************************************************* - handler invoked internally when the menuitem is clicked. -*************************************************************************/ -void MenuItem::onClicked(WindowEventArgs& e) -{ - // close the popup if we did'nt spawn a child - if (!d_opened && !d_popupWasClosed) - { - closeAllMenuItemPopups(); - } - d_popupWasClosed=false; - fireEvent(EventClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler for when the mouse moves -*************************************************************************/ -void MenuItem::onMouseMove(MouseEventArgs& e) -{ - // this is needed to discover whether mouse is in the widget area or not. - // The same thing used to be done each frame in the rendering method, - // but in this version the rendering method may not be called every frame - // so we must discover the internal widget state here - which is actually - // more efficient anyway. - - // base class processing - Window::onMouseMove(e); - - updateInternalState(e.position); - e.handled = true; -} - - -/************************************************************************* - Handler for mouse button pressed events -*************************************************************************/ -void MenuItem::onMouseButtonDown(MouseEventArgs& e) -{ - // default processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - d_popupWasClosed = false; - if (captureInput()) - { - d_pushed = true; - updateInternalState(e.position); - d_popupWasClosed = !togglePopupMenu(); - requestRedraw(); - } - - // event was handled by us. - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void MenuItem::onMouseButtonUp(MouseEventArgs& e) -{ - // default processing - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - releaseInput(); - - // was the button released over this window? - if ( !d_popupWasClosed && System::getSingleton().getGUISheet()->getChildAtPosition(e.position) == this ) - { - WindowEventArgs we(this); - onClicked(we); - } - - // event was handled by us. - e.handled = true; - } - -} - -/************************************************************************* - Handler for when mouse capture is lost -*************************************************************************/ -void MenuItem::onCaptureLost(WindowEventArgs& e) -{ - // Default processing - Window::onCaptureLost(e); - - d_pushed = false; - updateInternalState(MouseCursor::getSingleton().getPosition()); - requestRedraw(); - - // event was handled by us. - e.handled = true; -} - - -/************************************************************************* - Handler for when mouse leaves the widget -*************************************************************************/ -void MenuItem::onMouseLeaves(MouseEventArgs& e) -{ - // deafult processing - Window::onMouseLeaves(e); - - d_hovering = false; - requestRedraw(); - - e.handled = true; -} - - -/************************************************************************* - Internal version of adding a child window. -*************************************************************************/ -void MenuItem::addChild_impl(Window* wnd) -{ - TextItem::addChild_impl(wnd); - - // if this is a PopupMenu we add it like one. only if there is not already a popup attached. - if (wnd->testClassName("PopupMenu") && d_popup==NULL) - { - setPopupMenu((PopupMenu*)wnd); - } - -} - - -/************************************************************************* - Add MenuItem specific properties -*************************************************************************/ -void MenuItem::addMenuItemProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_hoverColourProperty); - addProperty(&d_pushedColourProperty); - addProperty(&d_openedColourProperty); - } - else - { - addProperty(&d_normalTextColourProperty); - addProperty(&d_disabledTextColourProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItemProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItemProperties.cpp deleted file mode 100644 index a3308a30b5..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenuItemProperties.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/************************************************************************ - filename: CEGUIMenuItemProperties.cpp - created: 8/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMenuItemProperties.h" -#include "elements/CEGUIMenuItem.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of MenuItemProperties namespace section -namespace MenuItemProperties -{ - - -String HoverColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getHoverColour()); -} - -void HoverColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHoverColour(PropertyHelper::stringToColour(value)); -} - - - - -String PushedColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getPushedColour()); -} - -void PushedColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setPushedColour(PropertyHelper::stringToColour(value)); -} - - - - -String OpenedColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getOpenedColour()); -} - -void OpenedColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setOpenedColour(PropertyHelper::stringToColour(value)); -} - - - - -String NormalTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalTextColour()); -} - -void NormalTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalTextColour(PropertyHelper::stringToColour(value)); -} - - - - -String DisabledTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getDisabledTextColour()); -} - -void DisabledTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDisabledTextColour(PropertyHelper::stringToColour(value)); -} - - -} // End of MenuItemProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenubar.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenubar.cpp deleted file mode 100644 index 407d68bf49..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMenubar.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************************************ - filename: CEGUIMenubar.cpp - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Implementation of Menubar widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMenubar.h" -#include "elements/CEGUIPopupMenu.h" -#include "elements/CEGUIMenuItem.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Constants -*************************************************************************/ -const String Menubar::EventNamespace("Menubar"); - -/************************************************************************* - Constructor for Menubar base class. -*************************************************************************/ -Menubar::Menubar(const String& type, const String& name) - : MenuBase(type, name) -{ - d_itemSpacing = 10; - d_horzPadding = d_vertPadding = 3; - d_borderWidth = 5; -} - - -/************************************************************************* - Destructor for Menubar base class. -*************************************************************************/ -Menubar::~Menubar(void) -{ -} - - -/************************************************************************* - Sets up sizes and positions for attached ItemEntry children. -*************************************************************************/ -void Menubar::layoutItemWidgets() -{ - Rect render_rect = getItemRenderArea(); - float x0 = PixelAligned(render_rect.d_left+d_borderWidth); - - Rect rect; - - ItemEntryList::iterator item = d_listItems.begin(); - while ( item != d_listItems.end() ) - { - Size optimal = (*item)->getItemPixelSize(); - optimal.d_width += 2*d_horzPadding; - optimal.d_height += 2*d_vertPadding; - - (*item)->setVerticalAlignment(VA_CENTRE); - rect.setPosition( Point(x0,0) ); - rect.setSize( Size( PixelAligned(optimal.d_width), PixelAligned(optimal.d_height) ) ); - - (*item)->setRect(Absolute,rect); - - x0 += optimal.d_width + d_itemSpacing; - - item++; - } - -} - - -/************************************************************************* - Returns the "optimal" size for the content in unclipped pixels -*************************************************************************/ -Size Menubar::getContentSize() -{ - // find the content sizes - float tallest = 0; - float total_width = 0; - - size_t count = 0; - size_t max = d_listItems.size(); - while (count < max) - { - const Size sz = d_listItems[count]->getItemPixelSize(); - if (sz.d_height > tallest) - tallest = sz.d_height; - total_width += sz.d_width; - - count++; - } - - const float dbl_border = d_borderWidth+d_borderWidth; - - // add horz padding - total_width += 2.0f*count*d_horzPadding; - // spacing - total_width += (count-1)*d_itemSpacing; - // border - total_width += dbl_border; - - // add vert padding - tallest += d_vertPadding+d_vertPadding; - // border - tallest += dbl_border; - - // return the content size - return Size( total_width, tallest); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnList.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnList.cpp deleted file mode 100644 index cfe7b801af..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnList.cpp +++ /dev/null @@ -1,2641 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiColumnList.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of MultiColumnList widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMultiColumnList.h" -#include "CEGUIExceptions.h" -#include "elements/CEGUIScrollbar.h" -#include "elements/CEGUIListHeader.h" -#include "elements/CEGUIListboxItem.h" -#include "CEGUILogger.h" -#include "CEGUIPropertyHelper.h" -#include - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String MultiColumnList::EventNamespace("MultiColumnList"); - -/************************************************************************* - Properties for this class -*************************************************************************/ -MultiColumnListProperties::ColumnsMovable MultiColumnList::d_columnsMovableProperty; -MultiColumnListProperties::ColumnsSizable MultiColumnList::d_columnsSizableProperty; -MultiColumnListProperties::ForceHorzScrollbar MultiColumnList::d_forceHorzScrollProperty; -MultiColumnListProperties::ForceVertScrollbar MultiColumnList::d_forceVertScrollProperty; -MultiColumnListProperties::NominatedSelectionColumnID MultiColumnList::d_nominatedSelectColProperty; -MultiColumnListProperties::NominatedSelectionRow MultiColumnList::d_nominatedSelectRowProperty; -MultiColumnListProperties::SelectionMode MultiColumnList::d_selectModeProperty; -MultiColumnListProperties::SortColumnID MultiColumnList::d_sortColumnIDProperty; -MultiColumnListProperties::SortDirection MultiColumnList::d_sortDirectionProperty; -MultiColumnListProperties::SortSettingEnabled MultiColumnList::d_sortSettingProperty; -MultiColumnListProperties::ColumnHeader MultiColumnList::d_columnHeaderProperty; -MultiColumnListProperties::RowCount MultiColumnList::d_rowCountProperty; - -/************************************************************************* - Constants -*************************************************************************/ -// Event names -const String MultiColumnList::EventSelectionModeChanged( (utf8*)"SelectModeChanged" ); -const String MultiColumnList::EventNominatedSelectColumnChanged( (utf8*)"NomSelColChanged" ); -const String MultiColumnList::EventNominatedSelectRowChanged( (utf8*)"NomSelRowChanged" ); -const String MultiColumnList::EventVertScrollbarModeChanged( (utf8*)"VertBarModeChanged" ); -const String MultiColumnList::EventHorzScrollbarModeChanged( (utf8*)"HorzBarModeChanged" ); -const String MultiColumnList::EventSelectionChanged( (utf8*)"SelectionChanged" ); -const String MultiColumnList::EventListContentsChanged( (utf8*)"ContentsChanged" ); -const String MultiColumnList::EventSortColumnChanged( (utf8*)"SortColChanged" ); -const String MultiColumnList::EventSortDirectionChanged( (utf8*)"SortDirChanged" ); -const String MultiColumnList::EventListColumnSized( (utf8*)"ColSized" ); -const String MultiColumnList::EventListColumnMoved( (utf8*)"ColMoved" ); - - -/************************************************************************* - Constructor for the Multi-column list base class -*************************************************************************/ -MultiColumnList::MultiColumnList(const String& type, const String& name) : - Window(type, name), - d_forceVertScroll(false), - d_forceHorzScroll(false), - d_nominatedSelectCol(0), - d_nominatedSelectRow(0), - d_lastSelected(NULL), - d_firstVisibleRow(-1), - d_lastVisibleRow(-1) -{ - // add multi-column list box specific events - addMultiColumnListboxEvents(); - - // add properties - addMultiColumnListProperties(); - - // set default selection mode - d_selectMode = CellSingle; // hack to ensure call below does what it should. - setSelectionMode(RowSingle); -} - - -/************************************************************************* - Destructor for the multi-column list base class. -*************************************************************************/ -MultiColumnList::~MultiColumnList(void) -{ - // delete any items we are supposed to - resetList_impl(); -} - - -/************************************************************************* - Return whether user manipulation of the sort column and direction - is enabled. -*************************************************************************/ -bool MultiColumnList::isUserSortControlEnabled(void) const -{ - return d_header->isSortingEnabled(); -} - - -/************************************************************************* - Return whether the user may size column segments. -*************************************************************************/ -bool MultiColumnList::isUserColumnSizingEnabled(void) const -{ - return d_header->isColumnSizingEnabled(); -} - -/************************************************************************* - Return whether the user may size specific column segment. Added by Talidan for MTA. -*************************************************************************/ -bool MultiColumnList::isUserColumnSegmentSizingEnabled(uint col_idx) const -{ - return getHeaderSegmentForColumn(col_idx).isSizingEnabled(); -} - - - -/************************************************************************* - Return whether the user may modify the order of the columns. -*************************************************************************/ -bool MultiColumnList::isUserColumnDraggingEnabled(void) const -{ - return d_header->isColumnDraggingEnabled(); -} - - -/************************************************************************* - Return the number of columns in the multi-column list -*************************************************************************/ -uint MultiColumnList::getColumnCount(void) const -{ - return d_header->getColumnCount(); -} - - -/************************************************************************* - Return the number of rows in the multi-column list. -*************************************************************************/ -uint MultiColumnList::getRowCount(void) const -{ - return (uint)d_grid.size(); -} - - -/************************************************************************* - Return the zero based index of the current sort column. There must - be at least one column to successfully call this method. -*************************************************************************/ -uint MultiColumnList::getSortColumn(void) const -{ - return d_header->getSortColumn(); -} - - -/************************************************************************* - Return the zero based column index of the column with the specified ID. -*************************************************************************/ -uint MultiColumnList::getColumnWithID(uint col_id) const -{ - return d_header->getColumnFromID(col_id); -} - - -/************************************************************************* - Return the zero based index of the column whos header text matches - the specified text. -*************************************************************************/ -uint MultiColumnList::getColumnWithHeaderText(const String& text) const -{ - return d_header->getColumnWithText(text); -} - - -/************************************************************************* - Return the total width of all column headers. -*************************************************************************/ -float MultiColumnList::getTotalColumnHeadersWidth(void) const -{ - float width = d_header->getTotalSegmentsPixelExtent(); - - if (getMetricsMode() == Relative) - { - width = absoluteToRelativeX(width); - } - - return width; -} - - -/************************************************************************* - Return the width of the specified column header. -*************************************************************************/ -float MultiColumnList::getColumnHeaderWidth(uint col_idx) const -{ - float width = d_header->getColumnPixelWidth(col_idx); - - if (getMetricsMode() == Relative) - { - width = absoluteToRelativeX(width); - } - - return width; -} - - -/************************************************************************* - Return the currently set sort direction. -*************************************************************************/ -ListHeaderSegment::SortDirection MultiColumnList::getSortDirection(void) const -{ - return d_header->getSortDirection(); -} - - -/************************************************************************* - Return the ListHeaderSegment object for the specified column -*************************************************************************/ -ListHeaderSegment& MultiColumnList::getHeaderSegmentForColumn(uint col_idx) const -{ - return d_header->getSegmentFromColumn(col_idx); -} - - -/************************************************************************* - return index of row containing the given ListboxItem -*************************************************************************/ -uint MultiColumnList::getItemRowIndex(const ListboxItem* item) const -{ - for (uint i = 0; i < getRowCount(); ++i) - { - if (isListboxItemInRow(item, i)) - { - return i; - } - - } - - // item is not attached to the list box, throw... - throw InvalidRequestException((utf8*)"MultiColumnList::getItemRowIndex - the given ListboxItem is not attached to this MultiColumnList."); -} - - -/************************************************************************* - return the index of the column containing the given ListboxItem -*************************************************************************/ -uint MultiColumnList::getItemColumnIndex(const ListboxItem* item) const -{ - for (uint i = 0; i < getColumnCount(); ++i) - { - if (isListboxItemInColumn(item, i)) - { - return i; - } - - } - - // item is not attached to the list box, throw... - throw InvalidRequestException((utf8*)"MultiColumnList::getItemColumnIndex - the given ListboxItem is not attached to this MultiColumnList."); -} - - -/************************************************************************* - return an MCLGridRef for the given ListboxItem. -*************************************************************************/ -MCLGridRef MultiColumnList::getItemGridReference(const ListboxItem* item) const -{ - return MCLGridRef(getItemRowIndex(item), getItemColumnIndex(item)); -} - - -/************************************************************************* - return a ListboxItem pointer for the given reference. - May be NULL if position is blank. Throws on out of range. -*************************************************************************/ -ListboxItem* MultiColumnList::getItemAtGridReference(const MCLGridRef& grid_ref) const -{ - // check for invalid grid ref - if (grid_ref.column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::getItemAtGridReference - the column given in the grid reference is out of range."); - } - else if (grid_ref.row >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::getItemAtGridReference - the row given in the grid reference is out of range."); - } - else - { - return d_grid[grid_ref.row][grid_ref.column]; - } - -} - - -/************************************************************************* - return true if the given item is in the given column. -*************************************************************************/ -bool MultiColumnList::isListboxItemInColumn(const ListboxItem* item, uint col_idx) const -{ - // check for invalid index - if (col_idx >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::isListboxItemInColumn - the column index given is out of range."); - } - else - { - for (uint i = 0; i < getRowCount(); ++i) - { - if (d_grid[i][col_idx] == item) - { - return true; - } - - } - - // Item was not in the column. - return false; - } - -} - - -/************************************************************************* - return true if the given item is in the given row. -*************************************************************************/ -bool MultiColumnList::isListboxItemInRow(const ListboxItem* item, uint row_idx) const -{ - // check for invalid index - if (row_idx >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::isListboxItemInRow - the row index given is out of range."); - } - else - { - for (uint i = 0; i < getColumnCount(); ++i) - { - if (d_grid[row_idx][i] == item) - { - return true; - } - - } - - // Item was not in the row. - return false; - } - -} - - -/************************************************************************* - return true if the given item is somewhere in the list box. -*************************************************************************/ -bool MultiColumnList::isListboxItemInList(const ListboxItem* item) const -{ - for (uint i = 0; i < getRowCount(); ++i) - { - for (uint j = 0; j < getColumnCount(); ++j) - { - if (d_grid[i][j] == item) - { - return true; - } - - } - - } - - return false; -} - - -/************************************************************************* - Search the items in column 'col_idx' and return the first item after - 'start_item' that matches the specified text. If 'start_item' is NULL - searching start at (and includes) the first item in the column. -*************************************************************************/ -ListboxItem* MultiColumnList::findColumnItemWithText(const String& text, uint col_idx, const ListboxItem* start_item) const -{ - // ensure column is valid - if (col_idx >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::findColumnItemWithText - specified column index is out of range."); - } - - // find start position for search - uint i = (start_item == NULL) ? 0 : getItemRowIndex(start_item) + 1; - - for ( ; i < getRowCount(); ++i) - { - // does this item match? - if (d_grid[i][col_idx]->getText() == text) - { - return d_grid[i][col_idx]; - } - - } - - // no matching item. - return NULL; -} - - -/************************************************************************* - Search the items in row 'row_idx' and return the first item after - 'start_item' that matches the specified text. If 'start_item' is NULL - searching start at (and includes) the first item in the row. -*************************************************************************/ -ListboxItem* MultiColumnList::findRowItemWithText(const String& text, uint row_idx, const ListboxItem* start_item) const -{ - // ensure row is valid - if (row_idx >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::findRowItemWithText - specified row index is out of range."); - } - - // find start position for search - uint i = (start_item == NULL) ? 0 : getItemColumnIndex(start_item) + 1; - - for ( ; i < getColumnCount(); ++i) - { - // does this item match? - if (d_grid[row_idx][i]->getText() == text) - { - return d_grid[row_idx][i]; - } - - } - - // no matching item. - return NULL; -} - - -/************************************************************************* - Search the list and return the first item after 'start_item' that - matches the specified text. If 'start_item' is NULL searching starts - at (and includes) the first item in the list. - - Searching proceeds across the columns and down the rows. -*************************************************************************/ -ListboxItem* MultiColumnList::findListItemWithText(const String& text, const ListboxItem* start_item) const -{ - MCLGridRef startRef(0, 0); - - // get position of start_item if it's not NULL - if (start_item != NULL) - { - startRef = getItemGridReference(start_item); - ++startRef.column; - } - - // perform the search - for (uint i = startRef.row; i < getRowCount(); ++i) - { - for (uint j = startRef.column; j < getColumnCount(); ++j) - { - // does this item match? - if (d_grid[i][j]->getText() == text) - { - return d_grid[i][j]; - } - - } - - } - - // No match - return NULL; -} - - -/************************************************************************* - Scan the list (across columns for each row) and return the first - selected item. -*************************************************************************/ -ListboxItem* MultiColumnList::getFirstSelectedItem(void) const -{ - return getNextSelected(NULL); -} - - -/************************************************************************* - Search the list and return the first item after 'start_item' that - is selected. If 'start_item' is NULL searching starts at (and - includes) the first item in the list. - - Searching proceeds across the columns and down the rows. -*************************************************************************/ -ListboxItem* MultiColumnList::getNextSelected(const ListboxItem* start_item) const -{ - MCLGridRef startRef(0, 0); - - // get position of start_item if it's not NULL - if (start_item != NULL) - { - startRef = getItemGridReference(start_item); - ++startRef.column; - - // lil_Toady: fix for this func not working - if ( startRef.column == getColumnCount() ) - { - startRef.column = 0; - ++startRef.row; - } - } - - // perform the search - for (uint i = startRef.row; i < getRowCount(); ++i) - { - for (uint j = startRef.column; j < getColumnCount(); ++j) - { - // does this item match? - ListboxItem* item = d_grid[i][j]; - - if ((item != NULL) && item->isSelected()) - { - return d_grid[i][j]; - } - - } - - } - - // No match - return NULL; -} - - -/************************************************************************* - Return the total number of selected items -*************************************************************************/ -uint MultiColumnList::getSelectedCount(void) const -{ - uint count = 0; - - for (uint i = 0; i < getRowCount(); ++i) - { - for (uint j = 0; j < getColumnCount(); ++j) - { - ListboxItem* item = d_grid[i][j]; - - if ((item != NULL) && item->isSelected()) - { - ++count; - } - - } - - } - - return count; -} - - -/************************************************************************* - Return whether the item at the given grid position is selected. -*************************************************************************/ -bool MultiColumnList::isItemSelected(const MCLGridRef& grid_ref) const -{ - ListboxItem* item = getItemAtGridReference(grid_ref); - - if (item != NULL) - { - return item->isSelected(); - } - - // if no item exists here, then it can't be selected. - return false; -} - - -/************************************************************************* - Return the ID of the nominated selection column -*************************************************************************/ -uint MultiColumnList::getNominatedSelectionColumnID(void) const -{ - return d_header->getSegmentFromColumn(d_nominatedSelectCol).getID(); -} - - -/************************************************************************* - Return the nominated selection column -*************************************************************************/ -uint MultiColumnList::getNominatedSelectionColumn(void) const -{ - return d_nominatedSelectCol; -} - - -/************************************************************************* - Return the nominated selection row. -*************************************************************************/ -uint MultiColumnList::getNominatedSelectionRow(void) const -{ - return d_nominatedSelectRow; -} - - -/************************************************************************* - Return the active selection mode. -*************************************************************************/ -MultiColumnList::SelectionMode MultiColumnList::getSelectionMode(void) const -{ - return d_selectMode; -} - - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void MultiColumnList::initialise(void) -{ - // create the component sub-widgets - d_vertScrollbar = createVertScrollbar(getName() + "__auto_vscrollbar__"); - d_horzScrollbar = createHorzScrollbar(getName() + "__auto_hscrollbar__"); - d_header = createListHeader(getName() + "__auto_listheader__"); - - // add components - addChildWindow(d_vertScrollbar); - addChildWindow(d_horzScrollbar); - addChildWindow(d_header); - - // subscribe some events - d_header->subscribeEvent(ListHeader::EventSegmentRenderOffsetChanged, Event::Subscriber(&CEGUI::MultiColumnList::handleHeaderScroll, this)); - d_header->subscribeEvent(ListHeader::EventSegmentSequenceChanged, Event::Subscriber(&CEGUI::MultiColumnList::handleHeaderSegMove, this)); - d_header->subscribeEvent(ListHeader::EventSegmentSized, Event::Subscriber(&CEGUI::MultiColumnList::handleColumnSizeChange, this)); - d_header->subscribeEvent(ListHeader::EventSortColumnChanged , Event::Subscriber(&CEGUI::MultiColumnList::handleSortColumnChange, this)); - d_header->subscribeEvent(ListHeader::EventSortDirectionChanged, Event::Subscriber(&CEGUI::MultiColumnList::handleSortDirectionChange, this)); - d_header->subscribeEvent(ListHeader::EventSplitterDoubleClicked, Event::Subscriber(&CEGUI::MultiColumnList::handleHeaderSegDblClick, this)); - d_horzScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&CEGUI::MultiColumnList::handleHorzScrollbar, this)); - d_vertScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&CEGUI::MultiColumnList::handleVertScrollbar, this)); - - - // final initialisation now widget is complete - setSortDirection(ListHeaderSegment::None); - - // Perform initial layout - configureScrollbars(); - performChildWindowLayout(); -} - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -void MultiColumnList::resetList(void) -{ - if (resetList_impl()) - { - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Add a column to the table. -*************************************************************************/ -void MultiColumnList::addColumn(const String& text, uint col_id, float width) -{ - insertColumn(text, col_id, width, getColumnCount()); -} - - -/************************************************************************* - Insert a column into the table. -*************************************************************************/ -void MultiColumnList::insertColumn(const String& text, uint col_id, float width, uint position) -{ - // if position is out of range, add item to end of current columns. - if (position > getColumnCount()) - { - position = getColumnCount(); - } - - // get width as pixels - if (getMetricsMode() == Relative) - { - width = relativeToAbsoluteX(width); - } - - // set-up the header for the new column. - d_header->insertColumn(text, col_id, d_header->absoluteToRelativeX(width), position); - - // Insert a blank entry at the appropriate position in each row. - for (uint i = 0; i < getRowCount(); ++i) - { - d_grid[i].d_items.insert(d_grid[i].d_items.begin() + position, reinterpret_cast < CEGUI::ListboxItem * > ( NULL ) ); - } - - // update stored nominated selection column if that has changed. - if ((d_nominatedSelectCol >= position) && (getColumnCount() > 1)) - { - d_nominatedSelectCol++; - } - - // signal a change to the list contents - WindowEventArgs args(this); - onListContentsChanged(args); -} - - -/************************************************************************* - Remove a column from the table. -*************************************************************************/ -void MultiColumnList::removeColumn(uint col_idx) -{ - // ensure index is valid, and throw if not. - if (col_idx >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::removeColumn - the specified column index is out of range."); - } - else - { - // update stored column index values - if (d_nominatedSelectCol == col_idx) - { - d_nominatedSelectCol = 0; - } - - // remove the column from each row - for (uint i = 0; i < getRowCount(); ++i) - { - // extract the item pointer. - ListboxItem* item = d_grid[i][col_idx]; - - // remove the column entry from the row - d_grid[i].d_items.erase(d_grid[i].d_items.begin() + col_idx); - - // delete the ListboxItem as needed. - if ((item != NULL) && item->isAutoDeleted()) - { - delete item; - } - - } - - // remove header segment - d_header->removeColumn(col_idx); - - // remove all rows entirely if no column is remaining (mta fix) - if (getColumnCount() == 0) - d_grid.clear(); - - // signal a change to the list contents - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - - -/************************************************************************* - Remove a column from the table (via ID) -*************************************************************************/ -void MultiColumnList::removeColumnWithID(uint col_id) -{ - removeColumn(getColumnWithID(col_id)); -} - - -/************************************************************************* - Move a column within the table -*************************************************************************/ -void MultiColumnList::moveColumn(uint col_idx, uint position) -{ - // move the segment on the header, events will ensure the items get moved also. - d_header->moveColumn(col_idx, position); -} - - -/************************************************************************* - Move a column (with specified ID) within the table. -*************************************************************************/ -void MultiColumnList::moveColumnWithID(uint col_id, uint position) -{ - moveColumn(getColumnWithID(col_id), position); -} - - -/************************************************************************* - Add a row to the bottom of the table -*************************************************************************/ -uint MultiColumnList::addRow(uint row_id, bool fast) -{ - return addRow(NULL, 0, row_id, fast); -} - - -/************************************************************************* - Add a row to the bottom of the table -*************************************************************************/ -uint MultiColumnList::addRow(ListboxItem* item, uint col_id, uint row_id, bool fast) -{ - uint col_idx = 0; - - // Build the new row - ListRow row; - row.d_sortColumn = getSortColumn(); - row.d_items.resize(getColumnCount(), NULL); - row.d_rowID = row_id; - - if (item != NULL) - { - // discover which column to initially set - col_idx = getColumnWithID(col_id); - - // establish item ownership & enter item into column - item->setOwnerWindow(this); - row[col_idx] = item; - } - - uint pos; - - // if sorting is enabled, insert at an appropriate position - ListHeaderSegment::SortDirection dir = getSortDirection(); - if ( dir == ListHeaderSegment::Descending || dir == ListHeaderSegment::Ascending ) - { - // calculate where the row should be inserted - ListItemGrid::iterator ins_pos; - - if ( dir == ListHeaderSegment::Descending ) - { - ins_pos = std::upper_bound(d_grid.begin(), d_grid.end(), row); - } - else - { - ins_pos = std::upper_bound(d_grid.begin(), d_grid.end(), row, pred_descend); - } - - // insert item and get final inserted position. - ListItemGrid::iterator final_pos = d_grid.insert(ins_pos, row); - // get final inserted position as an uint. - pos = (uint)std::distance(d_grid.begin(), final_pos); - } - // not sorted, just stick it on the end. - else - { - pos = getRowCount(); - d_grid.push_back(row); - } - - if ( !fast ) - { - // signal a change to the list contents - WindowEventArgs args(this); - onListContentsChanged(args); - } - else - { - requestRedraw(); - } - - return pos; -} - - -/************************************************************************* - Insert a row into the table -*************************************************************************/ -uint MultiColumnList::insertRow(uint row_idx, uint row_id) -{ - return insertRow(NULL, 0, row_idx, row_id); -} - - -/************************************************************************* - Insert a row into the table -*************************************************************************/ -uint MultiColumnList::insertRow(ListboxItem* item, uint col_id, uint row_idx, uint row_id) -{ - // if sorting is enabled, use add instead of insert - if (getSortDirection() != ListHeaderSegment::None) - { - return addRow(item, col_id); - } - else - { - // Build the new row (empty) - ListRow row; - row.d_sortColumn = getSortColumn(); - row.d_items.resize(getColumnCount(), NULL); - row.d_rowID = row_id; - - // if row index is too big, just insert at end. - if (row_idx > getRowCount()) - { - row_idx = getRowCount(); - } - - d_grid.insert(d_grid.begin() + row_idx, row); - - // set the initial item in the new row - //setItem(item, col_id, row_idx); - - // signal a change to the list contents - WindowEventArgs args(this); - onListContentsChanged(args); - - return row_idx; - } - -} - - -/************************************************************************* - Remove a row from the list. -*************************************************************************/ -void MultiColumnList::removeRow(uint row_idx) -{ - // ensure row exists - if (row_idx >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::removeRow - The specified row index is out of range."); - } - else - { - // delete items we are supposed to - for (uint i = 0; i < getColumnCount(); ++i) - { - ListboxItem* item = d_grid[row_idx][i]; - - if ((item != NULL) && item->isAutoDeleted()) - { - delete item; - } - - } - - // erase the row from the grid. - d_grid.erase(d_grid.begin() + row_idx); - - // if we have erased the selection row, reset that to 0 - if (d_nominatedSelectRow == row_idx) - { - d_nominatedSelectRow = 0; - } - - // signal a change to the list contents - WindowEventArgs args(this); - onListContentsChanged(args); - } - -} - -void MultiColumnList::forceUpdate() -{ - WindowEventArgs args(this); - onListContentsChanged(args); -} - -/************************************************************************* - Replace the item at grid-ref 'position' with 'item'. - The old item is deleted according to the items auto-delete setting -*************************************************************************/ -void MultiColumnList::setItem(ListboxItem* item, const MCLGridRef& position, bool fast) -{ - // validate grid ref - if (position.column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::setItem - the specified column index is invalid."); - } - else if (position.row >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::setItem - the specified row index is invalid."); - } - - // delete old item as required - ListboxItem* oldItem = d_grid[position.row][position.column]; - - if ((oldItem != NULL) && oldItem->isAutoDeleted()) - { - delete oldItem; - } - - // set new item. - if (item != NULL) - item->setOwnerWindow(this); - - d_grid[position.row][position.column] = item; - - - if ( !fast ) - { - // signal a change to the list contents - WindowEventArgs args(this); - onListContentsChanged(args); - } - else - { - requestRedraw(); - } -} - - -/************************************************************************* - Replace the item in row 'row_idx', in the column with ID 'col_id' - with 'item'. The old item is deleted as required. -*************************************************************************/ -void MultiColumnList::setItem(ListboxItem* item, uint col_id, uint row_idx, bool fast) -{ - setItem(item, MCLGridRef(row_idx, getColumnWithID(col_id)), fast); -} - - -/************************************************************************* - Set the current selection mode. -*************************************************************************/ -void MultiColumnList::setSelectionMode(MultiColumnList::SelectionMode sel_mode) -{ - if (d_selectMode != sel_mode) - { - d_selectMode = sel_mode; - - clearAllSelections(); - - switch(d_selectMode) - { - case RowSingle: - d_multiSelect = false; - d_fullRowSelect = true; - d_fullColSelect = false; - d_useNominatedCol = false; - d_useNominatedRow = false; - break; - - case RowMultiple: - d_multiSelect = true; - d_fullRowSelect = true; - d_fullColSelect = false; - d_useNominatedCol = false; - d_useNominatedRow = false; - break; - - case CellSingle: - d_multiSelect = false; - d_fullRowSelect = false; - d_fullColSelect = false; - d_useNominatedCol = false; - d_useNominatedRow = false; - break; - - case CellMultiple: - d_multiSelect = true; - d_fullRowSelect = false; - d_fullColSelect = false; - d_useNominatedCol = false; - d_useNominatedRow = false; - break; - - case NominatedColumnSingle: - d_multiSelect = false; - d_fullRowSelect = false; - d_fullColSelect = false; - d_useNominatedCol = true; - d_useNominatedRow = false; - break; - - case NominatedColumnMultiple: - d_multiSelect = true; - d_fullRowSelect = false; - d_fullColSelect = false; - d_useNominatedCol = true; - d_useNominatedRow = false; - break; - - case ColumnSingle: - d_multiSelect = false; - d_fullRowSelect = false; - d_fullColSelect = true; - d_useNominatedCol = false; - d_useNominatedRow = false; - break; - - case ColumnMultiple: - d_multiSelect = true; - d_fullRowSelect = false; - d_fullColSelect = true; - d_useNominatedCol = false; - d_useNominatedRow = false; - break; - - case NominatedRowSingle: - d_multiSelect = false; - d_fullRowSelect = false; - d_fullColSelect = false; - d_useNominatedCol = false; - d_useNominatedRow = true; - break; - - case NominatedRowMultiple: - d_multiSelect = true; - d_fullRowSelect = false; - d_fullColSelect = false; - d_useNominatedCol = false; - d_useNominatedRow = true; - break; - - default: - throw InvalidRequestException((utf8*)"MultiColumnList::setSelectionMode - invalid or unknown SelectionMode value supplied."); - break; - - } - - // Fire event. - WindowEventArgs args(this); - onSelectionModeChanged(args); - } - -} - - -/************************************************************************* - Set the nominated column for 'NominatedColumn*' selections (by ID) -*************************************************************************/ -void MultiColumnList::setNominatedSelectionColumnID(uint col_id) -{ - setNominatedSelectionColumn(getColumnWithID(col_id)); -} - - -/************************************************************************* - Set the nominated column for 'NominatedColumn*' selections (by Index) -*************************************************************************/ -void MultiColumnList::setNominatedSelectionColumn(uint col_idx) -{ - if (d_nominatedSelectCol != col_idx) - { - clearAllSelections(); - - d_nominatedSelectCol = col_idx; - - // Fire event. - WindowEventArgs args(this); - onNominatedSelectColumnChanged(args); - } - -} - - -/************************************************************************* - Set the nominated row for 'NominatedRow*' selections -*************************************************************************/ -void MultiColumnList::setNominatedSelectionRow(uint row_idx) -{ - if (d_nominatedSelectRow != row_idx) - { - clearAllSelections(); - - d_nominatedSelectRow = row_idx; - - // Fire event. - WindowEventArgs args(this); - onNominatedSelectRowChanged(args); - } - -} - - -/************************************************************************* - Set the current sort direction. -*************************************************************************/ -void MultiColumnList::setSortDirection(ListHeaderSegment::SortDirection direction) -{ - // set the sort direction on the header, events will make sure everything else is updated. - d_header->setSortDirection(direction); -} - - -/************************************************************************* - Set the current sort column (by index) -*************************************************************************/ -void MultiColumnList::setSortColumn(uint col_idx) -{ - // set the sort column on the header, events will make sure everything else is updated. - d_header->setSortColumn(col_idx); -} - - -/************************************************************************* - Set the current sort column (by ID) -*************************************************************************/ -void MultiColumnList::setSortColumnByID(uint col_id) -{ - if (d_header->getSegmentFromColumn(getSortColumn()).getID() != col_id) - { - // set the sort column on the header, events will make sure everything else is updated. - d_header->setSortColumnFromID(col_id); - } - -} - - -/************************************************************************* - Enable / Disable forced display of the vertical scroll bar -*************************************************************************/ -void MultiColumnList::setShowVertScrollbar(bool setting) -{ - if (d_forceVertScroll != setting) - { - d_forceVertScroll = setting; - - configureScrollbars(); - - // Event firing. - WindowEventArgs args(this); - onVertScrollbarModeChanged(args); - } - -} - - -/************************************************************************* - Enable / Disable forced display of the horizontal scroll bar -*************************************************************************/ -void MultiColumnList::setShowHorzScrollbar(bool setting) -{ - if (d_forceHorzScroll != setting) - { - d_forceHorzScroll = setting; - - configureScrollbars(); - - // Event firing. - WindowEventArgs args(this); - onHorzScrollbarModeChanged(args); - } - -} - - -/************************************************************************* - Clear the selected state from all currently selected items. -*************************************************************************/ -void MultiColumnList::clearAllSelections(void) -{ - // only fire events and update if we actually made any changes - if (clearAllSelections_impl()) - { - // Fire event. - WindowEventArgs args(this); - onSelectionChanged(args); - } - - -} - - -/************************************************************************* - Set the selected state of 'item' (must be attached to the list box) -*************************************************************************/ -void MultiColumnList::setItemSelectState(ListboxItem* item, bool state) -{ - setItemSelectState(getItemGridReference(item), state); -} - - -/************************************************************************* - Set the selected state of the item at 'grid_ref'. -*************************************************************************/ -void MultiColumnList::setItemSelectState(const MCLGridRef& grid_ref, bool state) -{ - if (setItemSelectState_impl(grid_ref, state)) - { - // Fire event. - WindowEventArgs args(this); - onSelectionChanged(args); - } - -} - - -/************************************************************************* - Update the list box internal state after attached items have been - externally modified. -*************************************************************************/ -void MultiColumnList::handleUpdatedItemData(void) -{ - configureScrollbars(); - requestRedraw(); -} - - -/************************************************************************* - Set the width of the specified column header (and therefore the - column itself). -*************************************************************************/ -void MultiColumnList::setColumnHeaderWidth(uint col_idx, float width, bool relative) -{ - if ( relative ) - { - if (getMetricsMode() == Relative) - { - width = relativeToAbsoluteX(width); - } - } - - - d_header->setColumnPixelWidth(col_idx, width); -} - - -/************************************************************************* - Set the title of the specified column header (and therefore the - column itself). -*************************************************************************/ -void MultiColumnList::setColumnHeaderTitle(uint col_idx, const char* szTitle) -{ - d_header->setColumnTitle(col_idx, szTitle); -} - - -/************************************************************************* - Get the title of the specified column header (and therefore the - column itself). -*************************************************************************/ -const char* MultiColumnList::getColumnHeaderTitle(uint col_idx) -{ - return d_header->getColumnTitle(col_idx); -} - -/************************************************************************* - Add multi column list box specific events -*************************************************************************/ -void MultiColumnList::addMultiColumnListboxEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventSelectionModeChanged); - addEvent(EventNominatedSelectColumnChanged); - addEvent(EventNominatedSelectRowChanged); - addEvent(EventVertScrollbarModeChanged); - addEvent(EventHorzScrollbarModeChanged); - addEvent(EventSelectionChanged); - addEvent(EventListContentsChanged); - addEvent(EventListColumnMoved); - addEvent(EventListColumnSized); - } - else - { - addEvent(EventSortColumnChanged); - addEvent(EventSortDirectionChanged); - } -} - - -/************************************************************************* - display required integrated scroll bars according to current state - of the list box and update their values. -*************************************************************************/ -void MultiColumnList::configureScrollbars(void) -{ - float totalHeight = getTotalRowsHeight(); - float fullWidth = d_header->getTotalSegmentsPixelExtent(); - - // - // First show or hide the scroll bars as needed (or requested) - // - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getListRenderArea().getHeight()) || d_forceVertScroll) - { - d_vertScrollbar->show(); - - // show or hide horizontal scroll bar as required (or as specified by option) - if ((fullWidth > getListRenderArea().getWidth()) || d_forceHorzScroll) - { - d_horzScrollbar->show(); - } - else - { - d_horzScrollbar->hide(); - } - - } - else - { - // show or hide horizontal scroll bar as required (or as specified by option) - if ((fullWidth > getListRenderArea().getWidth()) || d_forceHorzScroll) - { - d_horzScrollbar->show(); - - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getListRenderArea().getHeight()) || d_forceVertScroll) - { - d_vertScrollbar->show(); - } - else - { - d_vertScrollbar->hide(); - } - - } - else - { - d_vertScrollbar->hide(); - d_horzScrollbar->hide(); - } - - } - - // - // Set up scroll bar values - // - Rect renderArea(getListRenderArea()); - - d_vertScrollbar->setDocumentSize(totalHeight); - d_vertScrollbar->setPageSize(renderArea.getHeight()); - d_vertScrollbar->setStepSize(ceguimax(1.0f, renderArea.getHeight() / 10.0f)); - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition()); - - d_horzScrollbar->setDocumentSize(fullWidth); - d_horzScrollbar->setPageSize(renderArea.getWidth()); - d_horzScrollbar->setStepSize(ceguimax(1.0f, renderArea.getWidth() / 10.0f)); - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition()); -} - - -/************************************************************************* - select all strings between positions 'start' and 'end'. (inclusive) -*************************************************************************/ -bool MultiColumnList::selectRange(const MCLGridRef& start, const MCLGridRef& end) -{ - MCLGridRef tmpStart(start); - MCLGridRef tmpEnd(end); - - // ensure start is before end - if (tmpStart.column > tmpEnd.column) - { - tmpStart.column = tmpEnd.column; - tmpEnd.column = start.column; - } - - if (tmpStart.row > tmpEnd.row) - { - tmpStart.row = tmpEnd.row; - tmpEnd.row = start.row; - } - - bool modified = false; - - // loop through all items selecting them. - for (uint i = tmpStart.row; i <= tmpEnd.row; ++i) - { - for (uint j = tmpStart.column; j <= tmpEnd.column; ++j) - { - ListboxItem* item = d_grid[i][j]; - - if (item != NULL) - { - modified |= setItemSelectState_impl(getItemGridReference(item), true); - } - - } - - } - - return modified; -} - - -/************************************************************************* - Return the sum of all row heights -*************************************************************************/ -float MultiColumnList::getTotalRowsHeight(void) const -{ - float height = 0.0f; - - for (uint i = 0; i < getRowCount(); ++i) - { - height += getHighestRowItemHeight(i); - } - - return height; -} - - -/************************************************************************* - Return the width of the widest item in the given column -*************************************************************************/ -float MultiColumnList::getWidestColumnItemWidth(uint col_idx) const -{ - if (col_idx >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::getWidestColumnItemWidth - specified column is out of range."); - } - else - { - float width = 0.0f; - - // check each item in the column - for (uint i = 0; i < getRowCount(); ++i) - { - ListboxItem* item = d_grid[i][col_idx]; - - // if the slot has an item in it - if (item != NULL) - { - Size sz(item->getPixelSize()); - - // see if this item is wider than the previous widest - if (sz.d_width > width) - { - // update current widest - width = sz.d_width; - } - - } - - } - - // return the widest item. - return width; - } - -} - - -/************************************************************************* - Return the height of the highest item in the given row. -*************************************************************************/ -float MultiColumnList::getHighestRowItemHeight(uint row_idx) const -{ - if (row_idx >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::getHighestRowItemHeight - specified row is out of range."); - } - else - { - float height = 0.0f; - - // check each item in the column - for (uint i = 0; i < getColumnCount(); ++i) - { - ListboxItem* item = d_grid[row_idx][i]; - - // if the slot has an item in it - if (item != NULL) - { - Size sz(item->getPixelSize()); - - // see if this item is higher than the previous highest - if (sz.d_height > height) - { - // update current highest - height = sz.d_height; - } - - } - - } - - // return the hightest item. - return height; - } - -} - - -/************************************************************************* - Clear the selected state for all items (implementation) -*************************************************************************/ -bool MultiColumnList::clearAllSelections_impl(void) -{ - // flag used so we can track if we did anything. - bool modified = false; - - for (uint i = 0; i < getRowCount(); ++i) - { - for (uint j = 0; j < getColumnCount(); ++j) - { - ListboxItem* item = d_grid[i][j]; - - // if slot has an item, and item is selected - if ((item != NULL) && item->isSelected()) - { - // clear selection state and set modified flag - item->setSelected(false); - modified = true; - } - - } - - } - - // signal whether or not we did anything. - return modified; -} - - -/************************************************************************* - Return the range of visible rows -*************************************************************************/ -void MultiColumnList::getVisibleRowRange(int &first, int& last) const -{ - first = d_firstVisibleRow; - last = d_lastVisibleRow; -} - - -/************************************************************************* - Return the ListboxItem under the given window local pixel co-ordinate. -*************************************************************************/ -ListboxItem* MultiColumnList::getItemAtPoint(const Point& pt) const -{ - Rect listArea(getListRenderArea()); - - float y = listArea.d_top - d_vertScrollbar->getScrollPosition(); - float x = listArea.d_left - d_horzScrollbar->getScrollPosition(); - - for (uint i = 0; i < getRowCount(); ++i) - { - y += getHighestRowItemHeight(i); - - // have we located the row? - if (pt.d_y < y) - { - // scan across to find column that was clicked - for (uint j = 0; j < getColumnCount(); ++j) - { - x += d_header->getColumnPixelWidth(j); - - // was this the column? - if (pt.d_x < x) - { - // return contents of grid element that was clicked. - return d_grid[i][j]; - } - - } - - } - - } - - return NULL; -} - - -/************************************************************************* - Set select state for the given item. This appropriately selects other - items depending upon the select mode. Returns true if something is - changed, else false. -*************************************************************************/ -bool MultiColumnList::setItemSelectState_impl(const MCLGridRef grid_ref, bool state) -{ - // validate grid ref - if (grid_ref.column >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::setItemSelectState - the specified column index is invalid."); - } - else if (grid_ref.row >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::setItemSelectState - the specified row index is invalid."); - } - - // only do this if the setting is changing - if (d_grid[grid_ref.row][grid_ref.column]->isSelected() != state) - { - // if using nominated selection row and/ or column, check that they match. - if ((!d_useNominatedCol || (d_nominatedSelectCol == grid_ref.column)) && - (!d_useNominatedRow || (d_nominatedSelectRow == grid_ref.row))) - { - // clear current selection if not multi-select box - if (state && (!d_multiSelect)) - { - clearAllSelections_impl(); - } - - // full row? - if (d_fullRowSelect) - { - // clear selection on all items in the row - setSelectForItemsInRow(grid_ref.row, state); - } - // full column? - else if (d_fullColSelect) - { - // clear selection on all items in the column - setSelectForItemsInColumn(grid_ref.column, state); - - } - // single item to be affected - else - { - d_grid[grid_ref.row][grid_ref.column]->setSelected(state); - } - - return true; - } - - } - - return false; -} - - -/************************************************************************* - Select all items in the given row -*************************************************************************/ -void MultiColumnList::setSelectForItemsInRow(uint row_idx, bool state) -{ - for (uint i = 0; i < getColumnCount(); ++i) - { - ListboxItem* item = d_grid[row_idx][i]; - - if (item != NULL) - { - item->setSelected(state); - } - - } - -} - - -/************************************************************************* - Select all items in the given column -*************************************************************************/ -void MultiColumnList::setSelectForItemsInColumn(uint col_idx, bool state) -{ - for (uint i = 0; i < getRowCount(); ++i) - { - ListboxItem* item = d_grid[i][col_idx]; - - if (item != NULL) - { - item->setSelected(state); - } - - } - -} - -/************************************************************************* - Move the column at index 'col_idx' so it is at index 'position'. - - Implementation version which does not move the header segment - (since that may have already happned). -*************************************************************************/ -void MultiColumnList::moveColumn_impl(uint col_idx, uint position) -{ - // ensure index is valid, and throw if not. - if (col_idx >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::moveColumn - the specified source column index is out of range."); - } - else - { - // if position is too big, insert at end. - if (position > getColumnCount()) - { - position = getColumnCount(); - } - - // update select column index value if needed - if (d_nominatedSelectCol == col_idx) - { - d_nominatedSelectCol = position; - } - else if ((col_idx < d_nominatedSelectCol) && (position >= d_nominatedSelectCol)) - { - d_nominatedSelectCol--; - } - else if ((col_idx > d_nominatedSelectCol) && (position <= d_nominatedSelectCol)) - { - d_nominatedSelectCol++; - } - - // move column entry in each row. - for (uint i = 0; i < getRowCount(); ++i) - { - // store entry. - ListboxItem* item = d_grid[i][col_idx]; - - // remove the original column for this row. - d_grid[i].d_items.erase(d_grid[i].d_items.begin() + col_idx); - - // insert entry at its new position - d_grid[i].d_items.insert(d_grid[i].d_items.begin() + position, item); - } - - } - -} - - - -/************************************************************************* - renders the widget -*************************************************************************/ -void MultiColumnList::populateRenderCache() -{ - // get the derived class to render general stuff before we handle the items - cacheListboxBaseImagery(); - - // - // Render list items - // - Vector3 itemPos; - Size itemSize; - Rect itemClipper, itemRect;; - - // calculate position of area we have to render into - Rect itemsArea(getListRenderArea()); - - //absarea.offset(getUnclippedPixelRect().getPosition()); - -// // calculate clipper for list rendering area -// Rect clipper(absarea.getIntersection(getPixelRect())); - - // set up initial positional details for items - itemPos.d_y = itemsArea.d_top - d_vertScrollbar->getScrollPosition(); - itemPos.d_z = System::getSingleton().getRenderer()->getZLayer(3) - System::getSingleton().getRenderer()->getCurrentZ(); - - float alpha = getEffectiveAlpha(); - - d_firstVisibleRow = -1; - d_lastVisibleRow = -1; - - // loop through the items - for (uint i = 0; i < getRowCount(); ++i) - { - // set initial x position for this row. - itemPos.d_x = itemsArea.d_left - d_horzScrollbar->getScrollPosition(); - - // calculate height for this row. - itemSize.d_height = getHighestRowItemHeight(i); - - // loop through the columns in this row - for (uint j = 0; j < getColumnCount(); ++j) - { - // allow item to use full width of the column - itemSize.d_width = d_header->getColumnPixelWidth(j); - - ListboxItem* item = d_grid[i][j]; - - // is the item for this column set? - if (item) - { - // calculate destination area for this item. - itemRect.d_left = itemPos.d_x; - itemRect.d_top = itemPos.d_y; - itemRect.setSize(itemSize); - itemClipper = itemRect.getIntersection(itemsArea); - - // Leave a gap between columns - if ( !item->isSelected() && j < getColumnCount() - 1 ) - itemClipper.setWidth( std::max ( 0.f, itemClipper.getWidth() - 5 ) ); - - // skip this item if totally clipped - if (itemClipper.getWidth() == 0) - { - itemPos.d_x += itemSize.d_width; - continue; - } - - // draw this item - item->draw(d_renderCache, itemRect, itemPos.d_z, alpha, &itemClipper); - - if ( d_firstVisibleRow == -1 ) - d_firstVisibleRow = i; - d_lastVisibleRow = i; - } - - // update position for next column. - itemPos.d_x += itemSize.d_width; - } - - // update position ready for next row - itemPos.d_y += itemSize.d_height; - } - -} - - -/************************************************************************* - Handler called when selection mode changes -*************************************************************************/ -void MultiColumnList::onSelectionModeChanged(WindowEventArgs& e) -{ - fireEvent(EventSelectionModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the nominated selection column changes -*************************************************************************/ -void MultiColumnList::onNominatedSelectColumnChanged(WindowEventArgs& e) -{ - fireEvent(EventNominatedSelectColumnChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when nominated selection row changes -*************************************************************************/ -void MultiColumnList::onNominatedSelectRowChanged(WindowEventArgs& e) -{ - fireEvent(EventNominatedSelectRowChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when vertcial scroll bar 'force' mode changes -*************************************************************************/ -void MultiColumnList::onVertScrollbarModeChanged(WindowEventArgs& e) -{ - fireEvent(EventVertScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when horizontal scroll bar 'force' mode changes -*************************************************************************/ -void MultiColumnList::onHorzScrollbarModeChanged(WindowEventArgs& e) -{ - fireEvent(EventHorzScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the current selection in the list changes. -*************************************************************************/ -void MultiColumnList::onSelectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSelectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when list contents changes -*************************************************************************/ -void MultiColumnList::onListContentsChanged(WindowEventArgs& e) -{ - configureScrollbars(); - requestRedraw(); - fireEvent(EventListContentsChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the sort column changes -*************************************************************************/ -void MultiColumnList::onSortColumnChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSortColumnChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the sort direction changes -*************************************************************************/ -void MultiColumnList::onSortDirectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSortDirectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a column is sized -*************************************************************************/ -void MultiColumnList::onListColumnSized(WindowEventArgs& e) -{ - configureScrollbars(); - requestRedraw(); - fireEvent(EventListColumnSized, e, EventNamespace); -} - - -/************************************************************************* - Handler called when a column is moved -*************************************************************************/ -void MultiColumnList::onListColumnMoved(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventListColumnMoved, e, EventNamespace); -} - - -/************************************************************************* - Handler for when we are sized -*************************************************************************/ -void MultiColumnList::onSized(WindowEventArgs& e) -{ - // base class handling - Window::onSized(e); - - configureScrollbars(); - - e.handled = true; -} - - -/************************************************************************* - Handler for when mouse button is pressed -*************************************************************************/ -void MultiColumnList::onMouseButtonDown(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - bool modified = false; - - // clear old selections if no control key is pressed or if multi-select is off - if (!(e.sysKeys & Control) || !d_multiSelect) - { - modified = clearAllSelections_impl(); - } - - Point localPos(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - localPos = relativeToAbsolute(localPos); - } - - ListboxItem* item = getItemAtPoint(localPos); - - if (item != NULL) - { - modified = true; - - // select range or item, depending upon keys and last selected item - if (((e.sysKeys & Shift) && (d_lastSelected != NULL)) && d_multiSelect) - { - modified |= selectRange(getItemGridReference(item), getItemGridReference(d_lastSelected)); - } - else - { - modified |= setItemSelectState_impl(getItemGridReference(item), item->isSelected() ^ true); - } - - // update last selected item - d_lastSelected = item->isSelected() ? item : NULL; - } - - // fire event if needed - if (modified) - { - WindowEventArgs args(this); - onSelectionChanged(args); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse wheel changes -*************************************************************************/ -void MultiColumnList::onMouseWheel(MouseEventArgs& e) -{ - // base class processing. - Window::onMouseWheel(e); - - if (d_vertScrollbar->isVisible() && (d_vertScrollbar->getDocumentSize() > d_vertScrollbar->getPageSize())) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + d_vertScrollbar->getStepSize() * -e.wheelChange); - } - else if (d_horzScrollbar->isVisible() && (d_horzScrollbar->getDocumentSize() > d_horzScrollbar->getPageSize())) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + d_horzScrollbar->getStepSize() * -e.wheelChange); - } - - e.handled = true; -} - - -/************************************************************************* - Event handler for header offset changes (scrolling) -*************************************************************************/ -bool MultiColumnList::handleHeaderScroll(const EventArgs& e) -{ - // grab the header scroll value, convert to pixels, and set the scroll bar to match. - d_horzScrollbar->setScrollPosition(d_header->relativeToAbsoluteX(d_header->getSegmentOffset())); - - return true; -} - - -/************************************************************************* - Event handler for drag & drop of header segments -*************************************************************************/ -bool MultiColumnList::handleHeaderSegMove(const EventArgs& e) -{ - moveColumn_impl(((HeaderSequenceEventArgs&)e).d_oldIdx, ((HeaderSequenceEventArgs&)e).d_newIdx); - - // signal change to our clients - WindowEventArgs args(this); - onListColumnMoved(args); - - return true; -} - - - -/************************************************************************* - Event handler for when header segment size (column width) changes -*************************************************************************/ -bool MultiColumnList::handleColumnSizeChange(const EventArgs& e) -{ - configureScrollbars(); - - // signal change to our clients - WindowEventArgs args(this); - onListColumnSized(args); - - return true; -} - - -/************************************************************************* - Event handler for when horizontal scroll bar is moved. -*************************************************************************/ -bool MultiColumnList::handleHorzScrollbar(const EventArgs& e) -{ - // set header offset to match scroll position - d_header->setSegmentOffset(d_header->absoluteToRelativeX(d_horzScrollbar->getScrollPosition())); - requestRedraw(); - return true; -} - -/************************************************************************* - Event handler for when vertical scroll bar is moved. -*************************************************************************/ -bool MultiColumnList::handleVertScrollbar(const EventArgs& e) -{ - requestRedraw(); - return true; -} - - -/************************************************************************* - Handler for when sort column in header is changed -*************************************************************************/ -bool MultiColumnList::handleSortColumnChange(const EventArgs& e) -{ - uint col = getSortColumn(); - - // set new sort column on all rows - for (uint i = 0; i < getRowCount(); ++i) - { - d_grid[i].d_sortColumn = col; - } - - // re-sort list according to direction - ListHeaderSegment::SortDirection dir = getSortDirection(); - - if (dir == ListHeaderSegment::Descending) - { - std::stable_sort(d_grid.begin(), d_grid.end()); - } - else if (dir == ListHeaderSegment::Ascending) - { - std::stable_sort(d_grid.begin(), d_grid.end(), pred_descend); - } - - // else, no direction, so do not sort. - - // signal change to our clients - WindowEventArgs args(this); - onSortColumnChanged(args); - - return true; -} - - -/************************************************************************* - Handler for when sort direction in header is changed -*************************************************************************/ -bool MultiColumnList::handleSortDirectionChange(const EventArgs& e) -{ - // re-sort list according to direction - ListHeaderSegment::SortDirection dir = getSortDirection(); - - if (dir == ListHeaderSegment::Descending) - { - std::stable_sort(d_grid.begin(), d_grid.end()); - } - else if (dir == ListHeaderSegment::Ascending) - { - std::stable_sort(d_grid.begin(), d_grid.end(), pred_descend); - } - - - // else, no direction, so do not sort. - - // signal change to our clients - WindowEventArgs args(this); - onSortDirectionChanged(args); - - return true; -} - - -/************************************************************************* - Handler for when user double-clicks on header segment splitter -*************************************************************************/ -bool MultiColumnList::handleHeaderSegDblClick(const EventArgs& e) -{ - // get the column index for the segment that was double-clicked - uint col = d_header->getColumnFromSegment((ListHeaderSegment&)*((WindowEventArgs&)e).window); - - autoSizeColumnHeader(col); - - return true; -} - - -/************************************************************************* - Set whether user manipulation of the sort column and direction are - enabled. -*************************************************************************/ -void MultiColumnList::setUserSortControlEnabled(bool setting) -{ - d_header->setSortingEnabled(setting); -} - - -/************************************************************************* - Set whether the user may size column segments. -*************************************************************************/ -void MultiColumnList::setUserColumnSizingEnabled(bool setting) -{ - d_header->setColumnSizingEnabled(setting); -} - -/************************************************************************* - Set whether the user may size a specific column segment. Added by Talidan for MTA -*************************************************************************/ -void MultiColumnList::setUserColumnSegmentSizingEnabled(uint col_idx, bool setting) -{ - getHeaderSegmentForColumn(col_idx).setSizingEnabled(setting); -} - - -/************************************************************************* - Set whether the user may modify the order of the columns. -*************************************************************************/ -void MultiColumnList::setUserColumnDraggingEnabled(bool setting) -{ - d_header->setColumnDraggingEnabled(setting); -} - - -/************************************************************************* - Return the ID code assigned to the requested column. -*************************************************************************/ -uint MultiColumnList::getColumnID(uint col_idx) const -{ - return d_header->getSegmentFromColumn(col_idx).getID(); -} - - -/************************************************************************* - Return the ID code assigned to the requested row. -*************************************************************************/ -uint MultiColumnList::getRowID(uint row_idx) const -{ - // check for invalid index - if (row_idx >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::getRowID - the row index given is out of range."); - } - else - { - return d_grid[row_idx].d_rowID; - } -} - - -/************************************************************************* - Return the zero based row index of the row with the specified ID. -*************************************************************************/ -uint MultiColumnList::getRowWithID(uint row_id) const -{ - for (uint i = 0; i < getRowCount(); ++i) - { - if (d_grid[i].d_rowID == row_id) - { - return i; - } - } - - // No such row found, throw exception - throw InvalidRequestException((utf8*)"MultiColumnList::getRowWithID - no row with the requested ID is present."); -} - - -/************************************************************************* - std algorithm predicate used for sorting in descending order (static) -*************************************************************************/ -bool MultiColumnList::pred_descend(const ListRow& a, const ListRow& b) -{ - return a > b; -} - - -/************************************************************************* - Return whether the vertical scroll bar is always shown. -*************************************************************************/ -bool MultiColumnList::isVertScrollbarAlwaysShown(void) const -{ - return d_forceVertScroll; -} - - -/************************************************************************* - Return whether the horizontal scroll bar is always shown. -*************************************************************************/ -bool MultiColumnList::isHorzScrollbarAlwaysShown(void) const -{ - return d_forceHorzScroll; -} - - -/************************************************************************* - Adds properties for MCL -*************************************************************************/ -void MultiColumnList::addMultiColumnListProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_columnsSizableProperty); - addProperty(&d_columnsMovableProperty); - addProperty(&d_forceHorzScrollProperty); - addProperty(&d_forceVertScrollProperty); - addProperty(&d_nominatedSelectColProperty); - addProperty(&d_nominatedSelectRowProperty); - addProperty(&d_selectModeProperty); - addProperty(&d_sortColumnIDProperty); - addProperty(&d_sortDirectionProperty); - addProperty(&d_sortSettingProperty); - addProperty(&d_columnHeaderProperty); - addProperty(&d_rowCountProperty); - } -} - - -/************************************************************************* - Remove all items from the list. -*************************************************************************/ -bool MultiColumnList::resetList_impl(void) -{ - // just return false if the list is already empty (no rows == empty) - if (getRowCount() == 0) - { - return false; - } - // we have items to be removed and possible deleted - else - { - for (uint i = 0; i < getRowCount(); ++i) - { - for (uint j = 0; j < getColumnCount(); ++j) - { - ListboxItem* item = d_grid[i][j]; - - // delete item as needed. - if ((item != NULL) && item->isAutoDeleted()) - { - delete item; - } - - } - - } - - // clear all items from the grid. - d_grid.clear(); - - // reset other affected fields - d_nominatedSelectRow = 0; - d_lastSelected = NULL; - - return true; - } - -} - - -/************************************************************************* - Automatically determines the "best fit" size for the specified column - and sets the column width to the same. -*************************************************************************/ -void MultiColumnList::autoSizeColumnHeader(uint col_idx) -{ - // check for invalid index - if (col_idx >= getColumnCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::isListboxItemInColumn - the column index given is out of range."); - } - else - { - // get the width of the widest item in the column. - float width = ceguimax(getWidestColumnItemWidth(col_idx), ListHeader::MinimumSegmentPixelWidth); - - // perform metrics conversion if needed - if (getMetricsMode() == Relative) - { - width = absoluteToRelativeX(width); - } - - // set new column width - setColumnHeaderWidth(col_idx, width); - } - -} - - -/************************************************************************* - Set the ID code assigned to a given row. -*************************************************************************/ -void MultiColumnList::setRowID(uint row_idx, uint row_id) -{ - // check for invalid index - if (row_idx >= getRowCount()) - { - throw InvalidRequestException((utf8*)"MultiColumnList::setRowID - the row index given is out of range."); - } - else - { - d_grid[row_idx].d_rowID = row_id; - } -} - -int MultiColumnList::writePropertiesXML(OutStream& out_stream) const -{ - // basically this is here to translate the columns in the list into - // instances of the element. Because the SortColumnID - // property requires the column to exist, we also write that out manually. - - // Dump all other properties first - int propCnt = Window::writePropertiesXML(out_stream); - - // create an dump elements - for (uint i = 0; i < getColumnCount(); ++i) - { - ListHeaderSegment& seg = getHeaderSegmentForColumn(i); - - // start of property element, - String propString(""; - - // write this out to the stream - out_stream << propString.c_str() << std::endl; - - ++propCnt; - } - - // write out SortColumnID property, if any(!) - try - { - uint sortColumnID = getColumnWithID(getSortColumn()); - if (sortColumnID != 0) - { - out_stream << "" << std::endl; - ++propCnt; - } - } - catch (InvalidRequestException) - { - // This catches error(s) from the MultiLineColumnList for example - Logger::getSingleton().logEvent("MultiColumnList::writePropertiesXML - invalid sort column requested. Continuing...", Errors); - } - - return propCnt; -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Operators for ListRow -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Less-than operator -*************************************************************************/ -bool MultiColumnList::ListRow::operator<(const ListRow& rhs) const -{ - ListboxItem* a = d_items[d_sortColumn]; - ListboxItem* b = rhs.d_items[d_sortColumn]; - - // handle cases with empty slots - if (b == NULL) - { - return false; - } - else if (a == NULL) - { - return true; - } - else - { - return *a < *b; - } - -} - - -/************************************************************************* - Greater-than operator -*************************************************************************/ -bool MultiColumnList::ListRow::operator>(const ListRow& rhs) const -{ - ListboxItem* a = d_items[d_sortColumn]; - ListboxItem* b = rhs.d_items[d_sortColumn]; - - // handle cases with empty slots - if (a == NULL) - { - return false; - } - else if (b == NULL) - { - return true; - } - else - { - return *a > *b; - } - -} - - -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Operators for MCLGridRef -*************************************************************************/ -////////////////////////////////////////////////////////////////////////// -/************************************************************************* - Assignment operator -*************************************************************************/ -MCLGridRef& MCLGridRef::operator=(const MCLGridRef& rhs) -{ - column = rhs.column; - row = rhs.row; - return *this; -} - - -/************************************************************************* - return true if this is less than (appears before) 'rhs' in grid. -*************************************************************************/ -bool MCLGridRef::operator<(const MCLGridRef& rhs) const -{ - if ((row < rhs.row) || - ((row == rhs.row) && (column < rhs.column))) - { - return true; - } - else - { - return false; - } -} - - -/************************************************************************* - return true if this is less than or equal to 'rhs' -*************************************************************************/ -bool MCLGridRef::operator<=(const MCLGridRef& rhs) const -{ - return !operator>(rhs); -} - - -/************************************************************************* - return true if this is greater than (appears after) 'rhs' in grid. -*************************************************************************/ -bool MCLGridRef::operator>(const MCLGridRef& rhs) const -{ - return (operator<(rhs) || operator==(rhs)) ? false : true; -} - - -/************************************************************************* - return true if this is greater than or equal to 'rhs' -*************************************************************************/ -bool MCLGridRef::operator>=(const MCLGridRef& rhs) const -{ - return !operator<(rhs); -} - - -/************************************************************************* - return true if this grid ref is equal to that in 'rhs' -*************************************************************************/ -bool MCLGridRef::operator==(const MCLGridRef& rhs) const -{ - return ((column == rhs.column) && (row == rhs.row)) ? true : false; -} - - -/************************************************************************* - return true if this grid ref is different to that in 'rhs' -*************************************************************************/ -bool MCLGridRef::operator!=(const MCLGridRef& rhs) const -{ - return !operator==(rhs); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnListProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnListProperties.cpp deleted file mode 100644 index 26d66b0abf..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiColumnListProperties.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiColumnListProperties.cpp - created: 11/7/2004 - author: Paul D Turner - - purpose: Implements multi-column list properties. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMultiColumnListProperties.h" -#include "elements/CEGUIMultiColumnList.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUILogger.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of MultiColumnListProperties namespace section -namespace MultiColumnListProperties -{ -String ColumnsSizable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isUserColumnSizingEnabled()); -} - - -void ColumnsSizable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setUserColumnSizingEnabled(PropertyHelper::stringToBool(value)); -} - - -String ColumnsMovable::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isUserColumnDraggingEnabled()); -} - - -void ColumnsMovable::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setUserColumnDraggingEnabled(PropertyHelper::stringToBool(value)); -} - - -String SortSettingEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isUserSortControlEnabled()); -} - - -void SortSettingEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setUserSortControlEnabled(PropertyHelper::stringToBool(value)); -} - - -String SortColumnID::get(const PropertyReceiver* receiver) const -{ - const MultiColumnList* mcl = static_cast(receiver); - return PropertyHelper::uintToString(mcl->getColumnID(mcl->getSortColumn())); -} - - -void SortColumnID::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSortColumnByID(PropertyHelper::stringToUint(value)); -} - - -String SortDirection::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getSortDirection()) - { - case ListHeaderSegment::Ascending: - return String((utf8*)"Ascending"); - break; - - case ListHeaderSegment::Descending: - return String((utf8*)"Descending"); - break; - - default: - return String((utf8*)"None"); - break; - } - -} - - -void SortDirection::set(PropertyReceiver* receiver, const String& value) -{ - ListHeaderSegment::SortDirection dir; - - if (value == (utf8*)"Ascending") - { - dir = ListHeaderSegment::Ascending; - } - else if (value == (utf8*)"Descending") - { - dir = ListHeaderSegment::Descending; - } - else - { - dir = ListHeaderSegment::None; - } - - static_cast(receiver)->setSortDirection(dir); -} - - -String NominatedSelectionColumnID::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getNominatedSelectionColumnID()); -} - - -void NominatedSelectionColumnID::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNominatedSelectionColumn(PropertyHelper::stringToUint(value)); -} - - -String NominatedSelectionRow::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getNominatedSelectionRow()); -} - - -void NominatedSelectionRow::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNominatedSelectionRow(PropertyHelper::stringToUint(value)); -} - - -String ForceVertScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isVertScrollbarAlwaysShown()); -} - - -void ForceVertScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setShowVertScrollbar(PropertyHelper::stringToBool(value)); -} - - -String ForceHorzScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isHorzScrollbarAlwaysShown()); -} - - -void ForceHorzScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setShowHorzScrollbar(PropertyHelper::stringToBool(value)); -} - - -String SelectionMode::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getSelectionMode()) - { - case MultiColumnList::RowMultiple: - return String((utf8*)"RowMultiple"); - break; - - case MultiColumnList::ColumnSingle: - return String((utf8*)"ColumnSingle"); - break; - - case MultiColumnList::ColumnMultiple: - return String((utf8*)"ColumnMultiple"); - break; - - case MultiColumnList::CellSingle: - return String((utf8*)"CellSingle"); - break; - - case MultiColumnList::CellMultiple: - return String((utf8*)"CellMultiple"); - break; - - case MultiColumnList::NominatedColumnSingle: - return String((utf8*)"NominatedColumnSingle"); - break; - - case MultiColumnList::NominatedColumnMultiple: - return String((utf8*)"NominatedColumnMultiple"); - break; - - case MultiColumnList::NominatedRowSingle: - return String((utf8*)"NominatedRowSingle"); - break; - - case MultiColumnList::NominatedRowMultiple: - return String((utf8*)"NominatedRowMultiple"); - break; - - default: - return String((utf8*)"RowSingle"); - break; - } -} - - -void SelectionMode::set(PropertyReceiver* receiver, const String& value) -{ - MultiColumnList::SelectionMode mode; - - if (value == (utf8*)"RowMultiple") - { - mode = MultiColumnList::RowMultiple; - } - else if (value == (utf8*)"ColumnSingle") - { - mode = MultiColumnList::ColumnSingle; - } - else if (value == (utf8*)"ColumnMultiple") - { - mode = MultiColumnList::ColumnMultiple; - } - else if (value == (utf8*)"CellSingle") - { - mode = MultiColumnList::CellSingle; - } - else if (value == (utf8*)"CellMultiple") - { - mode = MultiColumnList::CellMultiple; - } - else if (value == (utf8*)"NominatedColumnSingle") - { - mode = MultiColumnList::NominatedColumnSingle; - } - else if (value == (utf8*)"NominatedColumnMultiple") - { - mode = MultiColumnList::NominatedColumnMultiple; - } - else if (value == (utf8*)"NominatedRowSingle") - { - mode = MultiColumnList::NominatedRowSingle; - } - else if (value == (utf8*)"NominatedRowMultiple") - { - mode = MultiColumnList::NominatedRowMultiple; - } - else - { - mode = MultiColumnList::RowSingle; - } - - static_cast(receiver)->setSelectionMode(mode); -} - - -String ColumnHeader::get(const PropertyReceiver* receiver) const -{ - return String(""); -} - - -void ColumnHeader::set(PropertyReceiver* receiver, const String& value) -{ - // Format: "text:[caption] width:[float] id:[uint]" - // Note: Components may appear in any order - String caption, width("0.33"), id("0"); - - // Extract data from the value string - size_t idstart = value.rfind("id:"); - size_t wstart = value.rfind("width:"); - size_t capstart = value.find("text:"); - - if (capstart != String::npos) - { - capstart = value.find_first_of(":", capstart) + 1; - - if (idstart == String::npos) // Missing 'id' component - { - if (wstart == String::npos || capstart > wstart) - { - // Missing 'width' component or caption comes after 'width' component - caption = value.substr(capstart); - } - else - { - // Caption is before the 'width' component - caption = value.substr(capstart, wstart - capstart); - } - } - else - { - if (wstart == String::npos) // Missing 'width' component - { - if (capstart > idstart) - { - // Caption is after the 'id' component - caption = value.substr(capstart); - } - else - { - // Caption is before the 'id' component - caption = value.substr(capstart, idstart - capstart); - } - } - else - { - if (capstart < wstart && capstart < idstart) - { - // Caption is before the 'id' and 'width' component ([caption][id/width]) - caption = value.substr(capstart, std::min(idstart, wstart) - capstart); - } - else if (capstart > wstart && capstart > idstart) - { - // Caption is after 'width' and 'id' component ([id/width][caption]) - caption = value.substr(capstart); - } - else - { - // Caption is between the 'id' and 'width' components ([id or width][caption][[id or width]) - caption = value.substr(capstart, std::max(idstart, wstart) - capstart); - } - } - } - } - - if (wstart != String::npos) - { - width = value.substr(value.find_first_of(":", wstart) + 1); - } - - if (idstart != String::npos) - { - id = value.substr(value.find_first_of(":", idstart) + 1); - } - - static_cast(receiver)->addColumn( - caption, PropertyHelper::stringToUint(id), PropertyHelper::stringToFloat(width)); -} - - -String RowCount::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getRowCount()); -} - - -void RowCount::set(PropertyReceiver* receiver, const String& value) -{ - // property is read only. - Logger::getSingleton().logEvent( - "Attempt to set read only property 'RowCount' on MultiColumnListbox '" + - static_cast(receiver)->getName() + "'.", Errors); -} - - -} // End of MultiColumnListProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditbox.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditbox.cpp deleted file mode 100644 index 1528a920e6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditbox.cpp +++ /dev/null @@ -1,1709 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiLineEditbox.cpp - created: 30/6/2004 - author: Paul D Turner - - purpose: Implementation of the Multi-line edit box base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMultiLineEditbox.h" -#include "elements/CEGUIScrollbar.h" -#include "CEGUITextUtils.h" -#include "CEGUIImage.h" -#include "CEGUIExceptions.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String MultiLineEditbox::EventNamespace("MultiLineEditbox"); - -/************************************************************************* - TODO: - - Clipboard support - Undo support -*************************************************************************/ -/************************************************************************* - Static Properties for this class -*************************************************************************/ -MultiLineEditboxProperties::ReadOnly MultiLineEditbox::d_readOnlyProperty; -MultiLineEditboxProperties::WordWrap MultiLineEditbox::d_wordWrapProperty; -MultiLineEditboxProperties::CaratIndex MultiLineEditbox::d_caratIndexProperty; -MultiLineEditboxProperties::SelectionStart MultiLineEditbox::d_selectionStartProperty; -MultiLineEditboxProperties::SelectionLength MultiLineEditbox::d_selectionLengthProperty; -MultiLineEditboxProperties::MaxTextLength MultiLineEditbox::d_maxTextLengthProperty; -MultiLineEditboxProperties::NormalTextColour MultiLineEditbox::d_normalTextColourProperty; -MultiLineEditboxProperties::SelectedTextColour MultiLineEditbox::d_selectedTextColourProperty; -MultiLineEditboxProperties::ActiveSelectionColour MultiLineEditbox::d_activeSelectionColourProperty; -MultiLineEditboxProperties::InactiveSelectionColour MultiLineEditbox::d_inactiveSelectionColourProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -// event names -const String MultiLineEditbox::EventReadOnlyModeChanged( (utf8*)"ReadOnlyChanged" ); -const String MultiLineEditbox::EventWordWrapModeChanged( (utf8*)"WordWrapModeChanged" ); -const String MultiLineEditbox::EventMaximumTextLengthChanged( (utf8*)"MaximumTextLengthChanged" ); -const String MultiLineEditbox::EventCaratMoved( (utf8*)"CaratMoved" ); -const String MultiLineEditbox::EventTextSelectionChanged( (utf8*)"TextSelectionChanged" ); -const String MultiLineEditbox::EventEditboxFull( (utf8*)"EditboxFullEvent" ); -const String MultiLineEditbox::EventVertScrollbarModeChanged( (utf8*)"VertScrollbarModeChanged" ); -const String MultiLineEditbox::EventHorzScrollbarModeChanged( (utf8*)"HorzScrollbarModeChanged" ); - -// default colours -const argb_t MultiLineEditbox::DefaultNormalTextColour = 0xFFFFFFFF; -const argb_t MultiLineEditbox::DefaultSelectedTextColour = 0xFF000000; -const argb_t MultiLineEditbox::DefaultNormalSelectionColour = 0xFF6060FF; -const argb_t MultiLineEditbox::DefaultInactiveSelectionColour = 0xFF808080; - -// Static data initialisation -String MultiLineEditbox::d_lineBreakChars((utf8*)"\n"); - - -/************************************************************************* - Constructor for the MultiLineEditbox base class. -*************************************************************************/ -MultiLineEditbox::MultiLineEditbox(const String& type, const String& name) : - Window(type, name), - d_readOnly(false), - d_maxTextLen(String::max_size()), - d_caratPos(0), - d_selectionStart(0), - d_selectionEnd(0), - d_dragging(false), - d_dragAnchorIdx(0), - d_wordWrap(true), - d_widestExtent(0.0f), - d_forceVertScroll(false), - d_forceHorzScroll(false), - d_selectionBrush(NULL), - d_normalTextColour(DefaultNormalTextColour), - d_selectTextColour(DefaultSelectedTextColour), - d_selectBrushColour(DefaultNormalSelectionColour), - d_inactiveSelectBrushColour(DefaultInactiveSelectionColour) -{ - // add events specific to this widget. - addMultiLineEditboxEvents(); - - addMultiLineEditboxProperties(); - - // we always need a terminating \n - d_text_raw.append(1, '\n'); - d_text = d_text_raw.bidify (); -} - - -/************************************************************************* - Destructor for the MultiLineEditbox base class. -*************************************************************************/ -MultiLineEditbox::~MultiLineEditbox(void) -{ -} - - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void MultiLineEditbox::initialise(void) -{ - // create the component sub-widgets - d_vertScrollbar = createVertScrollbar(getName() + "__auto_vscrollbar__"); - d_horzScrollbar = createHorzScrollbar(getName() + "__auto_hscrollbar__"); - - addChildWindow(d_vertScrollbar); - addChildWindow(d_horzScrollbar); - - d_vertScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&MultiLineEditbox::handle_scrollChange, this)); - d_horzScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&MultiLineEditbox::handle_scrollChange, this)); - - formatText(); - performChildWindowLayout(); -} - - -/************************************************************************* - return true if the edit box has input focus. -*************************************************************************/ -bool MultiLineEditbox::hasInputFocus(void) const -{ - return isActive(); -} - - -/************************************************************************* - return the current selection start point. -*************************************************************************/ -size_t MultiLineEditbox::getSelectionStartIndex(void) const -{ - return (d_selectionStart != d_selectionEnd) ? d_selectionStart : d_caratPos; -} - - -/************************************************************************* - return the current selection end point. -*************************************************************************/ -size_t MultiLineEditbox::getSelectionEndIndex(void) const -{ - return (d_selectionStart != d_selectionEnd) ? d_selectionEnd : d_caratPos; -} - - -/************************************************************************* - return the length of the current selection (in code points / characters). -*************************************************************************/ -size_t MultiLineEditbox::getSelectionLength(void) const -{ - return d_selectionEnd - d_selectionStart; -} - - -/************************************************************************* - Add multi-line edit box specific events -*************************************************************************/ -void MultiLineEditbox::addMultiLineEditboxEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventReadOnlyModeChanged); - addEvent(EventWordWrapModeChanged); - addEvent(EventMaximumTextLengthChanged); - addEvent(EventCaratMoved); - addEvent(EventTextSelectionChanged); - addEvent(EventEditboxFull); - addEvent(EventVertScrollbarModeChanged); - addEvent(EventHorzScrollbarModeChanged); - } -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void MultiLineEditbox::populateRenderCache() -{ - // get the derived class to render general stuff before we handle the text itself - cacheEditboxBaseImagery(); - - // - // Render edit box text - // - Rect textarea(getTextRenderArea()); - - cacheTextLines(textarea); - - if (hasInputFocus() && !isReadOnly()) - { - cacheCaratImagery(textarea); - } - -} - - -/************************************************************************* - Specify whether the edit box is read-only. -*************************************************************************/ -void MultiLineEditbox::setReadOnly(bool setting) -{ - // if setting is changed - if (d_readOnly != setting) - { - d_readOnly = setting; - WindowEventArgs args(this); - onReadOnlyChanged(args); - } - -} - - -/************************************************************************* - Set the current position of the carat. -*************************************************************************/ -void MultiLineEditbox::setCaratIndex(size_t carat_pos) -{ - // make sure new position is valid - if (carat_pos > d_text.length() - 1) - { - carat_pos = d_text.length() - 1; - } - - // if new position is different - if (d_caratPos != carat_pos) - { - d_caratPos = carat_pos; - ensureCaratIsVisible(); - - // Trigger "carat moved" event - WindowEventArgs args(this); - onCaratMoved(args); - } - -} - - -/************************************************************************* - Define the current selection for the edit box -*************************************************************************/ -void MultiLineEditbox::setSelection(size_t start_pos, size_t end_pos) -{ - // ensure selection start point is within the valid range - if (start_pos > d_text.length() - 1) - { - start_pos = d_text.length() - 1; - } - - // ensure selection end point is within the valid range - if (end_pos > d_text.length() - 1) - { - end_pos = d_text.length() - 1; - } - - // ensure start is before end - if (start_pos > end_pos) - { - size_t tmp = end_pos; - end_pos = start_pos; - start_pos = tmp; - } - - // only change state if values are different. - if ((start_pos != d_selectionStart) || (end_pos != d_selectionEnd)) - { - // setup selection - d_selectionStart = start_pos; - d_selectionEnd = end_pos; - - // Trigger "selection changed" event - WindowEventArgs args(this); - onTextSelectionChanged(args); - } - -} - - -/************************************************************************* - set the maximum text length for this edit box. -*************************************************************************/ -void MultiLineEditbox::setMaxTextLength(size_t max_len) -{ - if (d_maxTextLen != max_len) - { - d_maxTextLen = max_len; - - // Trigger max length changed event - WindowEventArgs args(this); - onMaximumTextLengthChanged(args); - - // trim string - if (d_text_raw.length() > d_maxTextLen) - { - d_text_raw.resize(d_maxTextLen); - d_text = d_text_raw.bidify (); - onTextChanged(args); - } - - } - -} - - -/************************************************************************* - Set the colour to be used for rendering edit box text in the normal, - unselected state. -*************************************************************************/ -void MultiLineEditbox::setNormalTextColour(const colour& col) -{ - d_normalTextColour = col; - requestRedraw(); -} - - -/************************************************************************* - Set the colour to be used for rendering the edit box text when - within the selected region. -*************************************************************************/ -void MultiLineEditbox::setSelectedTextColour(const colour& col) -{ - d_selectTextColour = col; - requestRedraw(); -} - - -/************************************************************************* - Set the colour to be used for rendering the edit box selection - highlight when the edit box is active. -*************************************************************************/ -void MultiLineEditbox::setNormalSelectBrushColour(const colour& col) -{ - d_selectBrushColour = col; - requestRedraw(); -} - - -/************************************************************************* - Set the colour to be used for rendering the edit box selection - highlight when the edit box is inactive. -*************************************************************************/ -void MultiLineEditbox::setInactiveSelectBrushColour(const colour& col) -{ - d_inactiveSelectBrushColour = col; - requestRedraw(); -} - - -/************************************************************************* - Scroll the view so that the current carat position is visible. -*************************************************************************/ -void MultiLineEditbox::ensureCaratIsVisible(void) -{ - // calculate the location of the carat - const Font* fnt = getFont(); - size_t caratLine = getLineNumberFromIndex(d_caratPos); - - if (caratLine < d_lines.size()) - { - Rect textArea(getTextRenderArea()); - - size_t caratLineIdx = d_caratPos - d_lines[caratLine].d_startIdx; - - float ypos = caratLine * fnt->getLineSpacing(); - float xpos = fnt->getTextExtent(d_text.substr(d_lines[caratLine].d_startIdx, caratLineIdx)); - - // adjust position for scroll bars - xpos -= d_horzScrollbar->getScrollPosition(); - ypos -= d_vertScrollbar->getScrollPosition(); - - // if carat is above window, scroll up - if (ypos < 0) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + ypos); - } - // if carat is below the window, scroll down - else if ((ypos += fnt->getLineSpacing()) > textArea.getHeight()) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + (ypos - textArea.getHeight()) + fnt->getLineSpacing()); - } - - // if carat is left of the window, scroll left - if (xpos < 0) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + xpos - 50); - } - // if carat is right of the window, scroll right - else if (xpos > textArea.getWidth()) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + (xpos - textArea.getWidth()) + 50); - } - - } - -} - - -/************************************************************************* - Set whether the text will be word wrapped or not. -*************************************************************************/ -void MultiLineEditbox::setWordWrapping(bool setting) -{ - if (setting != d_wordWrap) - { - d_wordWrap = setting; - formatText(); - - WindowEventArgs args(this); - onWordWrapModeChanged(args); - } - -} - - -/************************************************************************* - display required integrated scroll bars according to current state - of the edit box and update their values. -*************************************************************************/ -void MultiLineEditbox::configureScrollbars(void) -{ - float totalHeight = (float)d_lines.size() * getFont()->getLineSpacing(); - float widestItem = d_widestExtent; - - // - // First show or hide the scroll bars as needed (or requested) - // - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getTextRenderArea().getHeight()) || d_forceVertScroll) - { - d_vertScrollbar->show(); - - // show or hide horizontal scroll bar as required (or as specified by option) - if ((widestItem > getTextRenderArea().getWidth()) || d_forceHorzScroll) - { - d_horzScrollbar->show(); - } - else - { - d_horzScrollbar->hide(); - } - - } - else - { - // show or hide horizontal scroll bar as required (or as specified by option) - if ((widestItem > getTextRenderArea().getWidth()) || d_forceHorzScroll) - { - d_horzScrollbar->show(); - - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getTextRenderArea().getHeight()) || d_forceVertScroll) - { - d_vertScrollbar->show(); - } - else - { - d_vertScrollbar->hide(); - } - - } - else - { - d_vertScrollbar->hide(); - d_horzScrollbar->hide(); - } - - } - - // - // Set up scroll bar values - // - Rect renderArea(getTextRenderArea()); - - d_vertScrollbar->setDocumentSize(totalHeight); - d_vertScrollbar->setPageSize(renderArea.getHeight()); - d_vertScrollbar->setStepSize(ceguimax(1.0f, renderArea.getHeight() / 10.0f)); - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition()); - - d_horzScrollbar->setDocumentSize(widestItem); - d_horzScrollbar->setPageSize(renderArea.getWidth()); - d_horzScrollbar->setStepSize(ceguimax(1.0f, renderArea.getWidth() / 10.0f)); - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition()); -} - - -/************************************************************************* - Render text lines. -*************************************************************************/ -void MultiLineEditbox::cacheTextLines(const Rect& dest_area) -{ - // text is already formatted, we just grab the lines and render them with the required alignment. - Rect drawArea(dest_area); - drawArea.offset(Point(-d_horzScrollbar->getScrollPosition(), -d_vertScrollbar->getScrollPosition())); - - Renderer* renderer = System::getSingleton().getRenderer(); - const Font* fnt = getFont(); - - if (fnt) - { - // get layers to use for rendering - float textZ = renderer->getZLayer(4) - renderer->getCurrentZ(); - float selZ = renderer->getZLayer(3) - renderer->getCurrentZ(); - - // calculate final colours to use. - ColourRect colours; - float alpha = getEffectiveAlpha(); - colour normalTextCol = d_normalTextColour; - normalTextCol.setAlpha(normalTextCol.getAlpha() * alpha); - colour selectTextCol = d_selectTextColour; - selectTextCol.setAlpha(selectTextCol.getAlpha() * alpha); - colour selectBrushCol = hasInputFocus() ? d_selectBrushColour : d_inactiveSelectBrushColour; - selectBrushCol.setAlpha(selectBrushCol.getAlpha() * alpha); - - // Cache font info - const float fLineSpacing = fnt->getLineSpacing (); - - // for each formatted line. - for (size_t i = 0; i < d_lines.size(); ++i) - { - Rect lineRect(drawArea); - // Check line is within the dest_area - if ( lineRect.d_top < dest_area.d_bottom && lineRect.d_top + fLineSpacing > dest_area.d_top ) - { - const LineInfo& currLine = d_lines[i]; - String lineText(d_text.substr(currLine.d_startIdx, currLine.d_length)); - - // if it is a simple 'no selection area' case - if ((currLine.d_startIdx >= d_selectionEnd) || - ((currLine.d_startIdx + currLine.d_length) <= d_selectionStart) || - (d_selectionBrush == NULL)) - { - colours.setColours(normalTextCol); - // render the complete line. - d_renderCache.cacheText(lineText, fnt, LeftAligned, lineRect, textZ, colours, &dest_area); - } - // we have at least some selection highlighting to do - else - { - // Start of actual rendering section. - String sect; - size_t sectIdx = 0, sectLen; - float selStartOffset = 0.0f, selAreaWidth = 0.0f; - - // render any text prior to selected region of line. - if (currLine.d_startIdx < d_selectionStart) - { - // calculate length of text section - sectLen = d_selectionStart - currLine.d_startIdx; - - // get text for this section - sect = lineText.substr(sectIdx, sectLen); - sectIdx += sectLen; - - // get the pixel offset to the beginning of the selection area highlight. - selStartOffset = fnt->getTextExtent(sect); - - // draw this portion of the text - colours.setColours(normalTextCol); - d_renderCache.cacheText(sect, fnt, LeftAligned, lineRect, textZ, colours, &dest_area); - - // set position ready for next portion of text - lineRect.d_left += selStartOffset; - } - - // calculate the length of the selected section - sectLen = ceguimin(d_selectionEnd - currLine.d_startIdx, currLine.d_length) - sectIdx; - - // get the text for this section - sect = lineText.substr(sectIdx, sectLen); - sectIdx += sectLen; - - // get the extent to use as the width of the selection area highlight - selAreaWidth = fnt->getTextExtent(sect); - - // draw the text for this section - colours.setColours(selectTextCol); - d_renderCache.cacheText(sect, fnt, LeftAligned, lineRect, textZ, colours, &dest_area); - - // render any text beyond selected region of line - if (sectIdx < currLine.d_length) - { - // update render position to the end of the selected area. - lineRect.d_left += selAreaWidth; - - // calculate length of this section - sectLen = currLine.d_length - sectIdx; - - // get the text for this section - sect = lineText.substr(sectIdx, sectLen); - - // render the text for this section. - colours.setColours(normalTextCol); - d_renderCache.cacheText(sect, fnt, LeftAligned, lineRect, textZ, colours, &dest_area); - } - - // calculate area for the selection brush on this line - lineRect.d_left = drawArea.d_left + selStartOffset; - lineRect.d_right = lineRect.d_left + selAreaWidth; - lineRect.d_bottom = lineRect.d_top + fLineSpacing; - - // render the selection area brush for this line - colours.setColours(selectBrushCol); - d_renderCache.cacheImage(*d_selectionBrush, lineRect, selZ, colours, &dest_area); - } - } - - // update master position for next line in paragraph. - drawArea.d_top += fLineSpacing; - } - } -} - - -/************************************************************************* - Format the text into lines as needed by the current formatting options. -*************************************************************************/ -void MultiLineEditbox::formatText(void) -{ - // clear old formatting data - d_lines.clear(); - d_widestExtent = 0.0f; - - String paraText; - - const Font* fnt = getFont(); - - if (fnt != NULL) - { - float areaWidth = getTextRenderArea().getWidth(); - - String::size_type currPos = 0; - String::size_type paraLen; - LineInfo line; - - while (currPos < d_text.length()) - { - if ((paraLen = d_text.find_first_of(d_lineBreakChars, currPos)) == String::npos) - { - paraLen = d_text.length() - currPos; - } - else - { - ++paraLen -= currPos; - } - - paraText = d_text.substr(currPos, paraLen); - - if (!d_wordWrap || (areaWidth <= 0.0f)) - { - // no word wrapping, so we are just one long line. - line.d_startIdx = currPos; - line.d_length = paraLen; - line.d_extent = fnt->getTextExtent(paraText); - d_lines.push_back(line); - - // update widest, if needed. - if (line.d_extent > d_widestExtent) - { - d_widestExtent = line.d_extent; - } - - } - // must word-wrap the paragraph text - else - { - String::size_type lineIndex = 0; - - // while there is text in the string - while (lineIndex < paraLen) - { - String::size_type lineLen = 0; - float lineExtent = 0.0f; - - // loop while we have not reached the end of the paragraph string - while (lineLen < (paraLen - lineIndex)) - { - // get cp / char count of next token - size_t nextTokenSize = getNextTokenLength(paraText, lineIndex + lineLen); - - // get pixel width of the token - float tokenExtent = fnt->getTextExtent(paraText.substr(lineIndex + lineLen, nextTokenSize)); - - // would adding this token would overflow the available width - if ((lineExtent + tokenExtent) > areaWidth) - { - // Was this the first token? - if (lineLen == 0) - { - // get point at which to break the token - lineLen = fnt->getCharAtPixel(paraText.substr(lineIndex, nextTokenSize), areaWidth); - - // If not enough room, pretend there is (to prevent infinite loop) - if ( lineLen == 0 ) - lineLen = 1; - } - - // text wraps, exit loop early with line info up until wrap point - break; - } - - // add this token to current line - lineLen += nextTokenSize; - lineExtent += tokenExtent; - } - - // set up line info and add to collection - line.d_startIdx = currPos + lineIndex; - line.d_length = lineLen; - line.d_extent = lineExtent; - d_lines.push_back(line); - - // update widest, if needed. - if (lineExtent > d_widestExtent) - { - d_widestExtent = lineExtent; - } - - // update position in string - lineIndex += lineLen; - } - - } - - // skip to next 'paragraph' in text - currPos += paraLen; - } - - } - - configureScrollbars(); - requestRedraw(); -} - - -/************************************************************************* - Return the length of the next token in String 'text' starting at - index 'start_idx'. -*************************************************************************/ -size_t MultiLineEditbox::getNextTokenLength(const String& text, size_t start_idx) const -{ - String::size_type pos = text.find_first_of(TextUtils::DefaultWrapDelimiters, start_idx); - - // handle case where no more whitespace exists (so this is last token) - if (pos == String::npos) - { - return (text.length() - start_idx); - } - // handle 'delimiter' token cases - else if ((pos - start_idx) == 0) - { - return 1; - } - else - { - return (pos - start_idx); - } - -} - - -/************************************************************************* - Return the text code point index that is rendered closest to screen - position 'pt'. -*************************************************************************/ -size_t MultiLineEditbox::getTextIndexFromPosition(const Point& pt) const -{ - // - // calculate final window position to be checked - // - Point wndPt = screenToWindow(pt); - - if (getMetricsMode() == Relative) - { - wndPt = relativeToAbsolute(wndPt); - } - - Rect textArea(getTextRenderArea()); - - wndPt.d_x -= textArea.d_left; - wndPt.d_y -= textArea.d_top; - - // factor in scroll bar values - wndPt.d_x += d_horzScrollbar->getScrollPosition(); - wndPt.d_y += d_vertScrollbar->getScrollPosition(); - - size_t lineNumber = static_cast(wndPt.d_y / getFont()->getLineSpacing()); - - if (lineNumber >= d_lines.size()) - { - lineNumber = d_lines.size() - 1; - } - - String lineText(d_text.substr(d_lines[lineNumber].d_startIdx, d_lines[lineNumber].d_length)); - - size_t lineIdx = getFont()->getCharAtPixel(lineText, wndPt.d_x); - - if (lineIdx >= lineText.length() - 1) - { - lineIdx = lineText.length() - 1; - } - - return d_lines[lineNumber].d_startIdx + lineIdx; -} - - -/************************************************************************* - Return the line number a given index falls on with the current - formatting. Will return last line if index is out of range. -*************************************************************************/ -size_t MultiLineEditbox::getLineNumberFromIndex(size_t index) const -{ - size_t lineCount = d_lines.size(); - - if (lineCount == 0) - { - return 0; - } - else if (index >= d_text.length() - 1) - { - return lineCount - 1; - } - else - { - size_t indexCount = 0; - size_t caratLine = 0; - - for (; caratLine < lineCount; ++caratLine) - { - indexCount += d_lines[caratLine].d_length; - - if (index < indexCount) - { - return caratLine; - } - - } - - } - - throw InvalidRequestException((utf8*)"MultiLineEditbox::getLineNumberFromIndex - Unable to identify a line from the given, invalid, index."); -} - - - -/************************************************************************* - Clear the current selection setting -*************************************************************************/ -void MultiLineEditbox::clearSelection(void) -{ - // perform action only if required. - if (getSelectionLength() != 0) - { - setSelection(0, 0); - } - -} - - -/************************************************************************* - Erase the currently selected text. -*************************************************************************/ -void MultiLineEditbox::eraseSelectedText(bool modify_text) -{ - if (getSelectionLength() != 0) - { - // setup new carat position and remove selection highlight. - setCaratIndex(getSelectionStartIndex()); - - // erase the selected characters (if required) - if (modify_text) - { - d_text_raw.erase(getSelectionStartIndex(), getSelectionLength()); - d_text = d_text_raw.bidify(); - - // trigger notification that text has changed. - WindowEventArgs args(this); - onTextChanged(args); - } - - clearSelection(); - } - -} - - -/************************************************************************* - Processing for backspace key -*************************************************************************/ -void MultiLineEditbox::handleBackspace(void) -{ - if (!isReadOnly()) - { - if (getSelectionLength() != 0) - { - eraseSelectedText(); - } - else if (d_caratPos > 0) - { - d_text_raw.erase(d_caratPos - 1, 1); - setCaratIndex(d_caratPos - 1); - d_text = d_text_raw.bidify(); - - WindowEventArgs args(this); - onTextChanged(args); - } - - } -} - - -/************************************************************************* - Processing for Delete key -*************************************************************************/ -void MultiLineEditbox::handleDelete(void) -{ - if (!isReadOnly()) - { - if (getSelectionLength() != 0) - { - eraseSelectedText(); - } - else if (getCaratIndex() < d_text.length() - 1) - { - d_text_raw.erase(d_caratPos, 1); - ensureCaratIsVisible(); - d_text = d_text_raw.bidify(); - - WindowEventArgs args(this); - onTextChanged(args); - } - - } - -} - - -/************************************************************************* - Processing to move carat one character left -*************************************************************************/ -void MultiLineEditbox::handleCharLeft(uint sysKeys) -{ - if (d_caratPos > 0) - { - setCaratIndex(d_caratPos - 1); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat one word left -*************************************************************************/ -void MultiLineEditbox::handleWordLeft(uint sysKeys) -{ - if (d_caratPos > 0) - { - setCaratIndex(TextUtils::getWordStartIdx(d_text, getCaratIndex())); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat one character right -*************************************************************************/ -void MultiLineEditbox::handleCharRight(uint sysKeys) -{ - if (d_caratPos < d_text.length() - 1) - { - setCaratIndex(d_caratPos + 1); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat one word right -*************************************************************************/ -void MultiLineEditbox::handleWordRight(uint sysKeys) -{ - if (d_caratPos < d_text.length() - 1) - { - setCaratIndex(TextUtils::getNextWordStartIdx(d_text, getCaratIndex())); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat to the start of the text. -*************************************************************************/ -void MultiLineEditbox::handleDocHome(uint sysKeys) -{ - if (d_caratPos > 0) - { - setCaratIndex(0); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat to the end of the text -*************************************************************************/ -void MultiLineEditbox::handleDocEnd(uint sysKeys) -{ - if (d_caratPos < d_text.length() - 1) - { - setCaratIndex(d_text.length() - 1); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat to the start of the current line. -*************************************************************************/ -void MultiLineEditbox::handleLineHome(uint sysKeys) -{ - size_t line = getLineNumberFromIndex(d_caratPos); - - if (line < d_lines.size()) - { - size_t lineStartIdx = d_lines[line].d_startIdx; - - if (d_caratPos > lineStartIdx) - { - setCaratIndex(lineStartIdx); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - - } - -} - - -/************************************************************************* - Processing to move carat to the end of the current line -*************************************************************************/ -void MultiLineEditbox::handleLineEnd(uint sysKeys) -{ - size_t line = getLineNumberFromIndex(d_caratPos); - - if (line < d_lines.size()) - { - size_t lineEndIdx = d_lines[line].d_startIdx + d_lines[line].d_length - 1; - - if (d_caratPos < lineEndIdx) - { - setCaratIndex(lineEndIdx); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - - } - -} - - -/************************************************************************* - Processing to move carat up a line. -*************************************************************************/ -void MultiLineEditbox::handleLineUp(uint sysKeys) -{ - size_t caratLine = getLineNumberFromIndex(d_caratPos); - - if (caratLine > 0) - { - float caratPixelOffset = getFont()->getTextExtent(d_text.substr(d_lines[caratLine].d_startIdx, d_caratPos - d_lines[caratLine].d_startIdx)); - - --caratLine; - - size_t newLineIndex = getFont()->getCharAtPixel(d_text.substr(d_lines[caratLine].d_startIdx, d_lines[caratLine].d_length), caratPixelOffset); - - setCaratIndex(d_lines[caratLine].d_startIdx + newLineIndex); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to move carat down a line. -*************************************************************************/ -void MultiLineEditbox::handleLineDown(uint sysKeys) -{ - size_t caratLine = getLineNumberFromIndex(d_caratPos); - - if ((d_lines.size() > 1) && (caratLine < (d_lines.size() - 1))) - { - float caratPixelOffset = getFont()->getTextExtent(d_text.substr(d_lines[caratLine].d_startIdx, d_caratPos - d_lines[caratLine].d_startIdx)); - - ++caratLine; - - size_t newLineIndex = getFont()->getCharAtPixel(d_text.substr(d_lines[caratLine].d_startIdx, d_lines[caratLine].d_length), caratPixelOffset); - - setCaratIndex(d_lines[caratLine].d_startIdx + newLineIndex); - } - - if (sysKeys & Shift) - { - setSelection(d_caratPos, d_dragAnchorIdx); - } - else - { - clearSelection(); - } - -} - - -/************************************************************************* - Processing to insert a new line / paragraph. -*************************************************************************/ -void MultiLineEditbox::handleNewLine(uint sysKeys) -{ - if (!isReadOnly()) - { - // erase selected text - eraseSelectedText(); - - // if there is room - if (d_text_raw.length() - 1 < d_maxTextLen) - { - d_text_raw.insert(getCaratIndex(), 1, 0x0a); - d_text = d_text_raw.bidify (); - d_caratPos++; - - - WindowEventArgs args(this); - onTextChanged(args); - } - - } - -} - - -/************************************************************************* - Handler for when a mouse button is pushed -*************************************************************************/ -void MultiLineEditbox::onMouseButtonDown(MouseEventArgs& e) -{ - // base class handling - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - // grab inputs - if (captureInput()) - { - // handle mouse down - clearSelection(); - d_dragging = true; - d_dragAnchorIdx = getTextIndexFromPosition(e.position); - setCaratIndex(d_dragAnchorIdx); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse button is released -*************************************************************************/ -void MultiLineEditbox::onMouseButtonUp(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - releaseInput(); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse button is double-clicked -*************************************************************************/ -void MultiLineEditbox::onMouseDoubleClicked(MouseEventArgs& e) -{ - // base class processing - Window::onMouseDoubleClicked(e); - - if (e.button == LeftButton) - { - d_dragAnchorIdx = TextUtils::getWordStartIdx(d_text, (d_caratPos == d_text.length()) ? d_caratPos : d_caratPos + 1); - d_caratPos = TextUtils::getNextWordStartIdx(d_text, d_caratPos); - - // perform actual selection operation. - setSelection(d_dragAnchorIdx, d_caratPos); - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse button is triple-clicked. -*************************************************************************/ -void MultiLineEditbox::onMouseTripleClicked(MouseEventArgs& e) -{ - // base class processing - Window::onMouseTripleClicked(e); - - if (e.button == LeftButton) - { - size_t caratLine = getLineNumberFromIndex(d_caratPos); - size_t lineStart = d_lines[caratLine].d_startIdx; - - // find end of last paragraph - String::size_type paraStart = d_text.find_last_of(d_lineBreakChars, lineStart); - - // if no previous paragraph, selection will start at the beginning. - if (paraStart == String::npos) - { - paraStart = 0; - } - - // find end of this paragraph - String::size_type paraEnd = d_text.find_first_of(d_lineBreakChars, lineStart); - - // if paragraph has no end, which actually should never happen, fix the - // erroneous situation and select up to end at end of text. - if (paraEnd == String::npos) - { - d_text_raw.append(1, '\n'); - d_text = d_text_raw.bidify (); - - paraEnd = d_text.length() - 1; - } - - // set up selection using new values. - d_dragAnchorIdx = paraStart; - setCaratIndex(paraEnd); - setSelection(d_dragAnchorIdx, d_caratPos); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when mouse moves in the window. -*************************************************************************/ -void MultiLineEditbox::onMouseMove(MouseEventArgs& e) -{ - // base class processing - Window::onMouseMove(e); - - if (d_dragging) - { - setCaratIndex(getTextIndexFromPosition(e.position)); - setSelection(d_caratPos, d_dragAnchorIdx); - } - - e.handled = true; -} - - -/************************************************************************* - Handler for when capture is lost. -*************************************************************************/ -void MultiLineEditbox::onCaptureLost(WindowEventArgs& e) -{ - d_dragging = false; - - // base class processing - Window::onCaptureLost(e); - - e.handled = true; -} - - -/************************************************************************* - Handler for when character (printable keys) are typed -*************************************************************************/ -void MultiLineEditbox::onCharacter(KeyEventArgs& e) -{ - // base class processing - Window::onCharacter(e); - - // only need to take notice if we have focus - bool bHasCodePoint = (e.codepoint > 128) || getFont()->isCodepointAvailable(e.codepoint); - if (hasInputFocus() && bHasCodePoint && !isReadOnly()) - { - // erase selected text - eraseSelectedText(); - - // if there is room - if ( d_text_raw.length() == 0 || ( d_text_raw.length() - 1 < d_maxTextLen ) ) - { - d_text_raw.insert(getCaratIndex(), 1, e.codepoint); - d_caratPos++; - - // Trigger our text setting - d_text = d_text_raw.bidify(); - - WindowEventArgs args(this); - onTextChanged(args); - } - else - { - // Trigger text box full event - WindowEventArgs args(this); - onEditboxFullEvent(args); - } - - } - - e.handled = true; -} - - -/************************************************************************* - Handler for when non-printable keys are typed. -*************************************************************************/ -void MultiLineEditbox::onKeyDown(KeyEventArgs& e) -{ - // base class processing - Window::onKeyDown(e); - - if (hasInputFocus() && !isReadOnly()) - { - WindowEventArgs args(this); - switch (e.scancode) - { - case Key::LeftShift: - case Key::RightShift: - if (getSelectionLength() == 0) - { - d_dragAnchorIdx = getCaratIndex(); - } - break; - - case Key::Backspace: - handleBackspace(); - break; - - case Key::Delete: - handleDelete(); - break; - - case Key::Return: - case Key::NumpadEnter: - handleNewLine(e.sysKeys); - break; - - case Key::ArrowLeft: - if (e.sysKeys & Control) - { - handleWordLeft(e.sysKeys); - } - else - { - handleCharLeft(e.sysKeys); - } - break; - - case Key::ArrowRight: - if (e.sysKeys & Control) - { - handleWordRight(e.sysKeys); - } - else - { - handleCharRight(e.sysKeys); - } - break; - - case Key::ArrowUp: - handleLineUp(e.sysKeys); - break; - - case Key::ArrowDown: - handleLineDown(e.sysKeys); - break; - - case Key::Home: - if (e.sysKeys & Control) - { - handleDocHome(e.sysKeys); - } - else - { - handleLineHome(e.sysKeys); - } - break; - - case Key::End: - if (e.sysKeys & Control) - { - handleDocEnd(e.sysKeys); - } - else - { - handleLineEnd(e.sysKeys); - } - break; - - // default case is now to leave event as (possibly) unhandled. - default: - return; - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for when text is programmatically changed. -*************************************************************************/ -void MultiLineEditbox::onTextChanged(WindowEventArgs& e) -{ - // ensure last character is a new line - if ((d_text.length() == 0) || (d_text[d_text.length() - 1] != '\n')) - { - d_text_raw.append(1, '\n'); - d_text = d_text_raw.bidify (); - } - - // clear selection - clearSelection(); - // layout new text - formatText(); - - // base class processing - Window::onTextChanged(e); - - // layout child windows (scrollbars) since text layout may have changed - performChildWindowLayout(); - // ensure carat is still within the text - setCaratIndex(getCaratIndex()); - // ensure carat is visible - // NB: this will already have been called at least once, but since we - // may have changed the formatting of the text, it needs to be called again. - ensureCaratIsVisible(); - - e.handled = true; -} - - -/************************************************************************* - Handler for when widget size is changed. -*************************************************************************/ -void MultiLineEditbox::onSized(WindowEventArgs& e) -{ - formatText(); - - // base class handling - Window::onSized(e); - - e.handled = true; -} - - -/************************************************************************* - Handler for mouse wheel changes -*************************************************************************/ -void MultiLineEditbox::onMouseWheel(MouseEventArgs& e) -{ - // base class processing. - Window::onMouseWheel(e); - - if (d_vertScrollbar->isVisible() && (d_vertScrollbar->getDocumentSize() > d_vertScrollbar->getPageSize())) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + d_vertScrollbar->getStepSize() * -e.wheelChange); - } - else if (d_horzScrollbar->isVisible() && (d_horzScrollbar->getDocumentSize() > d_horzScrollbar->getPageSize())) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + d_horzScrollbar->getStepSize() * -e.wheelChange); - } - - e.handled = true; -} - - -/************************************************************************* - Handler called when the read-only state of the edit box changes -*************************************************************************/ -void MultiLineEditbox::onReadOnlyChanged(WindowEventArgs& e) -{ - fireEvent(EventReadOnlyModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the word wrap mode for the the edit box changes -*************************************************************************/ -void MultiLineEditbox::onWordWrapModeChanged(WindowEventArgs& e) -{ - fireEvent(EventWordWrapModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the maximum text length for the edit box changes -*************************************************************************/ -void MultiLineEditbox::onMaximumTextLengthChanged(WindowEventArgs& e) -{ - fireEvent(EventMaximumTextLengthChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the carat moves. -*************************************************************************/ -void MultiLineEditbox::onCaratMoved(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventCaratMoved, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the text selection changes -*************************************************************************/ -void MultiLineEditbox::onTextSelectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventTextSelectionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the edit box is full -*************************************************************************/ -void MultiLineEditbox::onEditboxFullEvent(WindowEventArgs& e) -{ - fireEvent(EventEditboxFull, e, EventNamespace); -} - - -/************************************************************************* - Handler called when the 'always show' setting for the vertical - scroll bar changes. -*************************************************************************/ -void MultiLineEditbox::onVertScrollbarModeChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventVertScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when 'always show' setting for the horizontal scroll - bar changes. -*************************************************************************/ -void MultiLineEditbox::onHorzScrollbarModeChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventHorzScrollbarModeChanged, e, EventNamespace); -} - - -/************************************************************************* - Return whether the text in the edit box will be word-wrapped. -*************************************************************************/ -bool MultiLineEditbox::isWordWrapped(void) const -{ - return d_wordWrap; -} - - -/************************************************************************* - Add new properties for this class -*************************************************************************/ -void MultiLineEditbox::addMultiLineEditboxProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_wordWrapProperty); - addProperty(&d_caratIndexProperty); - addProperty(&d_selectionStartProperty); - addProperty(&d_selectionLengthProperty); - addProperty(&d_maxTextLengthProperty); - } - else - { - addProperty(&d_readOnlyProperty); - addProperty(&d_normalTextColourProperty); - addProperty(&d_selectedTextColourProperty); - addProperty(&d_activeSelectionColourProperty); - addProperty(&d_inactiveSelectionColourProperty); - } -} - -/************************************************************************* - Handler for scroll position changes. -*************************************************************************/ -bool MultiLineEditbox::handle_scrollChange(const EventArgs& args) -{ - // simply trigger a redraw of the Listbox. - requestRedraw(); - return true; -} - - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditboxProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditboxProperties.cpp deleted file mode 100644 index 9300b6a48c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIMultiLineEditboxProperties.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/************************************************************************ - filename: CEGUIMultiLineEditboxProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements properties for the MultiLineEditbox class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIMultiLineEditboxProperties.h" -#include "elements/CEGUIMultiLineEditbox.h" -#include "CEGUIPropertyHelper.h" -#include "CEGUIExceptions.h" -#include "CEGUIFont.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of MultiLineEditboxProperties namespace section -namespace MultiLineEditboxProperties -{ -String ReadOnly::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isReadOnly()); -} - - -void ReadOnly::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setReadOnly(PropertyHelper::stringToBool(value)); -} - - -String WordWrap::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isWordWrapped()); -} - - -void WordWrap::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setWordWrapping(PropertyHelper::stringToBool(value)); -} - - -String CaratIndex::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getCaratIndex())); -} - - -void CaratIndex::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCaratIndex(PropertyHelper::stringToUint(value)); -} - - -String SelectionStart::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getSelectionStartIndex())); -} - - -void SelectionStart::set(PropertyReceiver* receiver, const String& value) -{ - MultiLineEditbox* eb = static_cast(receiver); - uint selStart = PropertyHelper::stringToUint(value); - eb->setSelection(selStart, selStart + eb->getSelectionLength()); -} - - -String SelectionLength::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getSelectionLength())); -} - - -void SelectionLength::set(PropertyReceiver* receiver, const String& value) -{ - MultiLineEditbox* eb = static_cast(receiver); - uint selLen = PropertyHelper::stringToUint(value); - eb->setSelection(eb->getSelectionStartIndex(), eb->getSelectionStartIndex() + selLen); -} - - -String MaxTextLength::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(static_cast(receiver)->getMaxTextLength())); -} - - -void MaxTextLength::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMaxTextLength(PropertyHelper::stringToUint(value)); -} - - -String NormalTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalTextColour()); -} - - -void NormalTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalTextColour(PropertyHelper::stringToColour(value)); -} - - -String SelectedTextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getSelectedTextColour()); -} - - -void SelectedTextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSelectedTextColour(PropertyHelper::stringToColour(value)); -} - - -String ActiveSelectionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getNormalSelectBrushColour()); -} - - -void ActiveSelectionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setNormalSelectBrushColour(PropertyHelper::stringToColour(value)); -} - - -String InactiveSelectionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getInactiveSelectBrushColour()); -} - - -void InactiveSelectionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setInactiveSelectBrushColour(PropertyHelper::stringToColour(value)); -} - -} // End of MultiLineEditboxProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenu.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenu.cpp deleted file mode 100644 index 77b6082e89..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenu.cpp +++ /dev/null @@ -1,338 +0,0 @@ -/************************************************************************ - filename: CEGUIPopupMenu.cpp - created: 1/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Implementation of PopupMenu widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIPopupMenu.h" -#include "elements/CEGUIMenuItem.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -PopupMenuProperties::FadeInTime PopupMenu::d_fadeInTimeProperty; -PopupMenuProperties::FadeOutTime PopupMenu::d_fadeOutTimeProperty; - - -/************************************************************************* - Constants -*************************************************************************/ -const String PopupMenu::EventNamespace("PopupMenu"); - - -/************************************************************************* - Constructor for PopupMenu base class. -*************************************************************************/ -PopupMenu::PopupMenu(const String& type, const String& name) - : MenuBase(type, name), - d_origAlpha(d_alpha), - d_fadeOutTime(0), - d_fadeInTime(0), - d_fading(false), - d_fadingOut(false) -{ - d_itemSpacing = 2; - d_horzPadding = 10; - d_vertPadding = 2; - d_borderWidth = 0; - - addPopupMenuProperties(); - - // enable auto resizing - d_autoResize = true; - - // disable parent clipping - setClippedByParent(false); - - // hide by default - hide(); -} - - -/************************************************************************* - Destructor for PopupMenu base class. -*************************************************************************/ -PopupMenu::~PopupMenu(void) -{ -} - - -/************************************************************************* - Tells the popup menu to open. -*************************************************************************/ -void PopupMenu::openPopupMenu(void) -{ - // are we fading? - if (d_fading) - { - // fading in! - if (!d_fadingOut) - { - // dont want to restart fade in! - return; - } - // fading out! - else - { - // make sure the "fade back in" is smooth - if possible ! - if (d_fadeInTime>0.0f&&d_fadeOutTime>0.0f) - { - // jump to the point of the fade in that has the same alpha as right now - this keeps it smooth - d_fadeElapsed = ((d_fadeOutTime-d_fadeElapsed)/d_fadeOutTime)*d_fadeInTime; - } - else - { - // start the fade in from the beginning - d_fadeElapsed = 0; - } - // change to fade in - d_fadingOut=false; - } - - } - // start normal fade in! - else if (d_fadeInTime>0.0f) - { - d_fading = true; - d_fadingOut=false; - setAlpha(0.0f); - d_fadeElapsed = 0; - } - // should not fade! - else - { - d_fading = false; - setAlpha(d_origAlpha); - } - - show(); - moveToFront(); -} - - -/************************************************************************* - Tells the popup menu to close. -*************************************************************************/ -void PopupMenu::closePopupMenu(void) -{ - // are we fading? - if (d_fading) - { - // fading out! - if (d_fadingOut) - { - // dont want to restart fade out! - return; - } - // fading in! - else - { - // make sure the "fade back out" is smooth - if possible ! - if (d_fadeInTime>0.0f&&d_fadeOutTime>0.0f) - { - // jump to the point of the fade in that has the same alpha as right now - this keeps it smooth - d_fadeElapsed = ((d_fadeInTime-d_fadeElapsed)/d_fadeInTime)*d_fadeOutTime; - } - else - { - // start the fade in from the beginning - d_fadeElapsed = 0; - } - // change to fade in - d_fadingOut=true; - } - - } - // start normal fade out! - else if (d_fadeOutTime>0.0f) - { - d_fading = true; - d_fadingOut=true; - setAlpha(d_origAlpha); - d_fadeElapsed = 0; - } - // should not fade! - else - { - d_fading = false; - hide(); - } - -} - - -/************************************************************************* - Perform actual update processing for this Window. -*************************************************************************/ -void PopupMenu::updateSelf(float elapsed) -{ - ItemListBase::updateSelf(elapsed); - - // handle fading - if (d_fading) - { - d_fadeElapsed+=elapsed; - - // fading out - if (d_fadingOut) - { - if (d_fadeElapsed>=d_fadeOutTime) - { - hide(); - d_fading=false; - } - else - { - setAlpha(d_origAlpha*(d_fadeOutTime-d_fadeElapsed)/d_fadeOutTime); - } - - } - - // fading in - else - { - if (d_fadeElapsed>=d_fadeInTime) - { - d_fading=false; - setAlpha(d_origAlpha); - } - else - { - setAlpha(d_origAlpha*d_fadeElapsed/d_fadeInTime); - } - - } - - } - -} - - -/************************************************************************* - Sets up sizes and positions for attached ItemEntry children. -*************************************************************************/ -void PopupMenu::layoutItemWidgets() -{ - // get render area - Rect render_rect = getItemRenderArea(); - - // get starting position - const float x0 = render_rect.d_left+d_borderWidth; - float y0 = render_rect.d_top+d_borderWidth; - - Rect rect; - Size sz(render_rect.getWidth()-d_borderWidth-d_borderWidth,0); // set item width - - // iterate through all items attached to this window - ItemEntryList::iterator item = d_listItems.begin(); - while ( item != d_listItems.end() ) - { - // get the "optimal" height of the item and use that! - sz.d_height = (*item)->getItemPixelSize().d_height; // fix rounding errors - sz.d_height += d_vertPadding+d_vertPadding; - - // set destination rect - rect.setPosition( Point(x0, y0) ); - rect.setSize( sz ); - (*item)->setRect(Absolute,rect); - - // next position - y0 += sz.d_height + d_itemSpacing; - - item++; // next item - } -} - - -/************************************************************************* - Returns the "optimal" size for the content in unclipped pixels -*************************************************************************/ -Size PopupMenu::getContentSize() -{ - // find the content sizes - float widest = 0; - float total_height = 0; - - size_t count = 0; - size_t max = d_listItems.size(); - while (count < max) - { - const Size sz = d_listItems[count]->getItemPixelSize(); - if (sz.d_width > widest) - widest = sz.d_width; - total_height += sz.d_height; - - count++; - } - - const float dbl_border = d_borderWidth+d_borderWidth; - - // add vert padding - total_height += 2.0f*count*d_vertPadding; - // spacing - total_height += (count-1)*d_itemSpacing; - // border - total_height += dbl_border; - - // add horz padding - widest += d_horzPadding+d_horzPadding; - // border - widest += dbl_border; - - // return the content size - return Size( widest, total_height ); -} - - -/************************************************************************* - Handler for when window alpha changes -*************************************************************************/ -void PopupMenu::onAlphaChanged(WindowEventArgs& e) -{ - ItemListBase::onAlphaChanged(e); - - // if we are not fading, this is a real alpha change request and we save a copy of the value - if (!d_fading) - { - d_origAlpha = d_alpha; - } -} - - -/************************************************************************* - Add PopupMenu specific properties -*************************************************************************/ -void PopupMenu::addPopupMenuProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_fadeInTimeProperty); - addProperty(&d_fadeOutTimeProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenuProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenuProperties.cpp deleted file mode 100644 index fadf8f7038..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPopupMenuProperties.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/************************************************************************ - filename: CEGUIPopupMenuProperties.cpp - created: 5/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIPopupMenuProperties.h" -#include "elements/CEGUIPopupMenu.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of PopupMenuProperties namespace section -namespace PopupMenuProperties -{ - -String FadeInTime::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getFadeInTime()); -} - -void FadeInTime::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setFadeInTime(PropertyHelper::stringToFloat(value)); -} - - - -String FadeOutTime::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getFadeOutTime()); -} - -void FadeOutTime::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setFadeOutTime(PropertyHelper::stringToFloat(value)); -} - -} // End of PopupMenuProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBar.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBar.cpp deleted file mode 100644 index 99a777e322..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBar.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/************************************************************************ - filename: CEGUIProgressBar.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of ProgressBar widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIProgressBar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String ProgressBar::EventNamespace("ProgressBar"); - -/************************************************************************* - Definitions of Properties for this class -*************************************************************************/ -ProgressBarProperties::CurrentProgress ProgressBar::d_currentProgressProperty; -ProgressBarProperties::StepSize ProgressBar::d_stepSizeProperty; - - -/************************************************************************* - Event name constants -*************************************************************************/ -const String ProgressBar::EventProgressChanged( (utf8*)"ProgressChanged" ); -const String ProgressBar::EventProgressDone( (utf8*)"ProgressDone" ); - - -/************************************************************************* - Constructor for ProgressBar class -*************************************************************************/ -ProgressBar::ProgressBar(const String& type, const String& name) : - Window(type, name), - d_progress(0), - d_step(0.01f) -{ - addProgressBarEvents(); - addProgressBarProperties(); -} - - -/************************************************************************* - Destructor for ProgressBar -*************************************************************************/ -ProgressBar::~ProgressBar(void) -{ -} - - -/************************************************************************* - set the current progress. -*************************************************************************/ -void ProgressBar::setProgress(float progress) -{ - if ( std::isnan( progress ) ) - progress = 0; - - // legal progress rangeis : 0.0f <= progress <= 1.0f - progress = (progress < 0.0f) ? 0.0f : (progress > 1.0f) ? 1.0f : progress; - - if (progress != d_progress) - { - // update progress and fire off event. - d_progress = progress; - WindowEventArgs args(this); - onProgressChanged(args); - - // if new progress is 100%, fire off the 'done' event as well. - if (d_progress == 1.0f) - { - onProgressDone(args); - } - - } - -} - - -/************************************************************************* - Add progress bar specific events to the window -*************************************************************************/ -void ProgressBar::addProgressBarEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventProgressChanged); - addEvent(EventProgressDone); - } -} - -/************************************************************************* - event triggered when progress changes -*************************************************************************/ -void ProgressBar::onProgressChanged(WindowEventArgs& e) -{ - requestRedraw(); - - fireEvent(EventProgressChanged, e, EventNamespace); -} - - -/************************************************************************* - event triggered when progress reaches 100% -*************************************************************************/ -void ProgressBar::onProgressDone(WindowEventArgs& e) -{ - fireEvent(EventProgressDone, e, EventNamespace); -} - -/************************************************************************* - add properties defined for this class -*************************************************************************/ -void ProgressBar::addProgressBarProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_stepSizeProperty); - addProperty(&d_currentProgressProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBarProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBarProperties.cpp deleted file mode 100644 index 48aa5eb7b3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIProgressBarProperties.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************ - filename: CEGUIProgressBarProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements the ProgressBar property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIProgressBarProperties.h" -#include "elements/CEGUIProgressBar.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ProgressBarProperties namespace section -namespace ProgressBarProperties -{ -String CurrentProgress::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getProgress()); -} - - -void CurrentProgress::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setProgress(PropertyHelper::stringToFloat(value)); -} - - -String StepSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getStep()); -} - - -void StepSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setStepSize(PropertyHelper::stringToFloat(value)); -} - -} // End of ProgressBarProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButton.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButton.cpp deleted file mode 100644 index d5e9e44646..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButton.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/************************************************************************ - filename: CEGUIPushButton.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of PushButton widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIPushButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - constants -*************************************************************************/ -// event strings -const String PushButton::EventNamespace("PushButton"); -const String PushButton::EventClicked( (utf8*)"Clicked" ); -// properties -PushButtonProperties::NormalImage PushButton::d_normalImageProperty; -PushButtonProperties::PushedImage PushButton::d_pushedImageProperty; -PushButtonProperties::HoverImage PushButton::d_hoverImageProperty; -PushButtonProperties::DisabledImage PushButton::d_disabledImageProperty; -PushButtonProperties::UseStandardImagery PushButton::d_useStandardImageryProperty; -PushButtonProperties::TextXOffset PushButton::d_textXOffsetProperty; - - -/************************************************************************* - Constructor -*************************************************************************/ -PushButton::PushButton(const String& type, const String& name) : - ButtonBase(type, name) -{ - // default options - d_autoscaleImages = true; - d_useStandardImagery = true; - d_useNormalImage = false; - d_useHoverImage = false; - d_usePushedImage = false; - d_useDisabledImage = false; - d_textXOffset = 0.0f; - - // add the additional events generated by this derived class - addPushButtonEvents(); - - // add properties for push button class - addPushButtonProperties(); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -PushButton::~PushButton(void) -{ -} - -bool PushButton::isStandardImageryEnabled(void) const -{ - return d_useStandardImagery; -} - -bool PushButton::isCustomImageryAutoSized(void) const -{ - return d_autoscaleImages; -} - -const RenderableImage* PushButton::getNormalImage(void) const -{ - return d_useNormalImage ? &d_normalImage : static_cast(0); -} - -const RenderableImage* PushButton::getHoverImage(void) const -{ - return d_useHoverImage ? &d_hoverImage : static_cast(0); -} - -const RenderableImage* PushButton::getPushedImage(void) const -{ - return d_usePushedImage ? &d_pushedImage : static_cast(0); -} - -const RenderableImage* PushButton::getDisabledImage(void) const -{ - return d_useDisabledImage ? &d_disabledImage : static_cast(0); -} - -float PushButton::getTextXOffset(void) const -{ - return d_textXOffset; -} - -void PushButton::setStandardImageryEnabled(bool setting) -{ - if (d_useStandardImagery != setting) - { - d_useStandardImagery = setting; - requestRedraw(); - } -} - -void PushButton::setCustomImageryAutoSized(bool setting) -{ - // if we are enabling auto-sizing, scale images for current size - if (setting && setting != d_autoscaleImages) - { - Rect area(0, 0, getAbsoluteWidth(), getAbsoluteHeight()); - d_normalImage.setRect(area); - d_hoverImage.setRect(area); - d_pushedImage.setRect(area); - d_disabledImage.setRect(area); - - requestRedraw(); - } - - d_autoscaleImages = setting; -} - -void PushButton::setNormalImage(const RenderableImage* image) -{ - if (image) - { - d_useNormalImage = true; - d_normalImage = *image; - d_normalImage.setRect(Rect(0, 0, getAbsoluteWidth(), getAbsoluteHeight())); - } - else - { - d_useNormalImage = false; - } - - requestRedraw(); -} - -void PushButton::setHoverImage(const RenderableImage* image) -{ - if (image) - { - d_useHoverImage = true; - d_hoverImage = *image; - d_hoverImage.setRect(Rect(0, 0, getAbsoluteWidth(), getAbsoluteHeight())); - } - else - { - d_useHoverImage = false; - } - - requestRedraw(); -} - -void PushButton::setPushedImage(const RenderableImage* image) -{ - if (image) - { - d_usePushedImage = true; - d_pushedImage = *image; - d_pushedImage.setRect(Rect(0, 0, getAbsoluteWidth(), getAbsoluteHeight())); - } - else - { - d_usePushedImage = false; - } - - requestRedraw(); -} - -void PushButton::setDisabledImage(const RenderableImage* image) -{ - if (image) - { - d_useDisabledImage = true; - d_disabledImage = *image; - d_disabledImage.setRect(Rect(0, 0, getAbsoluteWidth(), getAbsoluteHeight())); - } - else - { - d_useDisabledImage = false; - } - - requestRedraw(); -} - -void PushButton::setTextXOffset(float offset) -{ - d_textXOffset = offset; -} - -/************************************************************************* - Add button specific events -*************************************************************************/ -void PushButton::addPushButtonEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventClicked); -} - - -/************************************************************************* - handler invoked internally when the button is clicked. -*************************************************************************/ -void PushButton::onClicked(WindowEventArgs& e) -{ - fireEvent(EventClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void PushButton::onMouseButtonUp(MouseEventArgs& e) -{ - if ((e.button == LeftButton) && isPushed()) - { - Window* sheet = System::getSingleton().getGUISheet(); - - if (sheet != NULL) - { - // if mouse was released over this widget - if (this == sheet->getChildAtPosition(e.position)) - { - // fire event - WindowEventArgs args(this); - onClicked(args); - } - - } - - e.handled = true; - } - - // default handling - ButtonBase::onMouseButtonUp(e); -} - -void PushButton::onSized(WindowEventArgs& e) -{ - // default processing - ButtonBase::onSized(e); - - // scale images if required. - if (d_autoscaleImages) - { - Rect area(0, 0, getAbsoluteWidth(), getAbsoluteHeight()); - d_normalImage.setRect(area); - d_hoverImage.setRect(area); - d_pushedImage.setRect(area); - d_disabledImage.setRect(area); - - e.handled = true; - } - -} - -void PushButton::addPushButtonProperties( bool bCommon ) -{ - if ( bCommon == true ) - { - addProperty(&d_normalImageProperty); - addProperty(&d_pushedImageProperty); - addProperty(&d_hoverImageProperty); - addProperty(&d_useStandardImageryProperty); - } - else - { - addProperty(&d_disabledImageProperty); - addProperty(&d_textXOffsetProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButtonProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButtonProperties.cpp deleted file mode 100644 index 8d2298ab43..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIPushButtonProperties.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/************************************************************************ - filename: CEGUIPushButtonProperties.cpp - created: 22/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIImage.h" -#include "CEGUIImageset.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIExceptions.h" - -#include "elements/CEGUIPushButton.h" -#include "elements/CEGUIPushButtonProperties.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of PushButtonProperties namespace section -namespace PushButtonProperties -{ - String NormalImage::get(const PropertyReceiver* receiver) const - { - const RenderableImage* img = static_cast(receiver)->getNormalImage(); - return img ? PropertyHelper::imageToString(img->getImage()) : String(""); - } - - void NormalImage::set(PropertyReceiver* receiver, const String &value) - { - RenderableImage image; - image.setImage(PropertyHelper::stringToImage(value)); - image.setHorzFormatting(RenderableImage::HorzStretched); - image.setVertFormatting(RenderableImage::VertStretched); - static_cast(receiver)->setNormalImage(&image); - } - - String PushedImage::get(const PropertyReceiver* receiver) const - { - const RenderableImage* img = static_cast(receiver)->getPushedImage(); - return img ? PropertyHelper::imageToString(img->getImage()) : String(""); - } - - void PushedImage::set(PropertyReceiver* receiver, const String &value) - { - RenderableImage image; - image.setImage(PropertyHelper::stringToImage(value)); - image.setHorzFormatting(RenderableImage::HorzStretched); - image.setVertFormatting(RenderableImage::VertStretched); - static_cast(receiver)->setPushedImage(&image); - } - - String HoverImage::get(const PropertyReceiver* receiver) const - { - const RenderableImage* img = static_cast(receiver)->getHoverImage(); - return img ? PropertyHelper::imageToString(img->getImage()) : String(""); - } - - void HoverImage::set(PropertyReceiver* receiver, const String &value) - { - RenderableImage image; - image.setImage(PropertyHelper::stringToImage(value)); - image.setHorzFormatting(RenderableImage::HorzStretched); - image.setVertFormatting(RenderableImage::VertStretched); - static_cast(receiver)->setHoverImage(&image); - } - - String DisabledImage::get(const PropertyReceiver* receiver) const - { - const RenderableImage* img = static_cast(receiver)->getDisabledImage(); - return img ? PropertyHelper::imageToString(img->getImage()) : String(""); - } - - void DisabledImage::set(PropertyReceiver* receiver, const String &value) - { - RenderableImage image; - image.setImage(PropertyHelper::stringToImage(value)); - image.setHorzFormatting(RenderableImage::HorzStretched); - image.setVertFormatting(RenderableImage::VertStretched); - static_cast(receiver)->setDisabledImage(&image); - } - - String UseStandardImagery::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isStandardImageryEnabled()); - } - - void UseStandardImagery::set(PropertyReceiver* receiver, const String &value) - { - static_cast(receiver)->setStandardImageryEnabled(PropertyHelper::stringToBool(value)); - } - - String TextXOffset::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getTextXOffset()); - } - - void TextXOffset::set(PropertyReceiver* receiver, const String &value) - { - static_cast(receiver)->setTextXOffset(PropertyHelper::stringToFloat(value)); - } - -} - -} diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButton.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButton.cpp deleted file mode 100644 index 781af096cb..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButton.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/************************************************************************ - filename: CEGUIRadioButton.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of RadioButton widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIRadioButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String RadioButton::EventNamespace("RadioButton"); - -/************************************************************************* - Definitions of Properties for this class -*************************************************************************/ -RadioButtonProperties::Selected RadioButton::d_selectedProperty; -RadioButtonProperties::GroupID RadioButton::d_groupIDProperty; - - -/************************************************************************* - Event name constants -*************************************************************************/ -// generated internally by Window -const String RadioButton::EventSelectStateChanged( (utf8*)"SelectStateChanged" ); - - -/************************************************************************* - Constructor -*************************************************************************/ -RadioButton::RadioButton(const String& type, const String& name) : - ButtonBase(type, name), - d_selected(false), - d_groupID(0) -{ - // add radio button specific events. - addRadioButtonEvents(); - - addRadioButtonProperties(); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -RadioButton::~RadioButton(void) -{ -} - - -/************************************************************************* - set whether the radio button is selected or not -*************************************************************************/ -void RadioButton::setSelected(bool select) -{ - if (select != d_selected) - { - d_selected = select; - requestRedraw(); - - // if new state is 'selected', we must de-select any selected radio buttons within our group. - if (d_selected) - { - deselectOtherButtonsInGroup(); - } - - WindowEventArgs args(this); - onSelectStateChanged(args); - } - -} - - -/************************************************************************* - set the groupID for this radio button -*************************************************************************/ -void RadioButton::setGroupID(ulong group) -{ - d_groupID = group; - - if (d_selected) - { - deselectOtherButtonsInGroup(); - } - -} - - -/************************************************************************* - Add radio button specific events -*************************************************************************/ -void RadioButton::addRadioButtonEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventSelectStateChanged); -} - - -/************************************************************************* - Deselect any selected radio buttons attached to the same parent - within the same group (but not do not deselect 'this'). -*************************************************************************/ -void RadioButton::deselectOtherButtonsInGroup(void) const -{ - // nothing to do unless we are attached to another window. - if (d_parent != NULL) - { - int child_count = d_parent->getChildCount(); - - // scan all children - for (int child = 0; child < child_count; ++child) - { - // is this child same type as we are? - if (d_parent->getChildAtIdx(child)->getType() == getType()) - { - RadioButton* rb = (RadioButton*)d_parent->getChildAtIdx(child); - - // is child same group, selected, but not 'this'? - if (rb->isSelected() && (rb != this) && (rb->getGroupID() == d_groupID)) - { - // deselect the radio button. - rb->setSelected(false); - } - - } - - } - - } - -} - - -/************************************************************************* - event triggered internally when the select state of the button changes. -*************************************************************************/ -void RadioButton::onSelectStateChanged(WindowEventArgs& e) -{ - fireEvent(EventSelectStateChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler called when mouse button gets released -*************************************************************************/ -void RadioButton::onMouseButtonUp(MouseEventArgs& e) -{ - if ((e.button == LeftButton) && isPushed()) - { - Window* sheet = System::getSingleton().getGUISheet(); - - if (sheet != NULL) - { - // if mouse was released over this widget - if (this == sheet->getChildAtPosition(e.position)) - { - // select this button & deselect all others in the same group. - setSelected(true); - } - - } - - e.handled = true; - } - - // default handling - ButtonBase::onMouseButtonUp(e); -} - - -/************************************************************************* - Return a pointer to the RadioButton object within the same group as - this RadioButton, that is currently selected. -*************************************************************************/ -RadioButton* RadioButton::getSelectedButtonInGroup(void) const -{ - // Only search we we are a child window - if (d_parent != NULL) - { - int child_count = d_parent->getChildCount(); - - // scan all children - for (int child = 0; child < child_count; ++child) - { - // is this child same type as we are? - if (d_parent->getChildAtIdx(child)->getType() == getType()) - { - RadioButton* rb = (RadioButton*)d_parent->getChildAtIdx(child); - - // is child same group and selected? - if (rb->isSelected() && (rb->getGroupID() == d_groupID)) - { - // return the matching RadioButton pointer (may even be 'this'). - return rb; - } - - } - - } - - } - - // no selected button attached to this window is in same group - return NULL; -} - -/************************************************************************* - Add properties for radio button -*************************************************************************/ -void RadioButton::addRadioButtonProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_selectedProperty); - addProperty(&d_groupIDProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButtonProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButtonProperties.cpp deleted file mode 100644 index 4175a7795c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIRadioButtonProperties.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************ - filename: CEGUIRadioButtonProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements properties for Radio Button class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIRadioButtonProperties.h" -#include "elements/CEGUIRadioButton.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of RadioButtonProperties namespace section -namespace RadioButtonProperties -{ -String Selected::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isSelected()); -} - - -void Selected::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setSelected(PropertyHelper::stringToBool(value)); -} - - -String GroupID::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::uintToString(static_cast(receiver)->getGroupID()); -} - - -void GroupID::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setGroupID(PropertyHelper::stringToUint(value)); -} - - -} // End of RadioButtonProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePane.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePane.cpp deleted file mode 100644 index 1caba6799a..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePane.cpp +++ /dev/null @@ -1,509 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollablePane.cpp - created: 1/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIScrollablePane.h" -#include "elements/CEGUIScrolledContainer.h" -#include "elements/CEGUIScrollbar.h" -#include "CEGUIWindowManager.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - ////////////////////////////////////////////////////////////////////////// - // Event name constants - const String ScrollablePane::EventNamespace("ScrollablePane"); - const String ScrollablePane::EventContentPaneChanged("ContentPaneChanged"); - const String ScrollablePane::EventVertScrollbarModeChanged("VertScrollbarModeChanged"); - const String ScrollablePane::EventHorzScrollbarModeChanged("HorzScrollbarModeChanged"); - const String ScrollablePane::EventAutoSizeSettingChanged("AutoSizeSettingChanged"); - const String ScrollablePane::EventContentPaneScrolled("ContentPaneScrolled"); - // Property objects - ScrollablePaneProperties::ForceHorzScrollbar ScrollablePane::d_horzScrollbarProperty; - ScrollablePaneProperties::ForceVertScrollbar ScrollablePane::d_vertScrollbarProperty; - ScrollablePaneProperties::ContentPaneAutoSized ScrollablePane::d_autoSizedProperty; - ScrollablePaneProperties::ContentArea ScrollablePane::d_contentAreaProperty; - ScrollablePaneProperties::HorzStepSize ScrollablePane::d_horzStepProperty; - ScrollablePaneProperties::HorzOverlapSize ScrollablePane::d_horzOverlapProperty; - ScrollablePaneProperties::HorzScrollPosition ScrollablePane::d_horzScrollPositionProperty; - ScrollablePaneProperties::VertStepSize ScrollablePane::d_vertStepProperty; - ScrollablePaneProperties::VertOverlapSize ScrollablePane::d_vertOverlapProperty; - ScrollablePaneProperties::VertScrollPosition ScrollablePane::d_vertScrollPositionProperty; - ////////////////////////////////////////////////////////////////////////// - - ScrollablePane::ScrollablePane(const String& type, const String& name) : - Window(type, name), - d_forceVertScroll(false), - d_forceHorzScroll(false), - d_contentRect(0, 0, 0, 0), - d_vertStep(0.1f), - d_vertOverlap(0.01f), - d_horzStep(0.1f), - d_horzOverlap(0.01f), - d_vertScrollbar(0), - d_horzScrollbar(0), - d_container(0) - { - addScrollablePaneEvents(); - addScrollablePaneProperties(); - } - - ScrollablePane::~ScrollablePane(void) - { - } - - const ScrolledContainer* ScrollablePane::getContentPane(void) const - { - assert (d_container != 0); - return d_container; - } - - bool ScrollablePane::isVertScrollbarAlwaysShown(void) const - { - return d_forceVertScroll; - } - - void ScrollablePane::setShowVertScrollbar(bool setting) - { - if (d_forceVertScroll != setting) - { - d_forceVertScroll = setting; - - configureScrollbars(); - WindowEventArgs args(this); - onVertScrollbarModeChanged(args); - } - } - - bool ScrollablePane::isHorzScrollbarAlwaysShown(void) const - { - return d_forceHorzScroll; - } - - void ScrollablePane::setShowHorzScrollbar(bool setting) - { - if (d_forceHorzScroll != setting) - { - d_forceHorzScroll = setting; - - configureScrollbars(); - WindowEventArgs args(this); - onHorzScrollbarModeChanged(args); - } - } - - bool ScrollablePane::isContentPaneAutoSized(void) const - { - assert(d_container != 0); - return d_container->isContentPaneAutoSized(); - } - - void ScrollablePane::setContentPaneAutoSized(bool setting) - { - assert(d_container != 0); - d_container->setContentPaneAutoSized(setting); - } - - const Rect& ScrollablePane::getContentPaneArea(void) const - { - assert(d_container != 0); - return d_container->getContentArea(); - } - - void ScrollablePane::setContentPaneArea(const Rect& area) - { - assert(d_container != 0); - d_container->setContentArea(area); - } - - float ScrollablePane::getHorizontalStepSize(void) const - { - return d_horzStep; - } - - void ScrollablePane::setHorizontalStepSize(float step) - { - d_horzStep = step; - configureScrollbars(); - } - - float ScrollablePane::getHorizontalOverlapSize(void) const - { - return d_horzOverlap; - } - - void ScrollablePane::setHorizontalOverlapSize(float overlap) - { - d_horzOverlap = overlap; - configureScrollbars(); - } - - float ScrollablePane::getHorizontalScrollPosition(void) const - { - assert(d_horzScrollbar != 0); - float docSz = d_horzScrollbar->getDocumentSize(); - return (docSz != 0) ? d_horzScrollbar->getScrollPosition() / docSz : 0.0f; - } - - void ScrollablePane::setHorizontalScrollPosition(float position) - { - assert(d_horzScrollbar != 0); - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getDocumentSize() * position); - } - - float ScrollablePane::getVerticalStepSize(void) const - { - return d_vertStep; - } - - void ScrollablePane::setVerticalStepSize(float step) - { - d_vertStep = step; - configureScrollbars(); - } - - float ScrollablePane::getVerticalOverlapSize(void) const - { - return d_vertOverlap; - } - - void ScrollablePane::setVerticalOverlapSize(float overlap) - { - d_vertOverlap = overlap; - configureScrollbars(); - } - - float ScrollablePane::getVerticalScrollPosition(void) const - { - assert(d_vertScrollbar != 0); - float docSz = d_vertScrollbar->getDocumentSize(); - return (docSz != 0) ? d_vertScrollbar->getScrollPosition() / docSz : 0.0f; - } - - void ScrollablePane::setVerticalScrollPosition(float position) - { - assert(d_vertScrollbar != 0); - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getDocumentSize() * position); - } - - void ScrollablePane::initialise(void) - { - String widgetName; - // create horizontal scrollbar - widgetName = d_name + "__auto_hscrollbar__"; - d_horzScrollbar = createHorizontalScrollbar(widgetName); - // perform consistency checks on what we got back - assert(d_horzScrollbar != 0); - assert(d_horzScrollbar->getName() == widgetName); - - // create vertical scrollbar - widgetName = d_name + "__auto_vscrollbar__"; - d_vertScrollbar = createVerticalScrollbar(widgetName); - // perform consistency checks on what we got back - assert(d_vertScrollbar != 0); - assert(d_vertScrollbar->getName() == widgetName); - - // create scrolled container widget - d_container = - static_cast(WindowManager::getSingleton().createWindow( - ScrolledContainer::WidgetTypeName, d_name + "__auto_container__")); - - // add child controls - addChildWindow(d_horzScrollbar); - addChildWindow(d_vertScrollbar); - addChildWindow(d_container); - - // do a bit of initialisation - d_horzScrollbar->setAlwaysOnTop(true); - d_vertScrollbar->setAlwaysOnTop(true); - // container pane is always same size as this parent pane, - // scrolling is actually implemented via positioning and clipping tricks. - d_container->setSize(Relative, Size(1.0f, 1.0f)); - - // subscribe to events we need to hear about - d_vertScrollbar->subscribeEvent( - Scrollbar::EventScrollPositionChanged, - Event::Subscriber(&ScrollablePane::handleScrollChange, this)); - d_horzScrollbar->subscribeEvent( - Scrollbar::EventScrollPositionChanged, - Event::Subscriber(&ScrollablePane::handleScrollChange, this)); - d_container->subscribeEvent( - ScrolledContainer::EventContentChanged, - Event::Subscriber(&ScrollablePane::handleContentAreaChange, this)); - d_container->subscribeEvent( - ScrolledContainer::EventAutoSizeSettingChanged, - Event::Subscriber(&ScrollablePane::handleAutoSizePaneChanged, this)); - - // finalise setup - configureScrollbars(); - } - - void ScrollablePane::addScrollablePaneEvents(bool bCommon) - { - if ( bCommon == false ) - { - addEvent(EventAutoSizeSettingChanged); - addEvent(EventContentPaneChanged); - addEvent(EventHorzScrollbarModeChanged); - addEvent(EventVertScrollbarModeChanged); - addEvent(EventContentPaneScrolled); - } - } - - void ScrollablePane::configureScrollbars(void) - { - // controls should all be valid by this stage - assert(d_container != 0); - assert(d_vertScrollbar != 0); - assert(d_horzScrollbar != 0); - - // enable required scrollbars - d_vertScrollbar->setVisible(isVertScrollbarNeeded()); - d_horzScrollbar->setVisible(isHorzScrollbarNeeded()); - - // Check if the addition of the horizontal scrollbar means we - // now also need the vertical bar. - if (d_horzScrollbar->isVisible()) - { - d_vertScrollbar->setVisible(isVertScrollbarNeeded()); - } - - performChildWindowLayout(); - - // get viewable area - Rect viewableArea(getViewableArea()); - - // set up vertical scroll bar values - d_vertScrollbar->setDocumentSize(fabsf(d_contentRect.getHeight())); - d_vertScrollbar->setPageSize(viewableArea.getHeight()); - d_vertScrollbar->setStepSize(ceguimax(1.0f, viewableArea.getHeight() * d_vertStep)); - d_vertScrollbar->setOverlapSize(ceguimax(1.0f, viewableArea.getHeight() * d_vertOverlap)); - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition()); - - // set up horizontal scroll bar values - d_horzScrollbar->setDocumentSize(fabsf(d_contentRect.getWidth())); - d_horzScrollbar->setPageSize(viewableArea.getWidth()); - d_horzScrollbar->setStepSize(ceguimax(1.0f, viewableArea.getWidth() * d_horzStep)); - d_horzScrollbar->setOverlapSize(ceguimax(1.0f, viewableArea.getWidth() * d_horzOverlap)); - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition()); - } - - bool ScrollablePane::isHorzScrollbarNeeded(void) const - { - assert(d_container != 0); - - return ((fabs(d_contentRect.getWidth()) > getViewableArea().getWidth()) || d_forceHorzScroll); - } - - bool ScrollablePane::isVertScrollbarNeeded(void) const - { - assert(d_container != 0); - - return ((fabs(d_contentRect.getHeight()) > getViewableArea().getHeight()) || d_forceVertScroll); - } - - void ScrollablePane::updateContainerPosition(void) - { - assert(d_container != 0); - assert(d_horzScrollbar != 0); - assert(d_vertScrollbar != 0); - - // basePos is the position represented by the scrollbars - // (these are negated so pane is scrolled in the correct directions) - Point basePos(-d_horzScrollbar->getScrollPosition(), -d_vertScrollbar->getScrollPosition()); - - // this bias is the absolute position that 0 on the scrollbars represent. - // effectively removes un-used empty space from the pane. - Point bias(d_contentRect.d_left, d_contentRect.d_top); - - // set the new container pane position to be what the scrollbars request - // minus any bias generated by the location of the content. - d_container->setPosition(Absolute, basePos - bias); - } - - void ScrollablePane::onContentPaneChanged(WindowEventArgs& e) - { - fireEvent(EventContentPaneChanged, e, EventNamespace); - } - - void ScrollablePane::onVertScrollbarModeChanged(WindowEventArgs& e) - { - fireEvent(EventVertScrollbarModeChanged, e, EventNamespace); - } - - void ScrollablePane::onHorzScrollbarModeChanged(WindowEventArgs& e) - { - fireEvent(EventHorzScrollbarModeChanged, e, EventNamespace); - } - - void ScrollablePane::onAutoSizeSettingChanged(WindowEventArgs& e) - { - fireEvent(EventAutoSizeSettingChanged, e, EventNamespace); - } - - void ScrollablePane::onContentPaneScrolled(WindowEventArgs& e) - { - updateContainerPosition(); - fireEvent(EventContentPaneScrolled, e, EventNamespace); - } - - bool ScrollablePane::handleScrollChange(const EventArgs& e) - { - WindowEventArgs args(this); - onContentPaneScrolled(args); - return true; - } - - bool ScrollablePane::handleContentAreaChange(const EventArgs& e) - { - assert(d_container != 0); - assert(d_horzScrollbar != 0); - assert(d_vertScrollbar != 0); - - // get updated extents of the content - Rect contentArea(d_container->getContentArea()); - - // calculate any change on the top and left edges. - float xChange = contentArea.d_left - d_contentRect.d_left; - float yChange = contentArea.d_top - d_contentRect.d_top; - - // store new content extents information - d_contentRect = contentArea; - - configureScrollbars(); - - // update scrollbar positions (which causes container pane to be moved as needed). - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() - xChange); - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() - yChange); - - // this call may already have been made if the scroll positions changed. The call - // is required here for cases where the top/left 'bias' has changed; in which - // case the scroll position notification may or may not have been fired. - if (xChange || yChange) - { - updateContainerPosition(); - } - - // fire event - WindowEventArgs args(this); - onContentPaneChanged(args); - - return true; - } - - bool ScrollablePane::handleAutoSizePaneChanged(const EventArgs& e) - { - // just forward event to client. - WindowEventArgs args(this); - fireEvent(EventAutoSizeSettingChanged, args, EventNamespace); - return args.handled; - } - - void ScrollablePane::addChild_impl(Window* wnd) - { - // null is not a valid window pointer! - assert(wnd != 0); - - // See if this is an internally generated window (will have "__auto_" in the name) - if (wnd->getName().find("__auto_") != String::npos) - { - // This is an internal widget, so should be added normally. - Window::addChild_impl(wnd); - } - // this is a client window/widget, so should be added to the pane container. - else - { - // container should always be valid by the time we're adding client controls - assert(d_container != 0); - d_container->addChildWindow(wnd); - } - } - - void ScrollablePane::removeChild_impl(Window* wnd) - { - // null is not a valid window pointer! - assert(wnd != 0); - - // See if this is an internally generated window (will have "__auto_" in the name) - if (wnd->getName().find("__auto_") != String::npos) - { - // This is an internal widget, so should be removed normally. - Window::removeChild_impl(wnd); - } - // this is a client window/widget, so should be removed from the pane container. - else - { - // container should always be valid by the time we're handling client controls - assert(d_container != 0); - d_container->removeChildWindow(wnd); - } - } - - void ScrollablePane::onSized(WindowEventArgs& e) - { - Window::onSized(e); - configureScrollbars(); - updateContainerPosition(); - - e.handled = true; - } - - void ScrollablePane::onMouseWheel(MouseEventArgs& e) - { - // base class processing. - Window::onMouseWheel(e); - - if (d_vertScrollbar->isVisible() && (d_vertScrollbar->getDocumentSize() > d_vertScrollbar->getPageSize())) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + d_vertScrollbar->getStepSize() * -e.wheelChange); - } - else if (d_horzScrollbar->isVisible() && (d_horzScrollbar->getDocumentSize() > d_horzScrollbar->getPageSize())) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + d_horzScrollbar->getStepSize() * -e.wheelChange); - } - - e.handled = true; - } - - void ScrollablePane::addScrollablePaneProperties( bool bCommon ) - { - if ( bCommon == false ) - { - addProperty(&d_horzScrollbarProperty); - addProperty(&d_vertScrollbarProperty); - addProperty(&d_horzStepProperty); - addProperty(&d_horzOverlapProperty); - addProperty(&d_horzScrollPositionProperty); - addProperty(&d_vertOverlapProperty); - addProperty(&d_vertScrollPositionProperty); - } - else - { - addProperty(&d_autoSizedProperty); - addProperty(&d_contentAreaProperty); - addProperty(&d_vertStepProperty); - } - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePaneProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePaneProperties.cpp deleted file mode 100644 index 9d74e534ca..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollablePaneProperties.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollablePaneProperties.cpp - created: 3/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIScrollablePaneProperties.h" -#include "elements/CEGUIScrollablePane.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ScrollablePaneProperties namespace section -namespace ScrollablePaneProperties -{ - String ContentPaneAutoSized::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isContentPaneAutoSized()); - } - - void ContentPaneAutoSized::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setContentPaneAutoSized(PropertyHelper::stringToBool(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String ContentArea::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::rectToString(static_cast(receiver)->getContentPaneArea()); - } - - void ContentArea::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setContentPaneArea(PropertyHelper::stringToRect(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String ForceVertScrollbar::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isVertScrollbarAlwaysShown()); - } - - void ForceVertScrollbar::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setShowVertScrollbar(PropertyHelper::stringToBool(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String ForceHorzScrollbar::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isHorzScrollbarAlwaysShown()); - } - - void ForceHorzScrollbar::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setShowHorzScrollbar(PropertyHelper::stringToBool(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String HorzStepSize::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHorizontalStepSize()); - } - - void HorzStepSize::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setHorizontalStepSize(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String HorzOverlapSize::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHorizontalOverlapSize()); - } - - void HorzOverlapSize::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setHorizontalOverlapSize(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String HorzScrollPosition::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHorizontalScrollPosition()); - } - - void HorzScrollPosition::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setHorizontalScrollPosition(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String VertStepSize::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHorizontalStepSize()); - } - - void VertStepSize::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setVerticalStepSize(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String VertOverlapSize::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHorizontalOverlapSize()); - } - - void VertOverlapSize::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setVerticalOverlapSize(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String VertScrollPosition::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHorizontalScrollPosition()); - } - - void VertScrollPosition::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setVerticalScrollPosition(PropertyHelper::stringToFloat(value)); - } - -} // End of ScrollablePaneProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbar.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbar.cpp deleted file mode 100644 index ae5be2339e..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbar.cpp +++ /dev/null @@ -1,390 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollbar.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Scrollbar widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIScrollbar.h" -#include "elements/CEGUIThumb.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Scrollbar::EventNamespace("Scrollbar"); - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -ScrollbarProperties::DocumentSize Scrollbar::d_documentSizeProperty; -ScrollbarProperties::PageSize Scrollbar::d_pageSizeProperty; -ScrollbarProperties::StepSize Scrollbar::d_stepSizeProperty; -ScrollbarProperties::OverlapSize Scrollbar::d_overlapSizeProperty; -ScrollbarProperties::ScrollPosition Scrollbar::d_scrollPositionProperty; - - -/************************************************************************* - Event name constants -*************************************************************************/ -const String Scrollbar::EventScrollPositionChanged( (utf8*)"ScrollPosChanged" ); -const String Scrollbar::EventThumbTrackStarted( (utf8*)"ThumbTrackStarted" ); -const String Scrollbar::EventThumbTrackEnded( (utf8*)"ThumbTrackEnded" ); -const String Scrollbar::EventScrollConfigChanged( (utf8*)"ScrollConfigChanged" ); - - -/************************************************************************* - Constructor for Scrollbar objects -*************************************************************************/ -Scrollbar::Scrollbar(const String& type, const String& name) : - Window(type, name), - d_documentSize(1.0f), - d_pageSize(0.0f), - d_stepSize(1.0f), - d_overlapSize(0.0f), - d_position(0.0f) -{ - addScrollbarEvents(); - addScrollbarProperties(); -} - - -/************************************************************************* - Destructor for Scrollbar objects -*************************************************************************/ -Scrollbar::~Scrollbar(void) -{ -} - - -/************************************************************************* - Initialises the Scrollbar object ready for use. -*************************************************************************/ -void Scrollbar::initialise(void) -{ - // Set up thumb - d_thumb = createThumb(getName() + "__auto_thumb__"); - addChildWindow(d_thumb); - d_thumb->subscribeEvent(Thumb::EventThumbPositionChanged, Event::Subscriber(&CEGUI::Scrollbar::handleThumbMoved, this)); - d_thumb->subscribeEvent(Thumb::EventThumbTrackStarted, Event::Subscriber(&CEGUI::Scrollbar::handleThumbTrackStarted, this)); - d_thumb->subscribeEvent(Thumb::EventThumbTrackEnded, Event::Subscriber(&CEGUI::Scrollbar::handleThumbTrackEnded, this)); - - // set up Increase button - d_increase = createIncreaseButton(getName() + "__auto_incbtn__"); - addChildWindow(d_increase); - d_increase->subscribeEvent(PushButton::EventMouseButtonDown, Event::Subscriber(&CEGUI::Scrollbar::handleIncreaseClicked, this)); - - // set up Decrease button - d_decrease = createDecreaseButton(getName() + "__auto_decbtn__"); - addChildWindow(d_decrease); - d_decrease->subscribeEvent(PushButton::EventMouseButtonDown, Event::Subscriber(&CEGUI::Scrollbar::handleDecreaseClicked, this)); - - // do initial layout - performChildWindowLayout(); -} - - -/************************************************************************* - Set the size of the document or data. -*************************************************************************/ -void Scrollbar::setDocumentSize(float document_size) -{ - if (d_documentSize != document_size) - { - d_documentSize = document_size; - updateThumb(); - - WindowEventArgs args(this); - onScrollConfigChanged(args); - } - -} - - -/************************************************************************* - Set the page size for this scroll bar. -*************************************************************************/ -void Scrollbar::setPageSize(float page_size) -{ - if (d_pageSize != page_size) - { - d_pageSize = page_size; - updateThumb(); - - WindowEventArgs args(this); - onScrollConfigChanged(args); - } - -} - - -/************************************************************************* - Set the step size for this scroll bar. -*************************************************************************/ -void Scrollbar::setStepSize(float step_size) -{ - if (d_stepSize != step_size) - { - d_stepSize = step_size; - - WindowEventArgs args(this); - onScrollConfigChanged(args); - } - -} - - -/************************************************************************* - Set the overlap size for this scroll bar. -*************************************************************************/ -void Scrollbar::setOverlapSize(float overlap_size) -{ - if (d_overlapSize != overlap_size) - { - d_overlapSize = overlap_size; - - WindowEventArgs args(this); - onScrollConfigChanged(args); - } - -} - - -/************************************************************************* - Set the current position of scroll bar within the document. -*************************************************************************/ -void Scrollbar::setScrollPosition(float position) -{ - float old_pos = d_position; - - // max position is (docSize - pageSize), but must be at least 0 (in case doc size is very small) - float max_pos = ceguimax((d_documentSize - d_pageSize), 0.0f); - - // limit position to valid range: 0 <= position <= max_pos - d_position = (position >= 0) ? ((position <= max_pos) ? position : max_pos) : 0.0f; - - updateThumb(); - - // notification if required - if (d_position != old_pos) - { - WindowEventArgs args(this); - onScrollPositionChanged(args); - } - -} - - -/************************************************************************* - Add scroll bar specific events -*************************************************************************/ -void Scrollbar::addScrollbarEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventScrollConfigChanged); - } - else - { - addEvent(EventScrollPositionChanged); - addEvent(EventThumbTrackStarted); - addEvent(EventThumbTrackEnded); - } -} - - -/************************************************************************* - Handler triggered when the scroll position changes -*************************************************************************/ -void Scrollbar::onScrollPositionChanged(WindowEventArgs& e) -{ - fireEvent(EventScrollPositionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the user begins to drag the scroll bar thumb. -*************************************************************************/ -void Scrollbar::onThumbTrackStarted(WindowEventArgs& e) -{ - fireEvent(EventThumbTrackStarted, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the scroll bar thumb is released -*************************************************************************/ -void Scrollbar::onThumbTrackEnded(WindowEventArgs& e) -{ - fireEvent(EventThumbTrackEnded, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the scroll bar data configuration changes -*************************************************************************/ -void Scrollbar::onScrollConfigChanged(WindowEventArgs& e) -{ - performChildWindowLayout(); - fireEvent(EventScrollConfigChanged, e, EventNamespace); -} - - - -/************************************************************************* - Handler for when mouse button is clicked within the container -*************************************************************************/ -void Scrollbar::onMouseButtonDown(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - float adj = getAdjustDirectionFromPoint(e.position); - - // adjust scroll bar position in whichever direction as required. - if (adj != 0) - { - setScrollPosition(d_position + ((d_pageSize - d_overlapSize) * adj)); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for scroll wheel changes -*************************************************************************/ -void Scrollbar::onMouseWheel(MouseEventArgs& e) -{ - // base class processing - Window::onMouseWheel(e); - - // scroll by e.wheelChange * stepSize - setScrollPosition(d_position + d_stepSize * -e.wheelChange); - - // ensure the message does not go to our parent. - e.handled = true; -} - - -/************************************************************************* - handler function for when thumb moves. -*************************************************************************/ -bool Scrollbar::handleThumbMoved(const EventArgs& e) -{ - // adjust scroll bar position as required. - setScrollPosition(getValueFromThumb()); - - return true; -} - - -/************************************************************************* - handler function for when the increase button is clicked. -*************************************************************************/ -bool Scrollbar::handleIncreaseClicked(const EventArgs& e) -{ - if (((const MouseEventArgs&)e).button == LeftButton) - { - // adjust scroll bar position as required. - setScrollPosition(d_position + d_stepSize); - - return true; - } - else - { - return false; - } - -} - - -/************************************************************************* - handler function for when the decrease button is clicked. -*************************************************************************/ -bool Scrollbar::handleDecreaseClicked(const EventArgs& e) -{ - if (((const MouseEventArgs&)e).button == LeftButton) - { - // adjust scroll bar position as required. - setScrollPosition(d_position - d_stepSize); - - return true; - } - else - { - return false; - } -} - - -/************************************************************************* - handler function for when thumb tracking begins -*************************************************************************/ -bool Scrollbar::handleThumbTrackStarted(const EventArgs& e) -{ - // simply trigger our own version of this event - WindowEventArgs args(this); - onThumbTrackStarted(args); - - return true; -} - - -/************************************************************************* - handler function for when thumb tracking begins -*************************************************************************/ -bool Scrollbar::handleThumbTrackEnded(const EventArgs& e) -{ - // simply trigger our own version of this event - WindowEventArgs args(this); - onThumbTrackEnded(args); - - return true; -} - - -/************************************************************************* - Add scroll bar properties -*************************************************************************/ -void Scrollbar::addScrollbarProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_documentSizeProperty); - addProperty(&d_pageSizeProperty); - addProperty(&d_overlapSizeProperty); - addProperty(&d_scrollPositionProperty); - } - else - { - addProperty(&d_stepSizeProperty); - } -} - - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbarProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbarProperties.cpp deleted file mode 100644 index fde739e1a5..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrollbarProperties.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/************************************************************************ - filename: CEGUIScrollbarProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements properties for the scroll bar. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIScrollbarProperties.h" -#include "elements/CEGUIScrollbar.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ScrollbarProperties namespace section -namespace ScrollbarProperties -{ -String DocumentSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getDocumentSize()); -} - - -void DocumentSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDocumentSize(PropertyHelper::stringToFloat(value)); -} - - -String PageSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getPageSize()); -} - - -void PageSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setPageSize(PropertyHelper::stringToFloat(value)); -} - - -String StepSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getStepSize()); -} - - -void StepSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setStepSize(PropertyHelper::stringToFloat(value)); -} - - -String OverlapSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getOverlapSize()); -} - - -void OverlapSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setOverlapSize(PropertyHelper::stringToFloat(value)); -} - - -String ScrollPosition::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getScrollPosition()); -} - - -void ScrollPosition::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setScrollPosition(PropertyHelper::stringToFloat(value)); -} - -} // End of ScrollbarProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainer.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainer.cpp deleted file mode 100644 index 341cab7287..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainer.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/************************************************************************ - filename: CEGUIScrolledContainer.cpp - created: 1/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIScrolledContainer.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ ////////////////////////////////////////////////////////////////////////// - // static data definitions - ////////////////////////////////////////////////////////////////////////// - // Widget type name string - const String ScrolledContainer::WidgetTypeName("ScrolledContainer"); - // Event string constants - const String ScrolledContainer::EventNamespace("ScrolledContainer"); - const String ScrolledContainer::EventContentChanged("ContentChanged"); - const String ScrolledContainer::EventAutoSizeSettingChanged("AutoSizeSettingChanged"); - // properties - ScrolledContainerProperties::ContentPaneAutoSized ScrolledContainer::d_autoSizedProperty; - ScrolledContainerProperties::ContentArea ScrolledContainer::d_contentAreaProperty; - ScrolledContainerProperties::ChildExtentsArea ScrolledContainer::d_childExtentsAreaProperty; - ////////////////////////////////////////////////////////////////////////// - - ScrolledContainer::ScrolledContainer(const String& type, const String& name) : - Window(type, name), - d_contentArea(0, 0, 0, 0), - d_autosizePane(true) - { - addScrolledContainerEvents(); - addScrolledContainerProperties(); - } - - ScrolledContainer::~ScrolledContainer(void) - { - } - - bool ScrolledContainer::isContentPaneAutoSized(void) const - { - return d_autosizePane; - } - - void ScrolledContainer::setContentPaneAutoSized(bool setting) - { - if (d_autosizePane != setting) - { - d_autosizePane = setting; - - // Fire events - WindowEventArgs args1(this); - onAutoSizeSettingChanged(args1); - } - } - - const Rect& ScrolledContainer::getContentArea(void) const - { - return d_contentArea; - } - - void ScrolledContainer::setContentArea(const Rect& area) - { - if (!d_autosizePane) - { - d_contentArea = area; - - // Fire event - WindowEventArgs args(this); - onContentChanged(args); - } - - } - - void ScrolledContainer::addScrolledContainerEvents(bool bCommon) - { - if ( bCommon == true ) - { - addEvent(EventContentChanged); - addEvent(EventAutoSizeSettingChanged); - } - } - - Rect ScrolledContainer::getChildExtentsArea(void) const - { - uint childCount = getChildCount(); - - // set up initial content area to match first child. - if (childCount != 0) - { - Window* wnd = getChildAtIdx(0); - Rect extents(wnd->getAbsoluteRect()); - - // control var starts at 1 since we already dealt with 0 above - for (uint i = 1; i < childCount; ++i) - { - wnd = getChildAtIdx(i); - Rect area(wnd->getAbsoluteRect()); - - if (area.d_left < extents.d_left) - extents.d_left = area.d_left; - - if (area.d_top < extents.d_top) - extents.d_top = area.d_top; - - if (area.d_right > extents.d_right) - extents.d_right = area.d_right; - - if (area.d_bottom > extents.d_bottom) - extents.d_bottom = area.d_bottom; - } - - return extents; - } - else - { - return Rect(0, 0, 0, 0); - } - } - - void ScrolledContainer::onContentChanged(WindowEventArgs& e) - { - if (d_autosizePane) - { - d_contentArea = getChildExtentsArea(); - } - - fireEvent(EventContentChanged, e, EventNamespace); - } - - void ScrolledContainer::onAutoSizeSettingChanged(WindowEventArgs& e) - { - fireEvent(EventAutoSizeSettingChanged, e, EventNamespace); - - if (d_autosizePane) - { - WindowEventArgs args(this); - onContentChanged(args); - } - } - - bool ScrolledContainer::handleChildSized(const EventArgs& e) - { - // Fire event that notifies that a child's area has changed. - WindowEventArgs args(this); - onContentChanged(args); - return true; - } - - bool ScrolledContainer::handleChildMoved(const EventArgs& e) - { - // Fire event that notifies that a child's area has changed. - WindowEventArgs args(this); - onContentChanged(args); - return true; - } - - Rect ScrolledContainer::getUnclippedInnerRect(void) const - { - // return inner rect of our parent when possible, - // or of the screen when not. - return d_parent ? - d_parent->getUnclippedInnerRect() : - System::getSingleton().getRenderer()->getRect(); - } - - void ScrolledContainer::onChildAdded(WindowEventArgs& e) - { - Window::onChildAdded(e); - - // subscribe to some events on this child - d_eventConnections.insert(std::make_pair(e.window, - e.window->subscribeEvent(Window::EventSized, - Event::Subscriber(&ScrolledContainer::handleChildSized, this)))); - d_eventConnections.insert(std::make_pair(e.window, - e.window->subscribeEvent(Window::EventMoved, - Event::Subscriber(&ScrolledContainer::handleChildMoved, this)))); - - // perform notification. - WindowEventArgs args(this); - onContentChanged(args); - } - - void ScrolledContainer::onChildRemoved(WindowEventArgs& e) - { - Window::onChildRemoved(e); - - // disconnect from events for this window. - ConnectionTracker::iterator conn; - while ((conn = d_eventConnections.find(e.window)) != d_eventConnections.end()) - { - conn->second->disconnect(); - d_eventConnections.erase(conn); - } - - // perform notification. - WindowEventArgs args(this); - onContentChanged(args); - } - - void ScrolledContainer::onParentSized(WindowEventArgs& e) - { - Window::onParentSized(e); - - // perform notification. - WindowEventArgs args(this); - onContentChanged(args); - } - - void ScrolledContainer::addScrolledContainerProperties( bool bCommon ) - { - if ( bCommon == false ) - { - addProperty(&d_autoSizedProperty); - addProperty(&d_contentAreaProperty); - addProperty(&d_childExtentsAreaProperty); - } - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainerProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainerProperties.cpp deleted file mode 100644 index 81ab027157..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIScrolledContainerProperties.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************ - filename: CEGUIScrolledContainerProperties.cpp - created: 3/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIScrolledContainerProperties.h" -#include "elements/CEGUIScrolledContainer.h" -#include "CEGUILogger.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of ScrolledContainerProperties namespace section -namespace ScrolledContainerProperties -{ - String ContentPaneAutoSized::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::boolToString(static_cast(receiver)->isContentPaneAutoSized()); - } - - void ContentPaneAutoSized::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setContentPaneAutoSized(PropertyHelper::stringToBool(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String ContentArea::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::rectToString(static_cast(receiver)->getContentArea()); - } - - void ContentArea::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setContentArea(PropertyHelper::stringToRect(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String ChildExtentsArea::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::rectToString(static_cast(receiver)->getChildExtentsArea()); - } - - void ChildExtentsArea::set(PropertyReceiver* receiver, const String& value) - { - Logger::getSingleton().logEvent("ScrolledContainerProperties::ChildExtentsArea property does not support being set.", Errors); - } - -} // End of ScrolledContainerProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUISlider.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUISlider.cpp deleted file mode 100644 index cd7798fd1b..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUISlider.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/************************************************************************ - filename: CEGUISlider.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Slider widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUISlider.h" -#include "elements/CEGUIThumb.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Slider::EventNamespace("Slider"); - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -SliderProperties::CurrentValue Slider::d_currentValueProperty; -SliderProperties::MaximumValue Slider::d_maximumValueProperty; -SliderProperties::ClickStepSize Slider::d_clickStepSizeProperty; - - -/************************************************************************* - Event name constants -*************************************************************************/ -const String Slider::EventValueChanged( (utf8*)"ValueChanged" ); -const String Slider::EventThumbTrackStarted( (utf8*)"ThumbTrackStarted" ); -const String Slider::EventThumbTrackEnded( (utf8*)"ThumbTrackEnded" ); - - -/************************************************************************* - Slider base class constructor -*************************************************************************/ -Slider::Slider(const String& type, const String& name) : - Window(type, name), - d_value(0.0f), - d_maxValue(1.0f), - d_step(0.01f), - d_thumb(NULL) -{ - addSliderEvents(); - addSliderProperties(); -} - - -/************************************************************************* - Slider base class destructor -*************************************************************************/ -Slider::~Slider(void) -{ -} - - -/************************************************************************* - Initialises the Window based object ready for use. -*************************************************************************/ -void Slider::initialise(void) -{ - // create and attach thumb - d_thumb = createThumb(getName() + "__auto_thumb__"); - addChildWindow(d_thumb); - - // bind handler to thumb events - d_thumb->subscribeEvent(Thumb::EventThumbPositionChanged, Event::Subscriber(&CEGUI::Slider::handleThumbMoved, this)); - d_thumb->subscribeEvent(Thumb::EventThumbTrackStarted, Event::Subscriber(&CEGUI::Slider::handleThumbTrackStarted, this)); - d_thumb->subscribeEvent(Thumb::EventThumbTrackEnded, Event::Subscriber(&CEGUI::Slider::handleThumbTrackEnded, this)); - - performChildWindowLayout(); -} - - -/************************************************************************* - set the maximum value for the slider. - Note that the minimum value is fixed at 0. -*************************************************************************/ -void Slider::setMaxValue(float maxVal) -{ - d_maxValue = maxVal; - - float oldval = d_value; - - // limit current value to be within new max - if (d_value > d_maxValue) { - d_value = d_maxValue; - } - - updateThumb(); - - // send notification if slider value changed. - if (d_value != oldval) - { - WindowEventArgs args(this); - onValueChanged(args); - } - -} - - -/************************************************************************* - set the current slider value. -*************************************************************************/ -void Slider::setCurrentValue(float value) -{ - float oldval = d_value; - - // range for value: 0 <= value <= maxValue - d_value = (value >= 0.0f) ? ((value <= d_maxValue) ? value : d_maxValue) : 0.0f; - - updateThumb(); - - // send notification if slider value changed. - if (d_value != oldval) - { - WindowEventArgs args(this); - onValueChanged(args); - } - -} - - -/************************************************************************* - Add slider specific events -*************************************************************************/ -void Slider::addSliderEvents(bool bCommon) -{ - if ( bCommon == false ) - { - addEvent(EventValueChanged); - } - else - { - addEvent(EventThumbTrackStarted); - addEvent(EventThumbTrackEnded); - } -} - - -/************************************************************************* - Handler triggered when the slider value changes -*************************************************************************/ -void Slider::onValueChanged(WindowEventArgs& e) -{ - fireEvent(EventValueChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the user begins to drag the slider thumb. -*************************************************************************/ -void Slider::onThumbTrackStarted(WindowEventArgs& e) -{ - fireEvent(EventThumbTrackStarted, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the slider thumb is released -*************************************************************************/ -void Slider::onThumbTrackEnded(WindowEventArgs& e) -{ - fireEvent(EventThumbTrackEnded, e, EventNamespace); -} - - -/************************************************************************* - Handler for when a mouse button is pressed -*************************************************************************/ -void Slider::onMouseButtonDown(MouseEventArgs& e) -{ - // base class processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - float adj = getAdjustDirectionFromPoint(e.position); - - // adjust slider position in whichever direction as required. - if (adj != 0) - { - setCurrentValue(d_value + (adj * d_step)); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for scroll wheel changes -*************************************************************************/ -void Slider::onMouseWheel(MouseEventArgs& e) -{ - // base class processing - Window::onMouseWheel(e); - - // scroll by e.wheelChange * stepSize - setCurrentValue(d_value + d_step * -e.wheelChange); - - // ensure the message does not go to our parent. - e.handled = true; -} - - -/************************************************************************* - handler function for when thumb moves. -*************************************************************************/ -bool Slider::handleThumbMoved(const EventArgs& e) -{ - setCurrentValue(getValueFromThumb()); - - return true; -} - - -/************************************************************************* - handler function for when thumb tracking begins -*************************************************************************/ -bool Slider::handleThumbTrackStarted(const EventArgs& e) -{ - // simply trigger our own version of this event - WindowEventArgs args(this); - onThumbTrackStarted(args); - - return true; -} - - -/************************************************************************* - handler function for when thumb tracking begins -*************************************************************************/ -bool Slider::handleThumbTrackEnded(const EventArgs& e) -{ - // simply trigger our own version of this event - WindowEventArgs args(this); - onThumbTrackEnded(args); - - return true; -} - - -/************************************************************************* - Add properties for the slider -*************************************************************************/ -void Slider::addSliderProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_currentValueProperty); - addProperty(&d_clickStepSizeProperty); - addProperty(&d_maximumValueProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUISliderProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUISliderProperties.cpp deleted file mode 100644 index e71d616a99..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUISliderProperties.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************ - filename: CEGUISliderProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements properties for slider class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUISliderProperties.h" -#include "elements/CEGUISlider.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of SliderProperties namespace section -namespace SliderProperties -{ -String CurrentValue::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getCurrentValue()); -} - - -void CurrentValue::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCurrentValue(PropertyHelper::stringToFloat(value)); -} - - -String MaximumValue::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getMaxValue()); -} - - -void MaximumValue::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setMaxValue(PropertyHelper::stringToFloat(value)); -} - - -String ClickStepSize::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getClickStep()); -} - - -void ClickStepSize::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setClickStep(PropertyHelper::stringToFloat(value)); -} - -} // End of SliderProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUISpinner.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUISpinner.cpp deleted file mode 100644 index eec72f2e96..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUISpinner.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/************************************************************************ - filename: CEGUISpinner.cpp - created: 3/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUISpinner.h" -#include "elements/CEGUIPushButton.h" -#include "elements/CEGUIEditbox.h" -#include "CEGUIExceptions.h" -#include -#include -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - ////////////////////////////////////////////////////////////////////////// - // event strings - const String Spinner::EventNamespace("Spinner"); - const String Spinner::EventValueChanged("ValueChanged"); - const String Spinner::EventStepChanged("StepChanged"); - const String Spinner::EventMaximumValueChanged("MaximumValueChanged"); - const String Spinner::EventMinimumValueChanged("MinimumValueChanged"); - const String Spinner::EventTextInputModeChanged("TextInputModeChanged"); - // Validator strings - const String Spinner::FloatValidator("-?\\d*\\.?\\d*"); - const String Spinner::IntegerValidator("-?\\d*"); - const String Spinner::HexValidator("[0-9a-fA-F]*"); - const String Spinner::OctalValidator("[0-7]*"); - // properties - SpinnerProperties::CurrentValue Spinner::d_currentValueProperty; - SpinnerProperties::StepSize Spinner::d_stepSizeProperty; - SpinnerProperties::MaximumValue Spinner::d_maxValueProperty; - SpinnerProperties::MinimumValue Spinner::d_minValueProperty; - SpinnerProperties::TextInputMode Spinner::d_textInputModeProperty; - ////////////////////////////////////////////////////////////////////////// - - Spinner::Spinner(const String& type, const String& name) : - Window(type, name), - d_increaseButton(0), - d_decreaseButton(0), - d_editbox(0), - d_stepSize(1.0f), - d_currentValue(1.0f), - d_maxValue(32767.0f), - d_minValue(-32768.0f), - d_inputMode((TextInputMode)-1) - { - addSpinnerEvents(); - addSpinnerProperties(); - } - - Spinner::~Spinner(void) - { - // Nothing to do here. - } - - void Spinner::initialise(void) - { - Window::initialise(); - - // create all the component widgets - d_increaseButton = createIncreaseButton(getName() + "__auto_incbtn__"); - addChildWindow(d_increaseButton); - d_decreaseButton = createDecreaseButton(getName() + "__auto_decbtn__"); - addChildWindow(d_decreaseButton); - d_editbox = createEditbox(getName() + "__auto_editbox__"); - addChildWindow(d_editbox); - - // setup component controls - d_increaseButton->setWantsMultiClickEvents(false); - d_increaseButton->setMouseAutoRepeatEnabled(true); - d_decreaseButton->setWantsMultiClickEvents(false); - d_decreaseButton->setMouseAutoRepeatEnabled(true); - - // perform event subscriptions. - d_increaseButton->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(&Spinner::handleIncreaseButton, this)); - d_decreaseButton->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(&Spinner::handleDecreaseButton, this)); - d_editbox->subscribeEvent(Window::EventTextChanged, Event::Subscriber(&Spinner::handleEditTextChange, this)); - - // final initialisation - setTextInputMode(Integer); - setCurrentValue(0.0f); - performChildWindowLayout(); - } - - float Spinner::getCurrentValue(void) const - { - return d_currentValue; - } - - float Spinner::getStepSize(void) const - { - return d_stepSize; - } - - float Spinner::getMaximumValue(void) const - { - return d_maxValue; - } - - float Spinner::getMinimumValue(void) const - { - return d_minValue; - } - - Spinner::TextInputMode Spinner::getTextInputMode(void) const - { - return d_inputMode; - } - - void Spinner::setCurrentValue(float value) - { - if (value != d_currentValue) - { - // limit input value to within valid range for spinner - value = ceguimax(ceguimin(value, d_maxValue), d_minValue); - - d_currentValue = value; - - WindowEventArgs args(this); - onValueChanged(args); - } - } - - void Spinner::setStepSize(float step) - { - if (step != d_stepSize) - { - d_stepSize = step; - - WindowEventArgs args(this); - onStepChanged(args); - } - } - - void Spinner::setMaximumValue(float maxValue) - { - if (maxValue != d_maxValue) - { - d_maxValue = maxValue; - - WindowEventArgs args(this); - onMaximumValueChanged(args); - } - } - - void Spinner::setMinimumValue(float minVaue) - { - if (minVaue != d_minValue) - { - d_minValue = minVaue; - - WindowEventArgs args(this); - onMinimumValueChanged(args); - } - } - - void Spinner::setTextInputMode(TextInputMode mode) - { - if (mode != d_inputMode) - { - switch (mode) - { - case FloatingPoint: - d_editbox->setValidationString(FloatValidator); - break; - case Integer: - d_editbox->setValidationString(IntegerValidator); - break; - case Hexadecimal: - d_editbox->setValidationString(HexValidator); - break; - case Octal: - d_editbox->setValidationString(OctalValidator); - break; - default: - throw InvalidRequestException("Spinner::setTextInputMode - An unknown TextInputMode was specified."); - } - - d_inputMode = mode; - - WindowEventArgs args(this); - onTextInputModeChanged(args); - } - } - - void Spinner::addSpinnerEvents(bool bCommon) - { - if ( bCommon == false ) - { - addEvent(EventValueChanged); - addEvent(EventStepChanged); - addEvent(EventMaximumValueChanged); - addEvent(EventMinimumValueChanged); - addEvent(EventTextInputModeChanged); - } - } - - void Spinner::addSpinnerProperties( bool bCommon ) - { - if ( bCommon == false ) - { - addProperty(&d_currentValueProperty); - addProperty(&d_stepSizeProperty); - addProperty(&d_maxValueProperty); - addProperty(&d_minValueProperty); - addProperty(&d_textInputModeProperty); - } - } - - float Spinner::getValueFromText(void) const - { - // handle empty case - if (d_editbox->getText().empty()) - { - return 0.0f; - } - - int res, tmp; - uint utmp; - float val; - - switch (d_inputMode) - { - case FloatingPoint: - res = sscanf(d_editbox->getText().c_str(), "%f", &val); - break; - case Integer: - res = sscanf(d_editbox->getText().c_str(), "%d", &tmp); - val = static_cast(tmp); - break; - case Hexadecimal: - res = sscanf(d_editbox->getText().c_str(), "%x", &utmp); - val = static_cast(utmp); - break; - case Octal: - res = sscanf(d_editbox->getText().c_str(), "%o", &utmp); - val = static_cast(utmp); - break; - default: - throw InvalidRequestException("Spinner::getValueFromText - An unknown TextInputMode was encountered."); - } - - if (res) - { - return val; - } - - throw InvalidRequestException("Spinner::getValueFromText - The string '" + d_editbox->getText() + "' ca not be converted to numerical representation."); - } - - String Spinner::getTextFromValue(void) const - { - std::stringstream tmp; - - switch (d_inputMode) - { - case FloatingPoint: - tmp << d_currentValue; - break; - case Integer: - tmp << static_cast(d_currentValue); - break; - case Hexadecimal: - tmp << std::hex << std::uppercase << static_cast(d_currentValue); - break; - case Octal: - tmp << std::oct << static_cast(d_currentValue); - break; - default: - throw InvalidRequestException("Spinner::getValueFromText - An unknown TextInputMode was encountered."); - } - - return String(tmp.str()); - } - - void Spinner::onFontChanged(WindowEventArgs& e) - { - // Propagate to children - d_editbox->setFont(getFont()); - // Call base class handler - Window::onFontChanged(e); - } - - void Spinner::onTextChanged(WindowEventArgs& e) - { - // update only if needed - if (d_editbox->getText() != getText()) - { - // done before doing base class processing so event subscribers see - // 'updated' version. - d_editbox->setText(getText()); - e.handled = true; - - Window::onTextChanged(e); - } - } - - void Spinner::onActivated(ActivationEventArgs& e) - { - if (!isActive()) - { - Window::onActivated(e); - - if (!d_editbox->isActive()) - { - d_editbox->activate(); - } - } - } - - void Spinner::onValueChanged(WindowEventArgs& e) - { - // mute to save doing unnecessary events work. - bool wasMuted = d_editbox->isMuted(); - d_editbox->setMutedState(true); - - // Update text with new value. - // (allow special 'empty' case to equal 0 with no text change required) - if (!(d_currentValue == 0 && d_editbox->getText().empty())) - { - d_editbox->setText(getTextFromValue()); - } - // restore previous mute state. - d_editbox->setMutedState(wasMuted); - - fireEvent(EventValueChanged, e, EventNamespace); - } - - void Spinner::onStepChanged(WindowEventArgs& e) - { - fireEvent(EventStepChanged, e, EventNamespace); - } - - void Spinner::onMaximumValueChanged(WindowEventArgs& e) - { - fireEvent(EventMaximumValueChanged, e, EventNamespace); - - if (d_currentValue > d_maxValue) - { - setCurrentValue(d_maxValue); - } - } - - void Spinner::onMinimumValueChanged(WindowEventArgs& e) - { - fireEvent(EventMinimumValueChanged, e, EventNamespace); - - if (d_currentValue < d_minValue) - { - setCurrentValue(d_minValue); - } - } - - void Spinner::onTextInputModeChanged(WindowEventArgs& e) - { - // update edit box text to reflect new mode. - // mute to save doing unnecessary events work. - bool wasMuted = d_editbox->isMuted(); - d_editbox->setMutedState(true); - // Update text with new value. - d_editbox->setText(getTextFromValue()); - // restore previous mute state. - d_editbox->setMutedState(wasMuted); - - fireEvent(EventTextInputModeChanged, e, EventNamespace); - } - - bool Spinner::handleIncreaseButton(const EventArgs& e) - { - if (((const MouseEventArgs&)e).button == LeftButton) - { - setCurrentValue(d_currentValue + d_stepSize); - return true; - } - - return false; - } - - bool Spinner::handleDecreaseButton(const EventArgs& e) - { - if (((const MouseEventArgs&)e).button == LeftButton) - { - setCurrentValue(d_currentValue - d_stepSize); - return true; - } - - return false; - } - - bool Spinner::handleEditTextChange(const EventArgs& e) - { - // set this windows text to match - setText(d_editbox->getText()); - // update value - setCurrentValue(getValueFromText()); - return true; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUISpinnerProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUISpinnerProperties.cpp deleted file mode 100644 index f6733d11e4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUISpinnerProperties.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/************************************************************************ - filename: CEGUISpinnerProperties.cpp - created: 7/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUISpinnerProperties.h" -#include "elements/CEGUISpinner.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of SpinnerProperties namespace section -namespace SpinnerProperties -{ - String CurrentValue::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getCurrentValue()); - } - - void CurrentValue::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setCurrentValue(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String StepSize::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getStepSize()); - } - - void StepSize::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setStepSize(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String MinimumValue::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getMinimumValue()); - } - - void MinimumValue::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setMinimumValue(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String MaximumValue::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getMaximumValue()); - } - - void MaximumValue::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setMaximumValue(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String TextInputMode::get(const PropertyReceiver* receiver) const - { - switch(static_cast(receiver)->getTextInputMode()) - { - case Spinner::FloatingPoint: - return String("FloatingPoint"); - break; - case Spinner::Hexadecimal: - return String("Hexadecimal"); - break; - case Spinner::Octal: - return String("Octal"); - break; - default: - return String("Integer"); - } - } - - void TextInputMode::set(PropertyReceiver* receiver, const String& value) - { - Spinner::TextInputMode mode; - - if (value == "FloatingPoint") - { - mode = Spinner::FloatingPoint; - } - else if (value == "Hexadecimal") - { - mode = Spinner::Hexadecimal; - } - else if (value == "Octal") - { - mode = Spinner::Octal; - } - else - { - mode = Spinner::Integer; - } - - static_cast(receiver)->setTextInputMode(mode); - } - -} // End of SpinnerProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStatic.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIStatic.cpp deleted file mode 100644 index 11244b8bfe..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStatic.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/************************************************************************ - filename: CEGUIStatic.cpp - created: 13/4/2004 - author: Paul D Turner - - purpose: Implementation of Static widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIStatic.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Static::EventNamespace("Static"); - -/************************************************************************* - Definitions of Properties for this class -*************************************************************************/ -StaticProperties::FrameEnabled Static::d_frameEnabledProperty; -StaticProperties::BackgroundEnabled Static::d_backgroundEnabledProperty; -StaticProperties::FrameColours Static::d_frameColoursProperty; -StaticProperties::BackgroundColours Static::d_backgroundColoursProperty; -StaticProperties::BackgroundImage Static::d_backgroundImageProperty; -StaticProperties::TopLeftFrameImage Static::d_topLeftFrameProperty; -StaticProperties::TopRightFrameImage Static::d_topRightFrameProperty; -StaticProperties::BottomLeftFrameImage Static::d_bottomLeftFrameProperty; -StaticProperties::BottomRightFrameImage Static::d_bottomRightFrameProperty; -StaticProperties::LeftFrameImage Static::d_leftFrameProperty; -StaticProperties::RightFrameImage Static::d_rightFrameProperty; -StaticProperties::TopFrameImage Static::d_topFrameProperty; -StaticProperties::BottomFrameImage Static::d_bottomFrameProperty; - - -/************************************************************************* - Constructor for static widget base class -*************************************************************************/ -Static::Static(const String& type, const String& name) : - Window(type, name), - d_frameEnabled(false), - d_frameCols(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), - d_backgroundEnabled(false), - d_backgroundCols(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), - d_background(NULL), - d_left_width(0), - d_right_width(0), - d_top_height(0), - d_bottom_height(0) -{ - addStaticProperties(); -} - - -/************************************************************************* - Destructor for static widget base class. -*************************************************************************/ -Static::~Static(void) -{ -} - - -/************************************************************************* - overridden so derived classes are auto-clipped to within the inner - area of the frame when it's active. -*************************************************************************/ -Rect Static::getUnclippedInnerRect(void) const -{ - // if frame is enabled, return rect for area inside frame - if (d_frameEnabled) - { - Rect tmp(Window::getUnclippedInnerRect()); - tmp.d_left += d_left_width; - tmp.d_right -= d_right_width; - tmp.d_top += d_top_height; - tmp.d_bottom -= d_bottom_height; - return tmp; - } - // no frame, so return default inner rect. - else - { - return Window::getUnclippedInnerRect(); - } - -} - - -/************************************************************************* - Enable or disable rendering of the frame for this static widget. -*************************************************************************/ -void Static::setFrameEnabled(bool setting) -{ - if (d_frameEnabled != setting) - { - d_frameEnabled = setting; - WindowEventArgs args(this); - onStaticFrameChanged(args); - requestRedraw(); - } -} - - -/************************************************************************* - specify the Image objects to use for each part of the frame. - A NULL may be used to omit any part. -*************************************************************************/ -void Static::setFrameImages(const Image* topleft, const Image* topright, const Image* bottomleft, const Image* bottomright, const Image* left, const Image* top, const Image* right, const Image* bottom) -{ - // install the new images into the RenderableFrame - d_frame.setImages(topleft, topright, bottomleft, bottomright, left, top, right, bottom); - - // get sizes of frame edges - d_left_width = (left != NULL) ? left->getWidth() : 0.0f; - d_right_width = (right != NULL) ? right->getWidth() : 0.0f; - d_top_height = (top != NULL) ? top->getHeight() : 0.0f; - d_bottom_height = (bottom != NULL) ? bottom->getHeight() : 0.0f; - - // redraw only if change would be seen. - if (d_frameEnabled) - { - WindowEventArgs args(this); - onStaticFrameChanged(args); - requestRedraw(); - } - -} - - -/************************************************************************* - Sets the colours to be applied when rendering the frame -*************************************************************************/ -void Static::setFrameColours(const ColourRect& colours) -{ - d_frameCols = colours; - updateRenderableFrameColours(); - - // redraw only if change would be seen. - if (d_frameEnabled) - { - WindowEventArgs args(this); - onStaticFrameChanged(args); - requestRedraw(); - } - -} - - -/************************************************************************* - Sets the colours to be applied when rendering the frame -*************************************************************************/ -void Static::setFrameColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour) -{ - d_frameCols.d_top_left = top_left_colour; - d_frameCols.d_top_right = top_right_colour; - d_frameCols.d_bottom_left = bottom_left_colour; - d_frameCols.d_bottom_right = bottom_right_colour; - updateRenderableFrameColours(); - - // redraw only if change would be seen. - if (d_frameEnabled) - { - WindowEventArgs args(this); - onStaticFrameChanged(args); - requestRedraw(); - } - -} - - -/************************************************************************* - Enable or disable rendering of the background for this static widget. -*************************************************************************/ -void Static::setBackgroundEnabled(bool setting) -{ - if (d_backgroundEnabled != setting) - { - d_backgroundEnabled = setting; - requestRedraw(); - } - -} - - -/************************************************************************* - Set the image to use as the background for the static widget. -*************************************************************************/ -void Static::setBackgroundImage(const Image* image) -{ - d_background = image; - - if (d_backgroundEnabled) - { - requestRedraw(); - } - -} - - -/************************************************************************* - Set the image to use as the background for the static widget. -*************************************************************************/ -void Static::setBackgroundImage(const String& imageset, const String& image) -{ - setBackgroundImage(&ImagesetManager::getSingleton().getImageset(imageset)->getImage(image)); -} - - -/************************************************************************* - Sets the colours to be applied when rendering the background. -*************************************************************************/ -void Static::setBackgroundColours(const ColourRect& colours) -{ - d_backgroundCols = colours; - - if (d_backgroundEnabled) - { - requestRedraw(); - } - -} - - -/************************************************************************* - Sets the colours to be applied when rendering the background. -*************************************************************************/ -void Static::setBackgroundColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour) -{ - d_backgroundCols.d_top_left = top_left_colour; - d_backgroundCols.d_top_right = top_right_colour; - d_backgroundCols.d_bottom_left = bottom_left_colour; - d_backgroundCols.d_bottom_right = bottom_right_colour; - - if (d_backgroundEnabled) - { - requestRedraw(); - } - -} - - -/************************************************************************* - update the internal RenderableFrame with currently set colours and - alpha settings. -*************************************************************************/ -void Static::updateRenderableFrameColours(void) -{ - float alpha = getEffectiveAlpha(); - - d_frame.setColours( - calculateModulatedAlphaColour(d_frameCols.d_top_left, alpha), - calculateModulatedAlphaColour(d_frameCols.d_top_right, alpha), - calculateModulatedAlphaColour(d_frameCols.d_bottom_left, alpha), - calculateModulatedAlphaColour(d_frameCols.d_bottom_right, alpha) - ); - -} - - -/************************************************************************* - given an ARGB colour value and a alpha float value return the colour - value with the alpha component modulated by the given alpha float. -*************************************************************************/ -colour Static::calculateModulatedAlphaColour(const colour& col, float alpha) const -{ - colour temp(col); - temp.setAlpha(temp.getAlpha() * alpha); - return temp; -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void Static::populateRenderCache() -{ - Rect backgroundRect(Point(0,0), getAbsoluteSize()); - - // draw frame - if (d_frameEnabled) - { - d_frame.draw(d_renderCache); - - // adjust destination area for backfrop image. - backgroundRect.d_left += d_left_width; - backgroundRect.d_right -= d_right_width; - backgroundRect.d_top += d_top_height; - backgroundRect.d_bottom -= d_bottom_height; - } - - // draw backdrop - if (d_backgroundEnabled && (d_background != NULL)) - { - // factor window alpha into colours to use when rendering background - ColourRect colours(d_backgroundCols); - colours.modulateAlpha(getEffectiveAlpha()); - // cache image for drawing - d_renderCache.cacheImage(*d_background, backgroundRect, 0, colours); - } - -} - - -/************************************************************************* - Handler for when window is sized -*************************************************************************/ -void Static::onSized(WindowEventArgs& e) -{ - // base class processing - Window::onSized(e); - - // update frame size. - d_frame.setSize(getAbsoluteSize()); - - e.handled = true; -} - - -/************************************************************************* - Handler for when alpha value changes -*************************************************************************/ -void Static::onAlphaChanged(WindowEventArgs& e) -{ - // base class processing - Window::onAlphaChanged(e); - - // update frame colours to use new alpha value - updateRenderableFrameColours(); - - e.handled = true; -} - - -/************************************************************************* - Return the Image being used for the specified location of the frame. -*************************************************************************/ -const Image* Static::getImageForFrameLocation(FrameLocation location) const -{ - return d_frame.getImageForLocation(location); -} - - -/************************************************************************* - Return the Image currently set as the background image for the widget. -*************************************************************************/ -const Image* Static::getBackgroundImage(void) const -{ - return d_background; -} - - -/************************************************************************* - Set the Image to use for the specified location of the frame. -*************************************************************************/ -void Static::setImageForFrameLocation(FrameLocation location, const Image* image) -{ - d_frame.setImageForLocation(location, image); - - // update our record of image size - switch (location) - { - case LeftEdge: - d_left_width = (image != NULL) ? image->getWidth() : 0; - break; - - case RightEdge: - d_right_width = (image != NULL) ? image->getWidth() : 0; - break; - - case TopEdge: - d_top_height = (image != NULL) ? image->getHeight() : 0; - break; - - case BottomEdge: - d_bottom_height = (image != NULL) ? image->getHeight() : 0; - break; - - default: - break; - } - -} - -/************************************************************************* - Adds properties for the static widget base class -*************************************************************************/ -void Static::addStaticProperties( bool bCommon ) -{ - if ( bCommon == true ) - { - addProperty(&d_frameEnabledProperty); - addProperty(&d_backgroundEnabledProperty); - } - else - { - addProperty(&d_frameColoursProperty); - addProperty(&d_backgroundColoursProperty); - addProperty(&d_backgroundImageProperty); - addProperty(&d_topLeftFrameProperty); - addProperty(&d_topRightFrameProperty); - addProperty(&d_bottomLeftFrameProperty); - addProperty(&d_bottomRightFrameProperty); - addProperty(&d_leftFrameProperty); - addProperty(&d_topFrameProperty); - addProperty(&d_rightFrameProperty); - addProperty(&d_bottomFrameProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImage.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImage.cpp deleted file mode 100644 index f8f45053d2..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImage.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticImage.cpp - created: 4/6/2004 - author: Paul D Turner - - purpose: Implementation of the static image widget class. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIStaticImage.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String StaticImage::EventNamespace("StaticImage"); - -/************************************************************************* - Definitions of Properties for this class -*************************************************************************/ -StaticImageProperties::Image StaticImage::d_imageProperty; -StaticImageProperties::ImageColours StaticImage::d_imageColoursProperty; -StaticImageProperties::VertFormatting StaticImage::d_vertFormattingProperty; -StaticImageProperties::HorzFormatting StaticImage::d_horzFormattingProperty; - - -/************************************************************************* - Constructor for static image widgets. -*************************************************************************/ -StaticImage::StaticImage(const String& type, const String& name) : - Static(type, name), - d_imageCols(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF) -{ - addStaticImageProperties(); - - // default to stretched image - d_image.setHorzFormatting(RenderableImage::HorzStretched); - d_image.setVertFormatting(RenderableImage::VertStretched); -} - - -/************************************************************************* - Destructor for static image widgets. -*************************************************************************/ -StaticImage::~StaticImage(void) -{ -} - - -/************************************************************************* - Set the Image object to be drawn by this widget. -*************************************************************************/ -void StaticImage::setImage(const Image* image) -{ - d_image.setImage(image); - requestRedraw(); -} - - -/************************************************************************* - Set the Image object to be drawn by this widget. -*************************************************************************/ -void StaticImage::setImage(const String& imageset, const String& image) -{ - setImage(&ImagesetManager::getSingleton().getImageset(imageset)->getImage(image)); -} - - -/************************************************************************* - Sets the colours to be applied when rendering the image. -*************************************************************************/ -void StaticImage::setImageColours(const ColourRect& colours) -{ - d_imageCols = colours; - updateRenderableImageColours(); - - requestRedraw(); -} - - -/************************************************************************* - Sets the colours to be applied when rendering the image. -*************************************************************************/ -void StaticImage::setImageColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour) -{ - d_imageCols.d_top_left = top_left_colour; - d_imageCols.d_top_right = top_right_colour; - d_imageCols.d_bottom_left = bottom_left_colour; - d_imageCols.d_bottom_right = bottom_right_colour; - updateRenderableImageColours(); - - requestRedraw(); -} - - -/************************************************************************* - Set the formatting required for the image. -*************************************************************************/ -void StaticImage::setFormatting(HorzFormatting h_fmt, VertFormatting v_fmt) -{ - d_image.setHorzFormatting((RenderableImage::HorzFormatting)h_fmt); - d_image.setVertFormatting((RenderableImage::VertFormatting)v_fmt); - - requestRedraw(); -} - - -/************************************************************************* - Set the formatting required for the image. -*************************************************************************/ -void StaticImage::setVerticalFormatting(VertFormatting v_fmt) -{ - d_image.setVertFormatting((RenderableImage::VertFormatting)v_fmt); - - requestRedraw(); -} - - -/************************************************************************* - Set the formatting required for the image. -*************************************************************************/ -void StaticImage::setHorizontalFormatting(HorzFormatting h_fmt) -{ - d_image.setHorzFormatting((RenderableImage::HorzFormatting)h_fmt); - - requestRedraw(); -} - - -/************************************************************************* - update the internal RenderableImage with currently set colours and - alpha settings. -*************************************************************************/ -void StaticImage::updateRenderableImageColours(void) -{ - float alpha = getEffectiveAlpha(); - - d_image.setColours( - calculateModulatedAlphaColour(d_imageCols.d_top_left, alpha), - calculateModulatedAlphaColour(d_imageCols.d_top_right, alpha), - calculateModulatedAlphaColour(d_imageCols.d_bottom_left, alpha), - calculateModulatedAlphaColour(d_imageCols.d_bottom_right, alpha) - ); - -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void StaticImage::populateRenderCache() -{ - // get whatever base class needs to render. - Static::populateRenderCache(); - - // - // Render image. - // TODO: Probably needs custom clipping to be added to RenderableImage. - // - d_image.draw(d_renderCache); -} - - -/************************************************************************* - Handler for when window is sized. -*************************************************************************/ -void StaticImage::onSized(WindowEventArgs& e) -{ - // base class handling. - Static::onSized(e); - - d_image.setSize(getUnclippedInnerRect().getSize()); - - e.handled = true; -} - - -/************************************************************************* - Handler for when window alpha changes -*************************************************************************/ -void StaticImage::onAlphaChanged(WindowEventArgs& e) -{ - // base class handling - Static::onAlphaChanged(e); - - // Update image alpha values. - updateRenderableImageColours(); - - e.handled = true; -} - - -/************************************************************************* - Handler for when frame state changes. -*************************************************************************/ -void StaticImage::onStaticFrameChanged(WindowEventArgs& e) -{ - // base class processing - Static::onStaticFrameChanged(e); - - // update the size and position of the image to reflect changes made - // to the frame in the base class - Rect absRect(getUnclippedPixelRect()); - Rect innerRect(getUnclippedInnerRect()); - d_image.setSize(innerRect.getSize()); - d_image.setPosition(Point(innerRect.d_left - absRect.d_left, innerRect.d_top - absRect.d_top)); - - e.handled = true; -} - -/************************************************************************* - Add properties for static image -*************************************************************************/ -void StaticImage::addStaticImageProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_imageProperty); - addProperty(&d_imageColoursProperty); - addProperty(&d_vertFormattingProperty); - addProperty(&d_horzFormattingProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImageProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImageProperties.cpp deleted file mode 100644 index 32524071b4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticImageProperties.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticImageProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements static image properties. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIStaticImageProperties.h" -#include "elements/CEGUIStaticImage.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of StaticImageProperties namespace section -namespace StaticImageProperties -{ -String Image::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImage()); -} - - -void Image::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImage(PropertyHelper::stringToImage(value)); -} - - -String ImageColours::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourRectToString(static_cast(receiver)->getImageColours()); -} - - -void ImageColours::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageColours(PropertyHelper::stringToColourRect(value)); -} - - -String VertFormatting::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getVerticalFormatting()) - { - case StaticImage::TopAligned: - return String((utf8*)"TopAligned"); - break; - - case StaticImage::BottomAligned: - return String((utf8*)"BottomAligned"); - break; - - case StaticImage::VertTiled: - return String((utf8*)"VertTiled"); - break; - - case StaticImage::VertCentred: - return String((utf8*)"VertCentred"); - break; - - default: - return String((utf8*)"VertStretched"); - break; - } - -} - - -void VertFormatting::set(PropertyReceiver* receiver, const String& value) -{ - StaticImage::VertFormatting fmt; - - if (value == (utf8*)"TopAligned") - { - fmt = StaticImage::TopAligned; - } - else if (value == (utf8*)"BottomAligned") - { - fmt = StaticImage::BottomAligned; - } - else if (value == (utf8*)"VertTiled") - { - fmt = StaticImage::VertTiled; - } - else if (value == (utf8*)"VertCentred") - { - fmt = StaticImage::VertCentred; - } - else - { - fmt = StaticImage::VertStretched; - } - - static_cast(receiver)->setVerticalFormatting(fmt); -} - - -String HorzFormatting::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getHorizontalFormatting()) - { - case StaticImage::LeftAligned: - return String((utf8*)"LeftAligned"); - break; - - case StaticImage::RightAligned: - return String((utf8*)"RightAligned"); - break; - - case StaticImage::HorzTiled: - return String((utf8*)"HorzTiled"); - break; - - case StaticImage::HorzCentred: - return String((utf8*)"HorzCentred"); - break; - - default: - return String((utf8*)"HorzStretched"); - break; - } - -} - - -void HorzFormatting::set(PropertyReceiver* receiver, const String& value) -{ - StaticImage::HorzFormatting fmt; - - if (value == (utf8*)"LeftAligned") - { - fmt = StaticImage::LeftAligned; - } - else if (value == (utf8*)"RightAligned") - { - fmt = StaticImage::RightAligned; - } - else if (value == (utf8*)"HorzTiled") - { - fmt = StaticImage::HorzTiled; - } - else if (value == (utf8*)"HorzCentred") - { - fmt = StaticImage::HorzCentred; - } - else - { - fmt = StaticImage::HorzStretched; - } - - static_cast(receiver)->setHorizontalFormatting(fmt); -} - -} // End of StaticImageProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticProperties.cpp deleted file mode 100644 index c64ad25fc9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticProperties.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements property classes for the Static widget. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIStaticProperties.h" -#include "elements/CEGUIStatic.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of StaticProperties namespace section -namespace StaticProperties -{ -String FrameEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isFrameEnabled()); -} - - -void FrameEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setFrameEnabled(PropertyHelper::stringToBool(value)); -} - - -String BackgroundEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isBackgroundEnabled()); -} - - -void BackgroundEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setBackgroundEnabled(PropertyHelper::stringToBool(value)); -} - - -String FrameColours::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourRectToString(static_cast(receiver)->getFrameColours()); -} - - -void FrameColours::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setFrameColours(PropertyHelper::stringToColourRect(value)); -} - - -String BackgroundColours::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourRectToString(static_cast(receiver)->getBackgroundColours()); -} - - -void BackgroundColours::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setBackgroundColours(PropertyHelper::stringToColourRect(value)); -} - - -String BackgroundImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getBackgroundImage()); -} - - -void BackgroundImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setBackgroundImage(PropertyHelper::stringToImage(value)); -} - - -String TopLeftFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(TopLeftCorner)); -} - - -void TopLeftFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(TopLeftCorner, PropertyHelper::stringToImage(value)); -} - - -String TopRightFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(TopRightCorner)); -} - - -void TopRightFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(TopRightCorner, PropertyHelper::stringToImage(value)); -} - - -String BottomLeftFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(BottomLeftCorner)); -} - - -void BottomLeftFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(BottomLeftCorner, PropertyHelper::stringToImage(value)); -} - - -String BottomRightFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(BottomRightCorner)); -} - - -void BottomRightFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(BottomRightCorner, PropertyHelper::stringToImage(value)); -} - - -String LeftFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(LeftEdge)); -} - - -void LeftFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(LeftEdge, PropertyHelper::stringToImage(value)); -} - - -String RightFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(RightEdge)); -} - - -void RightFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(RightEdge, PropertyHelper::stringToImage(value)); -} - - -String TopFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(TopEdge)); -} - - -void TopFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(TopEdge, PropertyHelper::stringToImage(value)); -} - - -String BottomFrameImage::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::imageToString(static_cast(receiver)->getImageForFrameLocation(BottomEdge)); -} - - -void BottomFrameImage::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setImageForFrameLocation(BottomEdge, PropertyHelper::stringToImage(value)); -} - -} // End of StaticProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticText.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticText.cpp deleted file mode 100644 index eb160fbbf1..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticText.cpp +++ /dev/null @@ -1,494 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticText.cpp - created: 4/6/2004 - author: Paul D Turner - - purpose: Implementation of the static text widget class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIStaticText.h" -#include "CEGUIFont.h" -#include "CEGUIWindowManager.h" -#include "CEGUIExceptions.h" -#include "elements/CEGUIScrollbar.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String StaticText::EventNamespace("StaticText"); - -/************************************************************************* -Static Properties for this class -*************************************************************************/ -StaticTextProperties::TextColours StaticText::d_textColoursProperty; -StaticTextProperties::VertFormatting StaticText::d_vertFormattingProperty; -StaticTextProperties::HorzFormatting StaticText::d_horzFormattingProperty; -StaticTextProperties::VertScrollbar StaticText::d_vertScrollbarProperty; -StaticTextProperties::HorzScrollbar StaticText::d_horzScrollbarProperty; - - -/************************************************************************* - Constructor for static text widgets. -*************************************************************************/ -StaticText::StaticText(const String& type, const String& name) : - Static(type, name), - d_horzFormatting(LeftAligned), - d_vertFormatting(VertCentred), - d_textCols(0xFFFFFFFF), - d_enableVertScrollbar(false), - d_enableHorzScrollbar(false) -{ - addStaticTextProperties(); -} - - -/************************************************************************* - Destructor for static text widgets. -*************************************************************************/ -StaticText::~StaticText(void) -{ -} - - -/************************************************************************* - Sets the colours to be applied when rendering the text. -*************************************************************************/ -void StaticText::setTextColours(const ColourRect& colours) -{ - d_textCols = colours; - requestRedraw(); -} - - -/************************************************************************* - Sets the colours to be applied when rendering the text. -*************************************************************************/ -void StaticText::setTextColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour) -{ - d_textCols.d_top_left = top_left_colour; - d_textCols.d_top_right = top_right_colour; - d_textCols.d_bottom_left = bottom_left_colour; - d_textCols.d_bottom_right = bottom_right_colour; - requestRedraw(); -} - - -/************************************************************************* - Set the formatting required for the text. -*************************************************************************/ -void StaticText::setFormatting(HorzFormatting h_fmt, VertFormatting v_fmt) -{ - d_horzFormatting = h_fmt; - d_vertFormatting = v_fmt; - requestRedraw(); -} - - -/************************************************************************* - Set the formatting required for the text. -*************************************************************************/ -void StaticText::setVerticalFormatting(VertFormatting v_fmt) -{ - d_vertFormatting = v_fmt; - requestRedraw(); -} - - -/************************************************************************* - Set the formatting required for the text. -*************************************************************************/ -void StaticText::setHorizontalFormatting(HorzFormatting h_fmt) -{ - d_horzFormatting = h_fmt; - requestRedraw(); -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void StaticText::populateRenderCache() -{ - // get whatever base class needs to render. - Static::populateRenderCache(); - - const Font* font = getFont(); - // can't render text without a font :) - if (font == 0) - return; - - // get destination area for the text. - Rect absarea(getTextRenderArea()); - Rect clipper(absarea); - - float textHeight = font->getFormattedLineCount(d_text, absarea, (TextFormatting)d_horzFormatting) * font->getLineSpacing(); - - // see if we may need to adjust horizontal position - if (d_horzScrollbar->isVisible()) - { - switch(d_horzFormatting) - { - case LeftAligned: - case WordWrapLeftAligned: - case Justified: - case WordWrapJustified: - absarea.offset(Point(-d_horzScrollbar->getScrollPosition(), 0)); - break; - - case Centred: - case WordWrapCentred: - absarea.setWidth(d_horzScrollbar->getDocumentSize()); - absarea.offset(Point(-d_horzScrollbar->getScrollPosition(), 0)); - break; - - case RightAligned: - case WordWrapRightAligned: - absarea.offset(Point(d_horzScrollbar->getScrollPosition(), 0)); - break; - } - - } - - // adjust y positioning according to formatting option - switch(d_vertFormatting) - { - case TopAligned: - absarea.d_top -= d_vertScrollbar->getScrollPosition(); - break; - - case VertCentred: - // if scroll bar is in use, act like TopAligned - if (d_vertScrollbar->isVisible()) - { - absarea.d_top -= d_vertScrollbar->getScrollPosition(); - } - // no scroll bar, so centre text instead. - else - { - absarea.d_top += PixelAligned((absarea.getHeight() - textHeight) * 0.5f); - } - - break; - - case BottomAligned: - absarea.d_top = absarea.d_bottom - textHeight; - absarea.d_top += d_vertScrollbar->getScrollPosition(); - break; - } - - // calculate final colours - ColourRect final_cols(d_textCols); - final_cols.modulateAlpha(getEffectiveAlpha()); - // cache the text for rendering. - d_renderCache.cacheText(d_text, font, (TextFormatting)d_horzFormatting, absarea, 0, final_cols, &clipper); -} - - -/************************************************************************* - Add properties for static text -*************************************************************************/ -void StaticText::addStaticTextProperties( bool bCommon ) -{ - if ( bCommon == true ) - { - addProperty(&d_textColoursProperty); - } - else - { - addProperty(&d_vertFormattingProperty); - addProperty(&d_horzFormattingProperty); - addProperty(&d_vertScrollbarProperty); - addProperty(&d_horzScrollbarProperty); - } -} - - -/************************************************************************* - Perform initialisation for the widget. -*************************************************************************/ -void StaticText::initialise(void) -{ - Static::initialise(); - - // create the component sub-widgets - d_vertScrollbar = createVertScrollbar(getName() + "__auto_vscrollbar__"); - d_horzScrollbar = createHorzScrollbar(getName() + "__auto_hscrollbar__"); - - d_vertScrollbar->hide(); - d_horzScrollbar->hide(); - - addChildWindow(d_vertScrollbar); - addChildWindow(d_horzScrollbar); - - performChildWindowLayout(); - - // event subscription - d_vertScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&StaticText::handleScrollbarChange, this)); - d_horzScrollbar->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(&StaticText::handleScrollbarChange, this)); -} - - -/************************************************************************* - Return a Rect object describing, in un-clipped pixels, the window - relative area that the text should be rendered in to. -*************************************************************************/ -Rect StaticText::getTextRenderArea(void) const -{ - Rect area(Point(0,0), getAbsoluteSize()); - - if (d_horzScrollbar->isVisible()) - { - area.d_bottom -= d_horzScrollbar->getAbsoluteHeight(); - } - else if (d_frameEnabled) - { - area.d_bottom -= d_bottom_height; - } - - if (d_vertScrollbar->isVisible()) - { - area.d_right -= d_vertScrollbar->getAbsoluteWidth(); - } - else if (d_frameEnabled) - { - area.d_right -= d_right_width; - } - - if (d_frameEnabled) - { - area.d_left += d_left_width; - area.d_top += d_top_height; - } - - return area; -} - - -/************************************************************************* - display required integrated scroll bars according to current state - of the edit box and update their values. -*************************************************************************/ -void StaticText::configureScrollbars(void) -{ - Scrollbar* vertScrollbar; - Scrollbar* horzScrollbar; - - try - { - vertScrollbar = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_vscrollbar__")); - horzScrollbar = static_cast(WindowManager::getSingleton().getWindow(getName() + "__auto_hscrollbar__")); - } - catch (UnknownObjectException) - { - // no scrollbars? Can't configure then! - return; - } - - const Font* font = getFont(); - - // must have a font to measure text! - if (font == 0) - return; - - Rect initialArea(getTextRenderArea()); - - float totalHeight = font->getFormattedLineCount(d_text, initialArea, (TextFormatting)d_horzFormatting) * font->getLineSpacing(); - float widestItem = font->getFormattedTextExtent(d_text, initialArea, (TextFormatting)d_horzFormatting); - - // - // First show or hide the scroll bars as needed (or requested) - // - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getTextRenderArea().getHeight()) && d_enableVertScrollbar) - { - vertScrollbar->show(); - - // show or hide horizontal scroll bar as required (or as specified by option) - if ((widestItem > getTextRenderArea().getWidth()) && d_enableHorzScrollbar) - { - horzScrollbar->show(); - } - else - { - horzScrollbar->hide(); - } - - } - else - { - // show or hide horizontal scroll bar as required (or as specified by option) - if ((widestItem > getTextRenderArea().getWidth()) && d_enableHorzScrollbar) - { - horzScrollbar->show(); - - // show or hide vertical scroll bar as required (or as specified by option) - if ((totalHeight > getTextRenderArea().getHeight()) && d_enableVertScrollbar) - { - vertScrollbar->show(); - } - else - { - vertScrollbar->hide(); - } - - } - else - { - vertScrollbar->hide(); - horzScrollbar->hide(); - } - - } - - // - // Set up scroll bar values - // - Rect renderArea(getTextRenderArea()); - - vertScrollbar->setDocumentSize(totalHeight); - vertScrollbar->setPageSize(renderArea.getHeight()); - vertScrollbar->setStepSize(ceguimax(1.0f, renderArea.getHeight() / 10.0f)); - vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition()); - - horzScrollbar->setDocumentSize(widestItem); - horzScrollbar->setPageSize(renderArea.getWidth()); - horzScrollbar->setStepSize(ceguimax(1.0f, renderArea.getWidth() / 10.0f)); - horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition()); -} - - -/************************************************************************* - Return whether the vertical scroll bar is set to be shown if needed. -*************************************************************************/ -bool StaticText::isVerticalScrollbarEnabled(void) const -{ - return d_enableVertScrollbar; -} - - -/************************************************************************* - Return whether the horizontal scroll bar is set to be shown if needed. -*************************************************************************/ -bool StaticText::isHorizontalScrollbarEnabled(void) const -{ - return d_enableHorzScrollbar; -} - - -/************************************************************************* - Set whether the vertical scroll bar will be shown if needed. -*************************************************************************/ -void StaticText::setVerticalScrollbarEnabled(bool setting) -{ - d_enableVertScrollbar = setting; - configureScrollbars(); - performChildWindowLayout(); -} - - -/************************************************************************* - Set whether the horizontal scroll bar will be shown if needed. -*************************************************************************/ -void StaticText::setHorizontalScrollbarEnabled(bool setting) -{ - d_enableHorzScrollbar = setting; - configureScrollbars(); - performChildWindowLayout(); -} - - -/************************************************************************* - Handler called when text is changed. -*************************************************************************/ -void StaticText::onTextChanged(WindowEventArgs& e) -{ - Static::onTextChanged(e); - - configureScrollbars(); - requestRedraw(); -} - - -/************************************************************************* - Handler called when size is changed -*************************************************************************/ -void StaticText::onSized(WindowEventArgs& e) -{ - Static::onSized(e); - - configureScrollbars(); -} - - -/************************************************************************* - Handler called when font is changed. -*************************************************************************/ -void StaticText::onFontChanged(WindowEventArgs& e) -{ - Static::onFontChanged(e); - - configureScrollbars(); - requestRedraw(); -} - - -/************************************************************************* - Handler for mouse wheel changes -*************************************************************************/ -void StaticText::onMouseWheel(MouseEventArgs& e) -{ - // base class processing. - Static::onMouseWheel(e); - - if (d_vertScrollbar->isVisible() && (d_vertScrollbar->getDocumentSize() > d_vertScrollbar->getPageSize())) - { - d_vertScrollbar->setScrollPosition(d_vertScrollbar->getScrollPosition() + d_vertScrollbar->getStepSize() * -e.wheelChange); - } - else if (d_horzScrollbar->isVisible() && (d_horzScrollbar->getDocumentSize() > d_horzScrollbar->getPageSize())) - { - d_horzScrollbar->setScrollPosition(d_horzScrollbar->getScrollPosition() + d_horzScrollbar->getStepSize() * -e.wheelChange); - } - - e.handled = true; -} - - -/************************************************************************* - Handler called when the scroll bar positions change -*************************************************************************/ -bool StaticText::handleScrollbarChange(const EventArgs& e) -{ - requestRedraw(); - - return true; -} - -/************************************************************************* - overridden so scroll bars are not partially clipped when active -*************************************************************************/ -Rect StaticText::getUnclippedInnerRect(void) const -{ - // use default area from _Window_ - // (not from immediate base class Static, since that's what we're modifying) - return Window::getUnclippedInnerRect(); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticTextProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticTextProperties.cpp deleted file mode 100644 index ddacf71050..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIStaticTextProperties.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/************************************************************************ - filename: CEGUIStaticTextProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements properties for the StaticText class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIStaticTextProperties.h" -#include "elements/CEGUIStaticText.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of StaticTextProperties namespace section -namespace StaticTextProperties -{ -String TextColours::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourRectToString(static_cast(receiver)->getTextColours()); -} - - -void TextColours::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTextColours(PropertyHelper::stringToColourRect(value)); -} - - -String HorzFormatting::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getHorizontalFormatting()) - { - case StaticText::RightAligned: - return String((utf8*)"RightAligned"); - break; - - case StaticText::HorzCentred: - return String((utf8*)"HorzCentred"); - break; - - case StaticText::HorzJustified: - return String((utf8*)"HorzJustified"); - break; - - case StaticText::WordWrapLeftAligned: - return String((utf8*)"WordWrapLeftAligned"); - break; - - case StaticText::WordWrapRightAligned: - return String((utf8*)"WordWrapRightAligned"); - break; - - case StaticText::WordWrapCentred: - return String((utf8*)"WordWrapCentred"); - break; - - case StaticText::WordWrapJustified: - return String((utf8*)"WordWrapJustified"); - break; - - default: - return String((utf8*)"LeftAligned"); - break; - } -} - - -void HorzFormatting::set(PropertyReceiver* receiver, const String& value) -{ - StaticText::HorzFormatting fmt; - - if (value == (utf8*)"RightAligned") - { - fmt = StaticText::RightAligned; - } - else if (value == (utf8*)"HorzCentred") - { - fmt = StaticText::HorzCentred; - } - else if (value == (utf8*)"HorzJustified") - { - fmt = StaticText::HorzJustified; - } - else if (value == (utf8*)"WordWrapLeftAligned") - { - fmt = StaticText::WordWrapLeftAligned; - } - else if (value == (utf8*)"WordWrapRightAligned") - { - fmt = StaticText::WordWrapRightAligned; - } - else if (value == (utf8*)"WordWrapCentred") - { - fmt = StaticText::WordWrapCentred; - } - else if (value == (utf8*)"WordWrapJustified") - { - fmt = StaticText::WordWrapJustified; - } - else - { - fmt = StaticText::LeftAligned; - } - - static_cast(receiver)->setHorizontalFormatting(fmt); -} - - -String VertFormatting::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getVerticalFormatting()) - { - case StaticText::BottomAligned: - return String((utf8*)"BottomAligned"); - break; - - case StaticText::VertCentred: - return String((utf8*)"VertCentred"); - break; - - default: - return String((utf8*)"TopAligned"); - break; - } -} - - -void VertFormatting::set(PropertyReceiver* receiver, const String& value) -{ - StaticText::VertFormatting fmt; - - if (value == (utf8*)"BottomAligned") - { - fmt = StaticText::BottomAligned; - } - else if (value == (utf8*)"VertCentred") - { - fmt = StaticText::VertCentred; - } - else - { - fmt = StaticText::TopAligned; - } - - static_cast(receiver)->setVerticalFormatting(fmt); -} - - -String VertScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isVerticalScrollbarEnabled()); -} - - -void VertScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setVerticalScrollbarEnabled(PropertyHelper::stringToBool(value)); -} - -String HorzScrollbar::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isHorizontalScrollbarEnabled()); -} - - -void HorzScrollbar::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHorizontalScrollbarEnabled(PropertyHelper::stringToBool(value)); -} - -} // End of StaticTextProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITabButton.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITabButton.cpp deleted file mode 100644 index f6aca88e19..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITabButton.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/************************************************************************ - filename: CEGUITabButton.cpp - created: 8/8/2004 - author: Steve Streeting - - purpose: Implementation of TabButton widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITabButton.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String TabButton::EventNamespace("TabButton"); - -/************************************************************************* - Event name constants -*************************************************************************/ -const String TabButton::EventClicked( (utf8*)"Clicked" ); - - -/************************************************************************* - Constructor -*************************************************************************/ -TabButton::TabButton(const String& type, const String& name) : - ButtonBase(type, name), - d_selected(false), - d_rightOfSelected(true) -{ - // add the additional events generated by this derived class - addTabButtonEvents(); -} - - -/************************************************************************* - Destructor -*************************************************************************/ -TabButton::~TabButton(void) -{ -} - - -/************************************************************************* - Add button specific events -*************************************************************************/ -void TabButton::addTabButtonEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventClicked); -} - - -/************************************************************************* - handler invoked internally when the button is clicked. -*************************************************************************/ -void TabButton::onClicked(WindowEventArgs& e) -{ - fireEvent(EventClicked, e, EventNamespace); -} - - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void TabButton::onMouseButtonUp(MouseEventArgs& e) -{ - if ((e.button == LeftButton) && isPushed()) - { - Window* sheet = System::getSingleton().getGUISheet(); - - if (sheet != NULL) - { - // if mouse was released over this widget - if (this == sheet->getChildAtPosition(e.position)) - { - // fire event - WindowEventArgs args(this); - onClicked(args); - } - - } - - e.handled = true; - } - - // default handling - ButtonBase::onMouseButtonUp(e); -} -/************************************************************************* -Draw method -*************************************************************************/ -void TabButton::drawSelf(float z) -{ - if (isDisabled()) - { - drawDisabled(z); - } - else if (isHovering()) - { - drawHover(z); - } - else if (d_selected) - { - drawPushed(z); - } - else - { - drawNormal(z); - } -} -/************************************************************************* -Set target window -*************************************************************************/ -void TabButton::setTargetWindow(Window* wnd) -{ - d_targetWindow = wnd; - // Copy initial text - setText(wnd->getText()); - // Parent control will keep text up to date, since changes affect layout -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITabControl.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITabControl.cpp deleted file mode 100644 index 4609b791be..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITabControl.cpp +++ /dev/null @@ -1,669 +0,0 @@ -/************************************************************************ - filename: CEGUITabControl.cpp - created: 08/08/2004 - author: Steve Streeting - - purpose: Implementation of Tab Control widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "CEGUIExceptions.h" -#include "elements/CEGUITabControl.h" -#include "elements/CEGUITabButton.h" -#include "elements/CEGUIStatic.h" -#include "elements/CEGUIGUISheet.h" -#include "CEGUIFont.h" -#include "CEGUIWindowManager.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String TabControl::EventNamespace("TabControl"); - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -TabControlProperties::TabHeight TabControl::d_tabHeightProperty; -TabControlProperties::AbsoluteTabHeight TabControl::d_absoluteTabHeightProperty; -TabControlProperties::RelativeTabHeight TabControl::d_relativeTabHeightProperty; -TabControlProperties::TabTextPadding TabControl::d_tabTextPaddingProperty; -TabControlProperties::AbsoluteTabTextPadding TabControl::d_absoluteTabTextPaddingProperty; -TabControlProperties::RelativeTabTextPadding TabControl::d_relativeTabTextPaddingProperty; - -/************************************************************************* - Constants -*************************************************************************/ -// event names -const String TabControl::EventSelectionChanged( (utf8*)"TabSelectionChanged" ); - - -/************************************************************************* - Constructor for TabControl base class. -*************************************************************************/ -TabControl::TabControl(const String& type, const String& name) - : Window(type, name), - d_tabButtonPane(NULL), - d_tabContentPane(NULL), - d_nextTabIndex(0) -{ - addTabControlEvents(); - addTabControlProperties(); - setRelativeTabHeight(0.05f); - setAbsoluteTabTextPadding(5); -} - - -/************************************************************************* - Destructor for TabControl base class. -*************************************************************************/ -TabControl::~TabControl(void) -{ - // Should be handled in superclass (all child windows) -} - -/************************************************************************* - Initialise the Window based object ready for use. -*************************************************************************/ -void TabControl::initialise(void) -{ - // create the component sub-widgets - d_tabContentPane = createTabContentPane(getName() + "__auto_TabPane__"); - d_tabButtonPane = createTabButtonPane(getName() + "__auto_TabPane__Buttons"); - - addChildWindow(d_tabContentPane); - addChildWindow(d_tabButtonPane); - - performChildWindowLayout(); -} -/************************************************************************* -Get the number of tabs -*************************************************************************/ -uint TabControl::getTabCount(void) const -{ - return d_tabContentPane->getChildCount(); -} -/************************************************************************* -Get the tab with a given name -*************************************************************************/ -Window* TabControl::getTabContents(const String& name) const -{ - return d_tabContentPane->getChild(name); -} -/************************************************************************* -Get the tab at a given ID -*************************************************************************/ -Window* TabControl::getTabContents(uint ID) const -{ - return d_tabContentPane->getChild(ID); -} -/************************************************************************* -Get the tab for the given index -*************************************************************************/ -Window* TabControl::getTabContentsAtIndex(uint index) const -{ - return d_tabButtonIndexMap.find(index)->second->getTargetWindow(); -} - -/************************************************************************* -Return whether the tab content window is currently selected. -*************************************************************************/ -bool TabControl::isTabContentsSelected(Window* wnd) const -{ - TabButton* button = getButtonForTabContents(wnd); - return button->isSelected(); -} - -/************************************************************************* -Return whether the tab content window is currently selected. -*************************************************************************/ -uint TabControl::getSelectedTabIndex() const -{ - uint index; - TabButtonIndexMap::const_iterator i, iend; - iend = d_tabButtonIndexMap.end(); - for (i = d_tabButtonIndexMap.begin(); i != iend; ++i) - { - // get corresponding tab button and content window - TabButton* tb = i->second; - if (tb->isSelected()) - { - index = i->first; - break; - } - } - return index; -} - -/************************************************************************* -Set the selected tab by window name -*************************************************************************/ -void TabControl::setSelectedTab(const String &name) -{ - // get window - Window* wnd = d_tabContentPane->getChild(name); - - selectTab_impl(wnd); -} -/************************************************************************* -Set the selected tab by window ID -*************************************************************************/ -void TabControl::setSelectedTab(uint ID) -{ - // get window - Window* wnd = d_tabContentPane->getChild(ID); - - selectTab_impl(wnd); -} -/************************************************************************* -Set the selected tab by window name -*************************************************************************/ -void TabControl::setSelectedTabAtIndex(uint index) -{ - Window* wnd = getTabContentsAtIndex(index); - selectTab_impl(wnd); -} -/************************************************************************* -Get the tab height -*************************************************************************/ -float TabControl::getTabHeight(void) const -{ - MetricsMode mode = getMetricsMode(); - if (mode == Relative) - { - return d_rel_tabHeight; - } - else - { - return d_abs_tabHeight; - } -} - -/************************************************************************* -Set the tab height -*************************************************************************/ -void TabControl::setRelativeTabHeight(float height) -{ - d_rel_tabHeight = height; - d_abs_tabHeight = relativeToAbsoluteY(height); - - performChildWindowLayout(); -} -/************************************************************************* -Set the tab height -*************************************************************************/ -void TabControl::setAbsoluteTabHeight(float height) -{ - d_abs_tabHeight = height; - d_rel_tabHeight = absoluteToRelativeY(height); - - performChildWindowLayout(); -} -/************************************************************************* -Set the tab height -*************************************************************************/ -void TabControl::setTabHeight(float height) -{ - if (getMetricsMode() == Relative) - { - setRelativeTabHeight(height); - } - else - { - setAbsoluteTabHeight(height); - } -} -/************************************************************************* -Get the tab text padding -*************************************************************************/ -float TabControl::getTabTextPadding(void) const -{ - MetricsMode mode = getMetricsMode(); - if (mode == Relative) - { - return d_rel_tabPadding; - } - else - { - return d_abs_tabPadding; - } -} - -/************************************************************************* -Set the tab text padding -*************************************************************************/ -void TabControl::setRelativeTabTextPadding(float height) -{ - d_rel_tabPadding = height; - d_abs_tabPadding = relativeToAbsoluteY(height); - - performChildWindowLayout(); -} -/************************************************************************* -Set the tab text padding -*************************************************************************/ -void TabControl::setAbsoluteTabTextPadding(float height) -{ - d_abs_tabPadding = height; - d_rel_tabPadding = absoluteToRelativeY(height); - - performChildWindowLayout(); -} -/************************************************************************* -Set the tab text padding -*************************************************************************/ -void TabControl::setTabTextPadding(float height) -{ - if (getMetricsMode() == Relative) - { - setRelativeTabTextPadding(height); - } - else - { - setAbsoluteTabTextPadding(height); - } -} - -/************************************************************************* -Add a new tab -*************************************************************************/ -void TabControl::addTab(Window* wnd) -{ - // Create a new TabButton - addButtonForTabContent(wnd); - // Add the window to the content pane - d_tabContentPane->addChildWindow(wnd); - // Auto-select? - if (getTabCount() == 1) - { - setSelectedTab(wnd->getName()); - } - else - { - // initialise invisible content - wnd->setVisible(false); - } - // Just request redraw - performChildWindowLayout(); - requestRedraw(); - // Subscribe to text changed event so that we can resize as needed - wnd->subscribeEvent(Window::EventTextChanged, - Event::Subscriber(&TabControl::handleContentWindowTextChanged, this)); - -} -/************************************************************************* -Remove a tab -*************************************************************************/ -void TabControl::removeTab(const String& name) -{ - // do nothing if given window is not attached as a tab. - if (!d_tabContentPane->isChild(name)) - return; - - Window* wnd = d_tabContentPane->getChild(name); - // Was this selected? - bool reselect = wnd->isVisible(true); - // Tab buttons are the 2nd onward children - d_tabContentPane->removeChildWindow(name); - - // remove button too - removeButtonForTabContent(wnd); - - if (reselect) - { - // Select another tab - if (getTabCount() > 0) - { - setSelectedTab(d_tabContentPane->getChildAtIdx(0)->getName()); - } - } - - performChildWindowLayout(); - - requestRedraw(); -} -/************************************************************************* -Remove a tab by ID -*************************************************************************/ -void TabControl::removeTab(uint ID) -{ - // do nothing if given window is not attached as a tab. - if (!d_tabContentPane->isChild(ID)) - return; - - Window* wnd = d_tabContentPane->getChild(ID); - // Was this selected? - bool reselect = wnd->isVisible(); - // Tab buttons are the 2nd onward children - d_tabContentPane->removeChildWindow(ID); - - // remove button too - removeButtonForTabContent(wnd); - - if (reselect) - { - // Select another tab - if (getTabCount() > 0) - { - setSelectedTab(d_tabContentPane->getChildAtIdx(0)->getName()); - } - } - - performChildWindowLayout(); - - requestRedraw(); - -} -/************************************************************************* -Add tab button -*************************************************************************/ -void TabControl::addButtonForTabContent(Window* wnd) -{ - // Create the button - TabButton* tb = createTabButton(makeButtonName(wnd)); - // Copy font - tb->setFont(getFont()); - // Set target window - tb->setTargetWindow(wnd); - // Set index - tb->setTabIndex(d_nextTabIndex++); - // Instert into map - d_tabButtonIndexMap.insert( - TabButtonIndexMap::value_type(tb->getTabIndex(), tb)); - // add the button - d_tabButtonPane->addChildWindow(tb); - // Subscribe to clicked event so that we can change tab - tb->subscribeEvent(TabButton::EventClicked, - Event::Subscriber(&TabControl::handleTabButtonClicked, this)); - -} - -/************************************************************************* - Return the tab button for the given tab content window -*************************************************************************/ -TabButton* TabControl::getButtonForTabContents(Window* wnd) const -{ - TabButtonIndexMap::const_iterator i, iend; - iend = d_tabButtonIndexMap.end(); - for (i = d_tabButtonIndexMap.begin(); i != iend; ++i) - { - // get corresponding tab button and content window - TabButton* tb = i->second; - Window* child = tb->getTargetWindow(); - if (child == wnd) - { - return tb; - } - } - throw UnknownObjectException((utf8*)"TabControl::getButtonForTabContents - The Window object is not a tab contents."); -} -/************************************************************************* - Calculate size and position for a tab button -*************************************************************************/ -void TabControl::calculateTabButtonSizePosition(TabButton* btn, uint targetIndex) -{ - // relative height is always 1.0 for buttons since they are embedded in a - // panel of the correct height already - btn->setHeight(Relative, 1.0f); - btn->setYPosition(Relative, 0.0f); - // x position is based on previous button - if (targetIndex > 0) - { - TabButtonIndexMap::iterator iter = d_tabButtonIndexMap.begin(); - std::advance(iter, targetIndex - 1); - Window* prevButton = iter->second; - - // position is prev pos + width - btn->setXPosition(Relative, - prevButton->getXPosition(Relative) - + prevButton->getWidth(Relative)); - } - else - { - // First button - btn->setXPosition(Relative, 0); - } - // Width is based on font size (expressed as absolute) - const Font* fnt = btn->getFont(); - btn->setWidth(Absolute, - fnt->getTextExtent(btn->getText(true)) + getAbsoluteTabTextPadding()*2); - btn->requestRedraw(); -} -/************************************************************************* -Remove tab button -*************************************************************************/ -void TabControl::removeButtonForTabContent(Window* wnd) -{ - // get - TabButton* tb = static_cast( - d_tabButtonPane->getChild(makeButtonName(wnd))); - // remove - d_tabButtonIndexMap.erase(tb->getTabIndex()); - d_tabButtonPane->removeChildWindow(tb); - // destroy - WindowManager::getSingleton().destroyWindow(tb); -} -/************************************************************************* -Remove tab button -*************************************************************************/ -String TabControl::makeButtonName(Window* wnd) -{ - // derive button name - String buttonName = (utf8*)"__auto_btn"; - buttonName.append(wnd->getName()); - return buttonName; -} -/************************************************************************* -Select tab implementation -*************************************************************************/ -void TabControl::selectTab_impl(Window* wnd) -{ - bool modified = false; - bool foundSelected = false; - // Iterate in order of tab index - TabButtonIndexMap::iterator i, iend; - iend = d_tabButtonIndexMap.end(); - for (i = d_tabButtonIndexMap.begin(); i != iend; ++i) - { - // get corresponding tab button and content window - TabButton* tb = i->second; - Window* child = tb->getTargetWindow(); - // Should we be selecting? - bool selectThis = (child == wnd); - // Are we modifying this tab? - modified = modified || (tb->isSelected() != selectThis); - foundSelected = foundSelected || selectThis; - // Select tab & set visible if this is the window, not otherwise - tb->setSelected(selectThis); - tb->setRightOfSelected(foundSelected); - child->setVisible(selectThis); - } - // Trigger event? - if (modified) - { - WindowEventArgs args(this); - onSelectionChanged(args); - } -} -/************************************************************************* -Add tab control properties -*************************************************************************/ -void TabControl::addTabControlProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_tabHeightProperty); - addProperty(&d_relativeTabHeightProperty); - addProperty(&d_absoluteTabHeightProperty); - addProperty(&d_tabTextPaddingProperty); - addProperty(&d_relativeTabTextPaddingProperty); - addProperty(&d_absoluteTabTextPaddingProperty); - } -} -/************************************************************************* -Internal version of adding a child window -*************************************************************************/ -void TabControl::addChild_impl(Window* wnd) -{ - // Look for __auto_TabPane__ in the name (hopefully no-one will use this!) - if (wnd->getName().find((const utf8*)"__auto_TabPane__") != String::npos) - { - // perform normal addChild - Window::addChild_impl(wnd); - } - else - { - // This is another control, therefore add as a tab - addTab(wnd); - } -} -/************************************************************************* -Internal version of removing a child window -*************************************************************************/ -void TabControl::removeChild_impl(Window* wnd) -{ - // protect against possible null pointers - if (!wnd) return; - - // Look for __auto_TabPane__ in the name (hopefully no-one will use this!) - if (wnd->getName().find((const utf8*)"__auto_TabPane__") != String::npos) - { - // perform normal removeChild - Window::removeChild_impl(wnd); - } - else - { - // This is some user window, therefore remove as a tab - removeTab(wnd->getName()); - } -} -/************************************************************************* -Selection changed event -*************************************************************************/ -void TabControl::onSelectionChanged(WindowEventArgs& e) -{ - requestRedraw(); - fireEvent(EventSelectionChanged, e, EventNamespace); -} -/************************************************************************* -Font changed event -*************************************************************************/ -void TabControl::onFontChanged(WindowEventArgs& e) -{ - // Propagate font change to buttons - TabButtonIndexMap::iterator i, iend; - iend = d_tabButtonIndexMap.end(); - for (i = d_tabButtonIndexMap.begin(); i != iend; ++i) - { - i->second->setFont(getFont()); - } -} -/************************************************************************* -Add events for this class -*************************************************************************/ -void TabControl::addTabControlEvents(bool bCommon) -{ - if ( bCommon == true ) addEvent(EventSelectionChanged); -} -/************************************************************************* -Layout the widgets -*************************************************************************/ -void TabControl::performChildWindowLayout() -{ - Window::performChildWindowLayout(); - - if (d_tabButtonPane) - { - // Set the size of the tab button area (full width, height from tab height) - d_tabButtonPane->setSize(Relative, Size(1.0f, d_rel_tabHeight) ); - //d_tabButtonPane->setPosition(Relative, Point(0.0f, 0.0f) ); - // Calculate the positions and sizes of the tab buttons - TabButtonIndexMap::iterator i, iend; - iend = d_tabButtonIndexMap.end(); - uint x = 0; - for (i = d_tabButtonIndexMap.begin(); i != iend; ++i) - { - TabButton* btn = i->second; - if ( btn->isVisible ( true ) ) - { - calculateTabButtonSizePosition(btn, x); - ++x; - } - } - } - if (d_tabContentPane) - { - // Set the size of the content area - d_tabContentPane->setSize(Relative, Size(1.0f, 1.0f - d_rel_tabHeight) ); - d_tabContentPane->setPosition(Relative, Point(0.0f, d_rel_tabHeight) ); - } - -} -/************************************************************************* -Create tab button pane -*************************************************************************/ -Window* TabControl::createTabButtonPane(const String& name) const -{ - return WindowManager::getSingleton().createWindow(GUISheet::WidgetTypeName, name); -} -/************************************************************************* -Text changed on a content window -*************************************************************************/ -bool TabControl::handleContentWindowTextChanged(const EventArgs& args) -{ - // update text - const WindowEventArgs& wargs = static_cast(args); - Window* tabButton = d_tabButtonPane->getChild( - makeButtonName(wargs.window)); - tabButton->setText(wargs.window->getText()); - // sort out the layout - performChildWindowLayout(); - requestRedraw(); - - return true; -} -/************************************************************************* -Tab button clicked -*************************************************************************/ -bool TabControl::handleTabButtonClicked(const EventArgs& args) -{ - const WindowEventArgs& wargs = static_cast(args); - TabButton* tabButton = static_cast(wargs.window); - setSelectedTab(tabButton->getTargetWindow()->getName()); - - return true; -} - -int TabControl::writeChildWindowsXML(OutStream& out_stream) const -{ - int childOutputCount = Window::writeChildWindowsXML(out_stream); - - // since TabControl content is actually added to the component tab - // content pane window, this overridden function exists to dump those - // out as if they were our own children. - for (uint i = 0; i < getTabCount(); ++i) - { - getTabContentsAtIndex(i)->writeXMLToStream(out_stream); - ++childOutputCount; - } - - return childOutputCount; -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITabControlProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITabControlProperties.cpp deleted file mode 100644 index 2a10c0c72a..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITabControlProperties.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/************************************************************************ - filename: CEGUITabControlProperties.cpp - created: 08/08/2004 - author: Steve Streeting - - purpose: Implements Listbox Property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITabControlProperties.h" -#include "elements/CEGUITabControl.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of TabControlProperties namespace section -namespace TabControlProperties -{ -String AbsoluteTabHeight::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAbsoluteTabHeight()); -} - - -void AbsoluteTabHeight::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAbsoluteTabHeight(PropertyHelper::stringToFloat(value)); -} - -String RelativeTabHeight::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getRelativeTabHeight()); -} - -bool AbsoluteTabHeight::isDefault(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getRelativeTabHeight() == 0.05f; -} - -String AbsoluteTabHeight::getDefault(const PropertyReceiver* receiver) const -{ - float defval = 0; - Window* par = static_cast(receiver)->getParent(); - - if (par != 0) - { - defval = par->relativeToAbsoluteY(0.05f); - } - - return PropertyHelper::floatToString(defval); -} - - -void RelativeTabHeight::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRelativeTabHeight(PropertyHelper::stringToFloat(value)); -} - - -String TabHeight::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getTabHeight()); -} - - -void TabHeight::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTabHeight(PropertyHelper::stringToFloat(value)); -} - -bool TabHeight::isDefault(const PropertyReceiver* receiver) const -{ - if (static_cast(receiver)->getMetricsMode() == Relative) - { - return static_cast(receiver)->isPropertyDefault("RelativeTabHeight"); - } - else - { - return static_cast(receiver)->isPropertyDefault("AbsoluteTabHeight"); - } -} - -String TabHeight::getDefault(const PropertyReceiver* receiver) const -{ - if (static_cast(receiver)->getMetricsMode() == Relative) - { - return static_cast(receiver)->getPropertyDefault("RelativeTabHeight"); - } - else - { - return static_cast(receiver)->getPropertyDefault("AbsoluteTabHeight"); - } -} - - - -String AbsoluteTabTextPadding::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getAbsoluteTabTextPadding()); -} - - -void AbsoluteTabTextPadding::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setAbsoluteTabTextPadding(PropertyHelper::stringToFloat(value)); -} - -String RelativeTabTextPadding::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getRelativeTabTextPadding()); -} - - -void RelativeTabTextPadding::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setRelativeTabTextPadding(PropertyHelper::stringToFloat(value)); -} - -bool RelativeTabTextPadding::isDefault(const PropertyReceiver* receiver) const -{ - return static_cast(receiver)->getAbsoluteTabTextPadding() == 5.0f; -} - -String RelativeTabTextPadding::getDefault(const PropertyReceiver* receiver) const -{ - float defval = 0; - Window* par = static_cast(receiver)->getParent(); - - if (par != 0) - { - defval = par->absoluteToRelativeY(5.0f); - } - - return PropertyHelper::floatToString(defval); -} - - - -String TabTextPadding::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getTabTextPadding()); -} - - -void TabTextPadding::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTabTextPadding(PropertyHelper::stringToFloat(value)); -} - -bool TabTextPadding::isDefault(const PropertyReceiver* receiver) const -{ - if (static_cast(receiver)->getMetricsMode() == Relative) - { - return static_cast(receiver)->isPropertyDefault("RelativeTabTextPadding"); - } - else - { - return static_cast(receiver)->isPropertyDefault("AbsoluteTabTextPadding"); - } -} - -String TabTextPadding::getDefault(const PropertyReceiver* receiver) const -{ - if (static_cast(receiver)->getMetricsMode() == Relative) - { - return static_cast(receiver)->getPropertyDefault("RelativeTabTextPadding"); - } - else - { - return static_cast(receiver)->getPropertyDefault("AbsoluteTabTextPadding"); - } -} - - - - - -} // End of TabControlProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITextItem.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITextItem.cpp deleted file mode 100644 index b1cef5bb59..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITextItem.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/************************************************************************ - filename: CEGUITextItem.cpp - created: 31/3/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) - - purpose: Implementation of TextEntry widget base class -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITextItem.h" -#include "elements/CEGUIItemListBase.h" -#include "CEGUIFont.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* -Definition of Properties for this class -*************************************************************************/ -TextItemProperties::TextXOffset TextItem::d_textXOffsetProperty; -TextItemProperties::TextColour TextItem::d_textColourProperty; -TextItemProperties::TextFormatting TextItem::d_textFormattingProperty; - -/************************************************************************* -Constants -*************************************************************************/ -const colour TextItem::DefaultTextColour = 0xFFFFFFFF; - -/************************************************************************* - Constructor for TextItem base class. -*************************************************************************/ -TextItem::TextItem(const String& type, const String& name) : - ItemEntry(type, name), - d_textColour(DefaultTextColour), - d_textFormatting(LeftAligned), - d_textXOffset(0.0f) -{ - addTextItemProperties(); -} - - -/************************************************************************* - Destructor for TextItem base class. -*************************************************************************/ -TextItem::~TextItem(void) -{ -} - - -/************************************************************************* - Handler called when text is changed. -*************************************************************************/ -void TextItem::onTextChanged(WindowEventArgs& e) -{ - Window::onTextChanged(e); - - // if we are attached to a ItemListBase, we inform the list of the change - Window* parent = getParent(); - ItemListBase* ilb = (ItemListBase*)parent; - if (parent!=NULL && parent->testClassName("ItemListBase") && ilb->isItemInList(this)) - { - ilb->handleUpdatedItemData(); - } - - requestRedraw(); - e.handled = true; -} - - -/************************************************************************* - Perform the actual rendering for this Window. -*************************************************************************/ -void TextItem::populateRenderCache() -{ - Rect absrect(0,0,d_pixelSize.d_width, d_pixelSize.d_height); - - ColourRect colours(d_textColour); - colours.modulateAlpha(getEffectiveAlpha()); - - // - // Draw label text - // - absrect.d_top += PixelAligned((absrect.getHeight() - getFont()->getLineSpacing()) / 2); - absrect.d_left += PixelAligned(d_textXOffset); - - float zBase = System::getSingleton().getRenderer()->getZLayer(2) - System::getSingleton().getRenderer()->getCurrentZ(); - - const Font* font = getFont(); - - if ( font ) - { - d_renderCache.cacheText(getText(true), font, d_textFormatting, absrect, zBase, colours); - } -} - - -/************************************************************************* - Get the optimal pixelsize for this TextItem -*************************************************************************/ -Size TextItem::getItemPixelSize() -{ - const Font *f = getFont(); - // we abs the x offset to to ensure negative offsets do not shrink the item. - return Size(f->getTextExtent(getText())+(d_textXOffset<0?-d_textXOffset:d_textXOffset), f->getLineSpacing()+1); -} - - -/************************************************************************* - Add TextItem specific properties -*************************************************************************/ -void TextItem::addTextItemProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_textColourProperty); - addProperty(&d_textFormattingProperty); - addProperty(&d_textXOffsetProperty); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITextItemProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITextItemProperties.cpp deleted file mode 100644 index 8cfa4af358..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITextItemProperties.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/************************************************************************ - filename: CEGUITextItemProperties.cpp - created: 8/4/2005 - author: Tomas Lindquist Olsen (based on code by Paul D Turner) -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITextItemProperties.h" -#include "elements/CEGUITextItem.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of TextItemProperties namespace section -namespace TextItemProperties -{ - -String TextXOffset::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::floatToString(static_cast(receiver)->getTextXOffset()); -} - -void TextXOffset::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTextXOffset(PropertyHelper::stringToFloat(value)); -} - - -String TextColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getTextColour()); -} - - -void TextColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setTextColour(PropertyHelper::stringToColour(value)); -} - - -String TextFormatting::get(const PropertyReceiver* receiver) const -{ - switch(static_cast(receiver)->getTextFormatting()) - { - case RightAligned: - return String((utf8*)"RightAligned"); - break; - - case Centred: - return String((utf8*)"HorzCentred"); - break; - - case Justified: - return String((utf8*)"HorzJustified"); - break; - - case WordWrapLeftAligned: - return String((utf8*)"WordWrapLeftAligned"); - break; - - case WordWrapRightAligned: - return String((utf8*)"WordWrapRightAligned"); - break; - - case WordWrapCentred: - return String((utf8*)"WordWrapCentred"); - break; - - case WordWrapJustified: - return String((utf8*)"WordWrapJustified"); - break; - - default: - return String((utf8*)"LeftAligned"); - break; - } -} - - -void TextFormatting::set(PropertyReceiver* receiver, const String& value) -{ - CEGUI::TextFormatting fmt; - - if (value == (utf8*)"RightAligned") - { - fmt = RightAligned; - } - else if (value == (utf8*)"HorzCentred") - { - fmt = Centred; - } - else if (value == (utf8*)"HorzJustified") - { - fmt = Justified; - } - else if (value == (utf8*)"WordWrapLeftAligned") - { - fmt = WordWrapLeftAligned; - } - else if (value == (utf8*)"WordWrapRightAligned") - { - fmt = WordWrapRightAligned; - } - else if (value == (utf8*)"WordWrapCentred") - { - fmt = WordWrapCentred; - } - else if (value == (utf8*)"WordWrapJustified") - { - fmt = WordWrapJustified; - } - else - { - fmt = LeftAligned; - } - - static_cast(receiver)->setTextFormatting(fmt); -} - -} // End of TextItemProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIThumb.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIThumb.cpp deleted file mode 100644 index ef57a2a4e0..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIThumb.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/************************************************************************ - filename: CEGUIThumb.cpp - created: 25/4/2004 - author: Paul D Turner - - purpose: Implements common parts of the Thumb base class widget -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIThumb.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Thumb::EventNamespace("Thumb"); - -/************************************************************************* - Static Properties for this class -*************************************************************************/ -ThumbProperties::HotTracked Thumb::d_hotTrackedProperty; -ThumbProperties::VertFree Thumb::d_vertFreeProperty; -ThumbProperties::HorzFree Thumb::d_horzFreeProperty; -ThumbProperties::VertRange Thumb::d_vertRangeProperty; -ThumbProperties::HorzRange Thumb::d_horzRangeProperty; - - -/************************************************************************* - Event name constants -*************************************************************************/ -// generated internally by Window -const String Thumb::EventThumbPositionChanged( (utf8*)"ThumbPosChanged" ); -const String Thumb::EventThumbTrackStarted( (utf8*)"ThumbTrackStarted" ); -const String Thumb::EventThumbTrackEnded( (utf8*)"ThumbTrackEnded" ); - - -/************************************************************************* - Constructor for Thumb objects -*************************************************************************/ -Thumb::Thumb(const String& type, const String& name) : - PushButton(type, name), - d_hotTrack(true), - d_vertFree(false), - d_horzFree(false), - d_vertMin(0.0f), - d_vertMax(1.0f), - d_horzMin(0.0f), - d_horzMax(1.0f), - d_beingDragged(false) -{ - addThumbEvents(); - addThumbProperties(); -} - - -/************************************************************************* - Destructor for Thumb objects -*************************************************************************/ -Thumb::~Thumb(void) -{ -} - - -/************************************************************************* - set the movement range of the thumb for the vertical axis. -*************************************************************************/ -void Thumb::setVertRange(float min, float max) -{ - // ensure min <= max, swap if not. - if (min > max) - { - float tmp = min; - max = min; - min = tmp; - } - - d_vertMax = max; - d_vertMin = min; - - // validate current position. - float cp = getYPosition(); - - if (cp < min) - { - setYPosition(min); - } - else if (cp > max) - { - setYPosition(max); - } - -} - - -/************************************************************************* - set the movement range of the thumb for the horizontal axis. -*************************************************************************/ -void Thumb::setHorzRange(float min, float max) -{ - // ensure min <= max, swap if not. - if (min > max) - { - float tmp = min; - max = min; - min = tmp; - } - - d_horzMax = max; - d_horzMin = min; - - // validate current position. - float cp = getXPosition(); - - if (cp < min) - { - setXPosition(min); - } - else if (cp > max) - { - setXPosition(max); - } - -} - - -/************************************************************************* - Add thumb specific events -*************************************************************************/ -void Thumb::addThumbEvents(bool bCommon) -{ - if ( bCommon == true ) - { - addEvent(EventThumbPositionChanged); - addEvent(EventThumbTrackStarted); - addEvent(EventThumbTrackEnded); - } -} - - -/************************************************************************* - event triggered internally when the position of the thumb -*************************************************************************/ -void Thumb::onThumbPositionChanged(WindowEventArgs& e) -{ - fireEvent(EventThumbPositionChanged, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the user begins to drag the thumb. -*************************************************************************/ -void Thumb::onThumbTrackStarted(WindowEventArgs& e) -{ - fireEvent(EventThumbTrackStarted, e, EventNamespace); -} - - -/************************************************************************* - Handler triggered when the thumb is released -*************************************************************************/ -void Thumb::onThumbTrackEnded(WindowEventArgs& e) -{ - fireEvent(EventThumbTrackEnded, e, EventNamespace); -} - - -/************************************************************************* - Handler for mouse movement events -*************************************************************************/ -void Thumb::onMouseMove(MouseEventArgs& e) -{ - // default processing - PushButton::onMouseMove(e); - - // only react if we are being dragged - if (d_beingDragged) - { - Vector2 delta; - float hmin, hmax, vmin, vmax; - - // get some values as absolute pixel offsets - if (getMetricsMode() == Relative) - { - delta = relativeToAbsolute(screenToWindow(e.position)); - - hmax = relativeToAbsoluteX_impl(d_parent, d_horzMax); - hmin = relativeToAbsoluteX_impl(d_parent, d_horzMin); - vmax = relativeToAbsoluteY_impl(d_parent, d_vertMax); - vmin = relativeToAbsoluteY_impl(d_parent, d_vertMin); - } - else - { - delta = screenToWindow(e.position); - - hmin = d_horzMin; - hmax = d_horzMax; - vmin = d_vertMin; - vmax = d_vertMax; - } - - // calculate amount of movement in pixels - delta -= d_dragPoint; - - // - // Calculate new (pixel) position for thumb - // - Point newPos(getAbsolutePosition()); - - if (d_horzFree) - { - newPos.d_x += delta.d_x; - - // limit value to within currently set range - newPos.d_x = (newPos.d_x < hmin) ? hmin : (newPos.d_x > hmax) ? hmax : newPos.d_x; - } - - if (d_vertFree) - { - newPos.d_y += delta.d_y; - - // limit new position to within currently set range - newPos.d_y = (newPos.d_y < vmin) ? vmin : (newPos.d_y > vmax) ? vmax : newPos.d_y; - } - - // update thumb position if needed - if (newPos != getAbsolutePosition()) - { - if (getMetricsMode() == Relative) - { - newPos = absoluteToRelative_impl(d_parent, newPos); - } - - setPosition(newPos); - - // send notification as required - if (d_hotTrack) - { - WindowEventArgs args(this); - onThumbPositionChanged(args); - } - - } - - } - - e.handled = true; -} - - -/************************************************************************* - Handler for mouse button down events -*************************************************************************/ -void Thumb::onMouseButtonDown(MouseEventArgs& e) -{ - // default processing - PushButton::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - // initialise the dragging state - d_beingDragged = true; - d_dragPoint = screenToWindow(e.position); - - if (getMetricsMode() == Relative) - { - d_dragPoint = relativeToAbsolute(d_dragPoint); - } - - // trigger tracking started event - WindowEventArgs args(this); - onThumbTrackStarted(args); - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for event triggered when we lose capture of mouse input -*************************************************************************/ -void Thumb::onCaptureLost(WindowEventArgs& e) -{ - // default handling - PushButton::onCaptureLost(e); - - d_beingDragged = false; - - // trigger tracking ended event - WindowEventArgs args(this); - onThumbTrackEnded(args); - - // send notification whenever thumb is released - onThumbPositionChanged(args); -} - - -/************************************************************************* - Return a std::pair that describes the current range set for the - vertical movement. -*************************************************************************/ -std::pair Thumb::getVertRange(void) const -{ - return std::make_pair(d_vertMin, d_vertMax); -} - - -/************************************************************************* - Return a std::pair that describes the current range set for the - horizontal movement. -*************************************************************************/ -std::pair Thumb::getHorzRange(void) const -{ - return std::make_pair(d_horzMin, d_horzMax); -} - - -/************************************************************************* - Add thumb specifiec properties -*************************************************************************/ -void Thumb::addThumbProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_hotTrackedProperty); - addProperty(&d_vertRangeProperty); - addProperty(&d_horzRangeProperty); - } - else - { - addProperty(&d_vertFreeProperty); - addProperty(&d_horzFreeProperty); - } -} - - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUIThumbProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUIThumbProperties.cpp deleted file mode 100644 index cf4b7bb8e3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUIThumbProperties.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/************************************************************************ - filename: CEGUIThumbProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implements the Thumb class properties. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUIThumbProperties.h" -#include "elements/CEGUIThumb.h" -#include "CEGUIPropertyHelper.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of ThumbProperties namespace section -namespace ThumbProperties -{ -String HotTracked::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isHotTracked()); -} - - -void HotTracked::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHotTracked(PropertyHelper::stringToBool(value)); -} - - -String VertFree::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isVertFree()); -} - - -void VertFree::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setVertFree(PropertyHelper::stringToBool(value)); -} - - -String HorzFree::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isHorzFree()); -} - - -void HorzFree::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setHorzFree(PropertyHelper::stringToBool(value)); -} - - -String VertRange::get(const PropertyReceiver* receiver) const -{ - using namespace std; - char buff[64]; - - pair range = static_cast(receiver)->getVertRange(); - sprintf(buff, "min:%f max:%f", range.first, range.second); - - return String((utf8*)buff); -} - - -void VertRange::set(PropertyReceiver* receiver, const String& value) -{ - using namespace std; - - float rangeMin = 0, rangeMax = 0; - sscanf(value.c_str(), " min:%f max:%f", &rangeMin, &rangeMax); - - static_cast(receiver)->setVertRange(rangeMin, rangeMax); -} - - -String HorzRange::get(const PropertyReceiver* receiver) const -{ - using namespace std; - - char buff[64]; - pair range = static_cast(receiver)->getHorzRange(); - sprintf(buff, "min:%f max:%f", range.first, range.second); - - return String((utf8*)buff); -} - - -void HorzRange::set(PropertyReceiver* receiver, const String& value) -{ - using namespace std; - - float rangeMin = 0, rangeMax = 0; - sscanf(value.c_str(), " min:%f max:%f", &rangeMin, &rangeMax); - - static_cast(receiver)->setHorzRange(rangeMin, rangeMax); -} - - -} // End of ThumbProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebar.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebar.cpp deleted file mode 100644 index ac8cd9fd42..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebar.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/************************************************************************ - filename: CEGUITitlebar.cpp - created: 25/4/2004 - author: Paul D Turner - - purpose: Implementation of common Titlebar parts. -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITitlebar.h" -#include "elements/CEGUIFrameWindow.h" -#include "CEGUIMouseCursor.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -const String Titlebar::EventNamespace("Titlebar"); - -/************************************************************************* - Definition of Properties for this class -*************************************************************************/ -TitlebarProperties::DraggingEnabled Titlebar::d_dragEnabledProperty; -TitlebarProperties::CaptionColour Titlebar::d_captionColourProperty; - - -/************************************************************************* - Constructor -*************************************************************************/ -Titlebar::Titlebar(const String& type, const String& name) : - Window(type, name) -{ - addTitlebarProperties(); - - setAlwaysOnTop(true); - - // basic initialisation - d_dragging = false; - d_dragEnabled = true; -} - -/************************************************************************* - Destructor -*************************************************************************/ -Titlebar::~Titlebar(void) -{ -} - - -/************************************************************************* - Return whether this title bar will respond to dragging. -*************************************************************************/ -bool Titlebar::isDraggingEnabled(void) const -{ - return d_dragEnabled; -} - - -/************************************************************************* - Set whether this title bar widget will respond to dragging. -*************************************************************************/ -void Titlebar::setDraggingEnabled(bool setting) -{ - if (d_dragEnabled != setting) - { - d_dragEnabled = setting; - - // stop dragging now if the setting has been disabled. - if ((!d_dragEnabled) && d_dragging) - { - releaseInput(); - } - - // call event handler. - WindowEventArgs args(this); - onDraggingModeChanged(args); - } - -} - - -/************************************************************************* - Handler for mouse movement events -*************************************************************************/ -void Titlebar::onMouseMove(MouseEventArgs& e) -{ - // Base class processing. - Window::onMouseMove(e); - - if (d_dragging && (d_parent != NULL)) - { - Vector2 delta(screenToWindow(e.position)); - - if (getMetricsMode() == Relative) - { - delta = relativeToAbsolute(delta); - } - - // calculate amount that window has been moved - delta -= d_dragPoint; - - // move the window. *** Again: Titlebar objects should only be attached to FrameWindow derived classes. *** - ((FrameWindow*)d_parent)->offsetPixelPosition(delta); - - e.handled = true; - } -} - - -/************************************************************************* - Handler for mouse button press events -*************************************************************************/ -void Titlebar::onMouseButtonDown(MouseEventArgs& e) -{ - // Base class processing - Window::onMouseButtonDown(e); - - if (e.button == LeftButton) - { - if ((d_parent != NULL) && d_dragEnabled) - { - // we want all mouse inputs from now on - if (captureInput()) - { - // initialise the dragging state - d_dragging = true; - d_dragPoint = screenToWindow(e.position); - - if (getMetricsMode() == Relative) - { - d_dragPoint = relativeToAbsolute(d_dragPoint); - } - - // store old constraint area - d_oldCursorArea = MouseCursor::getSingleton().getConstraintArea(); - - // setup new constraint area to be the intersection of the old area and our grand-parent's clipped inner-area - Rect constrainArea; - - if ((d_parent == NULL) || (d_parent->getParent() == NULL)) - { - constrainArea = System::getSingleton().getRenderer()->getRect().getIntersection(d_oldCursorArea); - } - else - { - constrainArea = d_parent->getParent()->getInnerRect().getIntersection(d_oldCursorArea); - } - - MouseCursor::getSingleton().setConstraintArea(&constrainArea); - } - - } - - e.handled = true; - } -} - - -/************************************************************************* - Handler for mouse button release events -*************************************************************************/ -void Titlebar::onMouseButtonUp(MouseEventArgs& e) -{ - // Base class processing - Window::onMouseButtonUp(e); - - if (e.button == LeftButton) - { - releaseInput(); - e.handled = true; - } - -} - - -/************************************************************************* - Handler for mouse button double-click events -*************************************************************************/ -void Titlebar::onMouseDoubleClicked(MouseEventArgs& e) -{ - // Base class processing - Window::onMouseDoubleClicked(e); - - if (e.button == LeftButton) - { - // if we do not have a parent window, then obviously nothing should happen. - if (d_parent != NULL) - { - // we should only ever be attached to a FrameWindow (or derived) class - ((FrameWindow*)d_parent)->toggleRollup(); - } - - e.handled = true; - } - -} - - -/************************************************************************* - Handler for if the window loses capture of the mouse. -*************************************************************************/ -void Titlebar::onCaptureLost(WindowEventArgs& e) -{ - // Base class processing - Window::onCaptureLost(e); - - // when we lose out hold on the mouse inputs, we are no longer dragging. - d_dragging = false; - - // restore old constraint area - MouseCursor::getSingleton().setConstraintArea(&d_oldCursorArea); -} - - -/************************************************************************* - Handler for when the font for this Window is changed -*************************************************************************/ -void Titlebar::onFontChanged(WindowEventArgs& e) -{ - Window::onFontChanged(e); - - if (d_parent != NULL) - { - d_parent->performChildWindowLayout(); - } -} - - -/************************************************************************* - Add title bar specific properties -*************************************************************************/ -void Titlebar::addTitlebarProperties( bool bCommon ) -{ - if ( bCommon == false ) - { - addProperty(&d_dragEnabledProperty); - } - else - { - addProperty(&d_captionColourProperty); - } -} - - -/************************************************************************* - Return the current colour used for rendering the caption text -*************************************************************************/ -colour Titlebar::getCaptionColour(void) const -{ - return d_captionColour; -} - - -/************************************************************************* - Sets the colour to be used for rendering the caption text. -*************************************************************************/ -void Titlebar::setCaptionColour(const colour& col) -{ - d_captionColour = col; - requestRedraw(); -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebarProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebarProperties.cpp deleted file mode 100644 index 2a0de8e683..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITitlebarProperties.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************ - filename: CEGUITitlebarProperties.cpp - created: 10/7/2004 - author: Paul D Turner - - purpose: Implementation of title bar property classes -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITitlebarProperties.h" -#include "elements/CEGUITitlebar.h" -#include "CEGUIPropertyHelper.h" - - -// Start of CEGUI namespace section -namespace CEGUI -{ - -// Start of TitlebarProperties namespace section -namespace TitlebarProperties -{ -String DraggingEnabled::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::boolToString(static_cast(receiver)->isDraggingEnabled()); -} - - -void DraggingEnabled::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setDraggingEnabled(PropertyHelper::stringToBool(value)); -} - - -String CaptionColour::get(const PropertyReceiver* receiver) const -{ - return PropertyHelper::colourToString(static_cast(receiver)->getCaptionColour()); -} - -void CaptionColour::set(PropertyReceiver* receiver, const String& value) -{ - static_cast(receiver)->setCaptionColour(PropertyHelper::stringToColour(value)); -} - -} // End of TitlebarProperties namespace section - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITooltip.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITooltip.cpp deleted file mode 100644 index 9cfd410f79..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITooltip.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/************************************************************************ - filename: CEGUITooltip.cpp - created: 21/2/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITooltip.h" -#include "CEGUILogger.h" -#include "CEGUIFont.h" -#include "CEGUIImage.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - ////////////////////////////////////////////////////////////////////////// - // Event name constants - const String Tooltip::EventNamespace("Tooltip"); - const String Tooltip::EventHoverTimeChanged("HoverTimeChanged"); - const String Tooltip::EventDisplayTimeChanged("DisplayTimeChanged"); - const String Tooltip::EventFadeTimeChanged("FadeTimeChanged"); - const String Tooltip::EventTooltipActive("TooltipActive"); - const String Tooltip::EventTooltipInactive("TooltipInactive"); - // Property objects - TooltipProperties::HoverTime Tooltip::d_hoverTimeProperty; - TooltipProperties::DisplayTime Tooltip::d_displayTimeProperty; - TooltipProperties::FadeTime Tooltip::d_fadeTimeProperty; - ////////////////////////////////////////////////////////////////////////// - - Tooltip::Tooltip(const String& type, const String& name) : - Window(type, name) - { - d_hoverTime = 0.4f; - d_displayTime = 7.5f; - d_fadeTime = 0.33f; - - addTooltipEvents(); - addTooltipProperties(); - - setClippedByParent(false); - setDestroyedByParent(false); - setAlwaysOnTop(true); - - switchToInactiveState(); - } - - Tooltip::~Tooltip(void) - {} - - void Tooltip::positionSelf(void) - { - MouseCursor& cursor = MouseCursor::getSingleton(); - Rect screen(System::getSingleton().getRenderer()->getRect()); - Rect tipRect(getUnclippedPixelRect()); - const Image* mouseImage = cursor.getImage(); - - Point mousePos(cursor.getPosition()); - Size mouseSz(0,0); - - if (mouseImage) - { - mouseSz = mouseImage->getSize(); - } - - Point tmpPos(mousePos.d_x + mouseSz.d_width, mousePos.d_y + mouseSz.d_height); - tipRect.setPosition(tmpPos); - - // if tooltip would be off the right of the screen, - // reposition to the other side of the mouse cursor. - if (screen.d_right < tipRect.d_right) - { - tmpPos.d_x = mousePos.d_x - tipRect.getWidth() - 5; - } - - // if tooltip would be off the bottom of the screen, - // reposition to the other side of the mouse cursor. - if (screen.d_bottom < tipRect.d_bottom) - { - tmpPos.d_y = mousePos.d_y - tipRect.getHeight() - 5; - } - - // set final position of tooltip window. - setPosition(Absolute, tmpPos); - } - - void Tooltip::setTargetWindow(Window* wnd) - { - if (wnd) - { - if (d_target != wnd) - { - System::getSingleton().getGUISheet()->addChildWindow(this); - } - - // set text to that of the tooltip text of the target - setText(wnd->getTooltipText()); - - // set size and potition of the tooltip window. - setSize(Absolute, getTextSize()); - positionSelf(); - } - - resetTimer(); - d_target = wnd; - } - - const Window* Tooltip::getTargetWindow() - { - return d_target; - } - - Size Tooltip::getTextSize() const - { - const Font* fnt = getFont(); - - if (fnt) - { - Rect area(System::getSingleton().getRenderer()->getRect()); - - // get required size of the tool tip according to the text extents. - // TODO: Add a proprty to allow specification of text formatting. - float height = fnt->getFormattedLineCount(d_text, area, LeftAligned) * fnt->getLineSpacing(); - float width = fnt->getFormattedTextExtent(d_text, area, LeftAligned); - - return Size(width, height); - } - else - { - return Size(0,0); - } - } - - void Tooltip::resetTimer(void) - { - // only do the reset in active / inactive states, this is so that - // the fades are not messed up by having the timer reset on them. - if (d_state == Active || d_state == Inactive) - { - d_elapsed = 0; - } - } - - float Tooltip::getHoverTime(void) const - { - return d_hoverTime; - } - - void Tooltip::setHoverTime(float seconds) - { - if (d_hoverTime != seconds) - { - d_hoverTime = seconds; - - WindowEventArgs args(this); - onHoverTimeChanged(args); - } - } - - float Tooltip::getDisplayTime(void) const - { - return d_displayTime; - } - - void Tooltip::setDisplayTime(float seconds) - { - if (d_displayTime != seconds) - { - d_displayTime = seconds; - - WindowEventArgs args(this); - onDisplayTimeChanged(args); - } - } - - float Tooltip::getFadeTime(void) const - { - return d_fadeTime; - } - - void Tooltip::setFadeTime(float seconds) - { - if (d_fadeTime != seconds) - { - d_fadeTime = seconds; - - WindowEventArgs args(this); - onFadeTimeChanged(args); - } - } - - void Tooltip::doActiveState(float elapsed) - { - // if no target, switch immediately to inactive state. - if (!d_target || d_target->getTooltipText().empty()) - { - switchToInactiveState(); - } - // else see if display timeout has been reached - else if ((d_displayTime > 0) && ((d_elapsed += elapsed) >= d_displayTime)) - { - // display time is up, switch states - switchToFadeOutState(); - } - } - - void Tooltip::doInactiveState(float elapsed) - { - if (d_target && !d_target->getTooltipText().empty() && ((d_elapsed += elapsed) >= d_hoverTime)) - { - switchToFadeInState(); - } - } - - void Tooltip::doFadeInState(float elapsed) - { - // if no target, switch immediately to inactive state. - if (!d_target || d_target->getTooltipText().empty()) - { - switchToInactiveState(); - } - else - { - if ((d_elapsed += elapsed) >= d_fadeTime) - { - setAlpha(1.0f); - switchToActiveState(); - } - else - { - setAlpha((1.0f / d_fadeTime) * d_elapsed); - } - } - } - - void Tooltip::doFadeOutState(float elapsed) - { - // if no target, switch immediately to inactive state. - if (!d_target || d_target->getTooltipText().empty()) - { - switchToInactiveState(); - } - else - { - if ((d_elapsed += elapsed) >= d_fadeTime) - { - setAlpha(0.0f); - switchToInactiveState(); - } - else - { - setAlpha(1.0f - (1.0f / d_fadeTime) * d_elapsed); - } - } - } - - void Tooltip::switchToInactiveState(void) - { - setAlpha(0.0f); - d_state = Inactive; - d_elapsed = 0; - - if (d_parent) - d_parent->removeChildWindow(this); - - // fire event before target gets reset in case that information is required in handler. - WindowEventArgs args(this); - onTooltipInactive(args); - - d_target = 0; - hide(); - } - - void Tooltip::switchToActiveState(void) - { - d_state = Active; - d_elapsed = 0; - } - - void Tooltip::switchToFadeInState(void) - { - positionSelf(); - d_state = FadeIn; - d_elapsed = 0; - show(); - - // fire event. Not really active at the moment, but this is the "right" time - // for this event (just prior to anything getting displayed). - WindowEventArgs args(this); - onTooltipActive(args); - } - - void Tooltip::switchToFadeOutState(void) - { - d_state = FadeOut; - d_elapsed = 0; - } - - void Tooltip::updateSelf(float elapsed) - { - // base class processing. - Window::updateSelf(elapsed); - - // do something based upon current Tooltip state. - switch (d_state) - { - case Inactive: - doInactiveState(elapsed); - break; - - case Active: - doActiveState(elapsed); - break; - - case FadeIn: - doFadeInState(elapsed); - break; - - case FadeOut: - doFadeOutState(elapsed); - break; - - default: - // This should never happen. - Logger::getSingleton().logEvent("Tooltip (Name: " + getName() + "of Class: " + getType() + ") is in an unknown state. Switching to Inactive state.", Errors); - switchToInactiveState(); - } - } - - void Tooltip::addTooltipEvents(bool bCommon) - { - if ( bCommon == false ) - { - addEvent(EventHoverTimeChanged); - addEvent(EventDisplayTimeChanged); - addEvent(EventFadeTimeChanged); - addEvent(EventTooltipActive); - addEvent(EventTooltipInactive); - } - } - - void Tooltip::addTooltipProperties( bool bCommon ) - { - if ( bCommon == false ) - { - addProperty(&d_hoverTimeProperty); - addProperty(&d_displayTimeProperty); - addProperty(&d_fadeTimeProperty); - } - } - - void Tooltip::onMouseEnters(MouseEventArgs& e) - { - positionSelf(); - - Window::onMouseEnters(e); - } - - void Tooltip::onTextChanged(WindowEventArgs& e) - { - // base class processing - Window::onTextChanged(e); - - // set size and potition of the tooltip window to consider new text - setSize(Absolute, getTextSize()); - positionSelf(); - - // we do not signal we handled it, in case user wants to hear - // about text changes too. - } - - void Tooltip::onHoverTimeChanged(WindowEventArgs& e) - { - fireEvent(EventHoverTimeChanged, e, EventNamespace); - } - - void Tooltip::onDisplayTimeChanged(WindowEventArgs& e) - { - fireEvent(EventDisplayTimeChanged, e, EventNamespace); - } - - void Tooltip::onFadeTimeChanged(WindowEventArgs& e) - { - fireEvent(EventFadeTimeChanged, e, EventNamespace); - } - - void Tooltip::onTooltipActive(WindowEventArgs& e) - { - fireEvent(EventTooltipActive, e, EventNamespace); - } - - void Tooltip::onTooltipInactive(WindowEventArgs& e) - { - fireEvent(EventTooltipInactive, e, EventNamespace); - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/elements/CEGUITooltipProperties.cpp b/vendor/cegui-0.4.0-custom/src/elements/CEGUITooltipProperties.cpp deleted file mode 100644 index 6be9c7b135..0000000000 --- a/vendor/cegui-0.4.0-custom/src/elements/CEGUITooltipProperties.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************ - filename: CEGUITooltipProperties.cpp - created: 3/3/2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "elements/CEGUITooltipProperties.h" -#include "elements/CEGUITooltip.h" -#include "CEGUIPropertyHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ -// Start of TooltipProperties namespace section -namespace TooltipProperties -{ - String HoverTime::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getHoverTime()); - } - - void HoverTime::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setHoverTime(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String DisplayTime::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getDisplayTime()); - } - - void DisplayTime::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setDisplayTime(PropertyHelper::stringToFloat(value)); - } - - ////////////////////////////////////////////////////////////////////////// - - String FadeTime::get(const PropertyReceiver* receiver) const - { - return PropertyHelper::floatToString(static_cast(receiver)->getFadeTime()); - } - - void FadeTime::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setFadeTime(PropertyHelper::stringToFloat(value)); - } - -} // End of TooltipProperties namespace section -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalComponentBase.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalComponentBase.cpp deleted file mode 100644 index 2b3b703447..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalComponentBase.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/************************************************************************ - filename: CEGUIFalComponentBase.cpp - created: Mon Jul 18 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalComponentBase.h" -#include "CEGUIExceptions.h" -#include "CEGUIPropertyHelper.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - FalagardComponentBase::FalagardComponentBase() : - d_colours(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), - d_colourProperyIsRect(false) - {} - - FalagardComponentBase::~ FalagardComponentBase() - {} - - void FalagardComponentBase::render(Window& srcWindow, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - Rect destRect(d_area.getPixelRect(srcWindow)); - render_impl(srcWindow, destRect, base_z, modColours, clipper, clipToDisplay); - } - - void FalagardComponentBase::render(Window& srcWindow, const Rect& baseRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - Rect destRect(d_area.getPixelRect(srcWindow, baseRect)); - render_impl(srcWindow, destRect, base_z, modColours, clipper, clipToDisplay); - } - - const ComponentArea& FalagardComponentBase::getComponentArea() const - { - return d_area; - } - - void FalagardComponentBase::setComponentArea(const ComponentArea& area) - { - d_area = area; - } - - const ColourRect& FalagardComponentBase::getColours() const - { - return d_colours; - } - - void FalagardComponentBase::setColours(const ColourRect& cols) - { - d_colours = cols; - } - - void FalagardComponentBase::setColoursPropertySource(const String& property) - { - d_colourPropertyName = property; - } - - void FalagardComponentBase::setColoursPropertyIsColourRect(bool setting) - { - d_colourProperyIsRect = setting; - } - - void FalagardComponentBase::initColoursRect(const Window& wnd, const ColourRect* modCols, ColourRect& cr) const - { - // if colours come via a colour property - if (!d_colourPropertyName.empty()) - { - // if property accesses a ColourRect - if (d_colourProperyIsRect) - { - cr = PropertyHelper::stringToColourRect(wnd.getProperty(d_colourPropertyName)); - } - // property accesses a colour - else - { - colour val(PropertyHelper::stringToColour(wnd.getProperty(d_colourPropertyName))); - cr.d_top_left = val; - cr.d_top_right = val; - cr.d_bottom_left = val; - cr.d_bottom_right = val; - } - } - // use explicit ColourRect. - else - { - cr = d_colours; - } - - if (modCols) - { - cr *= *modCols; - } - } - - - void FalagardComponentBase::setVertFormattingPropertySource(const String& property) - { - d_vertFormatPropertyName = property; - } - - void FalagardComponentBase::setHorzFormattingPropertySource(const String& property) - { - d_horzFormatPropertyName = property; - } - - bool FalagardComponentBase::writeColoursXML(OutStream& out_stream) const - { - if (!d_colourPropertyName.empty()) - { - if (d_colourProperyIsRect) - out_stream << "" << std::endl; - } - else if (!d_colours.isMonochromatic() || d_colours.d_top_left != colour(1,1,1,1)) - { - out_stream << "" << std::endl; - } - else - { - return false; - } - - return true; - } - - bool FalagardComponentBase::writeVertFormatXML(OutStream& out_stream) const - { - if (!d_vertFormatPropertyName.empty()) - { - out_stream << "" << std::endl; - return true; - } - - return false; - } - - bool FalagardComponentBase::writeHorzFormatXML(OutStream& out_stream) const - { - if (!d_horzFormatPropertyName.empty()) - { - out_stream << "" << std::endl; - return true; - } - - return false; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalDimensions.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalDimensions.cpp deleted file mode 100644 index 3da9ccad1f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalDimensions.cpp +++ /dev/null @@ -1,792 +0,0 @@ -/************************************************************************ - filename: CEGUIFalDimensions.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalDimensions.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUIImage.h" -#include "CEGUIWindowManager.h" -#include "CEGUIWindow.h" -#include "CEGUIExceptions.h" -#include "CEGUIFontManager.h" -#include "CEGUIFont.h" -#include "CEGUIPropertyHelper.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - BaseDim::BaseDim() : - d_operator(DOP_NOOP), - d_operand(0) - { - } - - BaseDim::~BaseDim() - { - delete d_operand; - } - - float BaseDim::getValue(const Window& wnd) const - { - // get sub-class to return value for this dimension. - float val = getValue_impl(wnd); - - // if we have an attached operand, perform math on value as needed - if (d_operand) - { - switch (d_operator) - { - case DOP_ADD: - val += d_operand->getValue(wnd); - break; - case DOP_SUBTRACT: - val -= d_operand->getValue(wnd); - break; - case DOP_MULTIPLY: - val *= d_operand->getValue(wnd); - break; - case DOP_DIVIDE: - val /= d_operand->getValue(wnd); - break; - default: - // No-op. - break; - } - } - - return val; - } - - float BaseDim::getValue(const Window& wnd, const Rect& container) const - { - // get sub-class to return value for this dimension. - float val = getValue_impl(wnd, container); - - // if we have an attached operand, perform math on value as needed - if (d_operand) - { - switch (d_operator) - { - case DOP_ADD: - val += d_operand->getValue(wnd, container); - break; - case DOP_SUBTRACT: - val -= d_operand->getValue(wnd, container); - break; - case DOP_MULTIPLY: - val *= d_operand->getValue(wnd, container); - break; - case DOP_DIVIDE: - val /= d_operand->getValue(wnd, container); - break; - default: - // No-op. - break; - } - } - - return val; - } - - BaseDim* BaseDim::clone() const - { - // get sub-class to return a cloned object - BaseDim* o = clone_impl(); - - // fill in operator for cloned object - o->d_operator = d_operator; - - // now clone any attached operand dimension - if (d_operand) - o->d_operand = d_operand->clone(); - - return o; - } - - DimensionOperator BaseDim::getDimensionOperator() const - { - return d_operator; - } - - void BaseDim::setDimensionOperator(DimensionOperator op) - { - d_operator = op; - } - - const BaseDim* BaseDim::getOperand() const - { - return d_operand; - } - - void BaseDim::setOperand(const BaseDim& operand) - { - // release old operand, if any. - if(d_operand) delete d_operand; - - d_operand = operand.clone(); - } - - void BaseDim::writeXMLToStream(OutStream& out_stream) const - { - // open tag - out_stream << "<"; - // get sub-class to output the data for this single dimension - writeXMLElementName_impl(out_stream); - out_stream << " "; - writeXMLElementAttributes_impl(out_stream); - - if (d_operand) - { - // terminate the opening element tag - out_stream << ">" << std::endl; - // write out the DimOperator - out_stream << "" << std::endl; - // write out the other operand - d_operand->writeXMLToStream(out_stream); - // write closing tag for DimOperator element - out_stream << "" << std::endl; - // write closing tag for this dimension element - out_stream << "" << std::endl; - } - // no operand, so just close this tag. - else - { - out_stream << " />" << std::endl; - } - } - - //////////////////////////////////////////////////////////////////////////////// - - AbsoluteDim::AbsoluteDim(float val) : - d_val(val) - {} - - void AbsoluteDim::setValue(float val) - { - d_val = val; - } - - float AbsoluteDim::getValue_impl(const Window& wnd) const - { - return d_val; - } - - float AbsoluteDim::getValue_impl(const Window& wnd, const Rect& container) const - { - return d_val; - } - - BaseDim* AbsoluteDim::clone_impl() const - { - AbsoluteDim* ndim = new AbsoluteDim(d_val); - return ndim; - } - - void AbsoluteDim::writeXMLElementName_impl(OutStream& out_stream) const - { - out_stream << "AbsoluteDim"; - } - - void AbsoluteDim::writeXMLElementAttributes_impl(OutStream& out_stream) const - { - out_stream << "value=\"" << d_val << "\""; - } - - - //////////////////////////////////////////////////////////////////////////////// - - ImageDim::ImageDim(const String& imageset, const String& image, DimensionType dim) : - d_imageset(imageset), - d_image(image), - d_what(dim) - {} - - void ImageDim::setSourceImage(const String& imageset, const String& image) - { - d_imageset = imageset; - d_image = image; - } - - void ImageDim::setSourceDimension(DimensionType dim) - { - d_what = dim; - } - - float ImageDim::getValue_impl(const Window& wnd) const - { - const Image* img = &ImagesetManager::getSingleton().getImageset(d_imageset)->getImage(d_image); - - switch (d_what) - { - case DT_WIDTH: - return img->getWidth(); - break; - - case DT_HEIGHT: - return img->getHeight(); - break; - - case DT_X_OFFSET: - return img->getOffsetX(); - break; - - case DT_Y_OFFSET: - return img->getOffsetY(); - break; - - // these other options will not be particularly useful for most people since they return the edges of the - // image on the source texture. - case DT_LEFT_EDGE: - case DT_X_POSITION: - return img->getSourceTextureArea().d_left; - break; - - case DT_TOP_EDGE: - case DT_Y_POSITION: - return img->getSourceTextureArea().d_top; - break; - - case DT_RIGHT_EDGE: - return img->getSourceTextureArea().d_right; - break; - - case DT_BOTTOM_EDGE: - return img->getSourceTextureArea().d_bottom; - break; - - default: - throw InvalidRequestException("ImageDim::getValue - unknown or unsupported DimensionType encountered."); - break; - } - } - - float ImageDim::getValue_impl(const Window& wnd, const Rect& container) const - { - // This dimension type does not alter when whithin a container Rect. - return getValue(wnd); - } - - - BaseDim* ImageDim::clone_impl() const - { - ImageDim* ndim = new ImageDim(d_imageset, d_image, d_what); - return ndim; - } - - void ImageDim::writeXMLElementName_impl(OutStream& out_stream) const - { - out_stream << "ImageDim"; - } - - void ImageDim::writeXMLElementAttributes_impl(OutStream& out_stream) const - { - out_stream << "imageset=\"" << d_imageset << "\" image=\"" << d_image << "\" dimension=\"" << FalagardXMLHelper::dimensionTypeToString(d_what) << "\""; - } - - //////////////////////////////////////////////////////////////////////////////// - - WidgetDim::WidgetDim(const String& name, DimensionType dim) : - d_widgetName(name), - d_what(dim) - {} - - void WidgetDim::setWidgetName(const String& name) - { - d_widgetName = name; - } - - void WidgetDim::setSourceDimension(DimensionType dim) - { - d_what = dim; - } - - float WidgetDim::getValue_impl(const Window& wnd) const - { - const Window* widget; - - // if target widget name is empty, then use the input window. - if (d_widgetName.empty()) - { - widget = &wnd; - } - // name not empty, so find window with required name - else - { - widget = WindowManager::getSingleton().getWindow(wnd.getName() + d_widgetName); - } - - switch (d_what) - { - case DT_WIDTH: - return widget->getAbsoluteWidth(); - break; - - case DT_HEIGHT: - return widget->getAbsoluteHeight(); - break; - - case DT_X_OFFSET: - Logger::getSingleton().logEvent("WigetDim::getValue - Nonsensical DimensionType of DT_X_OFFSET specified! returning 0.0f"); - return 0.0f; - break; - - case DT_Y_OFFSET: - Logger::getSingleton().logEvent("WigetDim::getValue - Nonsensical DimensionType of DT_Y_OFFSET specified! returning 0.0f"); - return 0.0f; - break; - - case DT_LEFT_EDGE: - case DT_X_POSITION: - return widget->getAbsolutePosition().d_x; - break; - - case DT_TOP_EDGE: - case DT_Y_POSITION: - return widget->getAbsolutePosition().d_y; - break; - - case DT_RIGHT_EDGE: - return widget->getAbsoluteRect().d_right; - break; - - case DT_BOTTOM_EDGE: - return widget->getAbsoluteRect().d_bottom; - break; - - default: - throw InvalidRequestException("WidgetDim::getValue - unknown or unsupported DimensionType encountered."); - break; - } - } - - float WidgetDim::getValue_impl(const Window& wnd, const Rect& container) const - { - // This dimension type does not alter when whithin a container Rect. - return getValue(wnd); - } - - BaseDim* WidgetDim::clone_impl() const - { - WidgetDim* ndim = new WidgetDim(d_widgetName, d_what); - return ndim; - } - - void WidgetDim::writeXMLElementName_impl(OutStream& out_stream) const - { - out_stream << "WidgetDim"; - } - - void WidgetDim::writeXMLElementAttributes_impl(OutStream& out_stream) const - { - if (!d_widgetName.empty()) - out_stream << "widget=\"" << d_widgetName << "\" "; - - out_stream << "dimension=\"" << FalagardXMLHelper::dimensionTypeToString(d_what) << "\""; - } - - //////////////////////////////////////////////////////////////////////////////// - - FontDim::FontDim(const String& name, const String& font, const String& text, FontMetricType metric, float padding) : - d_font(font), - d_text(text), - d_childSuffix(name), - d_metric(metric), - d_padding(padding) - { - } - - float FontDim::getValue_impl(const Window& wnd) const - { - // get window to use. - const Window& sourceWindow = d_childSuffix.empty() ? wnd : *WindowManager::getSingleton().getWindow(wnd.getName() + d_childSuffix); - // get font to use - const Font* fontObj = d_font.empty() ? sourceWindow.getFont() : FontManager::getSingleton().getFont(d_font); - - if (fontObj) - { - switch (d_metric) - { - case FMT_LINE_SPACING: - return fontObj->getLineSpacing() + d_padding; - break; - case FMT_BASELINE: - return fontObj->getBaseline() + d_padding; - break; - case FMT_HORZ_EXTENT: - return fontObj->getTextExtent(d_text.empty() ? sourceWindow.getText(true) : d_text) + d_padding; - break; - default: - throw InvalidRequestException("FontDim::getValue - unknown or unsupported FontMetricType encountered."); - break; - } - } - // no font, return padding value only. - else - { - return d_padding; - } - } - - float FontDim::getValue_impl(const Window& wnd, const Rect& container) const - { - return getValue(wnd); - } - - BaseDim* FontDim::clone_impl() const - { - FontDim* ndim = new FontDim(d_childSuffix, d_font, d_text, d_metric, d_padding); - return ndim; - } - - void FontDim::writeXMLElementName_impl(OutStream& out_stream) const - { - out_stream << "FontDim"; - } - - void FontDim::writeXMLElementAttributes_impl(OutStream& out_stream) const - { - if (!d_childSuffix.empty()) - out_stream << "widget=\"" << d_childSuffix << "\" "; - - if (!d_font.empty()) - out_stream << "font=\"" << d_font << "\" "; - - if (!d_text.empty()) - out_stream << "string=\"" << d_text << "\" "; - - if (d_padding != 0) - out_stream << "padding=\"" << d_padding << "\" "; - - out_stream << "type=\"" << FalagardXMLHelper::fontMetricTypeToString(d_metric) << "\""; - } - - //////////////////////////////////////////////////////////////////////////////// - - PropertyDim::PropertyDim(const String& name, const String& property) : - d_property(property), - d_childSuffix(name) - { - } - - float PropertyDim::getValue_impl(const Window& wnd) const - { - // get window to use. - const Window& sourceWindow = d_childSuffix.empty() ? wnd : *WindowManager::getSingleton().getWindow(wnd.getName() + d_childSuffix); - // return property value. - return PropertyHelper::stringToFloat(sourceWindow.getProperty(d_property)); - } - - float PropertyDim::getValue_impl(const Window& wnd, const Rect& container) const - { - return getValue(wnd); - } - - BaseDim* PropertyDim::clone_impl() const - { - PropertyDim* ndim = new PropertyDim(d_childSuffix, d_property); - return ndim; - } - - void PropertyDim::writeXMLElementName_impl(OutStream& out_stream) const - { - if (!d_childSuffix.empty()) - out_stream << "widget=\"" << d_childSuffix << "\" "; - - out_stream << "PropertyDim"; - } - - void PropertyDim::writeXMLElementAttributes_impl(OutStream& out_stream) const - { - out_stream << "name=\"" << d_property << "\""; - } - - //////////////////////////////////////////////////////////////////////////////// - - Dimension::Dimension() - { - d_value = 0; - d_type = DT_INVALID; - } - - Dimension::~Dimension() - { - if (d_value) - delete d_value; - } - - Dimension::Dimension(const BaseDim& dim, DimensionType type) - { - d_value = dim.clone(); - d_type = type; - } - - Dimension::Dimension(const Dimension& other) - { - d_value = other.d_value ? other.d_value->clone() : 0; - d_type = other.d_type; - } - - Dimension& Dimension::operator=(const Dimension& other) - { - // release old value, if any. - if (d_value) delete d_value; - - d_value = other.d_value ? other.d_value->clone() : 0; - d_type = other.d_type; - - return *this; - } - - const BaseDim& Dimension::getBaseDimension() const - { - assert(d_value); - return *d_value; - } - - void Dimension::setBaseDimension(const BaseDim& dim) - { - // release old value, if any. - if (d_value) delete d_value; - - d_value = dim.clone(); - } - - DimensionType Dimension::getDimensionType() const - { - return d_type; - } - - void Dimension::setDimensionType(DimensionType type) - { - d_type = type; - } - - void Dimension::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - - if (d_value) - d_value->writeXMLToStream(out_stream); - - out_stream << "" << std::endl; - } - - //////////////////////////////////////////////////////////////////////////////// - - UnifiedDim::UnifiedDim(const UDim& value, DimensionType dim) : - d_value(value), - d_what(dim) - { - } - - float UnifiedDim::getValue_impl(const Window& wnd) const - { - switch (d_what) - { - case DT_LEFT_EDGE: - case DT_RIGHT_EDGE: - case DT_X_POSITION: - case DT_X_OFFSET: - case DT_WIDTH: - return d_value.asAbsolute(wnd.getAbsoluteWidth()); - break; - - case DT_TOP_EDGE: - case DT_BOTTOM_EDGE: - case DT_Y_POSITION: - case DT_Y_OFFSET: - case DT_HEIGHT: - return d_value.asAbsolute(wnd.getAbsoluteHeight()); - break; - - default: - throw InvalidRequestException("UnifiedDim::getValue - unknown or unsupported DimensionType encountered."); - break; - } - } - - float UnifiedDim::getValue_impl(const Window& wnd, const Rect& container) const - { - switch (d_what) - { - case DT_LEFT_EDGE: - case DT_RIGHT_EDGE: - case DT_X_POSITION: - case DT_X_OFFSET: - case DT_WIDTH: - return d_value.asAbsolute(container.getWidth()); - break; - - case DT_TOP_EDGE: - case DT_BOTTOM_EDGE: - case DT_Y_POSITION: - case DT_Y_OFFSET: - case DT_HEIGHT: - return d_value.asAbsolute(container.getHeight()); - break; - - default: - throw InvalidRequestException("UnifiedDim::getValue - unknown or unsupported DimensionType encountered."); - break; - } - } - - BaseDim* UnifiedDim::clone_impl() const - { - UnifiedDim* ndim = new UnifiedDim(d_value, d_what); - return ndim; - } - - void UnifiedDim::writeXMLElementName_impl(OutStream& out_stream) const - { - out_stream << "UnifiedDim"; - } - - void UnifiedDim::writeXMLElementAttributes_impl(OutStream& out_stream) const - { - if (d_value.d_scale != 0) - out_stream << "scale=\"" << d_value.d_scale << "\" "; - - if (d_value.d_offset != 0) - out_stream << "offset=\"" << d_value.d_offset << "\" "; - - out_stream << "type=\"" << FalagardXMLHelper::dimensionTypeToString(d_what) << "\""; - } - - //////////////////////////////////////////////////////////////////////////////// - - Rect ComponentArea::getPixelRect(const Window& wnd) const - { - Rect pixelRect; - - // use a property? - if (isAreaFetchedFromProperty()) - { - pixelRect = PropertyHelper::stringToURect(wnd.getProperty(d_areaProperty)).asAbsolute(wnd.getAbsoluteSize()); - } - // not via property - calculate using Dimensions - else - { - // sanity check, we must be able to form a Rect from what we represent. - assert(d_left.getDimensionType() == DT_LEFT_EDGE || d_left.getDimensionType() == DT_X_POSITION); - assert(d_top.getDimensionType() == DT_TOP_EDGE || d_top.getDimensionType() == DT_Y_POSITION); - assert(d_right_or_width.getDimensionType() == DT_RIGHT_EDGE || d_right_or_width.getDimensionType() == DT_WIDTH); - assert(d_bottom_or_height.getDimensionType() == DT_BOTTOM_EDGE || d_bottom_or_height.getDimensionType() == DT_HEIGHT); - - pixelRect.d_left = d_left.getBaseDimension().getValue(wnd); - pixelRect.d_top = d_top.getBaseDimension().getValue(wnd); - - if (d_right_or_width.getDimensionType() == DT_WIDTH) - pixelRect.setWidth(d_right_or_width.getBaseDimension().getValue(wnd)); - else - pixelRect.d_right = d_right_or_width.getBaseDimension().getValue(wnd); - - if (d_bottom_or_height.getDimensionType() == DT_HEIGHT) - pixelRect.setHeight(d_bottom_or_height.getBaseDimension().getValue(wnd)); - else - pixelRect.d_bottom = d_bottom_or_height.getBaseDimension().getValue(wnd); - - // width & height can never be negative - pixelRect.d_right = std::max(pixelRect.d_right, pixelRect.d_left); - pixelRect.d_bottom = std::max(pixelRect.d_bottom, pixelRect.d_top); - } - - return pixelRect; - } - - Rect ComponentArea::getPixelRect(const Window& wnd, const Rect& container) const - { - Rect pixelRect; - - // use a property? - if (isAreaFetchedFromProperty()) - { - pixelRect = PropertyHelper::stringToURect(wnd.getProperty(d_areaProperty)).asAbsolute(wnd.getAbsoluteSize()); - } - // not via property - calculate using Dimensions - else - { - // sanity check, we mus be able to form a Rect from what we represent. - assert(d_left.getDimensionType() == DT_LEFT_EDGE || d_left.getDimensionType() == DT_X_POSITION); - assert(d_top.getDimensionType() == DT_TOP_EDGE || d_top.getDimensionType() == DT_Y_POSITION); - assert(d_right_or_width.getDimensionType() == DT_RIGHT_EDGE || d_right_or_width.getDimensionType() == DT_WIDTH); - assert(d_bottom_or_height.getDimensionType() == DT_BOTTOM_EDGE || d_bottom_or_height.getDimensionType() == DT_HEIGHT); - - pixelRect.d_left = d_left.getBaseDimension().getValue(wnd, container) + container.d_left; - pixelRect.d_top = d_top.getBaseDimension().getValue(wnd, container) + container.d_top; - - if (d_right_or_width.getDimensionType() == DT_WIDTH) - pixelRect.setWidth(d_right_or_width.getBaseDimension().getValue(wnd, container)); - else - pixelRect.d_right = d_right_or_width.getBaseDimension().getValue(wnd, container) + container.d_left; - - if (d_bottom_or_height.getDimensionType() == DT_HEIGHT) - pixelRect.setHeight(d_bottom_or_height.getBaseDimension().getValue(wnd, container)); - else - pixelRect.d_bottom = d_bottom_or_height.getBaseDimension().getValue(wnd, container) + container.d_top; - } - - return pixelRect; - } - - void ComponentArea::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - - // see if we should write an AreaProperty element - if (isAreaFetchedFromProperty()) - { - out_stream << "" << std::endl; - } - // not a property, write out individual dimensions explicitly. - else - { - d_left.writeXMLToStream(out_stream); - d_top.writeXMLToStream(out_stream); - d_right_or_width.writeXMLToStream(out_stream); - d_bottom_or_height.writeXMLToStream(out_stream); - } - out_stream << "" << std::endl; - } - - bool ComponentArea::isAreaFetchedFromProperty() const - { - return !d_areaProperty.empty(); - } - - const String& ComponentArea::getAreaPropertySource() const - { - return d_areaProperty; - } - - void ComponentArea::setAreaPropertySource(const String& property) - { - d_areaProperty = property; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalFrameComponent.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalFrameComponent.cpp deleted file mode 100644 index 567339d6d6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalFrameComponent.cpp +++ /dev/null @@ -1,525 +0,0 @@ -/************************************************************************ - filename: CEGUIFalFrameComponent.cpp - created: Mon Jul 18 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalFrameComponent.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" -#include "CEGUIImage.h" -#include "CEGUIExceptions.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - FrameComponent::FrameComponent() : - d_vertFormatting(VF_STRETCHED), - d_horzFormatting(HF_STRETCHED) - { - for (int i = 0; i < FIC_FRAME_IMAGE_COUNT; ++i) - d_frameImages[i] = 0; - } - - VerticalFormatting FrameComponent::getBackgroundVerticalFormatting() const - { - return d_vertFormatting; - } - - void FrameComponent::setBackgroundVerticalFormatting(VerticalFormatting fmt) - { - d_vertFormatting = fmt; - } - - HorizontalFormatting FrameComponent::getBackgroundHorizontalFormatting() const - { - return d_horzFormatting; - } - - void FrameComponent::setBackgroundHorizontalFormatting(HorizontalFormatting fmt) - { - d_horzFormatting = fmt; - } - - const Image* FrameComponent::getImage(FrameImageComponent part) const - { - assert(part < FIC_FRAME_IMAGE_COUNT); - - return d_frameImages[part]; - } - - void FrameComponent::setImage(FrameImageComponent part, const Image* image) - { - assert(part < FIC_FRAME_IMAGE_COUNT); - - d_frameImages[part] = image; - } - - void FrameComponent::setImage(FrameImageComponent part, const String& imageset, const String& image) - { - assert(part < FIC_FRAME_IMAGE_COUNT); - - try - { - d_frameImages[part] = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); - } - catch (UnknownObjectException) - { - d_frameImages[part] = 0; - } - } - - void FrameComponent::render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - Rect backgroundRect(destRect); - Rect finalRect; - Size imageSize; - ColourRect imageColours; - float leftfactor, rightfactor, topfactor, bottomfactor; - bool calcColoursPerImage; - - // vars we use to track what to do with the side pieces. - float topOffset = 0, bottomOffset = 0, leftOffset = 0, rightOffset = 0; - float topWidth, bottomWidth, leftHeight, rightHeight; - topWidth = bottomWidth = destRect.getWidth(); - leftHeight = rightHeight = destRect.getHeight(); - - // calculate final overall colours to be used - ColourRect finalColours; - initColoursRect(srcWindow, modColours, finalColours); - - if (finalColours.isMonochromatic()) - { - calcColoursPerImage = false; - imageColours = finalColours; - } - else - { - calcColoursPerImage = true; - } - - // top-left image - if (d_frameImages[FIC_TOP_LEFT_CORNER]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_TOP_LEFT_CORNER]->getSize(); - finalRect.d_left = destRect.d_left; - finalRect.d_top = destRect.d_top; - finalRect.setSize(imageSize); - - // update adjustments required to edges do to presence of this element. - topOffset += imageSize.d_width; - leftOffset += imageSize.d_height; - topWidth -= topOffset; - leftHeight -= leftOffset; - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_TOP_LEFT_CORNER]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_TOP_LEFT_CORNER]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_TOP_LEFT_CORNER], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // top-right image - if (d_frameImages[FIC_TOP_RIGHT_CORNER]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_TOP_RIGHT_CORNER]->getSize(); - finalRect.d_left = destRect.d_right - imageSize.d_width; - finalRect.d_top = destRect.d_top; - finalRect.setSize(imageSize); - - // update adjustments required to edges do to presence of this element. - rightOffset += imageSize.d_height; - topWidth -= imageSize.d_width; - rightHeight -= rightOffset; - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_TOP_RIGHT_CORNER]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_TOP_RIGHT_CORNER]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_TOP_RIGHT_CORNER], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // bottom-left image - if (d_frameImages[FIC_BOTTOM_LEFT_CORNER]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_BOTTOM_LEFT_CORNER]->getSize(); - finalRect.d_left = destRect.d_left; - finalRect.d_top = destRect.d_bottom - imageSize.d_height; - finalRect.setSize(imageSize); - - // update adjustments required to edges do to presence of this element. - bottomOffset += imageSize.d_width; - bottomWidth -= bottomOffset; - leftHeight -= imageSize.d_height; - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_BOTTOM_LEFT_CORNER]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_BOTTOM_LEFT_CORNER]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_BOTTOM_LEFT_CORNER], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // bottom-right image - if (d_frameImages[FIC_BOTTOM_RIGHT_CORNER]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_BOTTOM_RIGHT_CORNER]->getSize(); - finalRect.d_left = destRect.d_right - imageSize.d_width; - finalRect.d_top = destRect.d_bottom - imageSize.d_height; - finalRect.setSize(imageSize); - - // update adjustments required to edges do to presence of this element. - bottomWidth -= imageSize.d_width; - rightHeight -= imageSize.d_height; - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_BOTTOM_RIGHT_CORNER]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_BOTTOM_RIGHT_CORNER]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_BOTTOM_RIGHT_CORNER], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // top image - if (d_frameImages[FIC_TOP_EDGE]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_TOP_EDGE]->getSize(); - finalRect.d_left = destRect.d_left + topOffset; - finalRect.d_right = finalRect.d_left + topWidth; - finalRect.d_top = destRect.d_top; - finalRect.d_bottom = finalRect.d_top + imageSize.d_height; - - // adjust background area to miss this edge - backgroundRect.d_top += imageSize.d_height + d_frameImages[FIC_TOP_EDGE]->getOffsetY();; - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_TOP_EDGE]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_TOP_EDGE]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_TOP_EDGE], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // bottom image - if (d_frameImages[FIC_BOTTOM_EDGE]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_BOTTOM_EDGE]->getSize(); - finalRect.d_left = destRect.d_left + bottomOffset; - finalRect.d_right = finalRect.d_left + bottomWidth; - finalRect.d_bottom = destRect.d_bottom; - finalRect.d_top = finalRect.d_bottom - imageSize.d_height; - - // adjust background area to miss this edge - backgroundRect.d_bottom -= imageSize.d_height - d_frameImages[FIC_BOTTOM_EDGE]->getOffsetY();; - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_BOTTOM_EDGE]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_BOTTOM_EDGE]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_BOTTOM_EDGE], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // left image - if (d_frameImages[FIC_LEFT_EDGE]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_LEFT_EDGE]->getSize(); - finalRect.d_left = destRect.d_left; - finalRect.d_right = finalRect.d_left + imageSize.d_width; - finalRect.d_top = destRect.d_top + leftOffset; - finalRect.d_bottom = finalRect.d_top + leftHeight; - - // adjust background area to miss this edge - backgroundRect.d_left += imageSize.d_width + d_frameImages[FIC_LEFT_EDGE]->getOffsetX(); - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_LEFT_EDGE]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_LEFT_EDGE]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_LEFT_EDGE], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - // right image - if (d_frameImages[FIC_RIGHT_EDGE]) - { - // calculate final destination area - imageSize = d_frameImages[FIC_RIGHT_EDGE]->getSize(); - finalRect.d_top = destRect.d_top + rightOffset; - finalRect.d_bottom = finalRect.d_top + rightHeight; - finalRect.d_right = destRect.d_right; - finalRect.d_left = finalRect.d_right - imageSize.d_width; - - // adjust background area to miss this edge - backgroundRect.d_right -= imageSize.d_width - d_frameImages[FIC_RIGHT_EDGE]->getOffsetX(); - - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (finalRect.d_left + d_frameImages[FIC_RIGHT_EDGE]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + finalRect.getWidth() / destRect.getWidth(); - topfactor = (finalRect.d_top + d_frameImages[FIC_RIGHT_EDGE]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + finalRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // draw this element. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_RIGHT_EDGE], finalRect, base_z, imageColours, 0, clipToDisplay); - } - - if (d_frameImages[FIC_BACKGROUND]) - { - // calculate colours that are to be used to this component image - if (calcColoursPerImage) - { - leftfactor = (backgroundRect.d_left + d_frameImages[FIC_BACKGROUND]->getOffsetX()) / destRect.getWidth(); - rightfactor = leftfactor + backgroundRect.getWidth() / destRect.getWidth(); - topfactor = (backgroundRect.d_top + d_frameImages[FIC_BACKGROUND]->getOffsetY()) / destRect.getHeight(); - bottomfactor = topfactor + backgroundRect.getHeight() / destRect.getHeight(); - - imageColours = finalColours.getSubRectangle( leftfactor, rightfactor, topfactor, bottomfactor); - } - - // render background image. - doBackgroundRender(srcWindow, backgroundRect, base_z, imageColours, clipper, clipToDisplay); - } - } - - void FrameComponent::doBackgroundRender(Window& srcWindow, Rect& destRect, float base_z, const ColourRect& colours, const Rect* clipper, bool clipToDisplay) const - { - HorizontalFormatting horzFormatting = d_horzFormatPropertyName.empty() ? d_horzFormatting : - FalagardXMLHelper::stringToHorzFormat(srcWindow.getProperty(d_horzFormatPropertyName)); - - VerticalFormatting vertFormatting = d_vertFormatPropertyName.empty() ? d_vertFormatting : - FalagardXMLHelper::stringToVertFormat(srcWindow.getProperty(d_vertFormatPropertyName)); - - uint horzTiles, vertTiles; - float xpos, ypos; - - Size imgSz(d_frameImages[FIC_BACKGROUND]->getSize()); - - // calculate initial x co-ordinate and horizontal tile count according to formatting options - switch (horzFormatting) - { - case HF_STRETCHED: - imgSz.d_width = destRect.getWidth(); - xpos = destRect.d_left; - horzTiles = 1; - break; - - case HF_TILED: - xpos = destRect.d_left; - horzTiles = (uint)((destRect.getWidth() + (imgSz.d_width - 1)) / imgSz.d_width); - break; - - case HF_LEFT_ALIGNED: - xpos = destRect.d_left; - horzTiles = 1; - break; - - case HF_CENTRE_ALIGNED: - xpos = destRect.d_left + PixelAligned((destRect.getWidth() - imgSz.d_width) * 0.5f); - horzTiles = 1; - break; - - case HF_RIGHT_ALIGNED: - xpos = destRect.d_right - imgSz.d_width; - horzTiles = 1; - break; - - default: - throw InvalidRequestException("FrameComponent::doBackgroundRender - An unknown HorizontalFormatting value was specified."); - } - - // calculate initial y co-ordinate and vertical tile count according to formatting options - switch (vertFormatting) - { - case VF_STRETCHED: - imgSz.d_height = destRect.getHeight(); - ypos = destRect.d_top; - vertTiles = 1; - break; - - case VF_TILED: - ypos = destRect.d_top; - vertTiles = (uint)((destRect.getHeight() + (imgSz.d_height - 1)) / imgSz.d_height); - break; - - case VF_TOP_ALIGNED: - ypos = destRect.d_top; - vertTiles = 1; - break; - - case VF_CENTRE_ALIGNED: - ypos = destRect.d_top + PixelAligned((destRect.getHeight() - imgSz.d_height) * 0.5f); - vertTiles = 1; - break; - - case VF_BOTTOM_ALIGNED: - ypos = destRect.d_bottom - imgSz.d_height; - vertTiles = 1; - break; - - default: - throw InvalidRequestException("FrameComponent::doBackgroundRender - An unknown VerticalFormatting value was specified."); - } - - // perform final rendering (actually is now a caching of the images which will be drawn) - Rect finalRect; - Rect finalClipper; - const Rect* clippingRect; - finalRect.d_top = ypos; - finalRect.d_bottom = ypos + imgSz.d_height; - - for (uint row = 0; row < vertTiles; ++row) - { - finalRect.d_left = xpos; - finalRect.d_right = xpos + imgSz.d_width; - - for (uint col = 0; col < horzTiles; ++col) - { - // use custom clipping for right and bottom edges when tiling the imagery - if (((vertFormatting == VF_TILED) && row == vertTiles - 1) || - ((horzFormatting == HF_TILED) && col == horzTiles - 1)) - { - finalClipper = clipper ? clipper->getIntersection(destRect) : destRect; - clippingRect = &finalClipper; - } - // not tiliing, or not on far edges, just used passed in clipper (if any). - else - { - clippingRect = clipper; - } - - // add image to the rendering cache for the target window. - srcWindow.getRenderCache().cacheImage(*d_frameImages[FIC_BACKGROUND], finalRect, base_z, colours, clippingRect, clipToDisplay); - - finalRect.d_left += imgSz.d_width; - finalRect.d_right += imgSz.d_width; - } - - finalRect.d_top += imgSz.d_height; - finalRect.d_bottom += imgSz.d_height; - } - } - - void FrameComponent::writeXMLToStream(OutStream& out_stream) const - { - // opening tag - out_stream << "" << std::endl; - // write out area - d_area.writeXMLToStream(out_stream); - - // write images - for (int i = 0; i < FIC_FRAME_IMAGE_COUNT; ++i) - { - if (d_frameImages[i]) - { - out_stream << "getImagesetName(); - out_stream << "\" image=\"" << d_frameImages[i]->getName(); - out_stream << "\" type=\"" << FalagardXMLHelper::frameImageComponentToString(static_cast(i)); - out_stream << "\" />" << std::endl; - } - } - - // get base class to write colours - writeColoursXML(out_stream); - - // write vert format, allowing base class to do this for us if a propety is in use - if (!writeVertFormatXML(out_stream)) - { - // was not a property, so write out explicit formatting in use - out_stream << "" << std::endl; - } - - // write horz format, allowing base class to do this for us if a propety is in use - if (!writeHorzFormatXML(out_stream)) - { - // was not a property, so write out explicit formatting in use - out_stream << "" << std::endl; - } - - // closing tag - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImageryComponent.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImageryComponent.cpp deleted file mode 100644 index 759658dafa..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImageryComponent.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/************************************************************************ - filename: CEGUIFalImageryComponent.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalImageryComponent.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" -#include "CEGUIImage.h" -#include "CEGUIExceptions.h" -#include "CEGUIImagesetManager.h" -#include "CEGUIImageset.h" -#include "CEGUIPropertyHelper.h" -#include - -// void draw(const Rect& dest_rect, float z, const Rect& clip_rect,const ColourRect& colours); - -// Start of CEGUI namespace section -namespace CEGUI -{ - ImageryComponent::ImageryComponent() : - d_image(0), - d_vertFormatting(VF_TOP_ALIGNED), - d_horzFormatting(HF_LEFT_ALIGNED) - {} - - const Image* ImageryComponent::getImage() const - { - return d_image; - } - - void ImageryComponent::setImage(const Image* image) - { - d_image = image; - } - - void ImageryComponent::setImage(const String& imageset, const String& image) - { - try - { - d_image = &ImagesetManager::getSingleton().getImageset(imageset)->getImage(image); - } - catch (UnknownObjectException) - { - d_image = 0; - } - } - - VerticalFormatting ImageryComponent::getVerticalFormatting() const - { - return d_vertFormatting; - } - - void ImageryComponent::setVerticalFormatting(VerticalFormatting fmt) - { - d_vertFormatting = fmt; - } - - HorizontalFormatting ImageryComponent::getHorizontalFormatting() const - { - return d_horzFormatting; - } - - void ImageryComponent::setHorizontalFormatting(HorizontalFormatting fmt) - { - d_horzFormatting = fmt; - } - - void ImageryComponent::render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - // get final image to use. - const Image* img = isImageFetchedFromProperty() ? - PropertyHelper::stringToImage(srcWindow.getProperty(d_imagePropertyName)) : - d_image; - - // do not draw anything if image is not set. - if (!img) - return; - - HorizontalFormatting horzFormatting = d_horzFormatPropertyName.empty() ? d_horzFormatting : - FalagardXMLHelper::stringToHorzFormat(srcWindow.getProperty(d_horzFormatPropertyName)); - - VerticalFormatting vertFormatting = d_vertFormatPropertyName.empty() ? d_vertFormatting : - FalagardXMLHelper::stringToVertFormat(srcWindow.getProperty(d_vertFormatPropertyName)); - - uint horzTiles, vertTiles; - float xpos, ypos; - - Size imgSz(img->getSize()); - - // calculate final colours to be used - ColourRect finalColours; - initColoursRect(srcWindow, modColours, finalColours); - - // calculate initial x co-ordinate and horizontal tile count according to formatting options - switch (horzFormatting) - { - case HF_STRETCHED: - imgSz.d_width = destRect.getWidth(); - xpos = destRect.d_left; - horzTiles = 1; - break; - - case HF_TILED: - xpos = destRect.d_left; - horzTiles = (uint)((destRect.getWidth() + (imgSz.d_width - 1)) / imgSz.d_width); - break; - - case HF_LEFT_ALIGNED: - xpos = destRect.d_left; - horzTiles = 1; - break; - - case HF_CENTRE_ALIGNED: - xpos = destRect.d_left + PixelAligned((destRect.getWidth() - imgSz.d_width) * 0.5f); - horzTiles = 1; - break; - - case HF_RIGHT_ALIGNED: - xpos = destRect.d_right - imgSz.d_width; - horzTiles = 1; - break; - - default: - throw InvalidRequestException("ImageryComponent::render - An unknown HorizontalFormatting value was specified."); - } - - // calculate initial y co-ordinate and vertical tile count according to formatting options - switch (vertFormatting) - { - case VF_STRETCHED: - imgSz.d_height = destRect.getHeight(); - ypos = destRect.d_top; - vertTiles = 1; - break; - - case VF_TILED: - ypos = destRect.d_top; - vertTiles = (uint)((destRect.getHeight() + (imgSz.d_height - 1)) / imgSz.d_height); - break; - - case VF_TOP_ALIGNED: - ypos = destRect.d_top; - vertTiles = 1; - break; - - case VF_CENTRE_ALIGNED: - ypos = destRect.d_top + PixelAligned((destRect.getHeight() - imgSz.d_height) * 0.5f); - vertTiles = 1; - break; - - case VF_BOTTOM_ALIGNED: - ypos = destRect.d_bottom - imgSz.d_height; - vertTiles = 1; - break; - - default: - throw InvalidRequestException("ImageryComponent::render - An unknown VerticalFormatting value was specified."); - } - - // perform final rendering (actually is now a caching of the images which will be drawn) - Rect finalRect; - Rect finalClipper; - const Rect* clippingRect; - finalRect.d_top = ypos; - finalRect.d_bottom = ypos + imgSz.d_height; - - for (uint row = 0; row < vertTiles; ++row) - { - finalRect.d_left = xpos; - finalRect.d_right = xpos + imgSz.d_width; - - for (uint col = 0; col < horzTiles; ++col) - { - // use custom clipping for right and bottom edges when tiling the imagery - if (((vertFormatting == VF_TILED) && row == vertTiles - 1) || - ((horzFormatting == HF_TILED) && col == horzTiles - 1)) - { - finalClipper = clipper ? clipper->getIntersection(destRect) : destRect; - clippingRect = &finalClipper; - } - // not tiliing, or not on far edges, just used passed in clipper (if any). - else - { - clippingRect = clipper; - } - - // add image to the rendering cache for the target window. - srcWindow.getRenderCache().cacheImage(*img, finalRect, base_z, finalColours, clippingRect, clipToDisplay); - - finalRect.d_left += imgSz.d_width; - finalRect.d_right += imgSz.d_width; - } - - finalRect.d_top += imgSz.d_height; - finalRect.d_bottom += imgSz.d_height; - } - } - - void ImageryComponent::writeXMLToStream(OutStream& out_stream) const - { - // opening tag - out_stream << "" << std::endl; - // write out area - d_area.writeXMLToStream(out_stream); - - // write image - if (isImageFetchedFromProperty()) - out_stream << "" << std::endl; - else - out_stream << "getImagesetName() << "\" image=\"" << d_image->getName() << "\" />" << std::endl; - - // get base class to write colours - writeColoursXML(out_stream); - - // write vert format, allowing base class to do this for us if a propety is in use - if (!writeVertFormatXML(out_stream)) - { - // was not a property, so write out explicit formatting in use - out_stream << "" << std::endl; - } - - // write horz format, allowing base class to do this for us if a propety is in use - if (!writeHorzFormatXML(out_stream)) - { - // was not a property, so write out explicit formatting in use - out_stream << "" << std::endl; - } - - // closing tag - out_stream << "" << std::endl; - } - - bool ImageryComponent::isImageFetchedFromProperty() const - { - return !d_imagePropertyName.empty(); - } - - const String& ImageryComponent::getImagePropertySource() const - { - return d_imagePropertyName; - } - - void ImageryComponent::setImagePropertySource(const String& property) - { - d_imagePropertyName = property; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImagerySection.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImagerySection.cpp deleted file mode 100644 index be64268e70..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalImagerySection.cpp +++ /dev/null @@ -1,305 +0,0 @@ -/************************************************************************ - filename: CEGUIFalImagerySection.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalImagerySection.h" -#include "CEGUIPropertyHelper.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - ImagerySection::ImagerySection() : - d_masterColours(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), - d_colourProperyIsRect(false) - {} - - ImagerySection::ImagerySection(const String& name) : - d_name(name), - d_masterColours(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), - d_colourProperyIsRect(false) - {} - - void ImagerySection::render(Window& srcWindow, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - // decide what to do as far as colours go - ColourRect finalCols; - initMasterColourRect(srcWindow, finalCols); - - if (modColours) - finalCols *= *modColours; - - ColourRect* finalColsPtr = (finalCols.isMonochromatic() && finalCols.d_top_left.getARGB() == 0xFFFFFFFF) ? 0 : &finalCols; - - // render all frame components in this section - for(FrameList::const_iterator frame = d_frames.begin(); frame != d_frames.end(); ++frame) - { - (*frame).render(srcWindow, base_z, finalColsPtr, clipper, clipToDisplay); - } - // render all image components in this section - for(ImageryList::const_iterator image = d_images.begin(); image != d_images.end(); ++image) - { - (*image).render(srcWindow, base_z, finalColsPtr, clipper, clipToDisplay); - } - // render all text components in this section - for(TextList::const_iterator text = d_texts.begin(); text != d_texts.end(); ++text) - { - (*text).render(srcWindow, base_z, finalColsPtr, clipper, clipToDisplay); - } - } - - void ImagerySection::render(Window& srcWindow, const Rect& baseRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - // decide what to do as far as colours go - ColourRect finalCols; - initMasterColourRect(srcWindow, finalCols); - - if (modColours) - finalCols *= *modColours; - - ColourRect* finalColsPtr = (finalCols.isMonochromatic() && finalCols.d_top_left.getARGB() == 0xFFFFFFFF) ? 0 : &finalCols; - - // render all frame components in this section - for(FrameList::const_iterator frame = d_frames.begin(); frame != d_frames.end(); ++frame) - { - (*frame).render(srcWindow, baseRect, base_z, finalColsPtr, clipper, clipToDisplay); - } - // render all image components in this section - for(ImageryList::const_iterator image = d_images.begin(); image != d_images.end(); ++image) - { - (*image).render(srcWindow, baseRect, base_z, finalColsPtr, clipper, clipToDisplay); - } - // render all text components in this section - for(TextList::const_iterator text = d_texts.begin(); text != d_texts.end(); ++text) - { - (*text).render(srcWindow, baseRect, base_z, finalColsPtr, clipper, clipToDisplay); - } - } - - void ImagerySection::addImageryComponent(const ImageryComponent& img) - { - d_images.push_back(img); - } - - void ImagerySection::clearImageryComponents() - { - d_images.clear(); - } - - void ImagerySection::addTextComponent(const TextComponent& text) - { - d_texts.push_back(text); - } - - void ImagerySection::clearTextComponents() - { - d_texts.clear(); - } - - void ImagerySection::clearFrameComponents() - { - d_frames.clear(); - } - - void ImagerySection::addFrameComponent(const FrameComponent& frame) - { - d_frames.push_back(frame); - } - - const ColourRect& ImagerySection::getMasterColours() const - { - return d_masterColours; - } - - void ImagerySection::setMasterColours(const ColourRect& cols) - { - d_masterColours = cols; - } - - const String& ImagerySection::getName() const - { - return d_name; - } - - void ImagerySection::setMasterColoursPropertySource(const String& property) - { - d_colourPropertyName = property; - } - - void ImagerySection::setMasterColoursPropertyIsColourRect(bool setting) - { - d_colourProperyIsRect = setting; - } - - void ImagerySection::initMasterColourRect(const Window& wnd, ColourRect& cr) const - { - // if colours come via a colour property - if (!d_colourPropertyName.empty()) - { - // if property accesses a ColourRect - if (d_colourProperyIsRect) - { - cr = PropertyHelper::stringToColourRect(wnd.getProperty(d_colourPropertyName)); - } - // property accesses a colour - else - { - colour val(PropertyHelper::stringToColour(wnd.getProperty(d_colourPropertyName))); - cr.d_top_left = val; - cr.d_top_right = val; - cr.d_bottom_left = val; - cr.d_bottom_right = val; - } - } - // use explicit ColourRect. - else - { - cr = d_masterColours; - } - } - - Rect ImagerySection::getBoundingRect(const Window& wnd) const - { - Rect compRect; - Rect bounds(0, 0, 0, 0); - - // measure all frame components - for(FrameList::const_iterator frame = d_frames.begin(); frame != d_frames.end(); ++frame) - { - compRect = (*frame).getComponentArea().getPixelRect(wnd); - - bounds.d_left = ceguimin(bounds.d_left, compRect.d_left); - bounds.d_top = ceguimin(bounds.d_top, compRect.d_top); - bounds.d_right = ceguimax(bounds.d_right, compRect.d_right); - bounds.d_bottom = ceguimax(bounds.d_bottom, compRect.d_bottom); - } - // measure all imagery components - for(ImageryList::const_iterator image = d_images.begin(); image != d_images.end(); ++image) - { - compRect = (*image).getComponentArea().getPixelRect(wnd); - - bounds.d_left = ceguimin(bounds.d_left, compRect.d_left); - bounds.d_top = ceguimin(bounds.d_top, compRect.d_top); - bounds.d_right = ceguimax(bounds.d_right, compRect.d_right); - bounds.d_bottom = ceguimax(bounds.d_bottom, compRect.d_bottom); - } - // measure all text components - for(TextList::const_iterator text = d_texts.begin(); text != d_texts.end(); ++text) - { - compRect = (*text).getComponentArea().getPixelRect(wnd); - - bounds.d_left = ceguimin(bounds.d_left, compRect.d_left); - bounds.d_top = ceguimin(bounds.d_top, compRect.d_top); - bounds.d_right = ceguimax(bounds.d_right, compRect.d_right); - bounds.d_bottom = ceguimax(bounds.d_bottom, compRect.d_bottom); - } - - return bounds; - } - - Rect ImagerySection::getBoundingRect(const Window& wnd, const Rect& rect) const - { - Rect compRect; - Rect bounds(0, 0, 0, 0); - - // measure all frame components - for(FrameList::const_iterator frame = d_frames.begin(); frame != d_frames.end(); ++frame) - { - compRect = (*frame).getComponentArea().getPixelRect(wnd, rect); - - bounds.d_left = ceguimin(bounds.d_left, compRect.d_left); - bounds.d_top = ceguimin(bounds.d_top, compRect.d_top); - bounds.d_right = ceguimax(bounds.d_right, compRect.d_right); - bounds.d_bottom = ceguimax(bounds.d_bottom, compRect.d_bottom); - } - // measure all imagery components - for(ImageryList::const_iterator image = d_images.begin(); image != d_images.end(); ++image) - { - compRect = (*image).getComponentArea().getPixelRect(wnd, rect); - - bounds.d_left = ceguimin(bounds.d_left, compRect.d_left); - bounds.d_top = ceguimin(bounds.d_top, compRect.d_top); - bounds.d_right = ceguimax(bounds.d_right, compRect.d_right); - bounds.d_bottom = ceguimax(bounds.d_bottom, compRect.d_bottom); - } - // measure all text components - for(TextList::const_iterator text = d_texts.begin(); text != d_texts.end(); ++text) - { - compRect = (*text).getComponentArea().getPixelRect(wnd, rect); - - bounds.d_left = ceguimin(bounds.d_left, compRect.d_left); - bounds.d_top = ceguimin(bounds.d_top, compRect.d_top); - bounds.d_right = ceguimax(bounds.d_right, compRect.d_right); - bounds.d_bottom = ceguimax(bounds.d_bottom, compRect.d_bottom); - } - - return bounds; - } - - void ImagerySection::writeXMLToStream(OutStream& out_stream) const - { - // output opening tag - out_stream << "" << std::endl; - - // output modulative colours for this section - if (!d_colourPropertyName.empty()) - { - if (d_colourProperyIsRect) - out_stream << "" << std::endl; - } - else if (!d_masterColours.isMonochromatic() || d_masterColours.d_top_left != colour(1,1,1,1)) - { - out_stream << "" << std::endl; - } - - // output all frame components. - for(FrameList::const_iterator frame = d_frames.begin(); frame != d_frames.end(); ++frame) - { - (*frame).writeXMLToStream(out_stream); - } - - // output all imagery components - for(ImageryList::const_iterator image = d_images.begin(); image != d_images.end(); ++image) - { - (*image).writeXMLToStream(out_stream); - } - - // output all text components - for(TextList::const_iterator text = d_texts.begin(); text != d_texts.end(); ++text) - { - (*text).writeXMLToStream(out_stream); - } - - // output closing tag - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalLayerSpecification.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalLayerSpecification.cpp deleted file mode 100644 index f95ef28960..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalLayerSpecification.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************************************ - filename: CEGUIFalLayerSpecification.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalLayerSpecification.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - LayerSpecification::LayerSpecification(uint priority) : - d_layerPriority(priority) - {} - - void LayerSpecification::render(Window& srcWindow, float base_z, const ColourRect* modcols, const Rect* clipper, bool clipToDisplay) const - { - // render all sections in this layer - for(SectionList::const_iterator curr = d_sections.begin(); curr != d_sections.end(); ++curr) - { - (*curr).render(srcWindow, base_z, modcols, clipper, clipToDisplay); - } - } - - void LayerSpecification::render(Window& srcWindow, const Rect& baseRect, float base_z, const ColourRect* modcols, const Rect* clipper, bool clipToDisplay) const - { - // render all sections in this layer - for(SectionList::const_iterator curr = d_sections.begin(); curr != d_sections.end(); ++curr) - { - (*curr).render(srcWindow, baseRect, base_z, modcols, clipper, clipToDisplay); - } - } - - void LayerSpecification::addSectionSpecification(const SectionSpecification& section) - { - d_sections.push_back(section); - } - - void LayerSpecification::clearSectionSpecifications() - { - d_sections.clear(); - } - - uint LayerSpecification::getLayerPriority() const - { - return d_layerPriority; - } - - bool LayerSpecification::operator<(const LayerSpecification& other) const - { - return d_layerPriority < other.d_layerPriority; - } - - void LayerSpecification::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - - // ouput all sections in this layer - for(SectionList::const_iterator curr = d_sections.begin(); curr != d_sections.end(); ++curr) - { - (*curr).writeXMLToStream(out_stream); - } - - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalNamedArea.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalNamedArea.cpp deleted file mode 100644 index c1d8e7a5d4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalNamedArea.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/************************************************************************ - filename: CEGUIFalNamedArea.cpp - created: Sun Jun 26 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalNamedArea.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - NamedArea::NamedArea(const String& name) : - d_name(name) - { - } - - const String& NamedArea::getName() const - { - return d_name; - } - - const ComponentArea& NamedArea::getArea() const - { - return d_area; - } - - void NamedArea::setArea(const ComponentArea& area) - { - d_area = area; - } - - void NamedArea::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - d_area.writeXMLToStream(out_stream); - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyDefinition.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyDefinition.cpp deleted file mode 100644 index 05614068d4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyDefinition.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/************************************************************************ - filename: CEGUIFalPropertyDefinition.cpp - created: Sun Jun 26 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalPropertyDefinition.h" -#include "CEGUIWindow.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - PropertyDefinition::PropertyDefinition(const String& name, const String& initialValue, bool redrawOnWrite, bool layoutOnWrite) : - Property(name, "Falagard custom property definition - gets/sets a named user string.", initialValue), - d_userStringName(name + "_fal_auto_prop__"), - d_writeCausesRedraw(redrawOnWrite), - d_writeCausesLayout(layoutOnWrite) - { - } - - // abstract members from Property - String PropertyDefinition::get(const PropertyReceiver* receiver) const - { - return static_cast(receiver)->getUserString(d_userStringName); - } - - void PropertyDefinition::set(PropertyReceiver* receiver, const String& value) - { - static_cast(receiver)->setUserString(d_userStringName, value); - - if (d_writeCausesLayout) - static_cast(receiver)->performChildWindowLayout(); - - if (d_writeCausesRedraw) - static_cast(receiver)->requestRedraw(); - } - - void PropertyDefinition::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyInitialiser.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyInitialiser.cpp deleted file mode 100644 index 0ad9f1a299..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalPropertyInitialiser.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************ - filename: CEGUIFalPropertyInitialiser.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalPropertyInitialiser.h" -#include "CEGUIExceptions.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - PropertyInitialiser::PropertyInitialiser(const String& property, const String& value) : - d_propertyName(property), - d_propertyValue(value) - {} - - void PropertyInitialiser::apply(CEGUI::PropertySet& target) const - { - try - { - target.setProperty(d_propertyName, d_propertyValue); - } - // allow 'missing' properties - catch (UnknownObjectException) - {} - } - - const String& PropertyInitialiser::getTargetPropertyName() const - { - return d_propertyName; - } - - const String& PropertyInitialiser::getInitialiserValue() const - { - return d_propertyValue; - } - - void PropertyInitialiser::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalSectionSpecification.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalSectionSpecification.cpp deleted file mode 100644 index 86ffcb86fc..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalSectionSpecification.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/************************************************************************ - filename: CEGUIFalSectionSpecification.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalSectionSpecification.h" -#include "falagard/CEGUIFalImagerySection.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "CEGUIExceptions.h" -#include "CEGUIPropertyHelper.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - SectionSpecification::SectionSpecification(const String& owner, const String& sectionName) : - d_owner(owner), - d_sectionName(sectionName), - d_usingColourOverride(false), - d_colourProperyIsRect(false) - {} - - SectionSpecification::SectionSpecification(const String& owner, const String& sectionName, const ColourRect& cols) : - d_owner(owner), - d_sectionName(sectionName), - d_coloursOverride(cols), - d_usingColourOverride(true), - d_colourProperyIsRect(false) - {} - - void SectionSpecification::render(Window& srcWindow, float base_z, const ColourRect* modcols, const Rect* clipper, bool clipToDisplay) const - { - try - { - // get the imagery section object with the name we're set up to use - const ImagerySection* sect = - &WidgetLookManager::getSingleton().getWidgetLook(d_owner).getImagerySection(d_sectionName); - - // decide what colours are to be used - ColourRect finalColours; - initColourRectForOverride(srcWindow, finalColours); - finalColours.modulateAlpha(srcWindow.getEffectiveAlpha()); - - if (modcols) - finalColours *= *modcols; - - // render the imagery section - sect->render(srcWindow, base_z, &finalColours, clipper, clipToDisplay); - } - // do nothing here, errors are non-faltal and are logged for debugging purposes. - catch (Exception) - {} - } - - void SectionSpecification::render(Window& srcWindow, const Rect& baseRect, float base_z, const ColourRect* modcols, const Rect* clipper, bool clipToDisplay) const - { - try - { - // get the imagery section object with the name we're set up to use - const ImagerySection* sect = - &WidgetLookManager::getSingleton().getWidgetLook(d_owner).getImagerySection(d_sectionName); - - // decide what colours are to be used - ColourRect finalColours; - initColourRectForOverride(srcWindow, finalColours); - finalColours.modulateAlpha(srcWindow.getEffectiveAlpha()); - - if (modcols) - finalColours *= *modcols; - - // render the imagery section - sect->render(srcWindow, baseRect, base_z, &finalColours, clipper, clipToDisplay); - } - // do nothing here, errors are non-faltal and are logged for debugging purposes. - catch (Exception) - {} - } - - const String& SectionSpecification::getOwnerWidgetLookFeel() const - { - return d_owner; - } - - const String& SectionSpecification::getSectionName() const - { - return d_sectionName; - } - - const ColourRect& SectionSpecification::getOverrideColours() const - { - return d_coloursOverride; - } - - void SectionSpecification::setOverrideColours(const ColourRect& cols) - { - d_coloursOverride = cols; - } - - bool SectionSpecification::isUsingOverrideColours() const - { - return d_usingColourOverride; - } - - void SectionSpecification::setUsingOverrideColours(bool setting) - { - d_usingColourOverride = setting; - } - - void SectionSpecification::setOverrideColoursPropertySource(const String& property) - { - d_colourPropertyName = property; - } - - void SectionSpecification::initColourRectForOverride(const Window& wnd, ColourRect& cr) const - { - // if no override set - if (!d_usingColourOverride) - { - colour val(1,1,1,1); - cr.d_top_left = val; - cr.d_top_right = val; - cr.d_bottom_left = val; - cr.d_bottom_right = val; - } - // if override comes via a colour property - else if (!d_colourPropertyName.empty()) - { - // if property accesses a ColourRect - if (d_colourProperyIsRect) - { - cr = PropertyHelper::stringToColourRect(wnd.getProperty(d_colourPropertyName)); - } - // property accesses a colour - else - { - colour val(PropertyHelper::stringToColour(wnd.getProperty(d_colourPropertyName))); - cr.d_top_left = val; - cr.d_top_right = val; - cr.d_bottom_left = val; - cr.d_bottom_right = val; - } - } - // override is an explicitly defined ColourRect. - else - { - cr = d_coloursOverride; - } - } - - void SectionSpecification::setOverrideColoursPropertyIsColourRect(bool setting) - { - d_colourProperyIsRect = setting; - } - - void SectionSpecification::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "

    " << std::endl; - - // output modulative colours for this section - if (!d_colourPropertyName.empty()) - { - if (d_colourProperyIsRect) - out_stream << "" << std::endl; - } - else if (!d_coloursOverride.isMonochromatic() || d_coloursOverride.d_top_left != colour(1,1,1,1)) - { - out_stream << "" << std::endl; - } - - // output closing section tag - out_stream << "
    " << std::endl; - } - else - { - // no sub elements, just terminate opening tag - out_stream << " />" << std::endl; - } - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalStateImagery.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalStateImagery.cpp deleted file mode 100644 index 7f4cf7eb41..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalStateImagery.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/************************************************************************ - filename: CEGUIFalStateImagery.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalStateImagery.h" -#include "CEGUISystem.h" -#include "CEGUIRenderer.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - StateImagery::StateImagery(const String& name) : - d_stateName(name), - d_clipToDisplay(false) - {} - - void StateImagery::render(Window& srcWindow, const ColourRect* modcols, const Rect* clipper) const - { - float base_z; - - // render all layers defined for this state - for(LayersList::const_iterator curr = d_layers.begin(); curr != d_layers.end(); ++curr) - { - // TODO: Magic number removal - base_z = -0.0000001f * static_cast((*curr).getLayerPriority()); - (*curr).render(srcWindow, base_z, modcols, clipper, d_clipToDisplay); - } - } - - void StateImagery::render(Window& srcWindow, const Rect& baseRect, const ColourRect* modcols, const Rect* clipper) const - { - float base_z; - - // render all layers defined for this state - for(LayersList::const_iterator curr = d_layers.begin(); curr != d_layers.end(); ++curr) - { - // TODO: Magic number removal - base_z = -0.0000001f * static_cast((*curr).getLayerPriority()); - (*curr).render(srcWindow, baseRect, base_z, modcols, clipper, d_clipToDisplay); - } - } - - void StateImagery::addLayer(const LayerSpecification& layer) - { - d_layers.insert(layer); - } - - void StateImagery::clearLayers() - { - d_layers.clear(); - } - - const String& StateImagery::getName() const - { - return d_stateName; - } - - bool StateImagery::isClippedToDisplay() const - { - return d_clipToDisplay; - } - - void StateImagery::setClippedToDisplay(bool setting) - { - d_clipToDisplay = setting; - } - - void StateImagery::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - } - else - { - out_stream << ">" << std::endl; - - // output all layers defined for this state - for(LayersList::const_iterator curr = d_layers.begin(); curr != d_layers.end(); ++curr) - (*curr).writeXMLToStream(out_stream); - - // write closing tag - out_stream << "" << std::endl; - } - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalTextComponent.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalTextComponent.cpp deleted file mode 100644 index 938713d0cc..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalTextComponent.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/************************************************************************ - filename: CEGUIFalTextComponent.cpp - created: Sun Jun 19 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalTextComponent.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" -#include "CEGUIFontManager.h" -#include "CEGUIExceptions.h" -#include "CEGUIPropertyHelper.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - TextComponent::TextComponent() : - d_vertFormatting(VTF_TOP_ALIGNED), - d_horzFormatting(HTF_LEFT_ALIGNED) - {} - - const String& TextComponent::getText() const - { - return d_text; - } - - void TextComponent::setText(const String& text) - { - d_text = text; - } - - const String& TextComponent::getFont() const - { - return d_font; - } - - void TextComponent::setFont(const String& font) - { - d_font = font; - } - - VerticalTextFormatting TextComponent::getVerticalFormatting() const - { - return d_vertFormatting; - } - - void TextComponent::setVerticalFormatting(VerticalTextFormatting fmt) - { - d_vertFormatting = fmt; - } - - HorizontalTextFormatting TextComponent::getHorizontalFormatting() const - { - return d_horzFormatting; - } - - void TextComponent::setHorizontalFormatting(HorizontalTextFormatting fmt) - { - d_horzFormatting = fmt; - } - - void TextComponent::render_impl(Window& srcWindow, Rect& destRect, float base_z, const CEGUI::ColourRect* modColours, const Rect* clipper, bool clipToDisplay) const - { - // get font to use - const Font* font; - - try - { - font = d_font.empty() ? srcWindow.getFont() : FontManager::getSingleton().getFont(d_font); - } - catch (UnknownObjectException) - { - font = 0; - } - - // exit if we have no font to use. - if (!font) - return; - - HorizontalTextFormatting horzFormatting = d_horzFormatPropertyName.empty() ? d_horzFormatting : - FalagardXMLHelper::stringToHorzTextFormat(srcWindow.getProperty(d_horzFormatPropertyName)); - - VerticalTextFormatting vertFormatting = d_vertFormatPropertyName.empty() ? d_vertFormatting : - FalagardXMLHelper::stringToVertTextFormat(srcWindow.getProperty(d_vertFormatPropertyName)); - - // calculate final colours to be used - ColourRect finalColours; - initColoursRect(srcWindow, modColours, finalColours); - - // decide which string to render. - const String& renderString = d_text.empty() ? srcWindow.getText(true) : d_text; - - // calculate height of formatted text - float textHeight = font->getFormattedLineCount(renderString, destRect, (TextFormatting)horzFormatting) * font->getLineSpacing(); - - // handle dest area adjustments for vertical formatting. - switch(vertFormatting) - { - case VTF_CENTRE_ALIGNED: - destRect.d_top += (destRect.getHeight() - textHeight) * 0.5f; - break; - - case VTF_BOTTOM_ALIGNED: - destRect.d_top = destRect.d_bottom - textHeight; - break; - - default: - // default is VTF_TOP_ALIGNED, for which we take no action. - break; - } - - // add text to the rendering cache for the target window. - srcWindow.getRenderCache().cacheText(renderString, font, (TextFormatting)horzFormatting, destRect, base_z, finalColours, clipper, clipToDisplay); - } - - void TextComponent::writeXMLToStream(OutStream& out_stream) const - { - // opening tag - out_stream << "" << std::endl; - // write out area - d_area.writeXMLToStream(out_stream); - - // write text element - out_stream << "" << std::endl; - - // get base class to write colours - writeColoursXML(out_stream); - - // write vert format, allowing base class to do this for us if a propety is in use - if (!writeVertFormatXML(out_stream)) - { - // was not a property, so write out explicit formatting in use - out_stream << "" << std::endl; - } - - // write horz format, allowing base class to do this for us if a propety is in use - if (!writeHorzFormatXML(out_stream)) - { - // was not a property, so write out explicit formatting in use - out_stream << "" << std::endl; - } - - // closing tag - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetComponent.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetComponent.cpp deleted file mode 100644 index 30c12161d2..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetComponent.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/************************************************************************ - filename: CEGUIFalWidgetComponent.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalWidgetComponent.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" -#include "CEGUIWindowManager.h" -#include "CEGUIExceptions.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - WidgetComponent::WidgetComponent(const String& type, const String& look, const String& suffix) : - d_baseType(type), - d_imageryName(look), - d_nameSuffix(suffix), - d_vertAlign(VA_TOP), - d_horzAlign(HA_LEFT) - {} - - void WidgetComponent::create(Window& parent) const - { - // build final name and create widget. - String widgetName = parent.getName() + d_nameSuffix; - Window* widget = WindowManager::getSingleton().createWindow(d_baseType, widgetName); - - // set the widget look - if (!d_imageryName.empty()) - widget->setLookNFeel("", d_imageryName); - - // add the new widget to its parent - parent.addChildWindow(widget); - - // set alignment options - widget->setVerticalAlignment(d_vertAlign); - widget->setHorizontalAlignment(d_horzAlign); - - // TODO: We still need code to specify position and size. Due to the advanced - // TODO: possibilities, this is better handled via a 'layout' method instead of - // TODO: setting this once and forgetting about it. - - // initialise properties. This is done last so that these properties can - // override properties specified in the look assigned to the created widget. - for(PropertiesList::const_iterator curr = d_properties.begin(); curr != d_properties.end(); ++curr) - { - (*curr).apply(*widget); - } - } - - const ComponentArea& WidgetComponent::getComponentArea() const - { - return d_area; - } - - void WidgetComponent::setComponentArea(const ComponentArea& area) - { - d_area = area; - } - - const String& WidgetComponent::getBaseWidgetType() const - { - return d_baseType; - } - - void WidgetComponent::setBaseWidgetType(const String& type) - { - d_baseType = type; - } - - const String& WidgetComponent::getWidgetLookName() const - { - return d_imageryName; - } - - void WidgetComponent::setWidgetLookName(const String& look) - { - d_imageryName = look; - } - - const String& WidgetComponent::getWidgetNameSuffix() const - { - return d_nameSuffix; - } - - void WidgetComponent::setWidgetNameSuffix(const String& suffix) - { - d_nameSuffix = suffix; - } - - VerticalAlignment WidgetComponent::getVerticalWidgetAlignemnt() const - { - return d_vertAlign; - } - - void WidgetComponent::setVerticalWidgetAlignment(VerticalAlignment alignment) - { - d_vertAlign = alignment; - } - - HorizontalAlignment WidgetComponent::getHorizontalWidgetAlignemnt() const - { - return d_horzAlign; - } - - void WidgetComponent::setHorizontalWidgetAlignemnt(HorizontalAlignment alignment) - { - d_horzAlign = alignment; - } - - void WidgetComponent::addPropertyInitialiser(const PropertyInitialiser& initialiser) - { - d_properties.push_back(initialiser); - } - - void WidgetComponent::clearPropertyInitialisers() - { - d_properties.clear(); - } - - void WidgetComponent::layout(const Window& owner) const - { - try - { - WindowManager::getSingleton().getWindow(owner.getName() + d_nameSuffix)->setRect(Absolute, d_area.getPixelRect(owner)); - } - catch (UnknownObjectException) - {} - } - - void WidgetComponent::writeXMLToStream(OutStream& out_stream) const - { - // output opening tag - out_stream << "" << std::endl; - - // output target area - d_area.writeXMLToStream(out_stream); - - // output vertical alignment - out_stream << "" << std::endl; - - // output horizontal alignment - out_stream << "" << std::endl; - - //output property initialisers - for (PropertiesList::const_iterator prop = d_properties.begin(); prop != d_properties.end(); ++prop) - { - (*prop).writeXMLToStream(out_stream); - } - - // output closing tag - out_stream << "" << std::endl; - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookFeel.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookFeel.cpp deleted file mode 100644 index 3c6162c8a5..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookFeel.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/************************************************************************ - filename: CEGUIFalWidgetLookFeel.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" -#include "CEGUIWindowManager.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - WidgetLookFeel::WidgetLookFeel(const String& name) : - d_lookName(name) - {} - - const StateImagery& WidgetLookFeel::getStateImagery(const CEGUI::String& state) const - { - StateList::const_iterator imagery = d_stateImagery.find(state); - - if (imagery == d_stateImagery.end()) - { - throw UnknownObjectException("WidgetLookFeel::getStateImagery - unknown state '" + state + "' in look '" + d_lookName + "'."); - } - - return (*imagery).second; - } - - - const ImagerySection& WidgetLookFeel::getImagerySection(const CEGUI::String& section) const - { - ImageryList::const_iterator imgSect = d_imagerySections.find(section); - - if (imgSect == d_imagerySections.end()) - { - throw UnknownObjectException("WidgetLookFeel::getImagerySection - unknown imagery section '" + section + "' in look '" + d_lookName + "'."); - } - - return (*imgSect).second; - } - - - const String& WidgetLookFeel::getName() const - { - return d_lookName; - } - - void WidgetLookFeel::addImagerySection(const ImagerySection& section) - { - if (d_imagerySections.find(section.getName()) != d_imagerySections.end()) - { - Logger::getSingleton().logEvent( - "WidgetLookFeel::addImagerySection - Defintion for imagery section '" + section.getName() + "' already exists. Replacing previous definition."); - } - - d_imagerySections[section.getName()] = section; - } - - void WidgetLookFeel::addWidgetComponent(const WidgetComponent& widget) - { - d_childWidgets.push_back(widget); - } - - void WidgetLookFeel::addStateSpecification(const StateImagery& state) - { - if (d_stateImagery.find(state.getName()) != d_stateImagery.end()) - { - Logger::getSingleton().logEvent( - "WidgetLookFeel::addStateSpecification - Defintion for state '" + state.getName() + "' already exists. Replacing previous definition."); - } - - d_stateImagery[state.getName()] = state; - } - - void WidgetLookFeel::addPropertyInitialiser(const PropertyInitialiser& initialiser) - { - d_properties.push_back(initialiser); - } - - void WidgetLookFeel::clearImagerySections() - { - d_imagerySections.clear(); - } - - void WidgetLookFeel::clearWidgetComponents() - { - d_childWidgets.clear(); - } - - void WidgetLookFeel::clearStateSpecifications() - { - d_stateImagery.clear(); - } - - void WidgetLookFeel::clearPropertyInitialisers() - { - d_properties.clear(); - } - - void WidgetLookFeel::initialiseWidget(Window& widget) const - { - // add new property definitions first - for(PropertyDefinitionList::iterator propdef = d_propertyDefinitions.begin(); propdef != d_propertyDefinitions.end(); ++propdef) - { - // add the property to the window - widget.addProperty(&(*propdef)); - // write default value to get things set up properly - widget.setProperty((*propdef).getName(), (*propdef).getDefault(&widget)); - } - - // apply properties to the parent window - for(PropertyList::const_iterator prop = d_properties.begin(); prop != d_properties.end(); ++prop) - { - (*prop).apply(widget); - } - - // add required child widgets - for(WidgetList::const_iterator curr = d_childWidgets.begin(); curr != d_childWidgets.end(); ++curr) - { - (*curr).create(widget); - } - } - - bool WidgetLookFeel::isStateImageryPresent(const String& state) const - { - return d_stateImagery.find(state) != d_stateImagery.end(); - } - - void WidgetLookFeel::addNamedArea(const NamedArea& area) - { - if (d_namedAreas.find(area.getName()) != d_namedAreas.end()) - { - Logger::getSingleton().logEvent( - "WidgetLookFeel::addNamedArea - Defintion for area '" + area.getName() + "' already exists. Replacing previous definition."); - } - - d_namedAreas[area.getName()] = area; - } - - void WidgetLookFeel::clearNamedAreas() - { - d_namedAreas.clear(); - } - - const NamedArea& WidgetLookFeel::getNamedArea(const String& name) const - { - NamedAreaList::const_iterator area = d_namedAreas.find(name); - - if (area == d_namedAreas.end()) - { - throw UnknownObjectException("WidgetLookFeel::getNamedArea - unknown named area: '" + name + "' in look '" + d_lookName + "'."); - } - - return (*area).second; - } - - bool WidgetLookFeel::isNamedAreaDefined(const String& name) const - { - return d_namedAreas.find(name) != d_namedAreas.end(); - } - - void WidgetLookFeel::layoutChildWidgets(const Window& owner) const - { - // apply properties to the parent window - for(WidgetList::const_iterator wdgt = d_childWidgets.begin(); wdgt != d_childWidgets.end(); ++wdgt) - { - (*wdgt).layout(owner); - } - } - - void WidgetLookFeel::addPropertyDefinition(const PropertyDefinition& propdef) - { - d_propertyDefinitions.push_back(propdef); - } - - void WidgetLookFeel::clearPropertyDefinitions() - { - d_propertyDefinitions.clear(); - } - - void WidgetLookFeel::writeXMLToStream(OutStream& out_stream) const - { - out_stream << "" << std::endl; - - // These sub-scobes of the loops avoid the "'curr'-already-initialized" compile error on VC6++ - { - // output property definitions - for (PropertyDefinitionList::const_iterator curr = d_propertyDefinitions.begin(); curr != d_propertyDefinitions.end(); ++curr) - (*curr).writeXMLToStream(out_stream); - } - - { - // output property initialisers. - for (PropertyList::const_iterator curr = d_properties.begin(); curr != d_properties.end(); ++curr) - (*curr).writeXMLToStream(out_stream); - } - - { - // output named areas - for (NamedAreaList::const_iterator curr = d_namedAreas.begin(); curr != d_namedAreas.end(); ++curr) - (*curr).second.writeXMLToStream(out_stream); - } - - { - // output child widgets - for (WidgetList::const_iterator curr = d_childWidgets.begin(); curr != d_childWidgets.end(); ++curr) - (*curr).writeXMLToStream(out_stream); - } - - { - // output imagery sections - for (ImageryList::const_iterator curr = d_imagerySections.begin(); curr != d_imagerySections.end(); ++curr) - (*curr).second.writeXMLToStream(out_stream); - } - - { - // output states - for (StateList::const_iterator curr = d_stateImagery.begin(); curr != d_stateImagery.end(); ++curr) - (*curr).second.writeXMLToStream(out_stream); - } - - out_stream << "" << std::endl; - } - - void WidgetLookFeel::renameChildren(const Window& widget, const String& newBaseName) const - { - WindowManager& winMgr = WindowManager::getSingleton(); - - for(WidgetList::const_iterator curr = d_childWidgets.begin(); curr != d_childWidgets.end(); ++curr) - winMgr.renameWindow(widget.getName() + (*curr).getWidgetNameSuffix(), - newBaseName + (*curr).getWidgetNameSuffix()); - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookManager.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookManager.cpp deleted file mode 100644 index 5634bb0466..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalWidgetLookManager.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/************************************************************************ - filename: CEGUIFalWidgetLookManager.cpp - created: Mon Jun 13 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalagard_xmlHandler.h" -#include "CEGUIResourceProvider.h" -#include "CEGUIXMLParser.h" -#include "CEGUIExceptions.h" -#include "CEGUILogger.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - //////////////////////////////////////////////////////////////////////////////// - // Static data definitions. - template<> WidgetLookManager* Singleton::ms_Singleton = 0; - const String WidgetLookManager::FalagardSchemaName("Falagard.xsd"); - //////////////////////////////////////////////////////////////////////////////// - - WidgetLookManager::WidgetLookManager() - { - Logger::getSingleton().logEvent("CEGUI::WidgetLookManager singleton created."); - } - - WidgetLookManager::~ WidgetLookManager() - { - Logger::getSingleton().logEvent("CEGUI::WidgetLookManager singleton destroyed."); - } - - /************************************************************************* - Return singleton object - *************************************************************************/ - WidgetLookManager& WidgetLookManager::getSingleton(void) - { - return Singleton::getSingleton(); - } - - /************************************************************************* - Return singleton pointer - *************************************************************************/ - WidgetLookManager* WidgetLookManager::getSingletonPtr(void) - { - return Singleton::getSingletonPtr(); - } - - void WidgetLookManager::parseLookNFeelSpecification(const String& filename, const String& resourceGroup) - { - // valid filenames are required! - if (filename.empty()) - { - throw InvalidRequestException("WidgetLookManager::parseLookNFeelSpecification - Filename supplied for look & feel file must be valid"); - } - - // create handler object - Falagard_xmlHandler handler(this); - - // perform parse of XML data - try - { - System::getSingleton().getXMLParser()->parseXMLFile(handler, filename, FalagardSchemaName, resourceGroup); - } - catch(...) - { - Logger::getSingleton().logEvent("WidgetLookManager::parseLookNFeelSpecification - loading of look and feel data from file '" + filename +"' has failed.", Errors); - throw; - } - } - - bool WidgetLookManager::isWidgetLookAvailable(const String& widget) const - { - return d_widgetLooks.find(widget) != d_widgetLooks.end(); - } - - const WidgetLookFeel& WidgetLookManager::getWidgetLook(const String& widget) const - { - WidgetLookList::const_iterator wlf = d_widgetLooks.find(widget); - - if (wlf != d_widgetLooks.end()) - { - return (*wlf).second; - } - - throw UnknownObjectException("WidgetLookManager::getWidgetLook - Widget look and feel '" + widget + "' does not exist."); - } - - void WidgetLookManager::eraseWidgetLook(const String& widget) - { - WidgetLookList::iterator wlf = d_widgetLooks.find(widget); - if (wlf != d_widgetLooks.end()) - { - d_widgetLooks.erase(wlf); - } - else - { - Logger::getSingleton().logEvent( - "WidgetLookManager::eraseWidgetLook - Widget look and feel '" + widget + "' did not exist."); - } - } - - void WidgetLookManager::addWidgetLook(const WidgetLookFeel& look) - { - if (isWidgetLookAvailable(look.getName())) - { - Logger::getSingleton().logEvent( - "WidgetLookManager::addWidgetLook - Widget look and feel '" + look.getName() + "' already exists. Replacing previous definition."); - } - - d_widgetLooks[look.getName()] = look; - } - - void WidgetLookManager::writeFalagardXMLHeadToStream(OutStream& out_stream) const - { - // output xml header - out_stream << "" << std::endl; - // output root element - out_stream << "" << std::endl; - } - - void WidgetLookManager::writeFalagardXMLTailToStream(OutStream& out_stream) const - { - // close root element - out_stream << "" << std::endl; - } - - void WidgetLookManager::writeWidgetLookToStream(const String& name, OutStream& out_stream) const - { - // start of file - writeFalagardXMLHeadToStream(out_stream); - - try - { - // output the desired widget look data - getWidgetLook(name).writeXMLToStream(out_stream); - } - catch (UnknownObjectException) - { - Logger::getSingleton().logEvent("WidgetLookManager::writeWidgetLookToStream - Failed to write widget look XML data to stream.", Errors); - } - - // close the root tags to terminate the file - writeFalagardXMLTailToStream(out_stream); - } - - void WidgetLookManager::writeWidgetLookSeriesToStream(const String& prefix, OutStream& out_stream) const - { - // start of file - writeFalagardXMLHeadToStream(out_stream); - - for (WidgetLookList::const_iterator curr = d_widgetLooks.begin(); curr != d_widgetLooks.end(); ++curr) - { - if ((*curr).first.compare(0, prefix.length(), prefix) == 0) - (*curr).second.writeXMLToStream(out_stream); - } - - // close the root tags to terminate the file - writeFalagardXMLTailToStream(out_stream); - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalXMLEnumHelper.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalXMLEnumHelper.cpp deleted file mode 100644 index 1443df3288..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalXMLEnumHelper.cpp +++ /dev/null @@ -1,525 +0,0 @@ -/************************************************************************ - filename: CEGUIFalXMLEnumHelper.cpp - created: Mon Jul 18 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" - -// Start of CEGUI namespace section -namespace CEGUI -{ - VerticalFormatting FalagardXMLHelper::stringToVertFormat(const String& str) - { - if (str == "CentreAligned") - { - return VF_CENTRE_ALIGNED; - } - else if (str == "BottomAligned") - { - return VF_BOTTOM_ALIGNED; - } - else if (str == "Tiled") - { - return VF_TILED; - } - else if (str == "Stretched") - { - return VF_STRETCHED; - } - else - { - return VF_TOP_ALIGNED; - } - } - - HorizontalFormatting FalagardXMLHelper::stringToHorzFormat(const String& str) - { - if (str == "CentreAligned") - { - return HF_CENTRE_ALIGNED; - } - else if (str == "RightAligned") - { - return HF_RIGHT_ALIGNED; - } - else if (str == "Tiled") - { - return HF_TILED; - } - else if (str == "Stretched") - { - return HF_STRETCHED; - } - else - { - return HF_LEFT_ALIGNED; - } - } - - VerticalAlignment FalagardXMLHelper::stringToVertAlignment(const String& str) - { - if (str == "CentreAligned") - { - return VA_CENTRE; - } - else if (str == "BottomAligned") - { - return VA_BOTTOM; - } - else - { - return VA_TOP; - } - } - - HorizontalAlignment FalagardXMLHelper::stringToHorzAlignment(const String& str) - { - if (str == "CentreAligned") - { - return HA_CENTRE; - } - else if (str == "RightAligned") - { - return HA_RIGHT; - } - else - { - return HA_LEFT; - } - } - - DimensionType FalagardXMLHelper::stringToDimensionType(const String& str) - { - if (str == "LeftEdge") - { - return DT_LEFT_EDGE; - } - else if (str == "XPosition") - { - return DT_X_POSITION; - } - else if (str == "TopEdge") - { - return DT_TOP_EDGE; - } - else if (str == "YPosition") - { - return DT_Y_POSITION; - } - else if (str == "RightEdge") - { - return DT_RIGHT_EDGE; - } - else if (str == "BottomEdge") - { - return DT_BOTTOM_EDGE; - } - else if (str == "Width") - { - return DT_WIDTH; - } - else if (str == "Height") - { - return DT_HEIGHT; - } - else if (str == "XOffset") - { - return DT_X_OFFSET; - } - else if (str == "YOffset") - { - return DT_Y_OFFSET; - } - else - { - return DT_INVALID; - } - } - - VerticalTextFormatting FalagardXMLHelper::stringToVertTextFormat(const String& str) - { - if (str == "CentreAligned") - { - return VTF_CENTRE_ALIGNED; - } - else if (str == "BottomAligned") - { - return VTF_BOTTOM_ALIGNED; - } - else - { - return VTF_TOP_ALIGNED; - } - } - - HorizontalTextFormatting FalagardXMLHelper::stringToHorzTextFormat(const String& str) - { - if (str == "CentreAligned") - { - return HTF_CENTRE_ALIGNED; - } - else if (str == "RightAligned") - { - return HTF_RIGHT_ALIGNED; - } - else if (str == "Justified") - { - return HTF_JUSTIFIED; - } - else if (str == "WordWrapLeftAligned") - { - return HTF_WORDWRAP_LEFT_ALIGNED; - } - else if (str == "WordWrapCentreAligned") - { - return HTF_WORDWRAP_CENTRE_ALIGNED; - } - else if (str == "WordWrapRightAligned") - { - return HTF_WORDWRAP_RIGHT_ALIGNED; - } - else if (str == "WordWrapJustified") - { - return HTF_WORDWRAP_JUSTIFIED; - } - else - { - return HTF_LEFT_ALIGNED; - } - } - - FontMetricType FalagardXMLHelper::stringToFontMetricType(const String& str) - { - if (str == "LineSpacing") - { - return FMT_LINE_SPACING; - } - else if (str == "Baseline") - { - return FMT_BASELINE; - } - else - { - return FMT_HORZ_EXTENT; - } - } - - DimensionOperator FalagardXMLHelper::stringToDimensionOperator(const String& str) - { - if (str == "Add") - { - return DOP_ADD; - } - else if (str == "Subtract") - { - return DOP_SUBTRACT; - } - else if (str == "Multiply") - { - return DOP_MULTIPLY; - } - else if (str == "Divide") - { - return DOP_DIVIDE; - } - else - { - return DOP_NOOP; - } - } - - FrameImageComponent FalagardXMLHelper::stringToFrameImageComponent(const String& str) - { - if (str == "TopLeftCorner") - { - return FIC_TOP_LEFT_CORNER; - } - if (str == "TopRightCorner") - { - return FIC_TOP_RIGHT_CORNER; - } - if (str == "BottomLeftCorner") - { - return FIC_BOTTOM_LEFT_CORNER; - } - if (str == "BottomRightCorner") - { - return FIC_BOTTOM_RIGHT_CORNER; - } - if (str == "LeftEdge") - { - return FIC_LEFT_EDGE; - } - if (str == "RightEdge") - { - return FIC_RIGHT_EDGE; - } - if (str == "TopEdge") - { - return FIC_TOP_EDGE; - } - if (str == "BottomEdge") - { - return FIC_BOTTOM_EDGE; - } - else - { - return FIC_BACKGROUND; - } - } - - - String FalagardXMLHelper::vertFormatToString(VerticalFormatting format) - { - switch (format) - { - case VF_BOTTOM_ALIGNED: - return String("BottomAligned"); - break; - case VF_CENTRE_ALIGNED: - return String("CentreAligned"); - break; - case VF_TILED: - return String("Tiled"); - break; - case VF_STRETCHED: - return String("Stretched"); - break; - default: - return String("TopAligned"); - break; - } - } - - String FalagardXMLHelper::horzFormatToString(HorizontalFormatting format) - { - switch (format) - { - case HF_RIGHT_ALIGNED: - return String("RightAligned"); - break; - case HF_CENTRE_ALIGNED: - return String("CentreAligned"); - break; - case HF_TILED: - return String("Tiled"); - break; - case HF_STRETCHED: - return String("Stretched"); - break; - default: - return String("LeftAligned"); - break; - } - } - - String FalagardXMLHelper::vertAlignmentToString(VerticalAlignment alignment) - { - switch (alignment) - { - case VA_BOTTOM: - return String("BottomAligned"); - break; - case VA_CENTRE: - return String("CentreAligned"); - break; - default: - return String("TopAligned"); - break; - } - } - - String FalagardXMLHelper::horzAlignmentToString(HorizontalAlignment alignment) - { - switch (alignment) - { - case HA_RIGHT: - return String("RightAligned"); - break; - case HA_CENTRE: - return String("CentreAligned"); - break; - default: - return String("LeftAligned"); - break; - } - } - - String FalagardXMLHelper::dimensionTypeToString(DimensionType dim) - { - switch (dim) - { - case DT_LEFT_EDGE: - return String("LeftEdge"); - break; - case DT_X_POSITION: - return String("XPosition"); - break; - case DT_TOP_EDGE: - return String("TopEdge"); - break; - case DT_Y_POSITION: - return String("YPosition"); - break; - case DT_RIGHT_EDGE: - return String("RightEdge"); - break; - case DT_BOTTOM_EDGE: - return String("BottomEdge"); - break; - case DT_WIDTH: - return String("Width"); - break; - case DT_HEIGHT: - return String("Height"); - break; - case DT_X_OFFSET: - return String("XOffset"); - break; - case DT_Y_OFFSET: - return String("YOffset"); - break; - default: - return String("Invalid"); - break; - } - } - - String FalagardXMLHelper::vertTextFormatToString(VerticalTextFormatting format) - { - switch (format) - { - case VTF_BOTTOM_ALIGNED: - return String("BottomAligned"); - break; - case VTF_CENTRE_ALIGNED: - return String("CentreAligned"); - break; - default: - return String("TopAligned"); - break; - } - } - - String FalagardXMLHelper::horzTextFormatToString(HorizontalTextFormatting format) - { - switch (format) - { - case HTF_RIGHT_ALIGNED: - return String("RightAligned"); - break; - case HTF_CENTRE_ALIGNED: - return String("CentreAligned"); - break; - case HTF_JUSTIFIED: - return String("Justified"); - break; - case HTF_WORDWRAP_LEFT_ALIGNED: - return String("WordWrapLeftAligned"); - break; - case HTF_WORDWRAP_RIGHT_ALIGNED: - return String("WordWrapRightAligned"); - break; - case HTF_WORDWRAP_CENTRE_ALIGNED: - return String("WordWrapCentreAligned"); - break; - case HTF_WORDWRAP_JUSTIFIED: - return String("WordWrapJustified"); - break; - default: - return String("LeftAligned"); - break; - } - } - - String FalagardXMLHelper::fontMetricTypeToString(FontMetricType metric) - { - switch (metric) - { - case FMT_BASELINE: - return String("Baseline"); - break; - case FMT_HORZ_EXTENT: - return String("HorzExtent"); - break; - default: - return String("LineSpacing"); - break; - } - } - - String FalagardXMLHelper::dimensionOperatorToString(DimensionOperator op) - { - switch (op) - { - case DOP_ADD: - return String("Add"); - break; - case DOP_SUBTRACT: - return String("Subtract"); - break; - case DOP_MULTIPLY: - return String("Multiply"); - break; - case DOP_DIVIDE: - return String("Divide"); - break; - default: - return String("Noop"); - break; - } - } - - String FalagardXMLHelper::frameImageComponentToString(FrameImageComponent imageComp) - { - switch (imageComp) - { - case FIC_TOP_LEFT_CORNER: - return String("TopLeftCorner"); - break; - case FIC_TOP_RIGHT_CORNER: - return String("TopRightCorner"); - break; - case FIC_BOTTOM_LEFT_CORNER: - return String("BottomLeftCorner"); - break; - case FIC_BOTTOM_RIGHT_CORNER: - return String("BottomRightCorner"); - break; - case FIC_LEFT_EDGE: - return String("LeftEdge"); - break; - case FIC_RIGHT_EDGE: - return String("RightEdge"); - break; - case FIC_TOP_EDGE: - return String("TopEdge"); - break; - case FIC_BOTTOM_EDGE: - return String("BottomEdge"); - break; - default: - return String("Background"); - break; - } - } -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalagard_xmlHandler.cpp b/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalagard_xmlHandler.cpp deleted file mode 100644 index c25d4a79de..0000000000 --- a/vendor/cegui-0.4.0-custom/src/falagard/CEGUIFalagard_xmlHandler.cpp +++ /dev/null @@ -1,690 +0,0 @@ -/************************************************************************ - filename: CEGUIFalagard_xmlHandler.cpp - created: Fri Jun 17 2005 - author: Paul D Turner -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "StdInc.h" -#include "falagard/CEGUIFalagard_xmlHandler.h" -#include "falagard/CEGUIFalWidgetLookManager.h" -#include "falagard/CEGUIFalWidgetLookFeel.h" -#include "falagard/CEGUIFalWidgetComponent.h" -#include "falagard/CEGUIFalTextComponent.h" -#include "falagard/CEGUIFalFrameComponent.h" -#include "falagard/CEGUIFalNamedArea.h" -#include "falagard/CEGUIFalPropertyDefinition.h" -#include "falagard/CEGUIFalXMLEnumHelper.h" -#include "CEGUIXMLAttributes.h" -#include "CEGUILogger.h" -#include - -// Start of CEGUI namespace section -namespace CEGUI -{ - //////////////////////////////////////////////////////////////////////////////// - // element names - const String Falagard_xmlHandler::FalagardElement("Falagard"); - const String Falagard_xmlHandler::WidgetLookElement("WidgetLook"); - const String Falagard_xmlHandler::ChildElement("Child"); - const String Falagard_xmlHandler::ImagerySectionElement("ImagerySection"); - const String Falagard_xmlHandler::StateImageryElement("StateImagery"); - const String Falagard_xmlHandler::LayerElement("Layer"); - const String Falagard_xmlHandler::SectionElement("Section"); - const String Falagard_xmlHandler::ImageryComponentElement("ImageryComponent"); - const String Falagard_xmlHandler::TextComponentElement("TextComponent"); - const String Falagard_xmlHandler::FrameComponentElement("FrameComponent"); - const String Falagard_xmlHandler::AreaElement("Area"); - const String Falagard_xmlHandler::ImageElement("Image"); - const String Falagard_xmlHandler::ColoursElement("Colours"); - const String Falagard_xmlHandler::VertFormatElement("VertFormat"); - const String Falagard_xmlHandler::HorzFormatElement("HorzFormat"); - const String Falagard_xmlHandler::VertAlignmentElement("VertAlignment"); - const String Falagard_xmlHandler::HorzAlignmentElement("HorzAlignment"); - const String Falagard_xmlHandler::PropertyElement("Property"); - const String Falagard_xmlHandler::DimElement("Dim"); - const String Falagard_xmlHandler::UnifiedDimElement("UnifiedDim"); - const String Falagard_xmlHandler::AbsoluteDimElement("AbsoluteDim"); - const String Falagard_xmlHandler::ImageDimElement("ImageDim"); - const String Falagard_xmlHandler::WidgetDimElement("WidgetDim"); - const String Falagard_xmlHandler::FontDimElement("FontDim"); - const String Falagard_xmlHandler::PropertyDimElement("PropertyDim"); - const String Falagard_xmlHandler::TextElement("Text"); - const String Falagard_xmlHandler::ColourPropertyElement("ColourProperty"); - const String Falagard_xmlHandler::ColourRectPropertyElement("ColourRectProperty"); - const String Falagard_xmlHandler::NamedAreaElement("NamedArea"); - const String Falagard_xmlHandler::PropertyDefinitionElement("PropertyDefinition"); - const String Falagard_xmlHandler::DimOperatorElement("DimOperator"); - const String Falagard_xmlHandler::VertFormatPropertyElement("VertFormatProperty"); - const String Falagard_xmlHandler::HorzFormatPropertyElement("HorzFormatProperty"); - const String Falagard_xmlHandler::AreaPropertyElement("AreaProperty"); - const String Falagard_xmlHandler::ImagePropertyElement("ImageProperty"); - // attribute names - const String Falagard_xmlHandler::TopLeftAttribute("topLeft"); - const String Falagard_xmlHandler::TopRightAttribute("topRight"); - const String Falagard_xmlHandler::BottomLeftAttribute("bottomLeft"); - const String Falagard_xmlHandler::BottomRightAttribute("bottomRight"); - const String Falagard_xmlHandler::ImagesetAttribute("imageset"); - const String Falagard_xmlHandler::ImageAttribute("image"); - const String Falagard_xmlHandler::TypeAttribute("type"); - const String Falagard_xmlHandler::NameAttribute("name"); - const String Falagard_xmlHandler::PriorityAttribute("priority"); - const String Falagard_xmlHandler::SectionNameAttribute("section"); - const String Falagard_xmlHandler::NameSuffixAttribute("nameSuffix"); - const String Falagard_xmlHandler::LookAttribute("look"); - const String Falagard_xmlHandler::ScaleAttribute("scale"); - const String Falagard_xmlHandler::OffsetAttribute("offset"); - const String Falagard_xmlHandler::ValueAttribute("value"); - const String Falagard_xmlHandler::DimensionAttribute("dimension"); - const String Falagard_xmlHandler::WidgetAttribute("widget"); - const String Falagard_xmlHandler::StringAttribute("string"); - const String Falagard_xmlHandler::FontAttribute("font"); - const String Falagard_xmlHandler::InitialValueAttribute("initialValue"); - const String Falagard_xmlHandler::ClippedAttribute("clipped"); - const String Falagard_xmlHandler::OperatorAttribute("op"); - const String Falagard_xmlHandler::PaddingAttribute("padding"); - const String Falagard_xmlHandler::LayoutOnWriteAttribute("layoutOnWrite"); - const String Falagard_xmlHandler::RedrawOnWriteAttribute("redrawOnWrite"); - - //////////////////////////////////////////////////////////////////////////////// - - - Falagard_xmlHandler::Falagard_xmlHandler(WidgetLookManager* mgr) : - d_manager(mgr), - d_widgetlook(0), - d_childcomponent(0), - d_imagerysection(0), - d_stateimagery(0), - d_layer(0), - d_section(0), - d_imagerycomponent(0), - d_area(0), - d_textcomponent(0), - d_namedArea(0), - d_framecomponent(0) - { - } - - Falagard_xmlHandler::~Falagard_xmlHandler() - {} - - void Falagard_xmlHandler::elementStart(const String& element, const XMLAttributes& attributes) - { - // root Falagard element - if (element == FalagardElement) - { - Logger::getSingleton().logEvent("===== Falagard 'root' element: look and feel parsing begins ====="); - } - // starting a new widget-look - else if (element == WidgetLookElement) - { - assert(d_widgetlook == 0); - d_widgetlook = new WidgetLookFeel(attributes.getValueAsString(NameAttribute)); - - Logger::getSingleton().logEvent("---> Start of definition for widget look '" + d_widgetlook->getName() + "'.", Informative); - } - // starting a component widget "Child" element - else if (element == ChildElement) - { - assert(d_childcomponent == 0); - d_childcomponent = new WidgetComponent(attributes.getValueAsString(TypeAttribute), attributes.getValueAsString(LookAttribute), attributes.getValueAsString(NameSuffixAttribute)); - - CEGUI_LOGINSANE("-----> Start of definition for child widget. Type: " + d_childcomponent->getBaseWidgetType() + " Suffix: " + d_childcomponent->getWidgetNameSuffix() + " Look: " + d_childcomponent->getWidgetLookName()); - } - else if (element == ImagerySectionElement) - { - assert(d_imagerysection == 0); - d_imagerysection = new ImagerySection(attributes.getValueAsString(NameAttribute)); - - CEGUI_LOGINSANE("-----> Start of definition for imagery section '" + d_imagerysection->getName() + "'."); - } - else if (element == StateImageryElement) - { - assert(d_stateimagery == 0); - d_stateimagery = new StateImagery(attributes.getValueAsString(NameAttribute)); - d_stateimagery->setClippedToDisplay(!attributes.getValueAsBool(ClippedAttribute, true)); - - CEGUI_LOGINSANE("-----> Start of definition for imagery for state '" + d_stateimagery->getName() + "'."); - } - else if (element == LayerElement) - { - assert(d_layer == 0); - d_layer = new LayerSpecification(attributes.getValueAsInteger(PriorityAttribute, 0)); - - CEGUI_LOGINSANE("-------> Start of definition of new imagery layer, priority: " + attributes.getValueAsString(PriorityAttribute, "0")); - } - else if (element == SectionElement) - { - assert(d_section == 0); - assert(d_widgetlook != 0); - String owner(attributes.getValueAsString(LookAttribute)); - d_section = new SectionSpecification(owner.empty() ? d_widgetlook->getName() : owner, attributes.getValueAsString(SectionNameAttribute)); - - CEGUI_LOGINSANE("---------> Layer references imagery section '" + d_section->getSectionName() + "'."); - } - else if (element == ImageryComponentElement) - { - assert(d_imagerycomponent == 0); - d_imagerycomponent = new ImageryComponent(); - - CEGUI_LOGINSANE("-------> Image component definition..."); - } - else if (element == TextComponentElement) - { - assert(d_textcomponent == 0); - d_textcomponent = new TextComponent(); - - CEGUI_LOGINSANE("-------> Text component definition..."); - } - else if (element == FrameComponentElement) - { - assert(d_framecomponent == 0); - d_framecomponent = new FrameComponent(); - - CEGUI_LOGINSANE("-------> Frame component definition..."); - } - else if (element == AreaElement) - { - assert(d_area == 0); - d_area = new ComponentArea(); - } - else if (element == ColoursElement) - { - ColourRect cols( - hexStringToARGB(attributes.getValueAsString(TopLeftAttribute)), - hexStringToARGB(attributes.getValueAsString(TopRightAttribute)), - hexStringToARGB(attributes.getValueAsString(BottomLeftAttribute)), - hexStringToARGB(attributes.getValueAsString(BottomRightAttribute)) - ); - - // need to decide what to apply colours to - if (d_framecomponent) - { - d_framecomponent->setColours(cols); - } - else if (d_imagerycomponent) - { - d_imagerycomponent->setColours(cols); - } - else if (d_textcomponent) - { - d_textcomponent->setColours(cols); - } - else if (d_imagerysection) - { - d_imagerysection->setMasterColours(cols); - } - else if (d_section) - { - d_section->setOverrideColours(cols); - d_section->setUsingOverrideColours(true); - } - } - else if ((element == ColourPropertyElement) || (element == ColourRectPropertyElement)) - { - // need to decide what to apply colours to - if (d_framecomponent) - { - d_framecomponent->setColoursPropertySource(attributes.getValueAsString(NameAttribute)); - d_framecomponent->setColoursPropertyIsColourRect(element == ColourRectPropertyElement); - } - else if (d_imagerycomponent) - { - d_imagerycomponent->setColoursPropertySource(attributes.getValueAsString(NameAttribute)); - d_imagerycomponent->setColoursPropertyIsColourRect(element == ColourRectPropertyElement); - } - else if (d_textcomponent) - { - d_textcomponent->setColoursPropertySource(attributes.getValueAsString(NameAttribute)); - d_textcomponent->setColoursPropertyIsColourRect(element == ColourRectPropertyElement); - } - else if (d_imagerysection) - { - d_imagerysection->setMasterColoursPropertySource(attributes.getValueAsString(NameAttribute)); - d_imagerysection->setMasterColoursPropertyIsColourRect(element == ColourRectPropertyElement); - } - else if (d_section) - { - d_section->setOverrideColoursPropertySource(attributes.getValueAsString(NameAttribute)); - d_section->setOverrideColoursPropertyIsColourRect(element == ColourRectPropertyElement); - d_section->setUsingOverrideColours(true); - } - } - else if (element == PropertyElement) - { - assert(d_widgetlook != 0); - PropertyInitialiser prop(attributes.getValueAsString(NameAttribute), attributes.getValueAsString(ValueAttribute)); - - if (d_childcomponent) - { - d_childcomponent->addPropertyInitialiser(prop); - CEGUI_LOGINSANE("-------> Added property initialiser for property: " + prop.getTargetPropertyName() + " with value: " + prop.getInitialiserValue()); - } - else - { - d_widgetlook->addPropertyInitialiser(prop); - CEGUI_LOGINSANE("---> Added property initialiser for property: " + prop.getTargetPropertyName() + " with value: " + prop.getInitialiserValue()); - } - - } - else if (element == VertAlignmentElement) - { - assert(d_childcomponent != 0); - d_childcomponent->setVerticalWidgetAlignment(FalagardXMLHelper::stringToVertAlignment(attributes.getValueAsString(TypeAttribute))); - } - else if (element == HorzAlignmentElement) - { - assert(d_childcomponent != 0); - d_childcomponent->setHorizontalWidgetAlignemnt(FalagardXMLHelper::stringToHorzAlignment(attributes.getValueAsString(TypeAttribute))); - } - else if (element == VertFormatElement) - { - if (d_framecomponent) - { - d_framecomponent->setBackgroundVerticalFormatting(FalagardXMLHelper::stringToVertFormat(attributes.getValueAsString(TypeAttribute))); - } - else if (d_imagerycomponent) - { - d_imagerycomponent->setVerticalFormatting(FalagardXMLHelper::stringToVertFormat(attributes.getValueAsString(TypeAttribute))); - } - else if (d_textcomponent) - { - d_textcomponent->setVerticalFormatting(FalagardXMLHelper::stringToVertTextFormat(attributes.getValueAsString(TypeAttribute))); - } - } - else if (element == HorzFormatElement) - { - if (d_framecomponent) - { - d_framecomponent->setBackgroundHorizontalFormatting(FalagardXMLHelper::stringToHorzFormat(attributes.getValueAsString(TypeAttribute))); - } - else if (d_imagerycomponent) - { - d_imagerycomponent->setHorizontalFormatting(FalagardXMLHelper::stringToHorzFormat(attributes.getValueAsString(TypeAttribute))); - } - else if (d_textcomponent) - { - d_textcomponent->setHorizontalFormatting(FalagardXMLHelper::stringToHorzTextFormat(attributes.getValueAsString(TypeAttribute))); - } - } - else if (element == ImageElement) - { - if (d_imagerycomponent) - { - d_imagerycomponent->setImage(attributes.getValueAsString(ImagesetAttribute), attributes.getValueAsString(ImageAttribute)); - CEGUI_LOGINSANE("---------> Using image: " + attributes.getValueAsString(ImageAttribute) + " from imageset: " + attributes.getValueAsString(ImagesetAttribute)); - } - else if (d_framecomponent) - { - d_framecomponent->setImage( - FalagardXMLHelper::stringToFrameImageComponent(attributes.getValueAsString(TypeAttribute)), - attributes.getValueAsString(ImagesetAttribute), - attributes.getValueAsString(ImageAttribute)); - - CEGUI_LOGINSANE("---------> Using image: " + - attributes.getValueAsString(ImageAttribute) + " from imageset: " + - attributes.getValueAsString(ImagesetAttribute) + " for: " + - attributes.getValueAsString(TypeAttribute)); - } - } - else if (element == DimElement) - { - d_dimension.setDimensionType(FalagardXMLHelper::stringToDimensionType(attributes.getValueAsString(TypeAttribute))); - } - else if (element == UnifiedDimElement) - { - UnifiedDim base(UDim(attributes.getValueAsFloat(ScaleAttribute, 0.0f), attributes.getValueAsFloat(OffsetAttribute, 0.0f)), FalagardXMLHelper::stringToDimensionType(attributes.getValueAsString(TypeAttribute))); - doBaseDimStart(&base); - } - else if (element == AbsoluteDimElement) - { - AbsoluteDim base(attributes.getValueAsFloat(ValueAttribute, 0.0f)); - doBaseDimStart(&base); - } - else if (element == ImageDimElement) - { - ImageDim base(attributes.getValueAsString(ImagesetAttribute), attributes.getValueAsString(ImageAttribute), FalagardXMLHelper::stringToDimensionType(attributes.getValueAsString(DimensionAttribute))); - doBaseDimStart(&base); - } - else if (element == WidgetDimElement) - { - WidgetDim base(attributes.getValueAsString(WidgetAttribute), FalagardXMLHelper::stringToDimensionType(attributes.getValueAsString(DimensionAttribute))); - doBaseDimStart(&base); - } - else if (element == FontDimElement) - { - FontDim base( - attributes.getValueAsString(WidgetAttribute), - attributes.getValueAsString(FontAttribute), - attributes.getValueAsString(StringAttribute), - FalagardXMLHelper::stringToFontMetricType(attributes.getValueAsString(TypeAttribute)), - attributes.getValueAsFloat(PaddingAttribute, 0.0f)); - - doBaseDimStart(&base); - } - else if (element == PropertyDimElement) - { - PropertyDim base(attributes.getValueAsString(WidgetAttribute), attributes.getValueAsString(NameAttribute)); - doBaseDimStart(&base); - } - else if (element == TextElement) - { - assert (d_textcomponent != 0); - d_textcomponent->setText(attributes.getValueAsString(StringAttribute)); - d_textcomponent->setFont(attributes.getValueAsString(FontAttribute)); - } - else if (element == NamedAreaElement) - { - assert(d_namedArea == 0); - d_namedArea = new NamedArea(attributes.getValueAsString(NameAttribute)); - - CEGUI_LOGINSANE("-----> Creating named area: " + d_namedArea->getName()); - } - else if (element == DimOperatorElement) - { - if (!d_dimStack.empty()) - { - d_dimStack.back()->setDimensionOperator(FalagardXMLHelper::stringToDimensionOperator(attributes.getValueAsString(OperatorAttribute))); - } - } - else if (element == PropertyDefinitionElement) - { - assert(d_widgetlook); - - PropertyDefinition prop( - attributes.getValueAsString(NameAttribute), - attributes.getValueAsString(InitialValueAttribute), - attributes.getValueAsBool(RedrawOnWriteAttribute, false), - attributes.getValueAsBool(LayoutOnWriteAttribute, false) - ); - - CEGUI_LOGINSANE("-----> Adding PropertyDefiniton. Name: " + prop.getName() + " Default Value: " + attributes.getValueAsString(InitialValueAttribute)); - - d_widgetlook->addPropertyDefinition(prop); - } - else if (element == VertFormatPropertyElement) - { - if (d_framecomponent) - d_framecomponent->setVertFormattingPropertySource(attributes.getValueAsString(NameAttribute)); - else if (d_imagerycomponent) - d_imagerycomponent->setVertFormattingPropertySource(attributes.getValueAsString(NameAttribute)); - else if (d_textcomponent) - d_textcomponent->setVertFormattingPropertySource(attributes.getValueAsString(NameAttribute)); - } - else if (element == HorzFormatPropertyElement) - { - if (d_framecomponent) - d_framecomponent->setHorzFormattingPropertySource(attributes.getValueAsString(NameAttribute)); - else if (d_imagerycomponent) - d_imagerycomponent->setHorzFormattingPropertySource(attributes.getValueAsString(NameAttribute)); - else if (d_textcomponent) - d_textcomponent->setHorzFormattingPropertySource(attributes.getValueAsString(NameAttribute)); - } - else if (element == AreaPropertyElement) - { - assert (d_area != 0); - - d_area->setAreaPropertySource(attributes.getValueAsString(NameAttribute)); - } - else if (element == ImagePropertyElement) - { - assert(d_imagerycomponent != 0); - - d_imagerycomponent->setImagePropertySource(attributes.getValueAsString(NameAttribute)); - } - else - { - throw FileIOException("Falagard::xmlHandler::elementStart - The unknown XML element '" + element + "' was encountered while processing the look and feel file."); - } - } - - void Falagard_xmlHandler::elementEnd(const String& element) - { - // end of main element - if (element == FalagardElement) - { - Logger::getSingleton().logEvent("===== Look and feel parsing completed ====="); - } - // ending a widget-look - else if (element == WidgetLookElement) - { - if (d_widgetlook) - { - Logger::getSingleton().logEvent("---< End of definition for widget look '" + d_widgetlook->getName() + "'.", Informative); - d_manager->addWidgetLook(*d_widgetlook); - delete d_widgetlook; - d_widgetlook = 0; - } - } - // ending a component widget - else if (element == ChildElement) - { - assert(d_widgetlook != 0); - - if (d_childcomponent) - { - CEGUI_LOGINSANE("-----< End of definition for child widget. Type: " + d_childcomponent->getBaseWidgetType() + "."); - d_widgetlook->addWidgetComponent(*d_childcomponent); - delete d_childcomponent; - d_childcomponent = 0; - } - } - // ending an ImagerySection - else if (element == ImagerySectionElement) - { - assert(d_widgetlook != 0); - - if (d_imagerysection) - { - CEGUI_LOGINSANE("-----< End of definition for imagery section '" + d_imagerysection->getName() + "'."); - d_widgetlook->addImagerySection(*d_imagerysection); - delete d_imagerysection; - d_imagerysection = 0; - } - } - // ending a StateImagery section - else if (element == StateImageryElement) - { - assert(d_widgetlook != 0); - - if (d_stateimagery) - { - CEGUI_LOGINSANE("-----< End of definition for imagery for state '" + d_stateimagery->getName() + "'."); - d_widgetlook->addStateSpecification(*d_stateimagery); - delete d_stateimagery; - d_stateimagery = 0; - } - } - // ending a Layer section - else if (element == LayerElement) - { - assert(d_stateimagery != 0); - - if (d_layer) - { - CEGUI_LOGINSANE("-------< End of definition of imagery layer."); - d_stateimagery->addLayer(*d_layer); - delete d_layer; - d_layer = 0; - } - } - // ending a Section specification - else if (element == SectionElement) - { - assert(d_layer != 0); - - if (d_section) - { - d_layer->addSectionSpecification(*d_section); - delete d_section; - d_section = 0; - } - } - // ending an Imagery component specification - else if (element == ImageryComponentElement) - { - assert(d_imagerysection != 0); - - if (d_imagerycomponent) - { - d_imagerysection->addImageryComponent(*d_imagerycomponent); - delete d_imagerycomponent; - d_imagerycomponent = 0; - } - } - // ending a Text component specification - else if (element == TextComponentElement) - { - assert(d_imagerysection != 0); - - if (d_textcomponent) - { - d_imagerysection->addTextComponent(*d_textcomponent); - delete d_textcomponent; - d_textcomponent = 0; - } - } - // ending a Frame component specification - else if (element == FrameComponentElement) - { - assert(d_imagerysection != 0); - - if (d_framecomponent) - { - d_imagerysection->addFrameComponent(*d_framecomponent); - delete d_framecomponent; - d_framecomponent = 0; - } - } - // component area end - else if (element == AreaElement) - { - assert((d_childcomponent != 0) || (d_imagerycomponent != 0) || (d_textcomponent != 0) || d_namedArea != 0 || d_framecomponent != 0); - assert(d_area != 0); - - if (d_childcomponent) - { - d_childcomponent->setComponentArea(*d_area); - } - else if (d_framecomponent) - { - d_framecomponent->setComponentArea(*d_area); - } - else if (d_imagerycomponent) - { - d_imagerycomponent->setComponentArea(*d_area); - } - else if (d_textcomponent) - { - d_textcomponent->setComponentArea(*d_area); - } - else if (d_namedArea) - { - d_namedArea->setArea(*d_area); - } - - delete d_area; - d_area = 0; - } - // NamedArea end - else if (element == NamedAreaElement) - { - assert(d_widgetlook != 0); - - if (d_namedArea) - { - d_widgetlook->addNamedArea(*d_namedArea); - delete d_namedArea; - d_namedArea = 0; - } - } - // End of a *Dim element. - else if ((element == UnifiedDimElement) || (element == AbsoluteDimElement) || (element == ImageDimElement) || - (element == WidgetDimElement) || (element == FontDimElement) || (element == PropertyDimElement)) - { - doBaseDimEnd(); - } - } - - argb_t Falagard_xmlHandler::hexStringToARGB(const String& str) - { - argb_t val; - std::istringstream s(str.c_str()); - s >> std::hex >> val; - - return val; - } - - void Falagard_xmlHandler::assignAreaDimension(Dimension& dim) - { - if (d_area) - { - switch (dim.getDimensionType()) - { - case DT_LEFT_EDGE: - case DT_X_POSITION: - d_area->d_left = dim; - break; - case DT_TOP_EDGE: - case DT_Y_POSITION: - d_area->d_top = dim; - break; - case DT_RIGHT_EDGE: - case DT_WIDTH: - d_area->d_right_or_width = dim; - break; - case DT_BOTTOM_EDGE: - case DT_HEIGHT: - d_area->d_bottom_or_height = dim; - break; - default: - throw InvalidRequestException("Falagard::xmlHandler::assignAreaDimension - Invalid DimensionType specified for area component."); - } - } - } - - void Falagard_xmlHandler::doBaseDimStart(const BaseDim* dim) - { - BaseDim* cloned = dim->clone(); - d_dimStack.push_back(cloned); - } - - void Falagard_xmlHandler::doBaseDimEnd() - { - if (!d_dimStack.empty()) - { - BaseDim* currDim = d_dimStack.back(); - d_dimStack.pop_back(); - - if (!d_dimStack.empty()) - { - d_dimStack.back()->setOperand(*currDim); - } - else - { - d_dimension.setBaseDimension(*currDim); - assignAreaDimension(d_dimension); - } - - // release the dim we popped. - delete currDim; - } - } - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/pcre/AUTHORS b/vendor/cegui-0.4.0-custom/src/pcre/AUTHORS deleted file mode 100644 index 9145749812..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/AUTHORS +++ /dev/null @@ -1,6 +0,0 @@ -Written by: Philip Hazel - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2004 University of Cambridge diff --git a/vendor/cegui-0.4.0-custom/src/pcre/COPYING b/vendor/cegui-0.4.0-custom/src/pcre/COPYING deleted file mode 100644 index dc6974d391..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/COPYING +++ /dev/null @@ -1,45 +0,0 @@ -PCRE LICENCE ------------- - -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - -Release 5 of PCRE is distributed under the terms of the "BSD" licence, as -specified below. The documentation for PCRE, supplied in the "doc" -directory, is distributed under the same terms as the software itself. - -Written by: Philip Hazel - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2004 University of Cambridge -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -End diff --git a/vendor/cegui-0.4.0-custom/src/pcre/ChangeLog b/vendor/cegui-0.4.0-custom/src/pcre/ChangeLog deleted file mode 100644 index 9e757e5a85..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/ChangeLog +++ /dev/null @@ -1,1611 +0,0 @@ -ChangeLog for PCRE ------------------- - -Version 5.0 13-Sep-04 ---------------------- - - 1. Internal change: literal characters are no longer packed up into items - containing multiple characters in a single byte-string. Each character - is now matched using a separate opcode. However, there may be more than one - byte in the character in UTF-8 mode. - - 2. The pcre_callout_block structure has two new fields: pattern_position and - next_item_length. These contain the offset in the pattern to the next match - item, and its length, respectively. - - 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic - insertion of callouts before each pattern item. Added the /C option to - pcretest to make use of this. - - 4. On the advice of a Windows user, the lines - - #if defined(_WIN32) || defined(WIN32) - _setmode( _fileno( stdout ), 0x8000 ); - #endif /* defined(_WIN32) || defined(WIN32) */ - - have been added to the source of pcretest. This apparently does useful - magic in relation to line terminators. - - 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" - for the benefit of those environments where the "b" makes a difference. - - 6. The icc compiler has the same options as gcc, but "configure" doesn't seem - to know about it. I have put a hack into configure.in that adds in code - to set GCC=yes if CC=icc. This seems to end up at a point in the - generated configure script that is early enough to affect the setting of - compiler options, which is what is needed, but I have no means of testing - whether it really works. (The user who reported this had patched the - generated configure script, which of course I cannot do.) - - LATER: After change 22 below (new libtool files), the configure script - seems to know about icc (and also ecc). Therefore, I have commented out - this hack in configure.in. - - 7. Added support for pkg-config (2 patches were sent in). - - 8. Negated POSIX character classes that used a combination of internal tables - were completely broken. These were [[:^alpha:]], [[:^alnum:]], and - [[:^ascii]]. Typically, they would match almost any characters. The other - POSIX classes were not broken in this way. - - 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed - to find the match, as PCRE was deluded into thinking that the match had to - start at the start point or following a newline. The same bug applied to - patterns with negative forward assertions or any backward assertions - preceding ".*" at the start, unless the pattern required a fixed first - character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. - -10. In UTF-8 mode, when moving forwards in the subject after a failed match - starting at the last subject character, bytes beyond the end of the subject - string were read. - -11. Renamed the variable "class" as "classbits" to make life easier for C++ - users. (Previously there was a macro definition, but it apparently wasn't - enough.) - -12. Added the new field "tables" to the extra data so that tables can be passed - in at exec time, or the internal tables can be re-selected. This allows - a compiled regex to be saved and re-used at a later time by a different - program that might have everything at different addresses. - -13. Modified the pcre-config script so that, when run on Solaris, it shows a - -R library as well as a -L library. - -14. The debugging options of pcretest (-d on the command line or D on a - pattern) showed incorrect output for anything following an extended class - that contained multibyte characters and which was followed by a quantifier. - -15. Added optional support for general category Unicode character properties - via the \p, \P, and \X escapes. Unicode property support implies UTF-8 - support. It adds about 90K to the size of the library. The meanings of the - inbuilt class escapes such as \d and \s have NOT been changed. - -16. Updated pcredemo.c to include calls to free() to release the memory for the - compiled pattern. - -17. The generated file chartables.c was being created in the source directory - instead of in the building directory. This caused the build to fail if the - source directory was different from the building directory, and was - read-only. - -18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE - file. No doubt somebody will tell me if they don't make sense... Also added - Dan Mooney's comments about building on OpenVMS. - -19. Added support for partial matching via the PCRE_PARTIAL option for - pcre_exec() and the \P data escape in pcretest. - -20. Extended pcretest with 3 new pattern features: - - (i) A pattern option of the form ">rest-of-line" causes pcretest to - write the compiled pattern to the file whose name is "rest-of-line". - This is a straight binary dump of the data, with the saved pointer to - the character tables forced to be NULL. The study data, if any, is - written too. After writing, pcretest reads a new pattern. - - (ii) If, instead of a pattern, ": new target - : new target - : use native compiler - : use native linker - : handle Windows platform correctly - : ditto - : ditto - copy DLL to top builddir before testing - - As part of these changes, -no-undefined was removed again. This was reported - to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea - in any case. - -3. Some tidies to get rid of compiler warnings: - - . In the match_data structure, match_limit was an unsigned long int, whereas - match_call_count was an int. I've made them both unsigned long ints. - - . In pcretest the fact that a const uschar * doesn't automatically cast to - a void * provoked a warning. - - . Turning on some more compiler warnings threw up some "shadow" variables - and a few more missing casts. - -4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained a single character with a value between 128 - and 255 (e.g. /[\xFF]/) caused PCRE to crash. - -5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained several characters, but with at least one - whose value was between 128 and 255 caused PCRE to crash. - - -Version 4.1 12-Mar-03 ---------------------- - -1. Compiling with gcc -pedantic found a couple of places where casts were -needed, and a string in dftables.c that was longer than standard compilers are -required to support. - -2. Compiling with Sun's compiler found a few more places where the code could -be tidied up in order to avoid warnings. - -3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the -first of these names is deprecated in the latest Autoconf in favour of the name -CC_FOR_BUILD, because "host" is typically used to mean the system on which the -compiled code will be run. I can't find a reference for HOST_CFLAGS, but by -analogy I have changed it to CFLAGS_FOR_BUILD. - -4. Added -no-undefined to the linking command in the Makefile, because this is -apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the -linking step for the pcreposix library. - -5. PCRE was failing to diagnose the case of two named groups with the same -name. - -6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a -literal character that is needed in the subject for a match, and scans along to -ensure that it is present before embarking on the full matching process. This -saves time in cases of nested unlimited repeats that are never going to match. -Problem: the scan can take a lot of time if the subject is very long (e.g. -megabytes), thus penalizing straightforward matches. It is now done only if the -amount of subject to be scanned is less than 1000 bytes. - -7. A lesser problem with the same optimization is that it was recording the -first character of an anchored pattern as "needed", thus provoking a search -right along the subject, even when the first match of the pattern was going to -fail. The "needed" character is now not set for anchored patterns, unless it -follows something in the pattern that is of non-fixed length. Thus, it still -fulfils its original purpose of finding quick non-matches in cases of nested -unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. - - -Version 4.0 17-Feb-03 ---------------------- - -1. If a comment in an extended regex that started immediately after a meta-item -extended to the end of string, PCRE compiled incorrect data. This could lead to -all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. - -2. Moved to autoconf 2.53 and libtool 1.4.2. - -3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, -the special perltest8 script is no longer needed - all the tests can be run -from a single perltest script. - -4. From 5.004, Perl has not included the VT character (0x0b) in the set defined -by \s. It has now been removed in PCRE. This means it isn't recognized as -whitespace in /x regexes too, which is the same as Perl. Note that the POSIX -class [:space:] *does* include VT, thereby creating a mess. - -5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only -space and tab. - -6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use -its new features into the main test script, reducing the number of scripts. - -7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions -were backward compatible, and made the (?i) apply to the whole pattern, as if -/i were given. Now it behaves more logically, and applies the option setting -only to what follows. PCRE has been changed to follow suit. However, if it -finds options settings right at the start of the pattern, it extracts them into -the global options, as before. Thus, they show up in the info data. - -8. Added support for the \Q...\E escape sequence. Characters in between are -treated as literals. This is slightly different from Perl in that $ and @ are -also handled as literals inside the quotes. In Perl, they will cause variable -interpolation. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - -For compatibility with Perl, \Q...\E sequences are recognized inside character -classes as well as outside them. - -9. Re-organized 3 code statements in pcretest to avoid "overflow in -floating-point constant arithmetic" warnings from a Microsoft compiler. Added a -(size_t) cast to one statement in pcretest and one in pcreposix to avoid -signed/unsigned warnings. - -10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o -option for pcretest, so I've replaced it by a simple function that does just -that job. - -11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or -"pcregrep -". - -12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's -Java package. This provides some syntactic sugar for simple cases of what my -documentation calls "once-only subpatterns". A pattern such as x*+ is the same -as (?>x*). In other words, if what is inside (?>...) is just a single repeated -item, you can use this simplified notation. Note that only makes sense with -greedy quantifiers. Consequently, the use of the possessive quantifier forces -greediness, whatever the setting of the PCRE_UNGREEDY option. - -13. A change of greediness default within a pattern was not taking effect at -the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized -subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option -was abstracted outside. - -14. PCRE now supports the \G assertion. It is true when the current matching -position is at the start point of the match. This differs from \A when the -starting offset is non-zero. Used with the /g option of pcretest (or similar -code), it works in the same way as it does for Perl's /g option. If all -alternatives of a regex begin with \G, the expression is anchored to the start -match position, and the "anchored" flag is set in the compiled expression. - -15. Some bugs concerning the handling of certain option changes within patterns -have been fixed. These applied to options other than (?ims). For example, -"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have -been the other way round. Some of this was related to change 7 above. - -16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX -features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ -and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports -POSIX classes only within a class (e.g. /[[:alpha:]]/). - -17. Added support for Perl's \C escape. This matches one byte, even in UTF8 -mode. Unlike ".", it always matches newline, whatever the setting of -PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind -assertions. Perl allows it, but it doesn't (in general) work because it can't -calculate the length of the lookbehind. At least, that's the case for Perl -5.8.0 - I've been told they are going to document that it doesn't work in -future. - -18. Added an error diagnosis for escapes that PCRE does not support: these are -\L, \l, \N, \P, \p, \U, \u, and \X. - -19. Although correctly diagnosing a missing ']' in a character class, PCRE was -reading past the end of the pattern in cases such as /[abcd/. - -20. PCRE was getting more memory than necessary for patterns with classes that -contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. - -21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for -compiling PCRE for use with Virtual Pascal. - -22. Small fix to the Makefile to make it work properly if the build is done -outside the source tree. - -23. Added a new extension: a condition to go with recursion. If a conditional -subpattern starts with (?(R) the "true" branch is used if recursion has -happened, whereas the "false" branch is used only at the top level. - -24. When there was a very long string of literal characters (over 255 bytes -without UTF support, over 250 bytes with UTF support), the computation of how -much memory was required could be incorrect, leading to segfaults or other -strange effects. - -25. PCRE was incorrectly assuming anchoring (either to start of subject or to -start of line for a non-DOTALL pattern) when a pattern started with (.*) and -there was a subsequent back reference to those brackets. This meant that, for -example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't -possible to check for precisely this case. All we can do is abandon the -optimization if .* occurs inside capturing brackets when there are any back -references whatsoever. (See below for a better fix that came later.) - -26. The handling of the optimization for finding the first character of a -non-anchored pattern, and for finding a character that is required later in the -match were failing in some cases. This didn't break the matching; it just -failed to optimize when it could. The way this is done has been re-implemented. - -27. Fixed typo in error message for invalid (?R item (it said "(?p"). - -28. Added a new feature that provides some of the functionality that Perl -provides with (?{...}). The facility is termed a "callout". The way it is done -in PCRE is for the caller to provide an optional function, by setting -pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a -global variable. By default it is unset, which disables all calling out. To get -the function called, the regex must include (?C) at appropriate points. This -is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). -This provides a means of identifying different callout points. When PCRE -reaches such a point in the regex, if pcre_callout has been set, the external -function is called. It is provided with data in a structure called -pcre_callout_block, which is defined in pcre.h. If the function returns 0, -matching continues; if it returns a non-zero value, the match at the current -point fails. However, backtracking will occur if possible. [This was changed -later and other features added - see item 49 below.] - -29. pcretest is upgraded to test the callout functionality. It provides a -callout function that displays information. By default, it shows the start of -the match and the current position in the text. There are some new data escapes -to vary what happens: - - \C+ in addition, show current contents of captured substrings - \C- do not supply a callout function - \C!n return 1 when callout number n is reached - \C!n!m return 1 when callout number n is reached for the mth time - -30. If pcregrep was called with the -l option and just a single file name, it -output "" if a match was found, instead of the file name. - -31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing -slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to -pcre_exec(). This saves a malloc/free per call. The default value of -POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold -when configuring. - -32. The default maximum size of a compiled pattern is 64K. There have been a -few cases of people hitting this limit. The code now uses macros to handle the -storing of links as offsets within the compiled pattern. It defaults to 2-byte -links, but this can be changed to 3 or 4 bytes by --with-link-size when -configuring. Tests 2 and 5 work only with 2-byte links because they output -debugging information about compiled patterns. - -33. Internal code re-arrangements: - -(a) Moved the debugging function for printing out a compiled regex into - its own source file (printint.c) and used #include to pull it into - pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two - separate copies. - -(b) Defined the list of op-code names for debugging as a macro in - internal.h so that it is next to the definition of the opcodes. - -(c) Defined a table of op-code lengths for simpler skipping along compiled - code. This is again a macro in internal.h so that it is next to the - definition of the opcodes. - -34. Added support for recursive calls to individual subpatterns, along the -lines of Robin Houston's patch (but implemented somewhat differently). - -35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to -allow it to read and process whole directories in Win32. This code was -contributed by Lionel Fourquaux; it has not been tested by me. - -36. Added support for named subpatterns. The Python syntax (?P...) is -used to name a group. Names consist of alphanumerics and underscores, and must -be unique. Back references use the syntax (?P=name) and recursive calls use -(?P>name) which is a PCRE extension to the Python extension. Groups still have -numbers. The function pcre_fullinfo() can be used after compilation to extract -a name/number map. There are three relevant calls: - - PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map - PCRE_INFO_NAMECOUNT yields the number of entries - PCRE_INFO_NAMETABLE yields a pointer to the map. - -The map is a vector of fixed-size entries. The size of each entry depends on -the length of the longest name used. The first two bytes of each entry are the -group number, most significant byte first. There follows the corresponding -name, zero terminated. The names are in alphabetical order. - -37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 -case instead of 255. Making it the same both with and without UTF-8 support -means that the same test output works with both. - -38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid -calling malloc() with a zero argument. - -39. Change 25 above had to resort to a heavy-handed test for the .* anchoring -optimization. I've improved things by keeping a bitmap of backreferences with -numbers 1-31 so that if .* occurs inside capturing brackets that are not in -fact referenced, the optimization can be applied. It is unlikely that a -relevant occurrence of .* (i.e. one which might indicate anchoring or forcing -the match to follow \n) will appear inside brackets with a number greater than -31, but if it does, any back reference > 31 suppresses the optimization. - -40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect -of disabling numbered capturing parentheses. Any opening parenthesis that is -not followed by ? behaves as if it were followed by ?: but named parentheses -can still be used for capturing (and they will acquire numbers in the usual -way). - -41. Redesigned the return codes from the match() function into yes/no/error so -that errors can be passed back from deep inside the nested calls. A malloc -failure while inside a recursive subpattern call now causes the -PCRE_ERROR_NOMEMORY return instead of quietly going wrong. - -42. It is now possible to set a limit on the number of times the match() -function is called in a call to pcre_exec(). This facility makes it possible to -limit the amount of recursion and backtracking, though not in a directly -obvious way, because the match() function is used in a number of different -circumstances. The count starts from zero for each position in the subject -string (for non-anchored patterns). The default limit is, for compatibility, a -large number, namely 10 000 000. You can change this in two ways: - -(a) When configuring PCRE before making, you can use --with-match-limit=n - to set a default value for the compiled library. - -(b) For each call to pcre_exec(), you can pass a pcre_extra block in which - a different value is set. See 45 below. - -If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - -43. Added a new function pcre_config(int, void *) to enable run-time extraction -of things that can be changed at compile time. The first argument specifies -what is wanted and the second points to where the information is to be placed. -The current list of available information is: - - PCRE_CONFIG_UTF8 - -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. - - PCRE_CONFIG_NEWLINE - -The output is an integer that it set to the value of the code that is used for -newline. It is either LF (10) or CR (13). - - PCRE_CONFIG_LINK_SIZE - -The output is an integer that contains the number of bytes used for internal -linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. See item 31 above. - - PCRE_CONFIG_MATCH_LIMIT - -The output is an unsigned integer that contains the default limit of the number -of match() calls in a pcre_exec() execution. See 42 above. - -44. pcretest has been upgraded by the addition of the -C option. This causes it -to extract all the available output from the new pcre_config() function, and to -output it. The program then exits immediately. - -45. A need has arisen to pass over additional data with calls to pcre_exec() in -order to support additional features. One way would have been to define -pcre_exec2() (for example) with extra arguments, but this would not have been -extensible, and would also have required all calls to the original function to -be mapped to the new one. Instead, I have chosen to extend the mechanism that -is used for passing in "extra" data from pcre_study(). - -The pcre_extra structure is now exposed and defined in pcre.h. It currently -contains the following fields: - - flags a bitmap indicating which of the following fields are set - study_data opaque data from pcre_study() - match_limit a way of specifying a limit on match() calls for a specific - call to pcre_exec() - callout_data data for callouts (see 49 below) - -The flag bits are also defined in pcre.h, and are - - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_CALLOUT_DATA - -The pcre_study() function now returns one of these new pcre_extra blocks, with -the actual study data pointed to by the study_data field, and the -PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as -before. That is, this change is entirely upwards-compatible and requires no -change to existing code. - -If you want to pass in additional data to pcre_exec(), you can either place it -in a pcre_extra block provided by pcre_study(), or create your own pcre_extra -block. - -46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a -data string contains the escape sequence \M, pcretest calls pcre_exec() several -times with different match limits, until it finds the minimum value needed for -pcre_exec() to complete. The value is then output. This can be instructive; for -most simple matches the number is quite small, but for pathological cases it -gets very large very quickly. - -47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It -returns the size of the data block pointed to by the study_data field in a -pcre_extra block, that is, the value that was passed as the argument to -pcre_malloc() when PCRE was getting memory in which to place the information -created by pcre_study(). The fourth argument should point to a size_t variable. -pcretest has been extended so that this information is shown after a successful -pcre_study() call when information about the compiled regex is being displayed. - -48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) -because what follows is always an absolute path. (Later: it turns out that this -is more than cosmetic for MinGW, because it doesn't like empty path -components.) - -49. Some changes have been made to the callout feature (see 28 above): - -(i) A callout function now has three choices for what it returns: - - 0 => success, carry on matching - > 0 => failure at this point, but backtrack if possible - < 0 => serious error, return this value from pcre_exec() - - Negative values should normally be chosen from the set of PCRE_ERROR_xxx - values. In particular, returning PCRE_ERROR_NOMATCH forces a standard - "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for - use by callout functions. It will never be used by PCRE itself. - -(ii) The pcre_extra structure (see 45 above) has a void * field called - callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The - pcre_callout_block structure has a field of the same name. The contents of - the field passed in the pcre_extra structure are passed to the callout - function in the corresponding field in the callout block. This makes it - easier to use the same callout-containing regex from multiple threads. For - testing, the pcretest program has a new data escape - - \C*n pass the number n (may be negative) as callout_data - - If the callout function in pcretest receives a non-zero value as - callout_data, it returns that value. - -50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, -there were some redundant $(CFLAGS) in commands that are now specified as -$(LINK), which already includes $(CFLAGS). - -51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE -has been compiled with UTF-8 support *and* pcre_compile() has been compiled -with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume -one-byte characters throughout. Note that case-insensitive matching applies -only to characters whose values are less than 256. PCRE doesn't support the -notion of cases for higher-valued characters. - -(i) A character class whose characters are all within 0-255 is handled as - a bit map, and the map is inverted for negative classes. Previously, a - character > 255 always failed to match such a class; however it should - match if the class was a negative one (e.g. [^ab]). This has been fixed. - -(ii) A negated character class with a single character < 255 is coded as - "not this character" (OP_NOT). This wasn't working properly when the test - character was multibyte, either singly or repeated. - -(iii) Repeats of multibyte characters are now handled correctly in UTF-8 - mode, for example: \x{100}{2,3}. - -(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either - singly or repeated) now correctly test multibyte characters. However, - PCRE doesn't recognize any characters with values greater than 255 as - digits, spaces, or word characters. Such characters always match \D, \S, - and \W, and never match \d, \s, or \w. - -(v) Classes may now contain characters and character ranges with values - greater than 255. For example: [ab\x{100}-\x{400}]. - -(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call - PCRE in UTF-8 mode. - -52. The info request value PCRE_INFO_FIRSTCHAR has been renamed -PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is -retained for backwards compatibility. (Note that LASTLITERAL is also a byte -value.) - -53. The single man page has become too large. I have therefore split it up into -a number of separate man pages. These also give rise to individual HTML pages; -these are now put in a separate directory, and there is an index.html page that -lists them all. Some hyperlinking between the pages has been installed. - -54. Added convenience functions for handling named capturing parentheses. - -55. Unknown escapes inside character classes (e.g. [\M]) and escapes that -aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also -true in PCRE, except when the PCRE_EXTENDED option is set, in which case they -are faulted. - -56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when -calling configure. These values are used when compiling the dftables.c program -which is run to generate the source of the default character tables. They -default to the values of CC and CFLAGS. If you are cross-compiling PCRE, -you will need to set these values. - -57. Updated the building process for Windows DLL, as provided by Fred Cox. - - -Version 3.9 02-Jan-02 ---------------------- - -1. A bit of extraneous text had somehow crept into the pcregrep documentation. - -2. If --disable-static was given, the building process failed when trying to -build pcretest and pcregrep. (For some reason it was using libtool to compile -them, which is not right, as they aren't part of the library.) - - -Version 3.8 18-Dec-01 ---------------------- - -1. The experimental UTF-8 code was completely screwed up. It was packing the -bytes in the wrong order. How dumb can you get? - - -Version 3.7 29-Oct-01 ---------------------- - -1. In updating pcretest to check change 1 of version 3.6, I screwed up. -This caused pcretest, when used on the test data, to segfault. Unfortunately, -this didn't happen under Solaris 8, where I normally test things. - -2. The Makefile had to be changed to make it work on BSD systems, where 'make' -doesn't seem to recognize that ./xxx and xxx are the same file. (This entry -isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made -this fix an hour or so after the initial 3.7 release.) - - -Version 3.6 23-Oct-01 ---------------------- - -1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if -offsets passed as NULL with zero offset count. - -2. The config.guess and config.sub files had not been updated when I moved to -the latest autoconf. - - -Version 3.5 15-Aug-01 ---------------------- - -1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that -had been forgotten. - -2. By using declared but undefined structures, we can avoid using "void" -definitions in pcre.h while keeping the internal definitions of the structures -private. - -3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a -user point of view, this means that both static and shared libraries are built -by default, but this can be individually controlled. More of the work of -handling this static/shared cases is now inside libtool instead of PCRE's make -file. - -4. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -5. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -6. pcre_exec() was referring to its "code" argument before testing that -argument for NULL (and giving an error if it was NULL). - -7. Upgraded Makefile.in to allow for compiling in a different directory from -the source directory. - -8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the -options bits, the pointer it was passed was to an int instead of to an unsigned -long int. This mattered only on 64-bit systems. - -9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is -generated) instead of pcre.in, which it its source. Also made the same change -in several of the .c files. - -10. A new release of gcc defines printf() as a macro, which broke pcretest -because it had an ifdef in the middle of a string argument for printf(). Fixed -by using separate calls to printf(). - -11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -13. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Version 3.4 22-Aug-00 ---------------------- - -1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. - -2. Diagnose condition (?(0) as an error instead of crashing on matching. - - -Version 3.3 01-Aug-00 ---------------------- - -1. If an octal character was given, but the value was greater than \377, it -was not getting masked to the least significant bits, as documented. This could -lead to crashes in some systems. - -2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats -the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. - -3. Added the functions pcre_free_substring() and pcre_free_substring_list(). -These just pass their arguments on to (pcre_free)(), but they are provided -because some uses of PCRE bind it to non-C systems that can call its functions, -but cannot call free() or pcre_free() directly. - -4. Add "make test" as a synonym for "make check". Corrected some comments in -the Makefile. - -5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the -Makefile. - -6. Changed the name of pgrep to pcregrep, because Solaris has introduced a -command called pgrep for grepping around the active processes. - -7. Added the beginnings of support for UTF-8 character strings. - -8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and -RANLIB to ./ltconfig so that they are used by libtool. I think these are all -the relevant ones. (AR is not passed because ./ltconfig does its own figuring -out for the ar command.) - - -Version 3.2 12-May-00 ---------------------- - -This is purely a bug fixing release. - -1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead -of ZA. This was just one example of several cases that could provoke this bug, -which was introduced by change 9 of version 2.00. The code for breaking -infinite loops after an iteration that matches an empty string was't working -correctly. - -2. The pcretest program was not imitating Perl correctly for the pattern /a*/g -when matched against abbab (for example). After matching an empty string, it -wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this -caused it to match further down the string than it should. - -3. The code contained an inclusion of sys/types.h. It isn't clear why this -was there because it doesn't seem to be needed, and it causes trouble on some -systems, as it is not a Standard C header. It has been removed. - -4. Made 4 silly changes to the source to avoid stupid compiler warnings that -were reported on the Macintosh. The changes were from - - while ((c = *(++ptr)) != 0 && c != '\n'); -to - while ((c = *(++ptr)) != 0 && c != '\n') ; - -Totally extraordinary, but if that's what it takes... - -5. PCRE is being used in one environment where neither memmove() nor bcopy() is -available. Added HAVE_BCOPY and an autoconf test for it; if neither -HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which -assumes the way PCRE uses memmove() (always moving upwards). - -6. PCRE is being used in one environment where strchr() is not available. There -was only one use in pcre.c, and writing it out to avoid strchr() probably gives -faster code anyway. - - -Version 3.1 09-Feb-00 ---------------------- - -The only change in this release is the fixing of some bugs in Makefile.in for -the "install" target: - -(1) It was failing to install pcreposix.h. - -(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. - - -Version 3.0 01-Feb-00 ---------------------- - -1. Add support for the /+ modifier to perltest (to output $` like it does in -pcretest). - -2. Add support for the /g modifier to perltest. - -3. Fix pcretest so that it behaves even more like Perl for /g when the pattern -matches null strings. - -4. Fix perltest so that it doesn't do unwanted things when fed an empty -pattern. Perl treats empty patterns specially - it reuses the most recent -pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this -effect. - -5. The POSIX interface was broken in that it was just handing over the POSIX -captured string vector to pcre_exec(), but (since release 2.00) PCRE has -required a bigger vector, with some working space on the end. This means that -the POSIX wrapper now has to get and free some memory, and copy the results. - -6. Added some simple autoconf support, placing the test data and the -documentation in separate directories, re-organizing some of the -information files, and making it build pcre-config (a GNU standard). Also added -libtool support for building PCRE as a shared library, which is now the -default. - -7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and -09 are not valid octal constants. Single digits will be used for minor values -less than 10. - -8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that -existing programs that set these in the POSIX interface can use PCRE without -modification. - -9. Added a new function, pcre_fullinfo() with an extensible interface. It can -return all that pcre_info() returns, plus additional data. The pcre_info() -function is retained for compatibility, but is considered to be obsolete. - -10. Added experimental recursion feature (?R) to handle one common case that -Perl 5.6 will be able to do with (?p{...}). - -11. Added support for POSIX character classes like [:alpha:], which Perl is -adopting. - - -Version 2.08 31-Aug-99 ----------------------- - -1. When startoffset was not zero and the pattern began with ".*", PCRE was not -trying to match at the startoffset position, but instead was moving forward to -the next newline as if a previous match had failed. - -2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, -and could get into a loop if a null string was matched other than at the start -of the subject. - -3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can -be distinguished at compile time, and for completeness also added PCRE_DATE. - -5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL -in GnuWin32 environments. - - -Version 2.07 29-Jul-99 ----------------------- - -1. The documentation is now supplied in plain text form and HTML as well as in -the form of man page sources. - -2. C++ compilers don't like assigning (void *) values to other pointer types. -In particular this affects malloc(). Although there is no problem in Standard -C, I've put in casts to keep C++ compilers happy. - -3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call -should be (const char *). - -4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may -be useful for non-Unix systems who don't want to bother with the POSIX stuff. -However, I haven't made this a standard facility. The documentation doesn't -mention it, and the Makefile doesn't support it. - -5. The Makefile now contains an "install" target, with editable destinations at -the top of the file. The pcretest program is not installed. - -6. pgrep -V now gives the PCRE version number and date. - -7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was -causing the entire string to be ignored, instead of just the last character. - -8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a -non-matching string, it can take a very, very long time, even for strings of -quite modest length, because of the nested recursion. PCRE now does better in -some of these cases. It does this by remembering the last required literal -character in the pattern, and pre-searching the subject to ensure it is present -before running the real match. In other words, it applies a heuristic to detect -some types of certain failure quickly, and in the above example, if presented -with a string that has no trailing " it gives "no match" very quickly. - -9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; -other alternatives are tried instead. - - -Version 2.06 09-Jun-99 ----------------------- - -1. Change pcretest's output for amount of store used to show just the code -space, because the remainder (the data block) varies in size between 32-bit and -64-bit systems. - -2. Added an extra argument to pcre_exec() to supply an offset in the subject to -start matching at. This allows lookbehinds to work when searching for multiple -occurrences in a string. - -3. Added additional options to pcretest for testing multiple occurrences: - - /+ outputs the rest of the string that follows a match - /g loops for multiple occurrences, using the new startoffset argument - /G loops for multiple occurrences by passing an incremented pointer - -4. PCRE wasn't doing the "first character" optimization for patterns starting -with \b or \B, though it was doing it for other lookbehind assertions. That is, -it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with -the letter 'x'. On long subject strings, this gives a significant speed-up. - - -Version 2.05 21-Apr-99 ----------------------- - -1. Changed the type of magic_number from int to long int so that it works -properly on 16-bit systems. - -2. Fixed a bug which caused patterns starting with .* not to work correctly -when the subject string contained newline characters. PCRE was assuming -anchoring for such patterns in all cases, which is not correct because .* will -not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if -DOTALL is set at top level; otherwise it knows that patterns starting with .* -must be retried after every newline in the subject. - - -Version 2.04 18-Feb-99 ----------------------- - -1. For parenthesized subpatterns with repeats whose minimum was zero, the -computation of the store needed to hold the pattern was incorrect (too large). -If such patterns were nested a few deep, this could multiply and become a real -problem. - -2. Added /M option to pcretest to show the memory requirement of a specific -pattern. Made -m a synonym of -s (which does this globally) for compatibility. - -3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being -compiled in such a way that the backtracking after subsequent failure was -pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of -((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. - - -Version 2.03 02-Feb-99 ----------------------- - -1. Fixed typo and small mistake in man page. - -2. Added 4th condition (GPL supersedes if conflict) and created separate -LICENCE file containing the conditions. - -3. Updated pcretest so that patterns such as /abc\/def/ work like they do in -Perl, that is the internal \ allows the delimiter to be included in the -pattern. Locked out the use of \ as a delimiter. If \ immediately follows -the final delimiter, add \ to the end of the pattern (to test the error). - -4. Added the convenience functions for extracting substrings after a successful -match. Updated pcretest to make it able to test these functions. - - -Version 2.02 14-Jan-99 ----------------------- - -1. Initialized the working variables associated with each extraction so that -their saving and restoring doesn't refer to uninitialized store. - -2. Put dummy code into study.c in order to trick the optimizer of the IBM C -compiler for OS/2 into generating correct code. Apparently IBM isn't going to -fix the problem. - -3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution -calls, and wasn't printing the correct value for compiling calls. Increased the -default value of LOOPREPEAT, and the number of significant figures in the -times. - -4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. - -5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid -a building problem on Windows NT with a FAT file system. - - -Version 2.01 21-Oct-98 ----------------------- - -1. Changed the API for pcre_compile() to allow for the provision of a pointer -to character tables built by pcre_maketables() in the current locale. If NULL -is passed, the default tables are used. - - -Version 2.00 24-Sep-98 ----------------------- - -1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable -it any more. - -2. Allow quantification of (?>) groups, and make it work correctly. - -3. The first character computation wasn't working for (?>) groups. - -4. Correct the implementation of \Z (it is permitted to match on the \n at the -end of the subject) and add 5.005's \z, which really does match only at the -very end of the subject. - -5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. - -6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and -DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 -localized options. All options to pcre_study() were also removed. - -7. Add other new features from 5.005: - - $(?<= positive lookbehind - $(?a*))*/ (a PCRE_EXTRA facility). - - -Version 1.00 18-Nov-97 ----------------------- - -1. Added compile-time macros to support systems such as SunOS4 which don't have -memmove() or strerror() but have other things that can be used instead. - -2. Arranged that "make clean" removes the executables. - - -Version 0.99 27-Oct-97 ----------------------- - -1. Fixed bug in code for optimizing classes with only one character. It was -initializing a 32-byte map regardless, which could cause it to run off the end -of the memory it had got. - -2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. - - -Version 0.98 22-Oct-97 ----------------------- - -1. Fixed bug in code for handling temporary memory usage when there are more -back references than supplied space in the ovector. This could cause segfaults. - - -Version 0.97 21-Oct-97 ----------------------- - -1. Added the \X "cut" facility, conditional on PCRE_EXTRA. - -2. Optimized negated single characters not to use a bit map. - -3. Brought error texts together as macro definitions; clarified some of them; -fixed one that was wrong - it said "range out of order" when it meant "invalid -escape sequence". - -4. Changed some char * arguments to const char *. - -5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). - -6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in -pcretest. - - -Version 0.96 16-Oct-97 ----------------------- - -1. Added a simple "pgrep" utility to the distribution. - -2. Fixed an incompatibility with Perl: "{" is now treated as a normal character -unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" -where "ddd" means "one or more decimal digits". - -3. Fixed serious bug. If a pattern had a back reference, but the call to -pcre_exec() didn't supply a large enough ovector to record the related -identifying subpattern, the match always failed. PCRE now remembers the number -of the largest back reference, and gets some temporary memory in which to save -the offsets during matching if necessary, in order to ensure that -backreferences always work. - -4. Increased the compatibility with Perl in a number of ways: - - (a) . no longer matches \n by default; an option PCRE_DOTALL is provided - to request this handling. The option can be set at compile or exec time. - - (b) $ matches before a terminating newline by default; an option - PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline - mode). The option can be set at compile or exec time. - - (c) The handling of \ followed by a digit other than 0 is now supposed to be - the same as Perl's. If the decimal number it represents is less than 10 - or there aren't that many previous left capturing parentheses, an octal - escape is read. Inside a character class, it's always an octal escape, - even if it is a single digit. - - (d) An escaped but undefined alphabetic character is taken as a literal, - unless PCRE_EXTRA is set. Currently this just reserves the remaining - escapes. - - (e) {0} is now permitted. (The previous item is removed from the compiled - pattern). - -5. Changed all the names of code files so that the basic parts are no longer -than 10 characters, and abolished the teeny "globals.c" file. - -6. Changed the handling of character classes; they are now done with a 32-byte -bit map always. - -7. Added the -d and /D options to pcretest to make it possible to look at the -internals of compilation without having to recompile pcre. - - -Version 0.95 23-Sep-97 ----------------------- - -1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or -\x20 at the start of a run of normal characters. These were being treated as -real characters, instead of the source characters being re-checked. - - -Version 0.94 18-Sep-97 ----------------------- - -1. The functions are now thread-safe, with the caveat that the global variables -containing pointers to malloc() and free() or alternative functions are the -same for all threads. - -2. Get pcre_study() to generate a bitmap of initial characters for non- -anchored patterns when this is possible, and use it if passed to pcre_exec(). - - -Version 0.93 15-Sep-97 ----------------------- - -1. /(b)|(:+)/ was computing an incorrect first character. - -2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), -but not actually doing anything yet. - -3. Treat "-" characters in classes that cannot be part of ranges as literals, -as Perl does (e.g. [-az] or [az-]). - -4. Set the anchored flag if a branch starts with .* or .*? because that tests -all possible positions. - -5. Split up into different modules to avoid including unneeded functions in a -compiled binary. However, compile and exec are still in one module. The "study" -function is split off. - -6. The character tables are now in a separate module whose source is generated -by an auxiliary program - but can then be edited by hand if required. There are -now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or -toupper() in the code. - -7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and -make them global. Abolish the function for setting them, as the caller can now -set them directly. - - -Version 0.92 11-Sep-97 ----------------------- - -1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character -(e.g. /a{1,3}/) was broken (I mis-optimized it). - -2. Caseless matching was not working in character classes if the characters in -the pattern were in upper case. - -3. Make ranges like [W-c] work in the same way as Perl for caseless matching. - -4. Make PCRE_ANCHORED public and accept as a compile option. - -5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and -PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to -pass them. - -6. Give an error if bad option bits passed at compile or run time. - -7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to -pcretest to cause it to pass that flag. - -8. Add pcre_info(), to get the number of identifying subpatterns, the stored -options, and the first character, if set. - -9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. - - -Version 0.91 10-Sep-97 ----------------------- - -1. PCRE was failing to diagnose unlimited repeats of subpatterns that could -match the empty string as in /(a*)*/. It was looping and ultimately crashing. - -2. PCRE was looping on encountering an indefinitely repeated back reference to -a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what -Perl does - treats the match as successful. - -**** diff --git a/vendor/cegui-0.4.0-custom/src/pcre/NEWS b/vendor/cegui-0.4.0-custom/src/pcre/NEWS deleted file mode 100644 index 23b54fd545..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/NEWS +++ /dev/null @@ -1,201 +0,0 @@ -News about PCRE releases ------------------------- - -Release 5.0 13-Sep-04 ---------------------- - -The licence under which PCRE is released has been changed to the more -conventional "BSD" licence. - -In the code, some bugs have been fixed, and there are also some major changes -in this release (which is why I've increased the number to 5.0). Some changes -are internal rearrangements, and some provide a number of new facilities. The -new features are: - -1. There's an "automatic callout" feature that inserts callouts before every - item in the regex, and there's a new callout field that gives the position - in the pattern - useful for debugging and tracing. - -2. The extra_data structure can now be used to pass in a set of character - tables at exec time. This is useful if compiled regex are saved and re-used - at a later time when the tables may not be at the same address. If the - default internal tables are used, the pointer saved with the compiled - pattern is now set to NULL, which means that you don't need to do anything - special unless you are using custom tables. - -3. It is possible, with some restrictions on the content of the regex, to - request "partial" matching. A special return code is given if all of the - subject string matched part of the regex. This could be useful for testing - an input field as it is being typed. - -4. There is now some optional support for Unicode character properties, which - means that the patterns items such as \p{Lu} and \X can now be used. Only - the general category properties are supported. If PCRE is compiled with this - support, an additional 90K data structure is include, which increases the - size of the library dramatically. - -5. There is support for saving compiled patterns and re-using them later. - -6. There is support for running regular expressions that were compiled on a - different host with the opposite endianness. - -7. The pcretest program has been extended to accommodate the new features. - -The main internal rearrangement is that sequences of literal characters are no -longer handled as strings. Instead, each character is handled on its own. This -makes some UTF-8 handling easier, and makes the support of partial matching -possible. Compiled patterns containing long literal strings will be larger as a -result of this change; I hope that performance will not be much affected. - - -Release 4.5 01-Dec-03 ---------------------- - -Again mainly a bug-fix and tidying release, with only a couple of new features: - -1. It's possible now to compile PCRE so that it does not use recursive -function calls when matching. Instead it gets memory from the heap. This slows -things down, but may be necessary on systems with limited stacks. - -2. UTF-8 string checking has been tightened to reject overlong sequences and to -check that a starting offset points to the start of a character. Failure of the -latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET. - -3. PCRE can now be compiled for systems that use EBCDIC code. - - -Release 4.4 21-Aug-03 ---------------------- - -This is mainly a bug-fix and tidying release. The only new feature is that PCRE -checks UTF-8 strings for validity by default. There is an option to suppress -this, just in case anybody wants that teeny extra bit of performance. - - -Releases 4.1 - 4.3 ------------------- - -Sorry, I forgot about updating the NEWS file for these releases. Please take a -look at ChangeLog. - - -Release 4.0 17-Feb-03 ---------------------- - -There have been a lot of changes for the 4.0 release, adding additional -functionality and mending bugs. Below is a list of the highlights of the new -functionality. For full details of these features, please consult the -documentation. For a complete list of changes, see the ChangeLog file. - -1. Support for Perl's \Q...\E escapes. - -2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java -package. They provide some syntactic sugar for simple cases of "atomic -grouping". - -3. Support for the \G assertion. It is true when the current matching position -is at the start point of the match. - -4. A new feature that provides some of the functionality that Perl provides -with (?{...}). The facility is termed a "callout". The way it is done in PCRE -is for the caller to provide an optional function, by setting pcre_callout to -its entry point. To get the function called, the regex must include (?C) at -appropriate points. - -5. Support for recursive calls to individual subpatterns. This makes it really -easy to get totally confused. - -6. Support for named subpatterns. The Python syntax (?P...) is used to -name a group. - -7. Several extensions to UTF-8 support; it is now fairly complete. There is an -option for pcregrep to make it operate in UTF-8 mode. - -8. The single man page has been split into a number of separate man pages. -These also give rise to individual HTML pages which are put in a separate -directory. There is an index.html page that lists them all. Some hyperlinking -between the pages has been installed. - - -Release 3.5 15-Aug-01 ---------------------- - -1. The configuring system has been upgraded to use later versions of autoconf -and libtool. By default it builds both a shared and a static library if the OS -supports it. You can use --disable-shared or --disable-static on the configure -command if you want only one of them. - -2. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -3. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -6. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Release 3.3 01-Aug-00 ---------------------- - -There is some support for UTF-8 character strings. This is incomplete and -experimental. The documentation describes what is and what is not implemented. -Otherwise, this is just a bug-fixing release. - - -Release 3.0 01-Feb-00 ---------------------- - -1. A "configure" script is now used to configure PCRE for Unix systems. It -builds a Makefile, a config.h file, and the pcre-config script. - -2. PCRE is built as a shared library by default. - -3. There is support for POSIX classes such as [:alpha:]. - -5. There is an experimental recursion feature. - ----------------------------------------------------------------------------- - IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 - -Please note that there has been a change in the API such that a larger -ovector is required at matching time, to provide some additional workspace. -The new man page has details. This change was necessary in order to support -some of the new functionality in Perl 5.005. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 - -Another (I hope this is the last!) change has been made to the API for the -pcre_compile() function. An additional argument has been added to make it -possible to pass over a pointer to character tables built in the current -locale by pcre_maketables(). To use the default tables, this new arguement -should be passed as NULL. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 - -Yet another (and again I hope this really is the last) change has been made -to the API for the pcre_exec() function. An additional argument has been -added to make it possible to start the match other than at the start of the -subject string. This is important if there are lookbehinds. The new man -page has the details, but you just want to convert existing programs, all -you need to do is to stick in a new fifth argument to pcre_exec(), with a -value of zero. For example, change - - pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) -to - pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) - -**** diff --git a/vendor/cegui-0.4.0-custom/src/pcre/README b/vendor/cegui-0.4.0-custom/src/pcre/README deleted file mode 100644 index 31763d7a5d..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/README +++ /dev/null @@ -1,427 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -The latest release of PCRE is always available from - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - -Please read the NEWS file if you are upgrading from a previous release. - -PCRE has its own native API, but a set of "wrapper" functions that are based on -the POSIX API are also supplied in the library libpcreposix. Note that this -just provides a POSIX calling interface to PCRE: the regular expressions -themselves still follow Perl syntax and semantics. The header file -for the POSIX-style functions is called pcreposix.h. The official POSIX name is -regex.h, but I didn't want to risk possible problems with existing files of -that name by distributing it that way. To use it with an existing program that -uses the POSIX API, it will have to be renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, you must take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the "real" POSIX functions of the same name. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way, you will end up with an installed set of -man pages whose names all start with "pcre". The one that is called "pcre" -lists all the others. In addition to these man pages, the PCRE documentation is -supplied in two other forms; however, as there is no standard place to install -them, they are left in the doc directory of the unpacked source distribution. -These forms are: - - 1. Files called doc/pcre.txt, doc/pcregrep.txt, and doc/pcretest.txt. The - first of these is a concatenation of the text forms of all the section 3 - man pages except those that summarize individual functions. The other two - are the text forms of the section 1 man pages for the pcregrep and - pcretest commands. Text forms are provided for ease of scanning with text - editors or similar tools. - - 2. A subdirectory called doc/html contains all the documentation in HTML - form, hyperlinked in various ways, and rooted in a file called - doc/index.html. - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -where there is also a README file giving brief descriptions of what they are. -Several of them provide support for compiling PCRE on various flavours of -Windows systems (I myself do not use Windows). Some are complete in themselves; -others are pointers to URLs containing relevant files. - - -Building PCRE on a Unix-like system ------------------------------------ - -To build PCRE on a Unix-like system, first run the "configure" command from the -PCRE distribution directory, with your current directory set to the directory -where you want the files to be created. This command is a standard GNU -"autoconf" configuration script, for which generic instructions are supplied in -INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient, but the -usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -specifies that the C compiler should be run with the flags '-O2 -Wall' instead -of the default, and that "make install" should install PCRE under /opt/local -instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -There are some optional features that can be included or omitted from the PCRE -library. You can read more about them in the pcrebuild man page. - -. If you want to make use of the support for UTF-8 character strings in PCRE, - you must add --enable-utf8 to the "configure" command. Without it, the code - for handling UTF-8 is not included in the library. (Even when included, it - still has to be enabled by an option at run time.) - -. If, in addition to support for UTF-8 character strings, you want to include - support for the \P, \p, and \X sequences that recognize Unicode character - properties, you must add --enable-unicode-properties to the "configure" - command. This adds about 90K to the size of the library (in the form of a - property table); only the basic two-letter properties such as Lu are - supported. - -. You can build PCRE to recognized CR or NL as the newline character, instead - of whatever your compiler uses for "\n", by adding --newline-is-cr or - --newline-is-nl to the "configure" command, respectively. Only do this if you - really understand what you are doing. On traditional Unix-like systems, the - newline character is NL. - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter which can be set to limit the amount of resources it uses. - If the limit is exceeded during a match, the match fails. The default is ten - million. You can change the default by setting, for example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is discussion on the pcreapi - man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. You can - increase it even more by setting --with-link-size=4, but this is unlikely - ever to be necessary. If you build PCRE with an increased link size, test 2 - (and 5 if you are using UTF-8) will fail. Part of the output of these tests - is a representation of the compiled pattern, and this changes with the link - size. - -. You can build PCRE so that its match() function does not call itself - recursively. Instead, it uses blocks of data from the heap via special - functions pcre_stack_malloc() and pcre_stack_free() to save data that would - otherwise be saved on the stack. To build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. - -The "configure" script builds seven files: - -. pcre.h is build by copying pcre.in and making substitutions -. Makefile is built by copying Makefile.in and making substitutions. -. config.h is built by copying config.in and making substitutions. -. pcre-config is built by copying pcre-config.in and making substitutions. -. libpcre.pc is data for the pkg-config command, built from libpcre.pc.in -. libtool is a script that builds shared and/or static libraries -. RunTest is a script for running tests - -Once "configure" has run, you can run "make". It builds two libraries called -libpcre and libpcreposix, a test program called pcretest, and the pcregrep -command. You can use "make install" to copy these, the public header files -pcre.h and pcreposix.h, and the man pages to appropriate live directories on -your system, in the normal way. - - -Retrieving configuration information on Unix-like systems ---------------------------------------------------------- - -Running "make install" also installs the command pcre-config, which can be used -to recall information about the PCRE configuration and installation. For -example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -pkgconfig. - - -Shared libraries on Unix-like systems -------------------------------------- - -The default distribution builds PCRE as two shared libraries and two static -libraries, as long as the operating system supports shared libraries. Shared -library support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the source directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling on a Unix-like system -------------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, during the building -process, the dftables.c source file is compiled *and run* on the local host, in -order to generate the default character tables (the chartables.c file). It -therefore needs to be compiled with the local compiler, not the cross compiler. -You can do this by specifying CC_FOR_BUILD (and if necessary CFLAGS_FOR_BUILD) -when calling the "configure" command. If they are not specified, they default -to the values of CC and CFLAGS. - - -Building on non-Unix systems ----------------------------- - -For a non-Unix system, read the comments in the file NON-UNIX-USE, though if -the system supports the use of "configure" and "make" you may be able to build -PCRE in the same way as for Unix systems. - -PCRE has been compiled on Windows systems and on Macintoshes, but I don't know -the details because I don't use those systems. It should be straightforward to -build PCRE on any system that has a Standard C compiler, because it uses only -Standard C functions. - - -Testing PCRE ------------- - -To test PCRE on a Unix system, run the RunTest script that is created by the -configuring process. (This can also be run by "make runtest", "make check", or -"make test".) For other systems, see the instructions in NON-UNIX-USE. - -The script runs the pcretest test program (which is documented in its own man -page) on each of the testinput files (in the testdata directory) in turn, -and compares the output with the contents of the corresponding testoutput file. -A file called testtry is used to hold the main output from pcretest -(testsavedregex is also used as a working file). To run pcretest on just one of -the test files, give its number as an argument to RunTest, for example: - - RunTest 2 - -The first file can also be fed directly into the perltest script to check that -Perl gives the same results. The only difference you should see is in the first -few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flag to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -The fourth test checks the UTF-8 support. It is not run automatically unless -PCRE is built with UTF-8 support. To do this you must set --enable-utf8 when -running "configure". This file can be also fed directly to the perltest script, -provided you are running Perl 5.8 or higher. (For Perl 5.6, a small patch, -commented in the script, can be be used.) - -The fifth test checks error handling with UTF-8 encoding, and internal UTF-8 -features of PCRE that are not relevant to Perl. - -The sixth and final test checks the support for Unicode character properties. -It it not run automatically unless PCRE is built with Unicode property support. -To to this you must set --enable-unicode-properties when running "configure". - - -Character tables ----------------- - -PCRE uses four tables for manipulating and identifying characters whose values -are less than 256. The final argument of the pcre_compile() function is a -pointer to a block of memory containing the concatenated tables. A call to -pcre_maketables() can be used to generate a set of tables in the current -locale. If the final argument for pcre_compile() is passed as NULL, a set of -default tables that is built into the binary is used. - -The source file called chartables.c contains the default set of tables. This is -not supplied in the distribution, but is built by the program dftables -(compiled from dftables.c), which uses the ANSI C character handling functions -such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table -sources. This means that the default C locale which is set for your system will -control the contents of these default tables. You can change the default tables -by editing chartables.c and then re-building PCRE. If you do this, you should -probably also edit Makefile to ensure that the file doesn't ever get -re-generated. - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -Manifest --------- - -The distribution should contain the following files: - -(A) The actual source files of the PCRE library functions and their - headers: - - dftables.c auxiliary program for building chartables.c - - get.c ) - maketables.c ) - study.c ) source of the functions - pcre.c ) in the library - pcreposix.c ) - printint.c ) - - ucp.c ) - ucp.h ) source for the code that is used for - ucpinternal.h ) Unicode property handling - ucptable.c ) - ucptypetable.c ) - - pcre.in "source" for the header for the external API; pcre.h - is built from this by "configure" - pcreposix.h header for the external POSIX wrapper API - internal.h header for internal use - config.in template for config.h, which is built by configure - -(B) Auxiliary files: - - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in template for Unix Makefile, which is built by configure - NEWS important changes in this release - NON-UNIX-USE notes on building PCRE on non-Unix systems - README this file - RunTest.in template for a Unix shell script for running tests - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.in the autoconf input used to build configure - doc/Tech.Notes notes on the encoding - doc/*.3 man page sources for the PCRE functions - doc/*.1 man page sources for pcregrep and pcretest - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre.pc.in "source" for libpcre.pc for pkg-config - ltmain.sh file used to build a libtool script - mkinstalldirs script for making install directories - pcretest.c comprehensive test program - pcredemo.c simple demonstration of coding calls to PCRE - perltest Perl test program - pcregrep.c source of a grep utility that uses PCRE - pcre-config.in source of script which retains PCRE information - testdata/testinput1 test data, compatible with Perl - testdata/testinput2 test data for error messages and non-Perl things - testdata/testinput3 test data for locale-specific tests - testdata/testinput4 test data for UTF-8 tests compatible with Perl - testdata/testinput5 test data for other UTF-8 tests - testdata/testinput6 test data for Unicode property support tests - testdata/testoutput1 test results corresponding to testinput1 - testdata/testoutput2 test results corresponding to testinput2 - testdata/testoutput3 test results corresponding to testinput3 - testdata/testoutput4 test results corresponding to testinput4 - testdata/testoutput5 test results corresponding to testinput5 - testdata/testoutput6 test results corresponding to testinput6 - -(C) Auxiliary files for Win32 DLL - - dll.mk - libpcre.def - libpcreposix.def - pcre.def - -(D) Auxiliary file for VPASCAL - - makevp.bat - -Philip Hazel -September 2004 diff --git a/vendor/cegui-0.4.0-custom/src/pcre/README-CEGUI b/vendor/cegui-0.4.0-custom/src/pcre/README-CEGUI deleted file mode 100644 index 456b3588cb..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/README-CEGUI +++ /dev/null @@ -1,10 +0,0 @@ -CEGUI is embedding a copy of PCRE into itself via its own build system(s). - -The version of PCRE included here has been modified from the original -distribution; the original UNIX build system has been removed, pcre.h has been -pre-created from (removed file) pcre.in, and pcreconfig.h has been pre-created -and edited from (removed file) config.h.in. Additionally, various other test -data, documentation, and source for utilities have been removed. - -For details about where to obtain the official releases of PCRE, please see the -README file in this directory. \ No newline at end of file diff --git a/vendor/cegui-0.4.0-custom/src/pcre/chartables.c b/vendor/cegui-0.4.0-custom/src/pcre/chartables.c deleted file mode 100644 index 55e413cfca..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/chartables.c +++ /dev/null @@ -1,183 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* This file is automatically written by the dftables auxiliary -program. If you edit it by hand, you might like to edit the Makefile to -prevent its ever being regenerated. - -This file is #included in the compilation of pcre.c to build the default -character tables which are used when no tables are passed to the compile -function. */ - -static unsigned char pcre_default_tables[] = { - -/* This table is a lower casing table. */ - - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 97, 98, 99,100,101,102,103, - 104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119, - 120,121,122, 91, 92, 93, 94, 95, - 96, 97, 98, 99,100,101,102,103, - 104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119, - 120,121,122,123,124,125,126,127, - 128,129,130,131,132,133,134,135, - 136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151, - 152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167, - 168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183, - 184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199, - 200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215, - 216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231, - 232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247, - 248,249,250,251,252,253,254,255, - -/* This table is a case flipping table. */ - - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 97, 98, 99,100,101,102,103, - 104,105,106,107,108,109,110,111, - 112,113,114,115,116,117,118,119, - 120,121,122, 91, 92, 93, 94, 95, - 96, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90,123,124,125,126,127, - 128,129,130,131,132,133,134,135, - 136,137,138,139,140,141,142,143, - 144,145,146,147,148,149,150,151, - 152,153,154,155,156,157,158,159, - 160,161,162,163,164,165,166,167, - 168,169,170,171,172,173,174,175, - 176,177,178,179,180,181,182,183, - 184,185,186,187,188,189,190,191, - 192,193,194,195,196,197,198,199, - 200,201,202,203,204,205,206,207, - 208,209,210,211,212,213,214,215, - 216,217,218,219,220,221,222,223, - 224,225,226,227,228,229,230,231, - 232,233,234,235,236,237,238,239, - 240,241,242,243,244,245,246,247, - 248,249,250,251,252,253,254,255, - -/* This table contains bit maps for various character classes. -Each map is 32 bytes long and the bits run from the least -significant end of each byte. The classes that have their own -maps are: space, xdigit, digit, upper, lower, word, graph -print, punct, and cntrl. Other classes are built from combinations. */ - - 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, - 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, - 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, - 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - -/* This table identifies various classes of character by individual bits: - 0x01 white space character - 0x02 letter - 0x04 decimal digit - 0x08 hexadecimal digit - 0x10 alphanumeric or '_' - 0x80 regular expression metacharacter or binary zero -*/ - - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ - 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ - 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ - 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ - 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ - 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ - 0x12,0x12,0x12,0x80,0x00,0x00,0x80,0x10, /* X - _ */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ - 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ - 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ - -/* End of chartables.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/Tech.Notes b/vendor/cegui-0.4.0-custom/src/pcre/doc/Tech.Notes deleted file mode 100644 index 9bf949f39c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/Tech.Notes +++ /dev/null @@ -1,315 +0,0 @@ -Technical Notes about PCRE --------------------------- - -Historical note 1 ------------------ - -Many years ago I implemented some regular expression functions to an algorithm -suggested by Martin Richards. These were not Unix-like in form, and were quite -restricted in what they could do by comparison with Perl. The interesting part -about the algorithm was that the amount of space required to hold the compiled -form of an expression was known in advance. The code to apply an expression did -not operate by backtracking, as the original Henry Spencer code and current -Perl code does, but instead checked all possibilities simultaneously by keeping -a list of current states and checking all of them as it advanced through the -subject string. In the terminology of Jeffrey Friedl's book, it was a "DFA -algorithm". When the pattern was all used up, all remaining states were -possible matches, and the one matching the longest subset of the subject string -was chosen. This did not necessarily maximize the individual wild portions of -the pattern, as is expected in Unix and Perl-style regular expressions. - -Historical note 2 ------------------ - -By contrast, the code originally written by Henry Spencer and subsequently -heavily modified for Perl actually compiles the expression twice: once in a -dummy mode in order to find out how much store will be needed, and then for -real. The execution function operates by backtracking and maximizing (or, -optionally, minimizing in Perl) the amount of the subject that matches -individual wild portions of the pattern. This is an "NFA algorithm" in Friedl's -terminology. - -OK, here's the real stuff -------------------------- - -For the set of functions that forms PCRE (which are unrelated to those -mentioned above), I tried at first to invent an algorithm that used an amount -of store bounded by a multiple of the number of characters in the pattern, to -save on compiling time. However, because of the greater complexity in Perl -regular expressions, I couldn't do this. In any case, a first pass through the -pattern is needed, for a number of reasons. PCRE works by running a very -degenerate first pass to calculate a maximum store size, and then a second pass -to do the real compile - which may use a bit less than the predicted amount of -store. The idea is that this is going to turn out faster because the first pass -is degenerate and the second pass can just store stuff straight into the -vector. It does make the compiling functions bigger, of course, but they have -got quite big anyway to handle all the Perl stuff. - -The compiled form of a pattern is a vector of bytes, containing items of -variable length. The first byte in an item is an opcode, and the length of the -item is either implicit in the opcode or contained in the data bytes that -follow it. - -In many cases below "two-byte" data values are specified. This is in fact just -a default. PCRE can be compiled to use 3-byte or 4-byte values (impairing the -performance). This is necessary only when patterns whose compiled length is -greater than 64K are going to be processed. In this description, we assume the -"normal" compilation options. - -A list of all the opcodes follows: - -Opcodes with no following data ------------------------------- - -These items are all just one byte long - - OP_END end of pattern - OP_ANY match any character - OP_ANYBYTE match any single byte, even in UTF-8 mode - OP_SOD match start of data: \A - OP_SOM, start of match (subject + offset): \G - OP_CIRC ^ (start of data, or after \n in multiline) - OP_NOT_WORD_BOUNDARY \W - OP_WORD_BOUNDARY \w - OP_NOT_DIGIT \D - OP_DIGIT \d - OP_NOT_WHITESPACE \S - OP_WHITESPACE \s - OP_NOT_WORDCHAR \W - OP_WORDCHAR \w - OP_EODN match end of data or \n at end: \Z - OP_EOD match end of data: \z - OP_DOLL $ (end of data, or before \n in multiline) - OP_EXTUNI match an extended Unicode character - - -Repeating single characters ---------------------------- - -The common repeats (*, +, ?) when applied to a single character use the -following opcodes: - - OP_STAR - OP_MINSTAR - OP_PLUS - OP_MINPLUS - OP_QUERY - OP_MINQUERY - -In ASCII mode, these are two-byte items; in UTF-8 mode, the length is variable. -Those with "MIN" in their name are the minimizing versions. Each is followed by -the character that is to be repeated. Other repeats make use of - - OP_UPTO - OP_MINUPTO - OP_EXACT - -which are followed by a two-byte count (most significant first) and the -repeated character. OP_UPTO matches from 0 to the given number. A repeat with a -non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an -OP_UPTO (or OP_MINUPTO). - - -Repeating character types -------------------------- - -Repeats of things like \d are done exactly as for single characters, except -that instead of a character, the opcode for the type is stored in the data -byte. The opcodes are: - - OP_TYPESTAR - OP_TYPEMINSTAR - OP_TYPEPLUS - OP_TYPEMINPLUS - OP_TYPEQUERY - OP_TYPEMINQUERY - OP_TYPEUPTO - OP_TYPEMINUPTO - OP_TYPEEXACT - - -Match by Unicode property -------------------------- - -OP_PROP and OP_NOTPROP are used for positive and negative matches of a -character by testing its Unicode property (the \p and \P escape sequences). -Each is followed by a single byte that encodes the desired property value. - -Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by two -bytes: OP_PROP or OP_NOTPROP and then the desired property value. - - -Matching literal characters ---------------------------- - -The OP_CHAR opcode is followed by a single character that is to be matched -casefully. For caseless matching, OP_CHARNC is used. In UTF-8 mode, the -character may be more than one byte long. (Earlier versions of PCRE used -multi-character strings, but this was changed to allow some new features to be -added.) - - -Character classes ------------------ - -If there is only one character, OP_CHAR or OP_CHARNC is used for a positive -class, and OP_NOT for a negative one (that is, for something like [^a]). -However, in UTF-8 mode, the use of OP_NOT applies only to characters with -values < 128, because OP_NOT is confined to single bytes. - -Another set of repeating opcodes (OP_NOTSTAR etc.) are used for a repeated, -negated, single-character class. The normal ones (OP_STAR etc.) are used for a -repeated positive single-character class. - -When there's more than one character in a class and all the characters are less -than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a negative -one. In either case, the opcode is followed by a 32-byte bit map containing a 1 -bit for every character that is acceptable. The bits are counted from the least -significant end of each byte. - -The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8 mode, -subject characters with values greater than 256 can be handled correctly. For -OP_CLASS they don't match, whereas for OP_NCLASS they do. - -For classes containing characters with values > 255, OP_XCLASS is used. It -optionally uses a bit map (if any characters lie within it), followed by a list -of pairs and single characters. There is a flag character than indicates -whether it's a positive or a negative class. - - -Back references ---------------- - -OP_REF is followed by two bytes containing the reference number. - - -Repeating character classes and back references ------------------------------------------------ - -Single-character classes are handled specially (see above). This applies to -OP_CLASS and OP_REF. In both cases, the repeat information follows the base -item. The matching code looks at the following opcode to see if it is one of - - OP_CRSTAR - OP_CRMINSTAR - OP_CRPLUS - OP_CRMINPLUS - OP_CRQUERY - OP_CRMINQUERY - OP_CRRANGE - OP_CRMINRANGE - -All but the last two are just single-byte items. The others are followed by -four bytes of data, comprising the minimum and maximum repeat counts. - - -Brackets and alternation ------------------------- - -A pair of non-capturing (round) brackets is wrapped round each expression at -compile time, so alternation always happens in the context of brackets. - -Non-capturing brackets use the opcode OP_BRA, while capturing brackets use -OP_BRA+1, OP_BRA+2, etc. [Note for North Americans: "bracket" to some English -speakers, including myself, can be round, square, curly, or pointy. Hence this -usage.] - -Originally PCRE was limited to 99 capturing brackets (so as not to use up all -the opcodes). From release 3.5, there is no limit. What happens is that the -first ones, up to EXTRACT_BASIC_MAX are handled with separate opcodes, as -above. If there are more, the opcode is set to EXTRACT_BASIC_MAX+1, and the -first operation in the bracket is OP_BRANUMBER, followed by a 2-byte bracket -number. This opcode is ignored while matching, but is fished out when handling -the bracket itself. (They could have all been done like this, but I was making -minimal changes.) - -A bracket opcode is followed by two bytes which give the offset to the next -alternative OP_ALT or, if there aren't any branches, to the matching OP_KET -opcode. Each OP_ALT is followed by two bytes giving the offset to the next one, -or to the OP_KET opcode. - -OP_KET is used for subpatterns that do not repeat indefinitely, while -OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or -maximally respectively. All three are followed by two bytes giving (as a -positive number) the offset back to the matching OP_BRA opcode. - -If a subpattern is quantified such that it is permitted to match zero times, it -is preceded by one of OP_BRAZERO or OP_BRAMINZERO. These are single-byte -opcodes which tell the matcher that skipping this subpattern entirely is a -valid branch. - -A subpattern with an indefinite maximum repetition is replicated in the -compiled data its minimum number of times (or once with OP_BRAZERO if the -minimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX -as appropriate. - -A subpattern with a bounded maximum repetition is replicated in a nested -fashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO -before each replication after the minimum, so that, for example, (abc){2,5} is -compiled as (abc)(abc)((abc)((abc)(abc)?)?)?. - - -Assertions ----------- - -Forward assertions are just like other subpatterns, but starting with one of -the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes -OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion -is OP_REVERSE, followed by a two byte count of the number of characters to move -back the pointer in the subject string. When operating in UTF-8 mode, the count -is a character count rather than a byte count. A separate count is present in -each alternative of a lookbehind assertion, allowing them to have different -fixed lengths. - - -Once-only subpatterns ---------------------- - -These are also just like other subpatterns, but they start with the opcode -OP_ONCE. - - -Conditional subpatterns ------------------------ - -These are like other subpatterns, but they start with the opcode OP_COND. If -the condition is a back reference, this is stored at the start of the -subpattern using the opcode OP_CREF followed by two bytes containing the -reference number. If the condition is "in recursion" (coded as "(?(R)"), the -same scheme is used, with a "reference number" of 0xffff. Otherwise, a -conditional subpattern always starts with one of the assertions. - - -Recursion ---------- - -Recursion either matches the current regex, or some subexpression. The opcode -OP_RECURSE is followed by an value which is the offset to the starting bracket -from the start of the whole pattern. - - -Callout -------- - -OP_CALLOUT is followed by one byte of data that holds a callout number in the -range 0 to 254 for manual callouts, or 255 for an automatic callout. In both -cases there follows a two-byte value giving the offset in the pattern to the -start of the following item, and another two-byte item giving the length of the -next item. - - -Changing options ----------------- - -If any of the /i, /m, or /s options are changed within a pattern, an OP_OPT -opcode is compiled, followed by one byte containing the new settings of these -flags. If there are several alternatives, there is an occurrence of OP_OPT at -the start of all those following the first options change, to set appropriate -options for the start of the alternative. Immediately after the end of the -group there is another such item to reset the flags to their previous values. A -change of flag right at the very start of the pattern can be handled entirely -at compile time, and so does not cause anything to be put into the compiled -data. - -Philip Hazel -September 2004 diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/index.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/index.html deleted file mode 100644 index 7617449a9b..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - -PCRE specification - - -

    Perl-compatible Regular Expressions (PCRE)

    -

    -The HTML documentation for PCRE comprises the following pages: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    pcre  Introductory page
    pcreapi  PCRE's native API
    pcrebuild  Options for building PCRE
    pcrecallout  The callout facility
    pcrecompat  Compability with Perl
    pcregrep  The pcregrep command
    pcrepartial  Using PCRE for partial matching
    pcrepattern  Specification of the regular expressions supported by PCRE
    pcreperform  Some comments on performance
    pcreposix  The POSIX API to the PCRE library
    pcreprecompile  How to save and re-use compiled patterns
    pcresample  Description of the sample program
    pcretest  The pcretest command for testing PCRE
    - -

    -There are also individual pages that summarize the interface for each function -in the library: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    pcre_compile  Compile a regular expression
    pcre_config  Show build-time configuration options
    pcre_copy_named_substring  Extract named substring into given buffer
    pcre_copy_substring  Extract numbered substring into given buffer
    pcre_exec  Match a compiled pattern to a subject string
    pcre_free_substring  Free extracted substring
    pcre_free_substring_list  Free list of extracted substrings
    pcre_fullinfo  Extract information about a pattern
    pcre_get_named_substring  Extract named substring into new memory
    pcre_get_stringnumber  Convert captured string name to number
    pcre_get_substring  Extract numbered substring into new memory
    pcre_get_substring_list  Extract all substrings into new memory
    pcre_info  Obsolete information extraction function
    pcre_maketables  Build character tables in current locale
    pcre_study  Study a compiled pattern
    pcre_version  Return PCRE version and release date
    - - diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre.html deleted file mode 100644 index f3ecde0260..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre.html +++ /dev/null @@ -1,214 +0,0 @@ - - -pcre specification - - -

    pcre man page

    -
    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    INTRODUCTION
    -

    -The PCRE library is a set of functions that implement regular expression -pattern matching using the same syntax and semantics as Perl, with just a few -differences. The current implementation of PCRE (release 5.x) corresponds -approximately with Perl 5.8, including support for UTF-8 encoded strings and -Unicode general category properties. However, this support has to be explicitly -enabled; it is not the default. -

    -

    -PCRE is written in C and released as a C library. A number of people have -written wrappers and interfaces of various kinds. A C++ class is included in -these contributions, which can be found in the Contrib directory at the -primary FTP site, which is: -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -

    -

    -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -pcrepattern -and -pcrecompat -pages. -

    -

    -Some features of PCRE can be included, excluded, or changed when the library is -built. The -pcre_config() -function makes it possible for a client to discover which features are -available. The features themselves are described in the -pcrebuild -page. Documentation about building PCRE for various operating systems can be -found in the README file in the source distribution. -

    -
    USER DOCUMENTATION
    -

    -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -all the sections are concatenated, for ease of searching. The sections are as -follows: -

    -  pcre              this document
    -  pcreapi           details of PCRE's native API
    -  pcrebuild         options for building PCRE
    -  pcrecallout       details of the callout feature
    -  pcrecompat        discussion of Perl compatibility
    -  pcregrep          description of the pcregrep command
    -  pcrepartial       details of the partial matching facility
    -  pcrepattern       syntax and semantics of supported regular expressions
    -  pcreperform       discussion of performance issues
    -  pcreposix         the POSIX-compatible API
    -  pcreprecompile    details of saving and re-using precompiled patterns
    -  pcresample        discussion of the sample program
    -  pcretest          description of the pcretest testing command
    -
    -In addition, in the "man" and HTML formats, there is a short page for each -library function, listing its arguments and results. -

    -
    LIMITATIONS
    -

    -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -

    -

    -The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE is -compiled with the default internal linkage size of 2. If you want to process -regular expressions that are truly enormous, you can compile PCRE with an -internal linkage size of 3 or 4 (see the README file in the source -distribution and the -pcrebuild -documentation for details). In these cases the limit is substantially larger. -However, the speed of execution will be slower. -

    -

    -All values in repeating quantifiers must be less than 65536. -The maximum number of capturing subpatterns is 65535. -

    -

    -There is no limit to the number of non-capturing subpatterns, but the maximum -depth of nesting of all kinds of parenthesized subpattern, including capturing -subpatterns, assertions, and other types of subpattern, is 200. -

    -

    -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, PCRE uses recursion to handle subpatterns -and indefinite repetition. This means that the available stack space may limit -the size of a subject string that can be processed by certain patterns. -

    -
    UTF-8 AND UNICODE PROPERTY SUPPORT
    -

    -From release 3.3, PCRE has had some support for character strings encoded in -the UTF-8 format. For release 4.0 this was greatly extended to cover most -common requirements, and in release 5.0 additional support for Unicode general -category properties was added. -

    -

    -In order process UTF-8 strings, you must build PCRE to include UTF-8 support in -the code, and, in addition, you must call -pcre_compile() -with the PCRE_UTF8 option flag. When you do this, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of just strings of bytes. -

    -

    -If you compile PCRE with UTF-8 support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF8 flag in several places, so should not be very large. -

    -

    -If PCRE is built with Unicode character property support (which implies UTF-8 -support), the escape sequences \p{..}, \P{..}, and \X are supported. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number. A full list is given in the -pcrepattern -documentation. The PCRE library is increased in size by about 90K when Unicode -property support is included. -

    -

    -The following comments apply when PCRE is running in UTF-8 mode: -

    -

    -1. When you set the PCRE_UTF8 flag, the strings passed as patterns and subjects -are checked for validity on entry to the relevant functions. If an invalid -UTF-8 string is passed, an error return is given. In some situations, you may -already know that your strings are valid, and therefore want to skip these -checks in order to improve performance. If you set the PCRE_NO_UTF8_CHECK flag -at compile time or at run time, PCRE assumes that the pattern or subject it -is given (respectively) contains only valid UTF-8 codes. In this case, it does -not diagnose an invalid UTF-8 string. If you pass an invalid UTF-8 string to -PCRE when PCRE_NO_UTF8_CHECK is set, the results are undefined. Your program -may crash. -

    -

    -2. In a pattern, the escape sequence \x{...}, where the contents of the braces -is a string of hexadecimal digits, is interpreted as a UTF-8 character whose -code number is the given hexadecimal number, for example: \x{1234}. If a -non-hexadecimal digit appears between the braces, the item is not recognized. -This escape sequence can be used either as a literal, or within a character -class. -

    -

    -3. The original hexadecimal escape sequence, \xhh, matches a two-byte UTF-8 -character if the value is greater than 127. -

    -

    -4. Repeat quantifiers apply to complete UTF-8 characters, not to individual -bytes, for example: \x{100}{3}. -

    -

    -5. The dot metacharacter matches one UTF-8 character instead of a single byte. -

    -

    -6. The escape sequence \C can be used to match a single byte in UTF-8 mode, -but its use can lead to some strange effects. -

    -

    -7. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly -test characters of any code value, but the characters that PCRE recognizes as -digits, spaces, or word characters remain the same set as before, all with -values less than 256. This remains true even when PCRE includes Unicode -property support, because to do otherwise would slow down PCRE in many common -cases. If you really want to test for a wider sense of, say, "digit", you -must use Unicode property tests such as \p{Nd}. -

    -

    -8. Similarly, characters that match the POSIX named character classes are all -low-valued characters. -

    -

    -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. Even when Unicode -property support is available, PCRE still uses its own character tables when -checking the case of low-valued characters, so as not to degrade performance. -The Unicode property information is used only for characters with higher -values. -

    -
    AUTHOR
    -

    -Philip Hazel <ph10@cam.ac.uk> -
    -University Computing Service, -
    -Cambridge CB2 3QG, England. -
    -Phone: +44 1223 334714 -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_compile.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_compile.html deleted file mode 100644 index 03e88e8c40..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_compile.html +++ /dev/null @@ -1,75 +0,0 @@ - - -pcre_compile specification - - -

    pcre_compile man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -pcre *pcre_compile(const char *pattern, int options, -const char **errptr, int *erroffset, -const unsigned char *tableptr); -

    -
    -DESCRIPTION -
    -

    -This function compiles a regular expression into an internal form. Its -arguments are: -

    -  pattern       A zero-terminated string containing the
    -                  regular expression to be compiled
    -  options       Zero or more option bits
    -  errptr        Where to put an error message
    -  erroffset     Offset in pattern where error was found
    -  tableptr      Pointer to character tables, or NULL to
    -                  use the built-in default
    -
    -The option bits are: -
    -  PCRE_ANCHORED         Force pattern anchoring
    -  PCRE_AUTO_CALLOUT     Compile automatic callouts
    -  PCRE_CASELESS         Do caseless matching
    -  PCRE_DOLLAR_ENDONLY   $ not to match newline at end
    -  PCRE_DOTALL           . matches anything including NL
    -  PCRE_EXTENDED         Ignore whitespace and # comments
    -  PCRE_EXTRA            PCRE extra features
    -                          (not much use currently)
    -  PCRE_MULTILINE        ^ and $ match newlines within data
    -  PCRE_NO_AUTO_CAPTURE  Disable numbered capturing paren-
    -                          theses (named ones available)
    -  PCRE_UNGREEDY         Invert greediness of quantifiers
    -  PCRE_UTF8             Run in UTF-8 mode
    -  PCRE_NO_UTF8_CHECK    Do not check the pattern for UTF-8
    -                          validity (only relevant if
    -                          PCRE_UTF8 is set)
    -
    -PCRE must be built with UTF-8 support in order to use PCRE_UTF8 and -PCRE_NO_UTF8_CHECK. -

    -

    -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_config.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_config.html deleted file mode 100644 index 4b94ce5f08..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_config.html +++ /dev/null @@ -1,60 +0,0 @@ - - -pcre_config specification - - -

    pcre_config man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_config(int what, void *where); -

    -
    -DESCRIPTION -
    -

    -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. Its -arguments are as follows: -

    -  what     A code specifying what information is required
    -  where    Points to where to put the data
    -
    -The available codes are: -
    -  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
    -  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
    -  PCRE_CONFIG_NEWLINE       Value of the newline character
    -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
    -                            Threshold of return slots, above
    -                              which malloc() is used by
    -                              the POSIX API
    -  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
    -  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no)
    -  PCRE_CONFIG_UNICODE_PROPERTIES
    -                            Availability of Unicode property support
    -                              (1=yes 0=no)
    -
    -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_named_substring.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_named_substring.html deleted file mode 100644 index 6e6cd8b634..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_named_substring.html +++ /dev/null @@ -1,53 +0,0 @@ - - -pcre_copy_named_substring specification - - -

    pcre_copy_named_substring man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_copy_named_substring(const pcre *code, -const char *subject, int *ovector, -int stringcount, const char *stringname, -char *buffer, int buffersize); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -

    -  code          Pattern that was successfully matched
    -  subject       Subject that has been successfully matched
    -  ovector       Offset vector that pcre_exec() used
    -  stringcount   Value returned by pcre_exec()
    -  stringname    Name of the required substring
    -  buffer        Buffer to receive the string
    -  buffersize    Size of buffer
    -
    -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_substring.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_substring.html deleted file mode 100644 index ec314aec95..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_copy_substring.html +++ /dev/null @@ -1,51 +0,0 @@ - - -pcre_copy_substring specification - - -

    pcre_copy_substring man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_copy_substring(const char *subject, int *ovector, -int stringcount, int stringnumber, char *buffer, -int buffersize); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -

    -  subject       Subject that has been successfully matched
    -  ovector       Offset vector that pcre_exec() used
    -  stringcount   Value returned by pcre_exec()
    -  stringnumber  Number of the required substring
    -  buffer        Buffer to receive the string
    -  buffersize    Size of buffer
    -
    -The yield is the legnth of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_exec.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_exec.html deleted file mode 100644 index b03850215e..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_exec.html +++ /dev/null @@ -1,78 +0,0 @@ - - -pcre_exec specification - - -

    pcre_exec man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_exec(const pcre *code, const pcre_extra *extra, -const char *subject, int length, int startoffset, -int options, int *ovector, int ovecsize); -

    -
    -DESCRIPTION -
    -

    -This function matches a compiled regular expression against a given subject -string, and returns offsets to capturing subexpressions. Its arguments are: -

    -  code         Points to the compiled pattern
    -  extra        Points to an associated pcre_extra structure,
    -                 or is NULL
    -  subject      Points to the subject string
    -  length       Length of the subject string, in bytes
    -  startoffset  Offset in bytes in the subject at which to
    -                 start matching
    -  options      Option bits
    -  ovector      Points to a vector of ints for result offsets
    -  ovecsize     Number of elements in the vector (a multiple of 3)
    -
    -The options are: -
    -  PCRE_ANCHORED      Match only at the first position
    -  PCRE_NOTBOL        Subject is not the beginning of a line
    -  PCRE_NOTEOL        Subject is not the end of a line
    -  PCRE_NOTEMPTY      An empty string is not a valid match
    -  PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8
    -                       validity (only relevant if PCRE_UTF8
    -                       was set at compile time)
    -  PCRE_PARTIAL       Return PCRE_ERROR_PARTIAL for a partial match
    -
    -There are restrictions on what may appear in a pattern when partial matching is -requested. -

    -

    -A pcre_extra structure contains the following fields: -

    -  flags        Bits indicating which fields are set
    -  study_data   Opaque data from pcre_study()
    -  match_limit  Limit on internal recursion
    -  callout_data Opaque data passed back to callouts
    -  tables       Points to character tables or is NULL
    -
    -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_CALLOUT_DATA, and PCRE_EXTRA_TABLES. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring.html deleted file mode 100644 index 89310ccb16..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring.html +++ /dev/null @@ -1,40 +0,0 @@ - - -pcre_free_substring specification - - -

    pcre_free_substring man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -void pcre_free_substring(const char *stringptr); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for freeing the store obtained by a previous -call to pcre_get_substring() or pcre_get_named_substring(). Its -only argument is a pointer to the string. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring_list.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring_list.html deleted file mode 100644 index cd61fb89b8..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_free_substring_list.html +++ /dev/null @@ -1,40 +0,0 @@ - - -pcre_free_substring_list specification - - -

    pcre_free_substring_list man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -void pcre_free_substring_list(const char **stringptr); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for freeing the store obtained by a previous -call to pcre_get_substring_list(). Its only argument is a pointer to the -list of string pointers. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_fullinfo.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_fullinfo.html deleted file mode 100644 index 399edcb177..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_fullinfo.html +++ /dev/null @@ -1,71 +0,0 @@ - - -pcre_fullinfo specification - - -

    pcre_fullinfo man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, -int what, void *where); -

    -
    -DESCRIPTION -
    -

    -This function returns information about a compiled pattern. Its arguments are: -

    -  code                      Compiled regular expression
    -  extra                     Result of pcre_study() or NULL
    -  what                      What information is required
    -  where                     Where to put the information
    -
    -The following information is available: -
    -  PCRE_INFO_BACKREFMAX      Number of highest back reference
    -  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
    -  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
    -  PCRE_INFO_FIRSTBYTE       Fixed first byte for a match, or
    -                              -1 for start of string
    -                                 or after newline, or
    -                              -2 otherwise
    -  PCRE_INFO_FIRSTTABLE      Table of first bytes
    -                              (after studying)
    -  PCRE_INFO_LASTLITERAL     Literal last byte required
    -  PCRE_INFO_NAMECOUNT       Number of named subpatterns
    -  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
    -  PCRE_INFO_NAMETABLE       Pointer to name table
    -  PCRE_INFO_OPTIONS         Options used for compilation
    -  PCRE_INFO_SIZE            Size of compiled pattern
    -  PCRE_INFO_STUDYSIZE       Size of study data
    -
    -The yield of the function is zero on success or: -
    -  PCRE_ERROR_NULL           the argument code was NULL
    -                            the argument where was NULL
    -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
    -  PCRE_ERROR_BADOPTION      the value of what was invalid
    -
    -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_named_substring.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_named_substring.html deleted file mode 100644 index c2df22164b..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_named_substring.html +++ /dev/null @@ -1,54 +0,0 @@ - - -pcre_get_named_substring specification - - -

    pcre_get_named_substring man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_get_named_substring(const pcre *code, -const char *subject, int *ovector, -int stringcount, const char *stringname, -const char **stringptr); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for extracting a captured substring by name. The -arguments are: -

    -  code          Compiled pattern
    -  subject       Subject that has been successfully matched
    -  ovector       Offset vector that pcre_exec() used
    -  stringcount   Value returned by pcre_exec()
    -  stringname    Name of the required substring
    -  stringptr     Where to put the string pointer
    -
    -The memory in which the substring is placed is obtained by calling -pcre_malloc(). The yield of the function is the length of the extracted -substring, PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_stringnumber.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_stringnumber.html deleted file mode 100644 index c4b33343e9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_stringnumber.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_get_stringnumber specification - - -

    pcre_get_stringnumber man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_get_stringnumber(const pcre *code, -const char *name); -

    -
    -DESCRIPTION -
    -

    -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -

    -  code    Compiled regular expression
    -  name    Name whose number is required
    -
    -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring.html deleted file mode 100644 index 84db08aefd..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring.html +++ /dev/null @@ -1,52 +0,0 @@ - - -pcre_get_substring specification - - -

    pcre_get_substring man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_get_substring(const char *subject, int *ovector, -int stringcount, int stringnumber, -const char **stringptr); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for extracting a captured substring. The -arguments are: -

    -  subject       Subject that has been successfully matched
    -  ovector       Offset vector that pcre_exec() used
    -  stringcount   Value returned by pcre_exec()
    -  stringnumber  Number of the required substring
    -  stringptr     Where to put the string pointer
    -
    -The memory in which the substring is placed is obtained by calling -pcre_malloc(). The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring_list.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring_list.html deleted file mode 100644 index 21d5d56004..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_get_substring_list.html +++ /dev/null @@ -1,51 +0,0 @@ - - -pcre_get_substring_list specification - - -

    pcre_get_substring_list man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_get_substring_list(const char *subject, -int *ovector, int stringcount, const char ***listptr); -

    -
    -DESCRIPTION -
    -

    -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -

    -  subject       Subject that has been successfully matched
    -  ovector       Offset vector that pcre_exec used
    -  stringcount   Value returned by pcre_exec
    -  listptr       Where to put a pointer to the list
    -
    -The memory in which the substrings and the list are placed is obtained by -calling pcre_malloc(). A pointer to a list of pointers is put in -the variable whose address is in listptr. The list is terminated by a -NULL pointer. The yield of the function is zero on success or -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_info.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_info.html deleted file mode 100644 index 1d7a8ccaa6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_info.html +++ /dev/null @@ -1,39 +0,0 @@ - - -pcre_info specification - - -

    pcre_info man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -int pcre_info(const pcre *code, int *optptr, int -*firstcharptr); -

    -
    -DESCRIPTION -
    -

    -This function is obsolete. You should be using pcre_fullinfo() instead. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_maketables.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_maketables.html deleted file mode 100644 index 6c97b779f4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_maketables.html +++ /dev/null @@ -1,42 +0,0 @@ - - -pcre_maketables specification - - -

    pcre_maketables man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -const unsigned char *pcre_maketables(void); -

    -
    -DESCRIPTION -
    -

    -This function builds a set of character tables for character values less than -256. These can be passed to pcre_compile() to override PCRE's internal, -built-in tables (which were made by pcre_maketables() when PCRE was -compiled). You might want to do this if you are using a non-standard locale. -The function yields a pointer to the tables. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_study.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_study.html deleted file mode 100644 index d5a4de1b27..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_study.html +++ /dev/null @@ -1,56 +0,0 @@ - - -pcre_study specification - - -

    pcre_study man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -pcre_extra *pcre_study(const pcre *code, int options, -const char **errptr); -

    -
    -DESCRIPTION -
    -

    -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -

    -  code       A compiled regular expression
    -  options    Options for pcre_study()
    -  errptr     Where to put an error message
    -
    -If the function succeeds, it returns a value that can be passed to -pcre_exec() via its extra argument. -

    -

    -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -

    -

    -There are currently no options defined; the value of the second argument should -always be zero. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_version.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_version.html deleted file mode 100644 index 0c534455bb..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcre_version.html +++ /dev/null @@ -1,39 +0,0 @@ - - -pcre_version specification - - -

    pcre_version man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -SYNOPSIS -
    -

    -#include <pcre.h> -

    -

    -char *pcre_version(void); -

    -
    -DESCRIPTION -
    -

    -This function returns a character string that gives the version number of the -PCRE library and the date of its release. -

    -

    -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreapi.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreapi.html deleted file mode 100644 index 2e7bc07236..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreapi.html +++ /dev/null @@ -1,1287 +0,0 @@ - - -pcreapi specification - - -

    pcreapi man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    PCRE NATIVE API
    -

    -#include <pcre.h> -

    -

    -pcre *pcre_compile(const char *pattern, int options, -const char **errptr, int *erroffset, -const unsigned char *tableptr); -

    -

    -pcre_extra *pcre_study(const pcre *code, int options, -const char **errptr); -

    -

    -int pcre_exec(const pcre *code, const pcre_extra *extra, -const char *subject, int length, int startoffset, -int options, int *ovector, int ovecsize); -

    -

    -int pcre_copy_named_substring(const pcre *code, -const char *subject, int *ovector, -int stringcount, const char *stringname, -char *buffer, int buffersize); -

    -

    -int pcre_copy_substring(const char *subject, int *ovector, -int stringcount, int stringnumber, char *buffer, -int buffersize); -

    -

    -int pcre_get_named_substring(const pcre *code, -const char *subject, int *ovector, -int stringcount, const char *stringname, -const char **stringptr); -

    -

    -int pcre_get_stringnumber(const pcre *code, -const char *name); -

    -

    -int pcre_get_substring(const char *subject, int *ovector, -int stringcount, int stringnumber, -const char **stringptr); -

    -

    -int pcre_get_substring_list(const char *subject, -int *ovector, int stringcount, const char ***listptr); -

    -

    -void pcre_free_substring(const char *stringptr); -

    -

    -void pcre_free_substring_list(const char **stringptr); -

    -

    -const unsigned char *pcre_maketables(void); -

    -

    -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, -int what, void *where); -

    -

    -int pcre_info(const pcre *code, int *optptr, int -*firstcharptr); -

    -

    -int pcre_config(int what, void *where); -

    -

    -char *pcre_version(void); -

    -

    -void *(*pcre_malloc)(size_t); -

    -

    -void (*pcre_free)(void *); -

    -

    -void *(*pcre_stack_malloc)(size_t); -

    -

    -void (*pcre_stack_free)(void *); -

    -

    -int (*pcre_callout)(pcre_callout_block *); -

    -
    PCRE API OVERVIEW
    -

    -PCRE has its own native API, which is described in this document. There is also -a set of wrapper functions that correspond to the POSIX regular expression API. -These are described in the -pcreposix -documentation. -

    -

    -The native API function prototypes are defined in the header file pcre.h, -and on Unix systems the library itself is called libpcre. It can -normally be accessed by adding -lpcre to the command for linking an -application that uses PCRE. The header file defines the macros PCRE_MAJOR and -PCRE_MINOR to contain the major and minor release numbers for the library. -Applications can use these to include support for different releases of PCRE. -

    -

    -The functions pcre_compile(), pcre_study(), and pcre_exec() -are used for compiling and matching regular expressions. A sample program that -demonstrates the simplest way of using them is provided in the file called -pcredemo.c in the source distribution. The -pcresample -documentation describes how to run it. -

    -

    -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a matched subject string. -They are: -

    -  pcre_copy_substring()
    -  pcre_copy_named_substring()
    -  pcre_get_substring()
    -  pcre_get_named_substring()
    -  pcre_get_substring_list()
    -  pcre_get_stringnumber()
    -
    -pcre_free_substring() and pcre_free_substring_list() are also -provided, to free the memory used for extracted strings. -

    -

    -The function pcre_maketables() is used to build a set of character tables -in the current locale for passing to pcre_compile() or pcre_exec(). -This is an optional facility that is provided for specialist use. Most -commonly, no special tables are passed, in which case internal tables that are -generated when PCRE is built are used. -

    -

    -The function pcre_fullinfo() is used to find out information about a -compiled pattern; pcre_info() is an obsolete version that returns only -some of the available information, but is retained for backwards compatibility. -The function pcre_version() returns a pointer to a string containing the -version of PCRE and its date of release. -

    -

    -The global variables pcre_malloc and pcre_free initially contain -the entry points of the standard malloc() and free() functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -

    -

    -The global variables pcre_stack_malloc and pcre_stack_free are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls. This is a non-standard way of building PCRE, for use -in environments that have limited stacks. Because of the greater use of memory -management, it runs more slowly. Separate functions are provided so that -special-purpose external code can be used for this case. When used, these -functions are always called in a stack-like manner (last obtained, first -freed), and always for memory blocks of the same size. -

    -

    -The global variable pcre_callout initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -pcrecallout -documentation. -

    -
    MULTITHREADING
    -

    -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by pcre_malloc, -pcre_free, pcre_stack_malloc, and pcre_stack_free, and the -callout function pointed to by pcre_callout, are shared by all threads. -

    -

    -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -

    -
    SAVING PRECOMPILED PATTERNS FOR LATER USE
    -

    -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -pcreprecompile -documentation. -

    -
    CHECKING BUILD-TIME OPTIONS
    -

    -int pcre_config(int what, void *where); -

    -

    -The function pcre_config() makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -pcrebuild -documentation has more details about these optional features. -

    -

    -The first argument for pcre_config() is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The following information is available: -

    -  PCRE_CONFIG_UTF8
    -
    -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. -
    -  PCRE_CONFIG_UNICODE_PROPERTIES
    -
    -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -
    -  PCRE_CONFIG_NEWLINE
    -
    -The output is an integer that is set to the value of the code that is used for -the newline character. It is either linefeed (10) or carriage return (13), and -should normally be the standard character for your operating system. -
    -  PCRE_CONFIG_LINK_SIZE
    -
    -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. The value is 2, 3, or 4. Larger values -allow larger regular expressions to be compiled, at the expense of slower -matching. The default value of 2 is sufficient for all but the most massive -patterns, since it allows the compiled pattern to be up to 64K in size. -
    -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
    -
    -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. Further details are given in -the -pcreposix -documentation. -
    -  PCRE_CONFIG_MATCH_LIMIT
    -
    -The output is an integer that gives the default limit for the number of -internal matching function calls in a pcre_exec() execution. Further -details are given with pcre_exec() below. -
    -  PCRE_CONFIG_STACKRECURSE
    -
    -The output is an integer that is set to one if internal recursion is -implemented by recursive function calls that use the stack to remember their -state. This is the usual way that PCRE is compiled. The output is zero if PCRE -was compiled to use blocks of data on the heap instead of recursive function -calls. In this case, pcre_stack_malloc and pcre_stack_free are -called to manage memory blocks on the heap, thus avoiding the use of the stack. -

    -
    COMPILING A PATTERN
    -

    -pcre *pcre_compile(const char *pattern, int options, -const char **errptr, int *erroffset, -const unsigned char *tableptr); -

    -

    -The function pcre_compile() is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the pattern argument. A pointer to a single block of memory -that is obtained via pcre_malloc is returned. This contains the compiled -code and related data. The pcre type is defined for the returned block; -this is a typedef for a structure whose contents are not externally defined. It -is up to the caller to free the memory when it is no longer required. -

    -

    -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete pcre data block is not -fully relocatable, because it may contain a copy of the tableptr -argument, which is an address (see below). -

    -

    -The options argument contains independent bits that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them, in particular, those that are -compatible with Perl, can also be set and unset from within the pattern (see -the detailed description in the -pcrepattern -documentation). For these options, the contents of the options argument -specifies their initial settings at the start of compilation and execution. The -PCRE_ANCHORED option can be set at the time of matching as well as at compile -time. -

    -

    -If errptr is NULL, pcre_compile() returns NULL immediately. -Otherwise, if compilation of a pattern fails, pcre_compile() returns -NULL, and sets the variable pointed to by errptr to point to a textual -error message. The offset from the start of the pattern to the character where -the error was discovered is placed in the variable pointed to by -erroffset, which must not be NULL. If it is, an immediate error is given. -

    -

    -If the final argument, tableptr, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, tableptr must be an address that is the result of a -call to pcre_maketables(). This value is stored with the compiled -pattern, and used again by pcre_exec(), unless another table pointer is -passed to it. For more discussion, see the section on locale support below. -

    -

    -This code fragment shows a typical straightforward call to pcre_compile(): -

    -  pcre *re;
    -  const char *error;
    -  int erroffset;
    -  re = pcre_compile(
    -    "^A.*Z",          /* the pattern */
    -    0,                /* default options */
    -    &error,           /* for error message */
    -    &erroffset,       /* for error offset */
    -    NULL);            /* use default character tables */
    -
    -The following names for option bits are defined in the pcre.h header -file: -
    -  PCRE_ANCHORED
    -
    -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -
    -  PCRE_AUTO_CALLOUT
    -
    -If this bit is set, pcre_compile() automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -pcrecallout -documentation. -
    -  PCRE_CASELESS
    -
    -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. When running in UTF-8 mode, case support for -high-valued characters is available only when PCRE is built with Unicode -character property support. -
    -  PCRE_DOLLAR_ENDONLY
    -
    -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before the final character if it is a newline (but not before any -other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is -set. There is no equivalent to this option in Perl, and no way to set it within -a pattern. -
    -  PCRE_DOTALL
    -
    -If this bit is set, a dot metacharater in the pattern matches all characters, -including newlines. Without it, newlines are excluded. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches a newline -character, independent of the setting of this option. -
    -  PCRE_EXTENDED
    -
    -If this bit is set, whitespace data characters in the pattern are totally -ignored except when escaped or inside a character class. Whitespace does not -include the VT character (code 11). In addition, characters between an -unescaped # outside a character class and the next newline character, -inclusive, are also ignored. This is equivalent to Perl's /x option, and it can -be changed within a pattern by a (?x) option setting. -

    -

    -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. Whitespace characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( which introduces a conditional subpattern. -

    -  PCRE_EXTRA
    -
    -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. There are at present no other features -controlled by this option. It can also be set by a (?X) option setting within a -pattern. -
    -  PCRE_MULTILINE
    -
    -By default, PCRE treats the subject string as consisting of a single line of -characters (even if it actually contains newlines). The "start of line" -metacharacter (^) matches only at the start of the string, while the "end of -line" metacharacter ($) matches only at the end of the string, or before a -terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as -Perl. -

    -

    -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before any newline in the subject -string, respectively, as well as at the very start and end. This is equivalent -to Perl's /m option, and it can be changed within a pattern by a (?m) option -setting. If there are no "\n" characters in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -

    -  PCRE_NO_AUTO_CAPTURE
    -
    -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -
    -  PCRE_UNGREEDY
    -
    -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -
    -  PCRE_UTF8
    -
    -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte character strings. However, it is -available only when PCRE is built to include UTF-8 support. If not, the use -of this option provokes an error. Details of how this option changes the -behaviour of PCRE are given in the -section on UTF-8 support -in the main -pcre -page. -
    -  PCRE_NO_UTF8_CHECK
    -
    -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. If an invalid UTF-8 sequence of bytes is found, -pcre_compile() returns an error. If you already know that your pattern is -valid, and you want to skip this check for performance reasons, you can set the -PCRE_NO_UTF8_CHECK option. When it is set, the effect of passing an invalid -UTF-8 string as a pattern is undefined. It may cause your program to crash. -Note that this option can also be passed to pcre_exec(), to suppress the -UTF-8 validity checking of subject strings. -

    -
    STUDYING A PATTERN
    -

    -pcre_extra *pcre_study(const pcre *code, int options, -const char **errptr); -

    -

    -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function pcre_study() takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, pcre_study() returns a pointer to a -pcre_extra block, in which the study_data field points to the -results of the study. -

    -

    -The returned value from pcre_study() can be passed directly to -pcre_exec(). However, a pcre_extra block also contains other -fields that can be set by the caller before the block is passed; these are -described -below -in the section on matching a pattern. -

    -

    -If studying the pattern does not produce any additional information, -pcre_study() returns NULL. In that circumstance, if the calling program -wants to pass any of the other fields to pcre_exec(), it must set up its -own pcre_extra block. -

    -

    -The second argument of pcre_study() contains option bits. At present, no -options are defined, and this argument should always be zero. -

    -

    -The third argument for pcre_study() is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it points to a textual error message. You should -therefore test the error pointer for NULL after calling pcre_study(), to -be sure that it has run successfully. -

    -

    -This is a typical call to pcre_study(): -

    -  pcre_extra *pe;
    -  pe = pcre_study(
    -    re,             /* result of pcre_compile() */
    -    0,              /* no options exist */
    -    &error);        /* set to NULL or points to a message */
    -
    -At present, studying a pattern is useful only for non-anchored patterns that do -not have a single fixed starting character. A bitmap of possible starting -bytes is created. -

    -
    LOCALE SUPPORT
    -

    -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -value. (When running in UTF-8 mode, this applies only to characters with codes -less than 128. Higher-valued codes never match escapes such as \w or \d, but -can be tested with \p if PCRE is built with Unicode character property -support.) -

    -

    -An internal set of tables is created in the default C locale when PCRE is -built. This is used when the final argument of pcre_compile() is NULL, -and is sufficient for many applications. An alternative set of tables can, -however, be supplied. These may be created in a different locale from the -default. As more and more applications change to using Unicode, the need for -this locale support is expected to die away. -

    -

    -External tables are built by calling the pcre_maketables() function, -which has no arguments, in the relevant locale. The result can then be passed -to pcre_compile() or pcre_exec() as often as necessary. For -example, to build and use tables that are appropriate for the French locale -(where accented characters with values greater than 128 are treated as letters), -the following code could be used: -

    -  setlocale(LC_CTYPE, "fr_FR");
    -  tables = pcre_maketables();
    -  re = pcre_compile(..., tables);
    -
    -When pcre_maketables() runs, the tables are built in memory that is -obtained via pcre_malloc. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -

    -

    -The pointer that is passed to pcre_compile() is saved with the compiled -pattern, and the same tables are used via this pointer by pcre_study() -and normally also by pcre_exec(). Thus, by default, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be compiled in different locales. -

    -

    -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to pcre_exec(). Although not intended for this purpose, -this facility could be used to match a pattern in a different locale from the -one in which it was compiled. Passing table pointers at run time is discussed -below in the section on matching a pattern. -

    -
    INFORMATION ABOUT A PATTERN
    -

    -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, -int what, void *where); -

    -

    -The pcre_fullinfo() function returns information about a compiled -pattern. It replaces the obsolete pcre_info() function, which is -nevertheless retained for backwards compability (and is documented below). -

    -

    -The first argument for pcre_fullinfo() is a pointer to the compiled -pattern. The second argument is the result of pcre_study(), or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -

    -  PCRE_ERROR_NULL       the argument code was NULL
    -                        the argument where was NULL
    -  PCRE_ERROR_BADMAGIC   the "magic number" was not found
    -  PCRE_ERROR_BADOPTION  the value of what was invalid
    -
    -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. Here is a typical call of -pcre_fullinfo(), to obtain the length of the compiled pattern: -
    -  int rc;
    -  unsigned long int length;
    -  rc = pcre_fullinfo(
    -    re,               /* result of pcre_compile() */
    -    pe,               /* result of pcre_study(), or NULL */
    -    PCRE_INFO_SIZE,   /* what is required */
    -    &length);         /* where to put the data */
    -
    -The possible values for the third argument are defined in pcre.h, and are -as follows: -
    -  PCRE_INFO_BACKREFMAX
    -
    -Return the number of the highest back reference in the pattern. The fourth -argument should point to an int variable. Zero is returned if there are -no back references. -
    -  PCRE_INFO_CAPTURECOUNT
    -
    -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an int variable. -
    -  PCRE_INFO_DEFAULTTABLES
    -
    -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an unsigned char * variable. This -information call is provided for internal use by the pcre_study() -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -
    -  PCRE_INFO_FIRSTBYTE
    -
    -Return information about the first byte of any matched string, for a -non-anchored pattern. (This option used to be called PCRE_INFO_FIRSTCHAR; the -old name is still recognized for backwards compatibility.) -

    -

    -If there is a fixed first byte, for example, from a pattern such as -(cat|cow|coyote), it is returned in the integer pointed to by where. -Otherwise, if either -
    -
    -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
    -
    -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
    -
    --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -

    -  PCRE_INFO_FIRSTTABLE
    -
    -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of bytes for the first byte in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an unsigned char * variable. -
    -  PCRE_INFO_LASTLITERAL
    -
    -Return the value of the rightmost literal byte that must exist in any matched -string, other than at its start, if such a byte has been recorded. The fourth -argument should point to an int variable. If there is no such byte, -1 is -returned. For anchored patterns, a last literal byte is recorded only if it -follows something of variable length. For example, for the pattern -/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value -is -1. -
    -  PCRE_INFO_NAMECOUNT
    -  PCRE_INFO_NAMEENTRYSIZE
    -  PCRE_INFO_NAMETABLE
    -
    -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. A convenience function called pcre_get_named_substring() -is provided for extracting an individual captured substring by name. It is also -possible to extract the data directly, by first converting the name to a number -in order to access the correct pointers in the output vector (described with -pcre_exec() below). To do the conversion, you need to use the -name-to-number map, which is described by these three values. -

    -

    -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an int value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table (a pointer to char). The first two bytes of each entry -are the number of the capturing parenthesis, most significant byte first. The -rest of the entry is the corresponding name, zero terminated. The names are in -alphabetical order. For example, consider the following pattern (assume -PCRE_EXTENDED is set, so white space - including newlines - is ignored): -

    -  (?P<date> (?P<year>(\d\d)?\d\d) - (?P<month>\d\d) - (?P<day>\d\d) )
    -
    -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -
    -  00 01 d  a  t  e  00 ??
    -  00 05 d  a  y  00 ?? ??
    -  00 04 m  o  n  t  h  00
    -  00 02 y  e  a  r  00 ??
    -
    -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of each entry is likely to be -different for each compiled pattern. -
    -  PCRE_INFO_OPTIONS
    -
    -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an unsigned long int variable. These option bits -are those specified in the call to pcre_compile(), modified by any -top-level option settings within the pattern itself. -

    -

    -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -

    -  ^     unless PCRE_MULTILINE is set
    -  \A    always
    -  \G    always
    -  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
    -
    -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -pcre_fullinfo(). -
    -  PCRE_INFO_SIZE
    -
    -Return the size of the compiled pattern, that is, the value that was passed as -the argument to pcre_malloc() when PCRE was getting memory in which to -place the compiled data. The fourth argument should point to a size_t -variable. -
    -  PCRE_INFO_STUDYSIZE
    -
    -Return the size of the data block pointed to by the study_data field in -a pcre_extra block. That is, it is the value that was passed to -pcre_malloc() when PCRE was getting memory into which to place the data -created by pcre_study(). The fourth argument should point to a -size_t variable. -

    -
    OBSOLETE INFO FUNCTION
    -

    -int pcre_info(const pcre *code, int *optptr, int -*firstcharptr); -

    -

    -The pcre_info() function is now obsolete because its interface is too -restrictive to return all the available data about a compiled pattern. New -programs should use pcre_fullinfo() instead. The yield of -pcre_info() is the number of capturing subpatterns, or one of the -following negative numbers: -

    -  PCRE_ERROR_NULL       the argument code was NULL
    -  PCRE_ERROR_BADMAGIC   the "magic number" was not found
    -
    -If the optptr argument is not NULL, a copy of the options with which the -pattern was compiled is placed in the integer it points to (see -PCRE_INFO_OPTIONS above). -

    -

    -If the pattern is not anchored and the firstcharptr argument is not NULL, -it is used to pass back information about the first character of any matched -string (see PCRE_INFO_FIRSTBYTE above). -

    -
    MATCHING A PATTERN
    -

    -int pcre_exec(const pcre *code, const pcre_extra *extra, -const char *subject, int length, int startoffset, -int options, int *ovector, int ovecsize); -

    -

    -The function pcre_exec() is called to match a subject string against a -compiled pattern, which is passed in the code argument. If the -pattern has been studied, the result of the study should be passed in the -extra argument. -

    -

    -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls pcre_exec(). However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -pcreprecompile -documentation. -

    -

    -Here is an example of a simple call to pcre_exec(): -

    -  int rc;
    -  int ovector[30];
    -  rc = pcre_exec(
    -    re,             /* result of pcre_compile() */
    -    NULL,           /* we didn't study the pattern */
    -    "some string",  /* the subject string */
    -    11,             /* the length of the subject string */
    -    0,              /* start at offset 0 in the subject */
    -    0,              /* default options */
    -    ovector,        /* vector of integers for substring information */
    -    30);            /* number of elements in the vector (NOT size in bytes) */
    -
    -

    -
    -Extra data for pcre_exec() -
    -

    -If the extra argument is not NULL, it must point to a pcre_extra -data block. The pcre_study() function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The fields in a pcre_extra block are as -follows: -

    -  unsigned long int flags;
    -  void *study_data;
    -  unsigned long int match_limit;
    -  void *callout_data;
    -  const unsigned char *tables;
    -
    -The flags field is a bitmap that specifies which of the other fields -are set. The flag bits are: -
    -  PCRE_EXTRA_STUDY_DATA
    -  PCRE_EXTRA_MATCH_LIMIT
    -  PCRE_EXTRA_CALLOUT_DATA
    -  PCRE_EXTRA_TABLES
    -
    -Other flag bits should be set to zero. The study_data field is set in the -pcre_extra block that is returned by pcre_study(), together with -the appropriate flag bit. You should not set this yourself, but you may add to -the block by setting the other fields and their corresponding flag bits. -

    -

    -The match_limit field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is the use of nested unlimited repeats. -

    -

    -Internally, PCRE uses a function called match() which it calls repeatedly -(sometimes recursively). The limit is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of recursion and backtracking that can take place. For patterns that are not -anchored, the count starts from zero for each position in the subject string. -

    -

    -The default limit for the library can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -reduce the default by suppling pcre_exec() with a pcre_extra block -in which match_limit is set to a smaller value, and -PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is -exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. -

    -

    -The pcre_callout field is used in conjunction with the "callout" feature, -which is described in the -pcrecallout -documentation. -

    -

    -The tables field is used to pass a character tables pointer to -pcre_exec(); this overrides the value that is stored with the compiled -pattern. A non-NULL value is stored with the compiled pattern only if custom -tables were supplied to pcre_compile() via its tableptr argument. -If NULL is passed to pcre_exec() using this mechanism, it forces PCRE's -internal tables to be used. This facility is helpful when re-using patterns -that have been saved after compiling with an external set of tables, because -the external tables might be at a different address when pcre_exec() is -called. See the -pcreprecompile -documentation for a discussion of saving compiled patterns for later use. -

    -
    -Option bits for pcre_exec() -
    -

    -The unused bits of the options argument for pcre_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NO_UTF8_CHECK and PCRE_PARTIAL. -

    -  PCRE_ANCHORED
    -
    -The PCRE_ANCHORED option limits pcre_exec() to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -
    -  PCRE_NOTBOL
    -
    -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \A. -
    -  PCRE_NOTEOL
    -
    -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \Z or \z. -
    -  PCRE_NOTEMPTY
    -
    -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -
    -  a?b?
    -
    -is applied to a string not beginning with "a" or "b", it matches the empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -

    -

    -Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case -of a pattern match of the empty string within its split() function, and -when using the /g modifier. It is possible to emulate Perl's behaviour after -matching a null string by first trying the match again at the same offset with -PCRE_NOTEMPTY and PCRE_ANCHORED, and then if that fails by advancing the -starting offset (see below) and trying an ordinary match again. There is some -code that demonstrates how to do this in the pcredemo.c sample program. -

    -  PCRE_NO_UTF8_CHECK
    -
    -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when pcre_exec() is subsequently called. -The value of startoffset is also checked to ensure that it points to the -start of a UTF-8 character. If an invalid UTF-8 sequence of bytes is found, -pcre_exec() returns the error PCRE_ERROR_BADUTF8. If startoffset -contains an invalid value, PCRE_ERROR_BADUTF8_OFFSET is returned. -

    -

    -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling pcre_exec(). You might want to do this for the second and -subsequent calls to pcre_exec() if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of startoffset points to the start of a UTF-8 character. When -PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid UTF-8 string as a -subject, or a value of startoffset that does not point to the start of a -UTF-8 character, is undefined. Your program may crash. -

    -  PCRE_PARTIAL
    -
    -This option turns on the partial matching feature. If the subject string fails -to match the pattern, but at some point during the matching process the end of -the subject was reached (that is, the subject partially matches the pattern and -the failure to match occurred only because there were not enough subject -characters), pcre_exec() returns PCRE_ERROR_PARTIAL instead of -PCRE_ERROR_NOMATCH. When PCRE_PARTIAL is used, there are restrictions on what -may appear in the pattern. These are discussed in the -pcrepartial -documentation. -

    -
    -The string to be matched by pcre_exec() -
    -

    -The subject string is passed to pcre_exec() as a pointer in -subject, a length in length, and a starting byte offset in -startoffset. In UTF-8 mode, the byte offset must point to the start of a -UTF-8 character. Unlike the pattern string, the subject may contain binary zero -bytes. When the starting offset is zero, the search for a match starts at the -beginning of the subject, and this is by far the most common case. -

    -

    -A non-zero starting offset is useful when searching for another match in the -same subject by calling pcre_exec() again after a previous success. -Setting startoffset differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -

    -  \Biss\B
    -
    -which finds occurrences of "iss" in the middle of words. (\B matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to pcre_exec() finds the first -occurrence. If pcre_exec() is called again with just the remainder of the -subject, namely "issipi", it does not match, because \B is always false at the -start of the subject, which is deemed to be a word boundary. However, if -pcre_exec() is passed the entire string again, but with startoffset -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -

    -

    -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -

    -
    -How pcre_exec() returns captured substrings -
    -

    -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -

    -

    -Captured substrings are returned to the caller via a vector of integer offsets -whose address is passed in ovector. The number of elements in the vector -is passed in ovecsize, which must be a non-negative number. Note: -this argument is NOT the size of ovector in bytes. -

    -

    -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by pcre_exec() while matching capturing subpatterns, -and is not available for passing back information. The length passed in -ovecsize should always be a multiple of three. If it is not, it is -rounded down. -

    -

    -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of ovector, and -continuing up to two-thirds of its length at the most. The first element of a -pair is set to the offset of the first character in a substring, and the second -is set to the offset of the first character after the end of a substring. The -first pair, ovector[0] and ovector[1], identify the portion of the -subject string matched by the entire pattern. The next pair is used for the -first capturing subpattern, and so on. The value returned by pcre_exec() -is the number of pairs that have been set. If there are no capturing -subpatterns, the return value from a successful match is 1, indicating that -just the first pair of offsets has been set. -

    -

    -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described in the following section. -

    -

    -It is possible for an capturing subpattern number n+1 to match some -part of the subject when subpattern n has not been used at all. For -example, if the string "abc" is matched against the pattern (a|(z))(bc) -subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset -values corresponding to the unused subpattern are set to -1. -

    -

    -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -

    -

    -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. In particular, if the substring offsets are not of -interest, pcre_exec() may be called with ovector passed as NULL and -ovecsize as zero. However, if the pattern contains back references and -the ovector is not big enough to remember the related substrings, PCRE -has to get additional memory for use during matching. Thus it is usually -advisable to supply an ovector. -

    -

    -Note that pcre_info() can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -ovector that will allow for n captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (n+1)*3. -

    -
    -Return values from pcre_exec() -
    -

    -If pcre_exec() fails, it returns a negative number. The following are -defined in the header file: -

    -  PCRE_ERROR_NOMATCH        (-1)
    -
    -The subject string did not match the pattern. -
    -  PCRE_ERROR_NULL           (-2)
    -
    -Either code or subject was passed as NULL, or ovector was -NULL and ovecsize was not zero. -
    -  PCRE_ERROR_BADOPTION      (-3)
    -
    -An unrecognized bit was set in the options argument. -
    -  PCRE_ERROR_BADMAGIC       (-4)
    -
    -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -
    -  PCRE_ERROR_UNKNOWN_NODE   (-5)
    -
    -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -
    -  PCRE_ERROR_NOMEMORY       (-6)
    -
    -If a pattern contains back references, but the ovector that is passed to -pcre_exec() is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via pcre_malloc() fails, this error is given. The memory is -automatically freed at the end of matching. -
    -  PCRE_ERROR_NOSUBSTRING    (-7)
    -
    -This error is used by the pcre_copy_substring(), -pcre_get_substring(), and pcre_get_substring_list() functions (see -below). It is never returned by pcre_exec(). -
    -  PCRE_ERROR_MATCHLIMIT     (-8)
    -
    -The recursion and backtracking limit, as specified by the match_limit -field in a pcre_extra structure (or defaulted) was reached. See the -description above. -
    -  PCRE_ERROR_CALLOUT        (-9)
    -
    -This error is never generated by pcre_exec() itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -pcrecallout -documentation for details. -
    -  PCRE_ERROR_BADUTF8        (-10)
    -
    -A string that contains an invalid UTF-8 byte sequence was passed as a subject. -
    -  PCRE_ERROR_BADUTF8_OFFSET (-11)
    -
    -The UTF-8 byte sequence that was passed as a subject was valid, but the value -of startoffset did not point to the beginning of a UTF-8 character. -
    -  PCRE_ERROR_PARTIAL (-12)
    -
    -The subject string did not match, but it did match partially. See the -pcrepartial -documentation for details of partial matching. -
    -  PCRE_ERROR_BAD_PARTIAL (-13)
    -
    -The PCRE_PARTIAL option was used with a compiled pattern containing items that -are not supported for partial matching. See the -pcrepartial -documentation for details of partial matching. -
    -  PCRE_ERROR_INTERNAL (-14)
    -
    -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -
    -  PCRE_ERROR_BADCOUNT (-15)
    -
    -This error is given if the value of the ovecsize argument is negative. -

    -
    EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
    -

    -int pcre_copy_substring(const char *subject, int *ovector, -int stringcount, int stringnumber, char *buffer, -int buffersize); -

    -

    -int pcre_get_substring(const char *subject, int *ovector, -int stringcount, int stringnumber, -const char **stringptr); -

    -

    -int pcre_get_substring_list(const char *subject, -int *ovector, int stringcount, const char ***listptr); -

    -

    -Captured substrings can be accessed directly by using the offsets returned by -pcre_exec() in ovector. For convenience, the functions -pcre_copy_substring(), pcre_get_substring(), and -pcre_get_substring_list() are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. A substring that contains a binary zero is correctly extracted and -has a further zero added on the end, but the result is not, of course, -a C string. -

    -

    -The first three arguments are the same for all three of these functions: -subject is the subject string that has just been successfully matched, -ovector is a pointer to the vector of integer offsets that was passed to -pcre_exec(), and stringcount is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by pcre_exec() if it is greater -than zero. If pcre_exec() returned zero, indicating that it ran out of -space in ovector, the value passed as stringcount should be the -number of elements in the vector divided by three. -

    -

    -The functions pcre_copy_substring() and pcre_get_substring() -extract a single substring, whose number is given as stringnumber. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For pcre_copy_substring(), -the string is placed in buffer, whose length is given by -buffersize, while for pcre_get_substring() a new block of memory is -obtained via pcre_malloc, and its address is returned via -stringptr. The yield of the function is the length of the string, not -including the terminating zero, or one of -

    -  PCRE_ERROR_NOMEMORY       (-6)
    -
    -The buffer was too small for pcre_copy_substring(), or the attempt to get -memory failed for pcre_get_substring(). -
    -  PCRE_ERROR_NOSUBSTRING    (-7)
    -
    -There is no substring whose number is stringnumber. -

    -

    -The pcre_get_substring_list() function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via pcre_malloc. The address of the memory block -is returned via listptr, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or -

    -  PCRE_ERROR_NOMEMORY       (-6)
    -
    -if the attempt to get the memory block failed. -

    -

    -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number n+1 matches some part of the -subject, but subpattern n has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in ovector, which is negative for unset -substrings. -

    -

    -The two convenience functions pcre_free_substring() and -pcre_free_substring_list() can be used to free the memory returned by -a previous call of pcre_get_substring() or -pcre_get_substring_list(), respectively. They do nothing more than call -the function pointed to by pcre_free, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language which cannot use -pcre_free directly; it is for these cases that the functions are -provided. -

    -
    EXTRACTING CAPTURED SUBSTRINGS BY NAME
    -

    -int pcre_get_stringnumber(const pcre *code, -const char *name); -

    -

    -int pcre_copy_named_substring(const pcre *code, -const char *subject, int *ovector, -int stringcount, const char *stringname, -char *buffer, int buffersize); -

    -

    -int pcre_get_named_substring(const pcre *code, -const char *subject, int *ovector, -int stringcount, const char *stringname, -const char **stringptr); -

    -

    -To extract a substring by name, you first have to find associated number. -For example, for this pattern -

    -  (a+)b(?<xxx>\d+)...
    -
    -the number of the subpattern called "xxx" is 2. You can find the number from -the name by calling pcre_get_stringnumber(). The first argument is the -compiled pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -

    -

    -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -

    -

    -Most of the arguments of pcre_copy_named_substring() and -pcre_get_named_substring() are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -

    -

    -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -

    -

    -These functions call pcre_get_stringnumber(), and if it succeeds, they -then call pcre_copy_substring() or pcre_get_substring(), as -appropriate. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrebuild.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrebuild.html deleted file mode 100644 index eb45572e88..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrebuild.html +++ /dev/null @@ -1,186 +0,0 @@ - - -pcrebuild specification - - -

    pcrebuild man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    PCRE BUILD-TIME OPTIONS
    -

    -This document describes the optional features of PCRE that can be selected when -the library is compiled. They are all selected, or deselected, by providing -options to the configure script that is run before the make -command. The complete list of options for configure (which includes the -standard ones such as the selection of the installation directory) can be -obtained by running -

    -  ./configure --help
    -
    -The following sections describe certain options whose names begin with --enable -or --disable. These settings specify changes to the defaults for the -configure command. Because of the way that configure works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -

    -
    UTF-8 SUPPORT
    -

    -To build PCRE with support for UTF-8 character strings, add -

    -  --enable-utf8
    -
    -to the configure command. Of itself, this does not make PCRE treat -strings as UTF-8. As well as compiling PCRE with this option, you also have -have to set the PCRE_UTF8 option when you call the pcre_compile() -function. -

    -
    UNICODE CHARACTER PROPERTY SUPPORT
    -

    -UTF-8 support allows PCRE to process character values greater than 255 in the -strings that it handles. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \P, \p, and \X, which refer to Unicode -character properties, you must add -

    -  --enable-unicode-properties
    -
    -to the configure command. This implies UTF-8 support, even if you have -not explicitly requested it. -

    -

    -Including Unicode property support adds around 90K of tables to the PCRE -library, approximately doubling its size. Only the general category properties -such as Lu and Nd are supported. Details are given in the -pcrepattern -documentation. -

    -
    CODE VALUE OF NEWLINE
    -

    -By default, PCRE treats character 10 (linefeed) as the newline character. This -is the normal newline character on Unix-like systems. You can compile PCRE to -use character 13 (carriage return) instead by adding -

    -  --enable-newline-is-cr
    -
    -to the configure command. For completeness there is also a ---enable-newline-is-lf option, which explicitly specifies linefeed as the -newline character. -

    -
    BUILDING SHARED AND STATIC LIBRARIES
    -

    -The PCRE building process uses libtool to build both shared and static -Unix libraries by default. You can suppress one of these by adding one of -

    -  --disable-shared
    -  --disable-static
    -
    -to the configure command, as required. -

    -
    POSIX MALLOC USAGE
    -

    -When PCRE is called through the POSIX interface (see the -pcreposix -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using malloc() for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -

    -  --with-posix-malloc-threshold=20
    -
    -to the configure command. -

    -
    LIMITING PCRE RESOURCE USAGE
    -

    -Internally, PCRE has a function called match(), which it calls repeatedly -(possibly recursively) when matching a pattern. By controlling the maximum -number of times this function may be called during a single matching operation, -a limit can be placed on the resources used by a single call to -pcre_exec(). The limit can be changed at run time, as described in the -pcreapi -documentation. The default is 10 million, but this can be changed by adding a -setting such as -

    -  --with-match-limit=500000
    -
    -to the configure command. -

    -
    HANDLING VERY LARGE PATTERNS
    -

    -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, two-byte values are used for these offsets, leading -to a maximum size for a compiled pattern of around 64K. This is sufficient to -handle all but the most gigantic patterns. Nevertheless, some people do want to -process enormous patterns, so it is possible to compile PCRE to use three-byte -or four-byte offsets by adding a setting such as -

    -  --with-link-size=3
    -
    -to the configure command. The value given must be 2, 3, or 4. Using -longer offsets slows down the operation of PCRE because it has to load -additional bytes when handling them. -

    -

    -If you build PCRE with an increased link size, test 2 (and test 5 if you are -using UTF-8) will fail. Part of the output of these tests is a representation -of the compiled pattern, and this changes with the link size. -

    -
    AVOIDING EXCESSIVE STACK USAGE
    -

    -PCRE implements backtracking while matching by making recursive calls to an -internal function called match(). In environments where the size of the -stack is limited, this can severely limit PCRE's operation. (The Unix -environment does not usually suffer from this problem.) An alternative approach -that uses memory from the heap to remember data, instead of using recursive -function calls, has been implemented to work round this problem. If you want to -build a version of PCRE that works this way, add -

    -  --disable-stack-for-recursion
    -
    -to the configure command. With this configuration, PCRE will use the -pcre_stack_malloc and pcre_stack_free variables to call memory -management functions. Separate functions are provided because the usage is very -predictable: the block sizes requested are always the same, and the blocks are -always freed in reverse order. A calling program might be able to implement -optimized functions that perform better than the standard malloc() and -free() functions. PCRE runs noticeably more slowly when built in this -way. -

    -
    USING EBCDIC CODE
    -

    -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). PCRE can, however, be -compiled to run in an EBCDIC environment by adding -

    -  --enable-ebcdic
    -
    -to the configure command. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecallout.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecallout.html deleted file mode 100644 index 1f4a1fe12f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecallout.html +++ /dev/null @@ -1,180 +0,0 @@ - - -pcrecallout specification - - -

    pcrecallout man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    PCRE CALLOUTS
    -

    -int (*pcre_callout)(pcre_callout_block *); -

    -

    -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable pcre_callout. By default, this variable contains NULL, -which disables all calling out. -

    -

    -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

    -  (?C1)\deabc(?C2)def
    -
    -If the PCRE_AUTO_CALLOUT option bit is set when pcre_compile() is called, -PCRE automatically inserts callouts, all with number 255, before each item in -the pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -
    -  A(\d{2}|--)
    -
    -it is processed as if it were -
    -
    -(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -
    -
    -Notice that there is a callout before and after each parenthesis and -alternation bar. Automatic callouts can be used for tracking the progress of -pattern matching. The -pcretest -command has an option that sets automatic callouts; when it is used, the output -indicates how the pattern is matched. This is useful information when you are -trying to optimize the performance of a particular pattern. -

    -
    MISSING CALLOUTS
    -

    -You should be aware that, because of optimizations in the way PCRE matches -patterns, callouts sometimes do not happen. For example, if the pattern is -

    -  ab(?C4)cd
    -
    -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -

    -
    THE CALLOUT INTERFACE
    -

    -During matching, when PCRE reaches a callout point, the external function -defined by pcre_callout is called (if it is set). The only argument is a -pointer to a pcre_callout block. This structure contains the following -fields: -

    -  int          version;
    -  int          callout_number;
    -  int         *offset_vector;
    -  const char  *subject;
    -  int          subject_length;
    -  int          start_match;
    -  int          current_position;
    -  int          capture_top;
    -  int          capture_last;
    -  void        *callout_data;
    -  int          pattern_position;
    -  int          next_item_length;
    -
    -The version field is an integer containing the version number of the -block format. The initial version was 0; the current version is 1. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -

    -

    -The callout_number field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -

    -

    -The offset_vector field is a pointer to the vector of offsets that was -passed by the caller to pcre_exec(). The contents can be inspected in -order to extract substrings that have been matched so far, in the same way as -for extracting substrings after a match has completed. -

    -

    -The subject and subject_length fields contain copies of the values -that were passed to pcre_exec(). -

    -

    -The start_match field contains the offset within the subject at which the -current match attempt started. If the pattern is not anchored, the callout -function may be called several times from the same point in the pattern for -different starting points in the subject. -

    -

    -The current_position field contains the offset within the subject of the -current match pointer. -

    -

    -The capture_top field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, -the value of capture_top is one. -

    -

    -The capture_last field contains the number of the most recently captured -substring. If no substrings have been captured, its value is -1. -

    -

    -The callout_data field contains a value that is passed to -pcre_exec() by the caller specifically so that it can be passed back in -callouts. It is passed in the pcre_callout field of the pcre_extra -data structure. If no such data was passed, the value of callout_data in -a pcre_callout block is NULL. There is a description of the -pcre_extra structure in the -pcreapi -documentation. -

    -

    -The pattern_position field is present from version 1 of the -pcre_callout structure. It contains the offset to the next item to be -matched in the pattern string. -

    -

    -The next_item_length field is present from version 1 of the -pcre_callout structure. It contains the length of the next item to be -matched in the pattern string. When the callout immediately precedes an -alternation bar, a closing parenthesis, or the end of the pattern, the length -is zero. When the callout precedes an opening parenthesis, the length is that -of the entire subpattern. -

    -

    -The pattern_position and next_item_length fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -

    -
    RETURN VALUES
    -

    -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but backtracking to test other matching possibilities -goes ahead, just as if a lookahead assertion had failed. If the value is less -than zero, the match is abandoned, and pcre_exec() returns the negative -value. -

    -

    -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecompat.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecompat.html deleted file mode 100644 index ef1cb0699c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrecompat.html +++ /dev/null @@ -1,150 +0,0 @@ - - -pcrecompat specification - - -

    pcrecompat man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -DIFFERENCES BETWEEN PCRE AND PERL -
    -

    -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -5.8. -

    -

    -1. PCRE does not have full UTF-8 support. Details of what it does have are -given in the -section on UTF-8 support -in the main -pcre -page. -

    -

    -2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits -them, but they do not mean what you might think. For example, (?!a){3} does -not assert that the next three characters are not "a". It just asserts that the -next character is not "a" three times. -

    -

    -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sets its -numerical variables from any such patterns that are matched before the -assertion fails to match something (thereby succeeding), but only if the -negative lookahead assertion contains just one branch. -

    -

    -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \0 can be used in the pattern to -represent a binary zero. -

    -

    -5. The following Perl escape sequences are not supported: \l, \u, \L, -\U, and \N. In fact these are implemented by Perl's general string-handling -and are not part of its pattern matching engine. If any of these are -encountered by PCRE, an error is generated. -

    -

    -6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \p and \P are limited to the general category properties such as -Lu and Nd. -

    -

    -7. PCRE does support the \Q...\E escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -

    -    Pattern            PCRE matches      Perl matches
    -
    -    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
    -    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
    -    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
    -
    -The \Q...\E sequence is recognized both inside and outside character classes. -

    -

    -8. Fairly obviously, PCRE does not support the (?{code}) and (?p{code}) -constructions. However, there is support for recursive patterns using the -non-Perl items (?R), (?number), and (?P>name). Also, the PCRE "callout" feature -allows an external function to be called during pattern matching. See the -pcrecallout -documentation for details. -

    -

    -9. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -

    -

    -10. PCRE provides some extensions to the Perl regular expression facilities: -
    -
    -(a) Although lookbehind assertions must match fixed length strings, each -alternative branch of a lookbehind assertion can match a different length of -string. Perl requires them all to have the same length. -
    -
    -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -
    -
    -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. -
    -
    -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -
    -
    -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -
    -
    -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, and PCRE_NO_AUTO_CAPTURE -options for pcre_exec() have no Perl equivalents. -
    -
    -(g) The (?R), (?number), and (?P>name) constructs allows for recursive pattern -matching (Perl can do this using the (?p{code}) construct, which PCRE cannot -support.) -
    -
    -(h) PCRE supports named capturing substrings, using the Python syntax. -
    -
    -(i) PCRE supports the possessive quantifier "++" syntax, taken from Sun's Java -package. -
    -
    -(j) The (R) condition, for testing recursion, is a PCRE extension. -
    -
    -(k) The callout facility is PCRE-specific. -
    -
    -(l) The partial matching facility is PCRE-specific. -
    -
    -(m) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcregrep.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcregrep.html deleted file mode 100644 index a666923ac8..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcregrep.html +++ /dev/null @@ -1,158 +0,0 @@ - - -pcregrep specification - - -

    pcregrep man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    SYNOPSIS
    -

    -pcregrep [-Vcfhilnrsuvx] [long options] [pattern] [file1 file2 ...] -

    -
    DESCRIPTION
    -

    -pcregrep searches files for character patterns, in the same way as other -grep commands do, but it uses the PCRE regular expression library to support -patterns that are compatible with the regular expressions of Perl 5. See -pcrepattern -for a full description of syntax and semantics of the regular expressions that -PCRE supports. -

    -

    -A pattern must be specified on the command line unless the -f option is -used (see below). -

    -

    -If no files are specified, pcregrep reads the standard input. By default, -each line that matches the pattern is copied to the standard output, and if -there is more than one file, the file name is printed before each line of -output. However, there are options that can change how pcregrep behaves. -

    -

    -Lines are limited to BUFSIZ characters. BUFSIZ is defined in <stdio.h>. -The newline character is removed from the end of each line before it is matched -against the pattern. -

    -
    OPTIONS
    -

    --V -Write the version number of the PCRE library being used to the standard error -stream. -

    -

    --c -Do not print individual lines; instead just print a count of the number of -lines that would otherwise have been printed. If several files are given, a -count is printed for each of them. -

    -

    --ffilename -Read a number of patterns from the file, one per line, and match all of them -against each line of input. A line is output if any of the patterns match it. -When -f is used, no pattern is taken from the command line; all arguments -are treated as file names. There is a maximum of 100 patterns. Trailing white -space is removed, and blank lines are ignored. An empty file contains no -patterns and therefore matches nothing. -

    -

    --h -Suppress printing of filenames when searching multiple files. -

    -

    --i -Ignore upper/lower case distinctions during comparisons. -

    -

    --l -Instead of printing lines from the files, just print the names of the files -containing lines that would have been printed. Each file name is printed -once, on a separate line. -

    -

    --n -Precede each line by its line number in the file. -

    -

    --r -If any file is a directory, recursively scan the files it contains. Without --r a directory is scanned as a normal file. -

    -

    --s -Work silently, that is, display nothing except error messages. -The exit status indicates whether any matches were found. -

    -

    --u -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. Both the pattern and each subject line must be valid -strings of UTF-8 characters. -

    -

    --v -Invert the sense of the match, so that lines which do not match the -pattern are now the ones that are found. -

    -

    --x -Force the pattern to be anchored (it must start matching at the beginning of -the line) and in addition, require it to match the entire line. This is -equivalent to having ^ and $ characters at the start and end of each -alternative branch in the regular expression. -

    -
    LONG OPTIONS
    -

    -Long forms of all the options are available, as in GNU grep. They are shown in -the following table: -

    -  -c   --count
    -  -h   --no-filename
    -  -i   --ignore-case
    -  -l   --files-with-matches
    -  -n   --line-number
    -  -r   --recursive
    -  -s   --no-messages
    -  -u   --utf-8
    -  -V   --version
    -  -v   --invert-match
    -  -x   --line-regex
    -  -x   --line-regexp
    -
    -In addition, --file=filename is equivalent to -ffilename, and ---help shows the list of options and then exits. -

    -
    DIAGNOSTICS
    -

    -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors or inacessible files (even if matches were found). -

    -
    AUTHOR
    -

    -Philip Hazel <ph10@cam.ac.uk> -
    -University Computing Service -
    -Cambridge CB2 3QG, England. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepartial.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepartial.html deleted file mode 100644 index af4a387b58..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepartial.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcrepartial specification - - -

    pcrepartial man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    PARTIAL MATCHING IN PCRE
    -

    -In normal use of PCRE, if the subject string that is passed to -pcre_exec() matches as far as it goes, but is too short to match the -entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where -it might be helpful to distinguish this case from other cases in which there is -no match. -

    -

    -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form ddmmmyy, defined by this pattern: -

    -  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
    -
    -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, possibly beeping and not reflecting the -character that has been typed. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. -

    -

    -PCRE supports the concept of partial matching by means of the PCRE_PARTIAL -option, which can be set when calling pcre_exec(). When this is done, the -return code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if at any -time during the matching process the entire subject string matched part of the -pattern. No captured data is set when this occurs. -

    -

    -Using PCRE_PARTIAL disables one of PCRE's optimizations. PCRE remembers the -last literal byte in a pattern, and abandons matching immediately if such a -byte is not present in the subject string. This optimization cannot be used -for a subject string that might match only partially. -

    -
    RESTRICTED PATTERNS FOR PCRE_PARTIAL
    -

    -Because of the way certain internal optimizations are implemented in PCRE, the -PCRE_PARTIAL option cannot be used with all patterns. Repeated single -characters such as -

    -  a{2,4}
    -
    -and repeated single metasequences such as -
    -  \d+
    -
    -are not permitted if the maximum number of occurrences is greater than one. -Optional items such as \d? (where the maximum is one) are permitted. -Quantifiers with any values are permitted after parentheses, so the invalid -examples above can be coded thus: -
    -  (a){2,4}
    -  (\d)+
    -
    -These constructions run more slowly, but for the kinds of application that are -envisaged for this facility, this is not felt to be a major restriction. -

    -

    -If PCRE_PARTIAL is set for a pattern that does not conform to the restrictions, -pcre_exec() returns the error code PCRE_ERROR_BADPARTIAL (-13). -

    -
    EXAMPLE OF PARTIAL MATCHING USING PCRETEST
    -

    -If the escape sequence \P is present in a pcretest data line, the -PCRE_PARTIAL flag is used for the match. Here is a run of pcretest that -uses the date example quoted above: -

    -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
    -  data> 25jun04\P
    -   0: 25jun04
    -   1: jun
    -  data> 25dec3\P
    -  Partial match
    -  data> 3ju\P
    -  Partial match
    -  data> 3juj\P
    -  No match
    -  data> j\P
    -  No match
    -
    -The first data string is matched completely, so pcretest shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. -

    -

    -Last updated: 08 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepattern.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepattern.html deleted file mode 100644 index a77b578b07..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcrepattern.html +++ /dev/null @@ -1,1470 +0,0 @@ - - -pcrepattern specification - - -

    pcrepattern man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    PCRE REGULAR EXPRESSION DETAILS
    -

    -The syntax and semantics of the regular expressions supported by PCRE are -described below. Regular expressions are also described in the Perl -documentation and in a number of books, some of which have copious examples. -Jeffrey Friedl's "Mastering Regular Expressions", published by O'Reilly, covers -regular expressions in great detail. This description of PCRE's regular -expressions is intended as reference material. -

    -

    -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 character strings. To use this, you must -build PCRE to include UTF-8 support, and then call pcre_compile() with -the PCRE_UTF8 option. How this affects pattern matching is mentioned in several -places below. There is also a summary of UTF-8 features in the -section on UTF-8 support -in the main -pcre -page. -

    -

    -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -

    -  The quick brown fox
    -
    -matches a portion of a subject string that is identical to itself. The power of -regular expressions comes from the ability to include alternatives and -repetitions in the pattern. These are encoded in the pattern by the use of -metacharacters, which do not stand for themselves but instead are -interpreted in some special way. -

    -

    -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized in square brackets. Outside square brackets, the metacharacters are -as follows: -

    -  \      general escape character with several uses
    -  ^      assert start of string (or line, in multiline mode)
    -  $      assert end of string (or line, in multiline mode)
    -  .      match any character except newline (by default)
    -  [      start character class definition
    -  |      start of alternative branch
    -  (      start subpattern
    -  )      end subpattern
    -  ?      extends the meaning of (
    -         also 0 or 1 quantifier
    -         also quantifier minimizer
    -  *      0 or more quantifier
    -  +      1 or more quantifier
    -         also "possessive quantifier"
    -  {      start min/max quantifier
    -
    -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -
    -  \      general escape character
    -  ^      negate the class, but only if the first character
    -  -      indicates character range
    -  [      POSIX character class (only if followed by POSIX syntax)
    -  ]      terminates the character class
    -
    -The following sections describe the use of each of the metacharacters. -

    -
    BACKSLASH
    -

    -The backslash character has several uses. Firstly, if it is followed by a -non-alphanumeric character, it takes away any special meaning that character may -have. This use of backslash as an escape character applies both inside and -outside character classes. -

    -

    -For example, if you want to match a * character, you write \* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \\. -

    -

    -If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the -pattern (other than in a character class) and characters between a # outside -a character class and the next newline character are ignored. An escaping -backslash can be used to include a whitespace or # character as part of the -pattern. -

    -

    -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \Q and \E. This is different from Perl in -that $ and @ are handled as literals in \Q...\E sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -

    -  Pattern            PCRE matches   Perl matches
    -
    -  \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
    -  \Qabc\$xyz\E       abc\$xyz       abc\$xyz
    -  \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz
    -
    -The \Q...\E sequence is recognized both inside and outside character classes. -

    -
    -Non-printing characters -
    -

    -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is usually easier to -use one of the following escape sequences than the binary character it -represents: -

    -  \a        alarm, that is, the BEL character (hex 07)
    -  \cx       "control-x", where x is any character
    -  \e        escape (hex 1B)
    -  \f        formfeed (hex 0C)
    -  \n        newline (hex 0A)
    -  \r        carriage return (hex 0D)
    -  \t        tab (hex 09)
    -  \ddd      character with octal code ddd, or backreference
    -  \xhh      character with hex code hh
    -  \x{hhh..} character with hex code hhh... (UTF-8 mode only)
    -
    -The precise effect of \cx is as follows: if x is a lower case letter, it -is converted to upper case. Then bit 6 of the character (hex 40) is inverted. -Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; becomes hex -7B. -

    -

    -After \x, from zero to two hexadecimal digits are read (letters can be in -upper or lower case). In UTF-8 mode, any number of hexadecimal digits may -appear between \x{ and }, but the value of the character code must be less -than 2**31 (that is, the maximum hexadecimal value is 7FFFFFFF). If characters -other than hexadecimal digits appear between \x{ and }, or if there is no -terminating }, this form of escape is not recognized. Instead, the initial -\x will be interpreted as a basic hexadecimal escape, with no following -digits, giving a character whose value is zero. -

    -

    -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \x when PCRE is in UTF-8 mode. There is no difference in the -way they are handled. For example, \xdc is exactly the same as \x{dc}. -

    -

    -After \0 up to two further octal digits are read. In both cases, if there -are fewer than two digits, just those that are present are used. Thus the -sequence \0\x\07 specifies two binary zeros followed by a BEL character -(code value 7). Make sure you supply two digits after the initial zero if the -pattern character that follows is itself an octal digit. -

    -

    -The handling of a backslash followed by a digit other than 0 is complicated. -Outside a character class, PCRE reads it and any following digits as a decimal -number. If the number is less than 10, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a back reference. A description of how this works is given -later, -following the discussion of -parenthesized subpatterns. -

    -

    -Inside a character class, or if the decimal number is greater than 9 and there -have not been that many capturing subpatterns, PCRE re-reads up to three octal -digits following the backslash, and generates a single byte from the least -significant 8 bits of the value. Any subsequent digits stand for themselves. -For example: -

    -  \040   is another way of writing a space
    -  \40    is the same, provided there are fewer than 40 previous capturing subpatterns
    -  \7     is always a back reference
    -  \11    might be a back reference, or another way of writing a tab
    -  \011   is always a tab
    -  \0113  is a tab followed by the character "3"
    -  \113   might be a back reference, otherwise the character with octal code 113
    -  \377   might be a back reference, otherwise the byte consisting entirely of 1 bits
    -  \81    is either a back reference, or a binary zero followed by the two characters "8" and "1"
    -
    -Note that octal values of 100 or greater must not be introduced by a leading -zero, because no more than three octal digits are ever read. -

    -

    -All the sequences that define a single byte value or a single UTF-8 character -(in UTF-8 mode) can be used both inside and outside character classes. In -addition, inside a character class, the sequence \b is interpreted as the -backspace character (hex 08), and the sequence \X is interpreted as the -character "X". Outside a character class, these sequences have different -meanings -(see below). -

    -
    -Generic character types -
    -

    -The third use of backslash is for specifying generic character types. The -following are always recognized: -

    -  \d     any decimal digit
    -  \D     any character that is not a decimal digit
    -  \s     any whitespace character
    -  \S     any character that is not a whitespace character
    -  \w     any "word" character
    -  \W     any "non-word" character
    -
    -Each pair of escape sequences partitions the complete set of characters into -two disjoint sets. Any given character matches one, and only one, of each pair. -

    -

    -These character type sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, since -there is no character to match. -

    -

    -For compatibility with Perl, \s does not match the VT character (code 11). -This makes it different from the the POSIX "space" class. The \s characters -are HT (9), LF (10), FF (12), CR (13), and space (32). -

    -

    -A "word" character is an underscore or any character less than 256 that is a -letter or digit. The definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -"Locale support" -in the -pcreapi -page). For example, in the "fr_FR" (French) locale, some character codes -greater than 128 are used for accented letters, and these are matched by \w. -

    -

    -In UTF-8 mode, characters with values greater than 128 never match \d, \s, or -\w, and always match \D, \S, and \W. This is true even when Unicode -character property support is available. -

    -
    -Unicode character properties -
    -

    -When PCRE is built with Unicode character property support, three additional -escape sequences to match generic character types are available when UTF-8 mode -is selected. They are: -

    - \p{xx}   a character with the xx property
    - \P{xx}   a character without the xx property
    - \X       an extended Unicode sequence
    -
    -The property names represented by xx above are limited to the -Unicode general category properties. Each character has exactly one such -property, specified by a two-letter abbreviation. For compatibility with Perl, -negation can be specified by including a circumflex between the opening brace -and the property name. For example, \p{^Lu} is the same as \P{Lu}. -

    -

    -If only one letter is specified with \p or \P, it includes all the properties -that start with that letter. In this case, in the absence of negation, the -curly brackets in the escape sequence are optional; these two examples have -the same effect: -

    -  \p{L}
    -  \pL
    -
    -The following property codes are supported: -
    -  C     Other
    -  Cc    Control
    -  Cf    Format
    -  Cn    Unassigned
    -  Co    Private use
    -  Cs    Surrogate
    -
    -  L     Letter
    -  Ll    Lower case letter
    -  Lm    Modifier letter
    -  Lo    Other letter
    -  Lt    Title case letter
    -  Lu    Upper case letter
    -
    -  M     Mark
    -  Mc    Spacing mark
    -  Me    Enclosing mark
    -  Mn    Non-spacing mark
    -
    -  N     Number
    -  Nd    Decimal number
    -  Nl    Letter number
    -  No    Other number
    -
    -  P     Punctuation
    -  Pc    Connector punctuation
    -  Pd    Dash punctuation
    -  Pe    Close punctuation
    -  Pf    Final punctuation
    -  Pi    Initial punctuation
    -  Po    Other punctuation
    -  Ps    Open punctuation
    -
    -  S     Symbol
    -  Sc    Currency symbol
    -  Sk    Modifier symbol
    -  Sm    Mathematical symbol
    -  So    Other symbol
    -
    -  Z     Separator
    -  Zl    Line separator
    -  Zp    Paragraph separator
    -  Zs    Space separator
    -
    -Extended properties such as "Greek" or "InMusicalSymbols" are not supported by -PCRE. -

    -

    -Specifying caseless matching does not affect these escape sequences. For -example, \p{Lu} always matches only upper case letters. -

    -

    -The \X escape matches any number of Unicode characters that form an extended -Unicode sequence. \X is equivalent to -

    -  (?>\PM\pM*)
    -
    -That is, it matches a character without the "mark" property, followed by zero -or more characters with the "mark" property, and treats the sequence as an -atomic group -(see below). -Characters with the "mark" property are typically accents that affect the -preceding character. -

    -

    -Matching characters by Unicode property is not fast, because PCRE has to search -a structure that contains data for over fifteen thousand characters. That is -why the traditional escape sequences such as \d and \w do not use Unicode -properties in PCRE. -

    -
    -Simple assertions -
    -

    -The fourth use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -below. -The backslashed -assertions are: -

    -  \b     matches at a word boundary
    -  \B     matches when not at a word boundary
    -  \A     matches at start of subject
    -  \Z     matches at end of subject or before newline at end
    -  \z     matches at end of subject
    -  \G     matches at first matching position in subject
    -
    -These assertions may not appear in character classes (but note that \b has a -different meaning, namely the backspace character, inside a character class). -

    -

    -A word boundary is a position in the subject string where the current character -and the previous character do not both match \w or \W (i.e. one matches -\w and the other matches \W), or the start or end of the string if the -first or last character matches \w, respectively. -

    -

    -The \A, \Z, and \z assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the startoffset -argument of pcre_exec() is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \A can never match. The -difference between \Z and \z is that \Z matches before a newline that is the -last character of the string as well as at the end of the string, whereas \z -matches only at the end. -

    -

    -The \G assertion is true only when the current matching position is at the -start point of the match, as specified by the startoffset argument of -pcre_exec(). It differs from \A when the value of startoffset is -non-zero. By calling pcre_exec() multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \G can be useful. -

    -

    -Note, however, that PCRE's interpretation of \G, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -

    -

    -If all the alternatives of a pattern begin with \G, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -

    -
    CIRCUMFLEX AND DOLLAR
    -

    -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is -at the start of the subject string. If the startoffset argument of -pcre_exec() is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -(see below). -

    -

    -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -

    -

    -A dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline -character that is the last character in the string (by default). Dollar need -not be the last character of the pattern if a number of alternatives are -involved, but it should be the last item in any branch in which it appears. -Dollar has no special meaning in a character class. -

    -

    -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \Z assertion. -

    -

    -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, they match immediately -after and immediately before an internal newline character, respectively, in -addition to matching at the start and end of the subject string. For example, -the pattern /^abc$/ matches the subject string "def\nabc" (where \n -represents a newline character) in multiline mode, but not otherwise. -Consequently, patterns that are anchored in single line mode because all -branches start with ^ are not anchored in multiline mode, and a match for -circumflex is possible when the startoffset argument of pcre_exec() -is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is -set. -

    -

    -Note that the sequences \A, \Z, and \z can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\A it is always anchored, whether PCRE_MULTILINE is set or not. -

    -
    FULL STOP (PERIOD, DOT)
    -

    -Outside a character class, a dot in the pattern matches any one character in -the subject, including a non-printing character, but not (by default) newline. -In UTF-8 mode, a dot matches any UTF-8 character, which might be more than one -byte long, except (by default) newline. If the PCRE_DOTALL option is set, -dots match newlines as well. The handling of dot is entirely independent of the -handling of circumflex and dollar, the only relationship being that they both -involve newline characters. Dot has no special meaning in a character class. -

    -
    MATCHING A SINGLE BYTE
    -

    -Outside a character class, the escape sequence \C matches any one byte, both -in and out of UTF-8 mode. Unlike a dot, it can match a newline. The feature is -provided in Perl in order to match individual bytes in UTF-8 mode. Because it -breaks up UTF-8 characters into individual bytes, what remains in the string -may be a malformed UTF-8 string. For this reason, the \C escape sequence is -best avoided. -

    -

    -PCRE does not allow \C to appear in lookbehind assertions -(described below), -because in UTF-8 mode this would make it impossible to calculate the length of -the lookbehind. -

    -
    SQUARE BRACKETS AND CHARACTER CLASSES
    -

    -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special. If a -closing square bracket is required as a member of the class, it should be the -first data character in the class (after an initial circumflex, if present) or -escaped with a backslash. -

    -

    -A character class matches a single character in the subject. In UTF-8 mode, the -character may occupy more than one byte. A matched character must be in the set -of characters defined by the class, unless the first character in the class -definition is a circumflex, in which case the subject character must not be in -the set defined by the class. If a circumflex is actually required as a member -of the class, ensure it is not the first character, or escape it with a -backslash. -

    -

    -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion: it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -

    -

    -In UTF-8 mode, characters with values greater than 255 can be included in a -class as a literal string of bytes, or by using the \x{ escaping mechanism. -

    -

    -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. When running in UTF-8 mode, PCRE supports the concept of -case for characters with values greater than 128 only when it is compiled with -Unicode property support. -

    -

    -The newline character is never treated in any special way in character classes, -whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class -such as [^a] will always match a newline. -

    -

    -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class. -

    -

    -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -

    -

    -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\000-\037]. In UTF-8 -mode, ranges can include characters whose values are greater than 255, for -example [\x{100}-\x{2ff}]. -

    -

    -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\\^_`wxyzabc], matched caselessly, and in non-UTF-8 mode, if character -tables for the "fr_FR" locale are in use, [\xc8-\xcb] matches accented E -characters in both cases. In UTF-8 mode, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -

    -

    -The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear -in a character class, and add the characters that they match to the class. For -example, [\dABCDEF] matches any hexadecimal digit. A circumflex can -conveniently be used with the upper case character types to specify a more -restricted set of characters than the matching lower case type. For example, -the class [^\W_] matches any letter or digit, but not underscore. -

    -

    -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name - see the next section), and the terminating -closing square bracket. However, escaping other non-alphanumeric characters -does no harm. -

    -
    POSIX CHARACTER CLASSES
    -

    -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -

    -  [01[:alpha:]%]
    -
    -matches "0", "1", any alphabetic character, or "%". The supported class names -are -
    -  alnum    letters and digits
    -  alpha    letters
    -  ascii    character codes 0 - 127
    -  blank    space or tab only
    -  cntrl    control characters
    -  digit    decimal digits (same as \d)
    -  graph    printing characters, excluding space
    -  lower    lower case letters
    -  print    printing characters, including space
    -  punct    printing characters, excluding letters and digits
    -  space    white space (not quite the same as \s)
    -  upper    upper case letters
    -  word     "word" characters (same as \w)
    -  xdigit   hexadecimal digits
    -
    -The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), and -space (32). Notice that this list includes the VT character (code 11). This -makes "space" different to \s, which does not include VT (for Perl -compatibility). -

    -

    -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -

    -  [12[:^digit:]]
    -
    -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -

    -

    -In UTF-8 mode, characters with values greater than 128 do not match any of -the POSIX character classes. -

    -
    VERTICAL BAR
    -

    -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -

    -  gilbert|sullivan
    -
    -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). -The matching process tries each alternative in turn, from left to right, -and the first one that succeeds is used. If the alternatives are within a -subpattern -(defined below), -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -

    -
    INTERNAL OPTION SETTING
    -

    -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options can be changed from within the pattern by a sequence of -Perl option letters enclosed between "(?" and ")". The option letters are -

    -  i  for PCRE_CASELESS
    -  m  for PCRE_MULTILINE
    -  s  for PCRE_DOTALL
    -  x  for PCRE_EXTENDED
    -
    -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -

    -

    -When an option change occurs at top level (that is, not inside subpattern -parentheses), the change applies to the remainder of the pattern that follows. -If the change is placed right at the start of a pattern, PCRE extracts it into -the global options (and it will therefore show up in data extracted by the -pcre_fullinfo() function). -

    -

    -An option change within a subpattern affects only that part of the current -pattern that follows it, so -

    -  (a(?i)b)c
    -
    -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -
    -  (a(?i)b|c)
    -
    -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -

    -

    -The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the -same way as the Perl-compatible options by using the characters U and X -respectively. The (?X) flag setting is special in that it must always occur -earlier in the pattern than any of the additional features it turns on, even -when it is at top level. It is best to put it at the start. -

    -
    SUBPATTERNS
    -

    -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -
    -
    -1. It localizes a set of alternatives. For example, the pattern -

    -  cat(aract|erpillar|)
    -
    -matches one of the words "cat", "cataract", or "caterpillar". Without the -parentheses, it would match "cataract", "erpillar" or the empty string. -
    -
    -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the ovector argument of -pcre_exec(). Opening parentheses are counted from left to right (starting -from 1) to obtain numbers for the capturing subpatterns. -

    -

    -For example, if the string "the red king" is matched against the pattern -

    -  the ((red|white) (king|queen))
    -
    -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -

    -

    -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -

    -  the ((?:red|white) (king|queen))
    -
    -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535, and the maximum depth -of nesting of all subpatterns, both capturing and non-capturing, is 200. -

    -

    -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -

    -  (?i:saturday|sunday)
    -  (?:(?i)saturday|sunday)
    -
    -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -

    -
    NAMED SUBPATTERNS
    -

    -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns, something that Perl does -not provide. The Python syntax (?P<name>...) is used. Names consist of -alphanumeric characters and underscores, and must be unique within a pattern. -

    -

    -Named capturing parentheses are still allocated numbers as well as names. The -PCRE API provides function calls for extracting the name-to-number translation -table from a compiled pattern. There is also a convenience function for -extracting a captured substring by name. For further details see the -pcreapi -documentation. -

    -
    REPETITION
    -

    -Repetition is specified by quantifiers, which can follow any of the following -items: -

    -  a literal data character
    -  the . metacharacter
    -  the \C escape sequence
    -  the \X escape sequence (in UTF-8 mode with Unicode properties)
    -  an escape such as \d that matches a single character
    -  a character class
    -  a back reference (see next section)
    -  a parenthesized subpattern (unless it is an assertion)
    -
    -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -
    -  z{2,4}
    -
    -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -
    -  [aeiou]{3,}
    -
    -matches at least 3 successive vowels, but may match many more, while -
    -  \d{8}
    -
    -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -

    -

    -In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to individual -bytes. Thus, for example, \x{100}{2} matches two UTF-8 characters, each of -which is represented by a two-byte sequence. Similarly, when Unicode property -support is available, \X{3} matches three Unicode extended sequences, each of -which may be several bytes long (and they may be of different lengths). -

    -

    -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. -

    -

    -For convenience (and historical compatibility) the three most common -quantifiers have single-character abbreviations: -

    -  *    is equivalent to {0,}
    -  +    is equivalent to {1,}
    -  ?    is equivalent to {0,1}
    -
    -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -
    -  (a?)*
    -
    -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -

    -

    -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -

    -  /\*.*\*/
    -
    -to the string -
    -  /* first comment */  not comment  /* second comment */
    -
    -fails, because it matches the entire string owing to the greediness of the .* -item. -

    -

    -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -

    -  /\*.*?\*/
    -
    -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -
    -  \d??\d
    -
    -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -

    -

    -If the PCRE_UNGREEDY option is set (an option which is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -

    -

    -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -

    -

    -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the . to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \A. -

    -

    -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -

    -

    -However, there is one situation where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a backreference -elsewhere in the pattern, a match at the start may fail, and a later one -succeed. Consider, for example: -

    -  (.*)abc\1
    -
    -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -

    -

    -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -

    -  (tweedle[dume]{3}\s*)+
    -
    -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -
    -  /(a|(b))+/
    -
    -matches "aba" the value of the second captured substring is "b". -

    -
    ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
    -

    -With both maximizing and minimizing repetition, failure of what follows -normally causes the repeated item to be re-evaluated to see if a different -number of repeats allows the rest of the pattern to match. Sometimes it is -useful to prevent this, either to change the nature of the match, or to cause -it fail earlier than it otherwise might, when the author of the pattern knows -there is no point in carrying on. -

    -

    -Consider, for example, the pattern \d+foo when applied to the subject line -

    -  123456bar
    -
    -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \d+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -

    -

    -If we use atomic grouping for the previous example, the matcher would give up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -

    -  (?>\d+)foo
    -
    -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -

    -

    -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -

    -

    -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \d+ and \d+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\d+) can only match an entire sequence of digits. -

    -

    -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -

    -  \d++foo
    -
    -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning or processing of a -possessive quantifier and the equivalent atomic group. -

    -

    -The possessive quantifier syntax is an extension to the Perl syntax. It -originates in Sun's Java package. -

    -

    -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -

    -  (\D+|<\d+>)*[!?]
    -
    -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -
    -  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    -
    -it takes a long time before reporting failure. This is because the string can -be divided between the internal \D+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -
    -  ((?>\D+)|<\d+>)*[!?]
    -
    -sequences of non-digits cannot be broken, and failure happens quickly. -

    -
    BACK REFERENCES
    -

    -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -

    -

    -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. See the subsection entitled "Non-printing characters" -above -for further details of the handling of digits following a backslash. -

    -

    -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -"Subpatterns as subroutines" -below for a way of doing that). So the pattern -

    -  (sens|respons)e and \1ibility
    -
    -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -
    -  ((?i)rah)\s+\1
    -
    -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -

    -

    -Back references to named subpatterns use the Python syntax (?P=name). We could -rewrite the above example as follows: -

    -  (?<p1>(?i)rah)\s+(?P=p1)
    -
    -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail. For example, the pattern -
    -  (a|(bc))\2
    -
    -always fails if it starts to match "a" rather than "bc". Because there may be -many capturing parentheses in a pattern, all digits following the backslash are -taken as part of a potential back reference number. If the pattern continues -with a digit character, some delimiter must be used to terminate the back -reference. If the PCRE_EXTENDED option is set, this can be whitespace. -Otherwise an empty comment (see -"Comments" -below) can be used. -

    -

    -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -

    -  (a|b\1)+
    -
    -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -

    -
    ASSERTIONS
    -

    -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described -above. -

    -

    -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -

    -

    -Assertion subpatterns are not capturing subpatterns, and may not be repeated, -because it makes no sense to assert the same thing several times. If any kind -of assertion contains capturing subpatterns within it, these are counted for -the purposes of numbering the capturing subpatterns in the whole pattern. -However, substring capturing is carried out only for positive assertions, -because it does not make sense for negative assertions. -

    -
    -Lookahead assertions -
    -

    -Lookahead assertions start -with (?= for positive assertions and (?! for negative assertions. For example, -

    -  \w+(?=;)
    -
    -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -
    -  foo(?!bar)
    -
    -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -
    -  (?!foo)bar
    -
    -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -

    -

    -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -

    -
    -Lookbehind assertions -
    -

    -Lookbehind assertions start with (?<= for positive assertions and (?<! for -negative assertions. For example, -

    -  (?<!foo)bar
    -
    -does find an occurrence of "bar" that is not preceded by "foo". The contents of -a lookbehind assertion are restricted such that all the strings it matches must -have a fixed length. However, if there are several alternatives, they do not -all have to have the same fixed length. Thus -
    -  (?<=bullock|donkey)
    -
    -is permitted, but -
    -  (?<!dogs?|cats?)
    -
    -causes an error at compile time. Branches that match different length strings -are permitted only at the top level of a lookbehind assertion. This is an -extension compared with Perl (at least for 5.8), which requires all branches to -match the same length of string. An assertion such as -
    -  (?<=ab(c|de))
    -
    -is not permitted, because its single top-level branch can match two different -lengths, but it is acceptable if rewritten to use two top-level branches: -
    -  (?<=abc|abde)
    -
    -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed width and then try to -match. If there are insufficient characters before the current position, the -match is deemed to fail. -

    -

    -PCRE does not allow the \C escape (which matches a single byte in UTF-8 mode) -to appear in lookbehind assertions, because it makes it impossible to calculate -the length of the lookbehind. The \X escape, which can match different numbers -of bytes, is also not permitted. -

    -

    -Atomic groups can be used in conjunction with lookbehind assertions to specify -efficient matching at the end of the subject string. Consider a simple pattern -such as -

    -  abcd$
    -
    -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -
    -  ^.*abcd$
    -
    -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -
    -  ^(?>.*)(?<=abcd)
    -
    -or, equivalently, using the possessive quantifier syntax, -
    -  ^.*+(?<=abcd)
    -
    -there can be no backtracking for the .* item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -

    -
    -Using multiple assertions -
    -

    -Several assertions (of any sort) may occur in succession. For example, -

    -  (?<=\d{3})(?<!999)foo
    -
    -matches "foo" preceded by three digits that are not "999". Notice that each of -the assertions is applied independently at the same point in the subject -string. First there is a check that the previous three characters are all -digits, and then there is a check that the same three characters are not "999". -This pattern does not match "foo" preceded by six characters, the first -of which are digits and the last three of which are not "999". For example, it -doesn't match "123abcfoo". A pattern to do that is -
    -  (?<=\d{3}...)(?<!999)foo
    -
    -This time the first assertion looks at the preceding six characters, checking -that the first three are digits, and then the second assertion checks that the -preceding three characters are not "999". -

    -

    -Assertions can be nested in any combination. For example, -

    -  (?<=(?<!foo)bar)baz
    -
    -matches an occurrence of "baz" that is preceded by "bar" which in turn is not -preceded by "foo", while -
    -  (?<=\d{3}(?!999)...)foo
    -
    -is another pattern that matches "foo" preceded by three digits and any three -characters that are not "999". -

    -
    CONDITIONAL SUBPATTERNS
    -

    -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a previous capturing subpattern matched -or not. The two possible forms of conditional subpattern are -

    -  (?(condition)yes-pattern)
    -  (?(condition)yes-pattern|no-pattern)
    -
    -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. -

    -

    -There are three kinds of condition. If the text between the parentheses -consists of a sequence of digits, the condition is satisfied if the capturing -subpattern of that number has previously matched. The number must be greater -than zero. Consider the following pattern, which contains non-significant white -space to make it more readable (assume the PCRE_EXTENDED option) and to divide -it into three parts for ease of discussion: -

    -  ( \( )?    [^()]+    (?(1) \) )
    -
    -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether the first set of parentheses matched -or not. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -

    -

    -If the condition is the string (R), it is satisfied if a recursive call to the -pattern or subpattern has been made. At "top level", the condition is false. -This is a PCRE extension. Recursive patterns are described in the next section. -

    -

    -If the condition is not a sequence of digits or (R), it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -

    -  (?(?=[^a-z]*[a-z])
    -  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
    -
    -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -

    -
    COMMENTS
    -

    -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. The characters -that make up a comment play no part in the pattern matching at all. -

    -

    -If the PCRE_EXTENDED option is set, an unescaped # character outside a -character class introduces a comment that continues up to the next newline -character in the pattern. -

    -
    RECURSIVE PATTERNS
    -

    -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. Perl provides a facility -that allows regular expressions to recurse (amongst other things). It does this -by interpolating Perl code in the expression at run time, and the code can -refer to the expression itself. A Perl pattern to solve the parentheses problem -can be created like this: -

    -  $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
    -
    -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. Obviously, PCRE cannot support -the interpolation of Perl code. Instead, it supports some special syntax for -recursion of the entire pattern, and also for individual subpattern recursion. -

    -

    -The special item that consists of (? followed by a number greater than zero and -a closing parenthesis is a recursive call of the subpattern of the given -number, provided that it occurs inside that subpattern. (If not, it is a -"subroutine" call, which is described in the next section.) The special item -(?R) is a recursive call of the entire regular expression. -

    -

    -For example, this PCRE pattern solves the nested parentheses problem (assume -the PCRE_EXTENDED option is set so that white space is ignored): -

    -  \( ( (?>[^()]+) | (?R) )* \)
    -
    -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is a correctly parenthesized substring). -Finally there is a closing parenthesis. -

    -

    -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -

    -  ( \( ( (?>[^()]+) | (?1) )* \) )
    -
    -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. In a larger pattern, keeping track of -parenthesis numbers can be tricky. It may be more convenient to use named -parentheses instead. For this, PCRE uses (?P>name), which is an extension to -the Python syntax that PCRE uses for named parentheses (Perl does not provide -named parentheses). We could rewrite the above example as follows: -
    -  (?P<pn> \( ( (?>[^()]+) | (?P>pn) )* \) )
    -
    -This particular example pattern contains nested unlimited repeats, and so the -use of atomic grouping for matching strings of non-parentheses is important -when applying the pattern to strings that do not match. For example, when this -pattern is applied to -
    -  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
    -
    -it yields "no match" quickly. However, if atomic grouping is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -

    -

    -At the end of a match, the values set for any capturing subpatterns are those -from the outermost level of the recursion at which the subpattern value is set. -If you want to obtain intermediate values, a callout function can be used (see -the next section and the -pcrecallout -documentation). If the pattern above is matched against -

    -  (ab(cd)ef)
    -
    -the value for the capturing parentheses is "ef", which is the last value taken -on at the top level. If additional parentheses are added, giving -
    -  \( ( ( (?>[^()]+) | (?R) )* ) \)
    -     ^                        ^
    -     ^                        ^
    -
    -the string they capture is "ab(cd)ef", the contents of the top level -parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE -has to obtain extra memory to store data during a recursion, which it does by -using pcre_malloc, freeing it via pcre_free afterwards. If no -memory can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -

    -

    -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -

    -  < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
    -
    -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -

    -
    SUBPATTERNS AS SUBROUTINES
    -

    -If the syntax for a recursive subpattern reference (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. An earlier example pointed out that the -pattern -

    -  (sens|respons)e and \1ibility
    -
    -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -
    -  (sens|respons)e and (?1)ibility
    -
    -is used, it does match "sense and responsibility" as well as the other two -strings. Such references must, however, follow the subpattern to which they -refer. -

    -
    CALLOUTS
    -

    -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -

    -

    -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable pcre_callout. -By default, this variable contains NULL, which disables all calling out. -

    -

    -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

    -  (?C1)\dabc(?C2)def
    -
    -If the PCRE_AUTO_CALLOUT flag is passed to pcre_compile(), callouts are -automatically installed before each item in the pattern. They are all numbered -255. -

    -

    -During matching, when PCRE reaches a callout point (and pcre_callout is -set), the external function is called. It is provided with the number of the -callout, the position in the pattern, and, optionally, one item of data -originally supplied by the caller of pcre_exec(). The callout function -may cause matching to proceed, to backtrack, or to fail altogether. A complete -description of the interface to the callout function is given in the -pcrecallout -documentation. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreperform.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreperform.html deleted file mode 100644 index 188b1423e3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreperform.html +++ /dev/null @@ -1,97 +0,0 @@ - - -pcreperform specification - - -

    pcreperform man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -PCRE PERFORMANCE -
    -

    -Certain items that may appear in regular expression patterns are more efficient -than others. It is more efficient to use a character class like [aeiou] than a -set of alternatives such as (a|e|i|o|u). In general, the simplest construction -that provides the required behaviour is usually the most efficient. Jeffrey -Friedl's book contains a lot of useful general discussion about optimizing -regular expressions for efficient performance. This document contains a few -observations about PCRE. -

    -

    -Using Unicode character properties (the \p, \P, and \X escapes) is slow, -because PCRE has to scan a structure that contains data for over fifteen -thousand characters whenever it needs a character's property. If you can find -an alternative pattern that does not use character properties, it will probably -be faster. -

    -

    -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -

    -  .*second
    -
    -matches the subject "first\nand second" (where \n stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -

    -

    -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* to indicate explicit anchoring. That saves PCRE from -having to scan along the subject looking for a newline to restart at. -

    -

    -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -

    -  (a+)*
    -
    -This can match "aaaa" in 33 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time. -

    -

    -An optimization catches some of the more simple cases such as -

    -  (a+)*b
    -
    -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -
    -  (a+)*\d
    -
    -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -

    -

    -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreposix.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreposix.html deleted file mode 100644 index c0e9cc9789..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreposix.html +++ /dev/null @@ -1,218 +0,0 @@ - - -pcreposix specification - - -

    pcreposix man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    SYNOPSIS OF POSIX API
    -

    -#include <pcreposix.h> -

    -

    -int regcomp(regex_t *preg, const char *pattern, -int cflags); -

    -

    -int regexec(regex_t *preg, const char *string, -size_t nmatch, regmatch_t pmatch[], int eflags); -

    -

    -size_t regerror(int errcode, const regex_t *preg, -char *errbuf, size_t errbuf_size); -

    -

    -void regfree(regex_t *preg); -

    -
    DESCRIPTION
    -

    -This set of functions provides a POSIX-style API to the PCRE regular expression -package. See the -pcreapi -documentation for a description of PCRE's native API, which contains additional -functionality. -

    -

    -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the pcreposix.h -header file, and on Unix systems the library itself is called -pcreposix.a, so can be accessed by adding -lpcreposix to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add -lpcre. -

    -

    -I have implemented only those option bits that can be reasonably mapped to PCRE -native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined -with the value zero. They have no effect, but since programs that are written -to the POSIX interface often use them, this makes it easier to slot in PCRE as -a replacement library. Other POSIX options are not even defined. -

    -

    -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -

    -

    -The header for these functions is supplied as pcreposix.h to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as regex.h, which is the "correct" name. It provides two -structure types, regex_t for compiled internal forms, and -regmatch_t for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -

    -

    -

    -
    COMPILING A PATTERN
    -

    -The function regcomp() is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument pattern. The preg argument is a pointer -to a regex_t structure that is used as a base for storing information -about the compiled expression. -

    -

    -The argument cflags is either zero, or contains one or more of the bits -defined by the following macros: -

    -  REG_ICASE
    -
    -The PCRE_CASELESS option is set when the expression is passed for compilation -to the native function. -
    -  REG_NEWLINE
    -
    -The PCRE_MULTILINE option is set when the expression is passed for compilation -to the native function. Note that this does not mimic the defined POSIX -behaviour for REG_NEWLINE (see the following section). -

    -

    -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -some of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they aren't) or by a negative class such as [^a] -(they are). -

    -

    -The yield of regcomp() is zero on success, and non-zero otherwise. The -preg structure is filled in on success, and one member of the structure -is public: re_nsub contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -

    -
    MATCHING NEWLINE CHARACTERS
    -

    -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -

    -                          Default   Change with
    -
    -  . matches newline          no     PCRE_DOTALL
    -  newline matches [^a]       yes    not changeable
    -  $ matches \n at end        yes    PCRE_DOLLARENDONLY
    -  $ matches \n in middle     no     PCRE_MULTILINE
    -  ^ matches \n in middle     no     PCRE_MULTILINE
    -
    -This is the equivalent table for POSIX: -
    -                          Default   Change with
    -
    -  . matches newline          yes    REG_NEWLINE
    -  newline matches [^a]       yes    REG_NEWLINE
    -  $ matches \n at end        no     REG_NEWLINE
    -  $ matches \n in middle     no     REG_NEWLINE
    -  ^ matches \n in middle     no     REG_NEWLINE
    -
    -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -

    -

    -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -

    -
    MATCHING A PATTERN
    -

    -The function regexec() is called to match a compiled pattern preg -against a given string, which is terminated by a zero byte, subject to -the options in eflags. These can be: -

    -  REG_NOTBOL
    -
    -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -
    -  REG_NOTEOL
    -
    -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -

    -

    -The portion of the string that was matched, and also any captured substrings, -are returned via the pmatch argument, which points to an array of -nmatch structures of type regmatch_t, containing the members -rm_so and rm_eo. These contain the offset to the first character of -each substring and the offset to the first character after the end of each -substring, respectively. The 0th element of the vector relates to the entire -portion of string that was matched; subsequent elements relate to the -capturing subpatterns of the regular expression. Unused entries in the array -have both structure members set to -1. -

    -

    -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -

    -
    ERROR MESSAGES
    -

    -The regerror() function maps a non-zero errorcode from either -regcomp() or regexec() to a printable message. If preg is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in errbuf. The length of the -message, including the zero, is limited to errbuf_size. The yield of the -function is the size of buffer needed to hold the whole message. -

    -
    MEMORY USAGE
    -

    -Compiling a regular expression causes memory to be allocated and associated -with the preg structure. The function regfree() frees all such -memory, after which preg may no longer be used as a compiled expression. -

    -
    AUTHOR
    -

    -Philip Hazel <ph10@cam.ac.uk> -
    -University Computing Service, -
    -Cambridge CB2 3QG, England. -

    -

    -Last updated: 07 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreprecompile.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreprecompile.html deleted file mode 100644 index 66e6656bfb..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcreprecompile.html +++ /dev/null @@ -1,133 +0,0 @@ - - -pcreprecompile specification - - -

    pcreprecompile man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    SAVING AND RE-USING PRECOMPILED PCRE PATTERNS
    -

    -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -pcre_maketables() -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. -

    -

    -If you save compiled patterns to a file, you can copy them to a different host -and run them there. This works even if the new host has the opposite endianness -to the one on which the patterns were compiled. There may be a small -performance penalty, but it should be insignificant. -

    -
    SAVING A COMPILED PATTERN
    -

    -The value returned by pcre_compile() points to a single block of memory -that holds the compiled pattern and associated data. You can find the length of -this block in bytes by calling pcre_fullinfo() with an argument of -PCRE_INFO_SIZE. You can then save the data in any appropriate manner. Here is -sample code that compiles a pattern and writes it to a file. It assumes that -the variable fd refers to a file that is open for output: -

    -  int erroroffset, rc, size;
    -  char *error;
    -  pcre *re;
    -
    -  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
    -  if (re == NULL) { ... handle errors ... }
    -  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
    -  if (rc < 0) { ... handle errors ... }
    -  rc = fwrite(re, 1, size, fd);
    -  if (rc != size) { ... handle errors ... }
    -
    -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -

    -

    -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -

    -

    -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -

    -

    -If the pattern has been studied, it is also possible to save the study data in -a similar way to the compiled pattern itself. When studying generates -additional information, pcre_study() returns a pointer to a -pcre_extra data block. Its format is defined in the -section on matching a pattern -in the -pcreapi -documentation. The study_data field points to the binary study data, and -this is what you must save (not the pcre_extra block itself). The length -of the study data can be obtained by calling pcre_fullinfo() with an -argument of PCRE_INFO_STUDYSIZE. Remember to check that pcre_study() did -return a non-NULL value before trying to save the study data. -

    -
    RE-USING A PRECOMPILED PATTERN
    -

    -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, you pass its pointer to pcre_exec() in the usual way. This should -work even on another host, and even if that host has the opposite endianness to -the one where the pattern was compiled. -

    -

    -However, if you passed a pointer to custom character tables when the pattern -was compiled (the tableptr argument of pcre_compile()), you must -now pass a similar pointer to pcre_exec(), because the value saved with -the compiled pattern will obviously be nonsense. A field in a -pcre_extra() block is used to pass this data, as described in the -section on matching a pattern -in the -pcreapi -documentation. -

    -

    -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes pcre_exec() to -use PCRE's internal tables. Thus, you do not need to take any special action at -run time in this case. -

    -

    -If you saved study data with the compiled pattern, you need to create your own -pcre_extra data block and set the study_data field to point to the -reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in the -flags field to indicate that study data is present. Then pass the -pcre_extra block to pcre_exec() in the usual way. -

    -
    COMPATIBILITY WITH DIFFERENT PCRE RELEASES
    -

    -The layout of the control block that is at the start of the data that makes up -a compiled pattern was changed for release 5.0. If you have any saved patterns -that were compiled with previous releases (not a facility that was previously -advertised), you will have to recompile them for release 5.0. However, from now -on, it should be possible to make changes in a compabible manner. -

    -

    -Last updated: 10 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcresample.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcresample.html deleted file mode 100644 index eb4d25e623..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcresample.html +++ /dev/null @@ -1,81 +0,0 @@ - - -pcresample specification - - -

    pcresample man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -
    -PCRE SAMPLE PROGRAM -
    -

    -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file pcredemo.c in the PCRE distribution. -

    -

    -The program compiles the regular expression that is its first argument, and -matches it against the subject string in its second argument. No PCRE options -are set, and default character tables are used. If matching succeeds, the -program outputs the portion of the subject that matched, together with the -contents of any captured substrings. -

    -

    -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -

    -

    -If PCRE is installed in the standard include and library directories for your -system, you should be able to compile the demonstration program using this -command: -

    -  gcc -o pcredemo pcredemo.c -lpcre
    -
    -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -/usr/local, you can compile the demonstration program using a command -like this: -
    -  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
    -
    -Once you have compiled the demonstration program, you can run simple tests like -this: -
    -  ./pcredemo 'cat|dog' 'the cat sat on the mat'
    -  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
    -
    -Note that there is a much more comprehensive test program, called -pcretest, -which supports many more facilities for testing regular expressions and the -PCRE library. The pcredemo program is provided as a simple coding -example. -

    -

    -On some operating systems (e.g. Solaris), when PCRE is not installed in the -standard library directory, you may get an error like this when you try to run -pcredemo: -

    -  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
    -
    -This is caused by the way shared library support works on those systems. You -need to add -
    -  -R/usr/local/lib
    -
    -(for example) to the compile command to get round this problem. -

    -

    -Last updated: 09 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcretest.html b/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcretest.html deleted file mode 100644 index c7bedcd968..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/html/pcretest.html +++ /dev/null @@ -1,495 +0,0 @@ - - -pcretest specification - - -

    pcretest man page

    -

    -Return to the PCRE index page. -

    -

    -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
    -

    -
    SYNOPSIS
    -

    -pcretest [-C] [-d] [-i] [-m] [-o osize] [-p] [-t] [source] -[destination] -

    -

    -pcretest was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -pcrepattern -documentation. For details of the PCRE library function calls and their -options, see the -pcreapi -documentation. -

    -
    OPTIONS
    -

    --C -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit. -

    -

    --d -Behave as if each regex had the /D (debug) modifier; the internal -form is output after compilation. -

    -

    --i -Behave as if each regex had the /I modifier; information about the -compiled pattern is given after compilation. -

    -

    --m -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding /M to each regular expression. For compatibility -with earlier versions of pcretest, -s is a synonym for -m. -

    -

    --o osize -Set the number of elements in the output vector that is used when calling -pcre_exec() to be osize. The default value is 45, which is enough -for 14 capturing subexpressions. The vector size can be changed for individual -matching calls by including \O in the data line (see below). -

    -

    --p -Behave as if each regex has /P modifier; the POSIX wrapper API is used -to call PCRE. None of the other options has any effect when -p is set. -

    -

    --t -Run each compile, study, and match many times with a timer, and output -resulting time per compile or match (in milliseconds). Do not set -m with --t, because you will then get the size output a zillion times, and the -timing will be distorted. -

    -
    DESCRIPTION
    -

    -If pcretest is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -

    -

    -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against the pattern. -

    -

    -Each data line is matched separately and independently. If you want to do -multiple-line matches, you have to use the \n escape sequence in a single line -of input to encode the newline characters. The maximum length of data line is -30,000 characters. -

    -

    -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example -

    -  /(a|bc)x+yz/
    -
    -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -
    -  /abc\/def/
    -
    -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -
    -  /abc/\
    -
    -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -
    -  /abc\/
    -
    -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -

    -
    PATTERN MODIFIERS
    -

    -A pattern may be followed by any number of modifiers, which are mostly single -characters. Following Perl usage, these are referred to below as, for example, -"the /i modifier", even though the delimiter of the pattern need not -always be a slash, and no slash is used when writing modifiers. Whitespace may -appear between the final pattern delimiter and the first modifier, and between -the modifiers themselves. -

    -

    -The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -pcre_compile() is called. These four modifier letters have the same -effect as they do in Perl. For example: -

    -  /caseless/i
    -
    -The following table shows additional modifiers for setting PCRE options that do -not correspond to anything in Perl: -
    -  /A    PCRE_ANCHORED
    -  /C    PCRE_AUTO_CALLOUT
    -  /E    PCRE_DOLLAR_ENDONLY
    -  /N    PCRE_NO_AUTO_CAPTURE
    -  /U    PCRE_UNGREEDY
    -  /X    PCRE_EXTRA
    -
    -Searching for all possible matches within each subject string can be requested -by the /g or /G modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -/g and /G is that the former uses the startoffset argument to -pcre_exec() to start searching at a new point within the entire string -(which is in effect what Perl does), whereas the latter passes over a shortened -substring. This makes a difference to the matching process if the pattern -begins with a lookbehind assertion (including \b or \B). -

    -

    -If any call to pcre_exec() in a /g or /G sequence matches an -empty string, the next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED -flags set in order to search for another, non-empty, match at the same point. -If this second match fails, the start offset is advanced by one, and the normal -match is retried. This imitates the way Perl handles such cases when using the -/g modifier or the split() function. -

    -

    -There are yet more modifiers for controlling the way pcretest -operates. -

    -

    -The /+ modifier requests that as well as outputting the substring that -matched the entire pattern, pcretest should in addition output the remainder of -the subject string. This is useful for tests where the subject contains -multiple copies of the same substring. -

    -

    -The /L modifier must be followed directly by the name of a locale, for -example, -

    -  /pattern/Lfr_FR
    -
    -For this reason, it must be the last modifier. The given locale is set, -pcre_maketables() is called to build a set of character tables for the -locale, and this is then passed to pcre_compile() when compiling the -regular expression. Without an /L modifier, NULL is passed as the tables -pointer; that is, /L applies only to the expression on which it appears. -

    -

    -The /I modifier requests that pcretest output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling pcre_fullinfo() after compiling a -pattern. If the pattern is studied, the results of that are also output. -

    -

    -The /D modifier is a PCRE debugging feature, which also assumes /I. -It causes the internal form of compiled regular expressions to be output after -compilation. If the pattern was studied, the information returned is also -output. -

    -

    -The /F modifier causes pcretest to flip the byte order of the -fields in the compiled pattern that contain 2-byte and 4-byte numbers. This -facility is for testing the feature in PCRE that allows it to execute patterns -that were compiled on a host with a different endianness. This feature is not -available when the POSIX interface to PCRE is being used, that is, when the -/P pattern modifier is specified. See also the section about saving and -reloading compiled patterns below. -

    -

    -The /S modifier causes pcre_study() to be called after the -expression has been compiled, and the results used when the expression is -matched. -

    -

    -The /M modifier causes the size of memory block used to hold the compiled -pattern to be output. -

    -

    -The /P modifier causes pcretest to call PCRE via the POSIX wrapper -API rather than its native API. When this is done, all other modifiers except -/i, /m, and /+ are ignored. REG_ICASE is set if /i is -present, and REG_NEWLINE is set if /m is present. The wrapper functions -force PCRE_DOLLAR_ENDONLY always, and PCRE_DOTALL unless REG_NEWLINE is set. -

    -

    -The /8 modifier causes pcretest to call PCRE with the PCRE_UTF8 -option set. This turns on support for UTF-8 character handling in PCRE, -provided that it was compiled with this support enabled. This modifier also -causes any non-printing characters in output strings to be printed using the -\x{hh...} notation if they are valid UTF-8 sequences. -

    -

    -If the /? modifier is used with /8, it causes pcretest to -call pcre_compile() with the PCRE_NO_UTF8_CHECK option, to suppress the -checking of the string for UTF-8 validity. -

    -
    DATA LINES
    -

    -Before each data line is passed to pcre_exec(), leading and trailing -whitespace is removed, and it is then scanned for \ escapes. Some of these are -pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -

    -  \a         alarm (= BEL)
    -  \b         backspace
    -  \e         escape
    -  \f         formfeed
    -  \n         newline
    -  \r         carriage return
    -  \t         tab
    -  \v         vertical tab
    -  \nnn       octal character (up to 3 octal digits)
    -  \xhh       hexadecimal character (up to 2 hex digits)
    -  \x{hh...}  hexadecimal character, any number of digits in UTF-8 mode
    -  \A         pass the PCRE_ANCHORED option to pcre_exec()
    -  \B         pass the PCRE_NOTBOL option to pcre_exec()
    -  \Cdd       call pcre_copy_substring() for substring dd after a successful match (number less than 32)
    -  \Cname     call pcre_copy_named_substring() for substring "name" after a successful match (name termin-
    -               ated by next non alphanumeric character)
    -  \C+        show the current captured substrings at callout time
    -  \C-        do not supply a callout function
    -  \C!n       return 1 instead of 0 when callout number n is reached
    -  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
    -  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
    -  \Gdd       call pcre_get_substring() for substring dd after a successful match (number less than 32)
    -  \Gname     call pcre_get_named_substring() for substring "name" after a successful match (name termin-
    -               ated by next non-alphanumeric character)
    -  \L         call pcre_get_substringlist() after a successful match
    -  \M         discover the minimum MATCH_LIMIT setting
    -  \N         pass the PCRE_NOTEMPTY option to pcre_exec()
    -  \Odd       set the size of the output vector passed to pcre_exec() to dd (any number of digits)
    -  \P         pass the PCRE_PARTIAL option to pcre_exec()
    -  \S         output details of memory get/free calls during matching
    -  \Z         pass the PCRE_NOTEOL option to pcre_exec()
    -  \?         pass the PCRE_NO_UTF8_CHECK option to pcre_exec()
    -  \>dd       start the match at offset dd (any number of digits);
    -               this sets the startoffset argument for pcre_exec()
    -
    -A backslash followed by anything else just escapes the anything else. If the -very last character is a backslash, it is ignored. This gives a way of passing -an empty line as data, since a real empty line terminates the data input. -

    -

    -If \M is present, pcretest calls pcre_exec() several times, with -different values in the match_limit field of the pcre_extra data -structure, until it finds the minimum number that is needed for -pcre_exec() to complete. This number is a measure of the amount of -recursion and backtracking that takes place, and checking it out can be -instructive. For most simple matches, the number is quite small, but for -patterns with very large numbers of matching possibilities, it can become large -very quickly with increasing length of subject string. -

    -

    -When \O is used, the value specified may be higher or lower than the size set -by the -O command line option (or defaulted to 45); \O applies only to -the call of pcre_exec() for the line in which it appears. -

    -

    -If the /P modifier was present on the pattern, causing the POSIX wrapper -API to be used, only \B and \Z have any effect, causing REG_NOTBOL and -REG_NOTEOL to be passed to regexec() respectively. -

    -

    -The use of \x{hh...} to represent UTF-8 characters is not dependent on the use -of the /8 modifier on the pattern. It is recognized always. There may be -any number of hexadecimal digits inside the braces. The result is from one to -six bytes, encoded according to the UTF-8 rules. -

    -
    OUTPUT FROM PCRETEST
    -

    -When a match succeeds, pcretest outputs the list of captured substrings that -pcre_exec() returns, starting with number 0 for the string that matched -the whole pattern. Otherwise, it outputs "No match" or "Partial match" -when pcre_exec() returns PCRE_ERROR_NOMATCH or PCRE_ERROR_PARTIAL, -respectively, and otherwise the PCRE negative error number. Here is an example -of an interactive pcretest run. -

    -  $ pcretest
    -  PCRE version 5.00 07-Sep-2004
    -
    -    re> /^abc(\d+)/
    -  data> abc123
    -   0: abc123
    -   1: 123
    -  data> xyz
    -  No match
    -
    -If the strings contain any non-printing characters, they are output as \0x -escapes, or as \x{...} escapes if the /8 modifier was present on the -pattern. If the pattern has the /+ modifier, the output for substring 0 -is followed by the the rest of the subject string, identified by "0+" like -this: -
    -    re> /cat/+
    -  data> cataract
    -   0: cat
    -   0+ aract
    -
    -If the pattern has the /g or /G modifier, the results of successive -matching attempts are output in sequence, like this: -
    -    re> /\Bi(\w\w)/g
    -  data> Mississippi
    -   0: iss
    -   1: ss
    -   0: iss
    -   1: ss
    -   0: ipp
    -   1: pp
    -
    -"No match" is output only if the first match attempt fails. -

    -

    -If any of the sequences \C, \G, or \L are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \C and \G. -

    -

    -Note that while patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \n escape. -

    -
    CALLOUTS
    -

    -If the pattern contains any callout requests, pcretest's callout function -is called during matching. By default, it displays the callout number, the -start and current positions in the text at the callout time, and the next -pattern item to be tested. For example, the output -

    -  --->pqrabcdef
    -    0    ^  ^     \d
    -
    -indicates that callout number 0 occurred for a match attempt starting at the -fourth character of the subject string, when the pointer was at the seventh -character of the data, and when the next pattern item was \d. Just one -circumflex is output if the start and current positions are the same. -

    -

    -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the /C pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -

    -    re> /\d?[A-E]\*/C
    -  data> E*
    -  --->E*
    -   +0 ^      \d?
    -   +3 ^      [A-E]
    -   +8 ^^     \*
    -  +10 ^ ^
    -   0: E*
    -
    -The callout function in pcretest returns zero (carry on matching) by -default, but you can use an \C item in a data line (as described above) to -change this. -

    -

    -Inserting callouts can be helpful when using pcretest to check -complicated regular expressions. For further information about callouts, see -the -pcrecallout -documentation. -

    -
    SAVING AND RELOADING COMPILED PATTERNS
    -

    -The facilities described in this section are not available when the POSIX -inteface to PCRE is being used, that is, when the /P pattern modifier is -specified. -

    -

    -When the POSIX interface is not in use, you can cause pcretest to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -

    -  /pattern/im >/some/file
    -
    -See the -pcreprecompile -documentation for a discussion about saving and re-using compiled patterns. -

    -

    -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -follows immediately after the compiled pattern. After writing the file, -pcretest expects to read a new pattern. -

    -

    -A saved pattern can be reloaded into pcretest by specifing < and a file -name instead of a pattern. The name of the file must not contain a < character, -as otherwise pcretest will interpret the line as a pattern delimited by < -characters. -For example: -

    -   re> </some/file
    -  Compiled regex loaded from /some/file
    -  No study data
    -
    -When the pattern has been loaded, pcretest proceeds to read data lines in -the usual way. -

    -

    -You can copy a file written by pcretest to a different host and reload it -there, even if the new host has opposite endianness to the one on which the -pattern was compiled. For example, you can compile on an i86 machine and run on -a SPARC machine. -

    -

    -File names for saving and reloading can be absolute or relative, but note that -the shell facility of expanding a file name that starts with a tilde (~) is not -available. -

    -

    -The ability to save and reload files in pcretest is intended for testing -and experimentation. It is not intended for production use because only a -single pattern can be written to a file. Furthermore, there is no facility for -supplying custom character tables for use with a reloaded pattern. If the -original pattern was compiled with custom tables, an attempt to match a subject -string using a reloaded pattern is likely to cause pcretest to crash. -Finally, if you attempt to load a file that is not in the correct format, the -result is undefined. -

    -
    AUTHOR
    -

    -Philip Hazel <ph10@cam.ac.uk> -
    -University Computing Service, -
    -Cambridge CB2 3QG, England. -

    -

    -Last updated: 10 September 2004 -
    -Copyright © 1997-2004 University of Cambridge. -

    -Return to the PCRE index page. -

    diff --git a/vendor/cegui-0.4.0-custom/src/pcre/doc/pcre.txt b/vendor/cegui-0.4.0-custom/src/pcre/doc/pcre.txt deleted file mode 100644 index fdf0d6ff67..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/doc/pcre.txt +++ /dev/null @@ -1,3769 +0,0 @@ ------------------------------------------------------------------------------ -This file contains a concatenation of the PCRE man pages, converted to plain -text format for ease of searching with a text editor, or for use on systems -that do not have a man page processor. The small individual files that give -synopses of each function in the library have not been included. There are -separate text files for the pcregrep and pcretest commands. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -INTRODUCTION - - The PCRE library is a set of functions that implement regular expres- - sion pattern matching using the same syntax and semantics as Perl, with - just a few differences. The current implementation of PCRE (release - 5.x) corresponds approximately with Perl 5.8, including support for - UTF-8 encoded strings and Unicode general category properties. However, - this support has to be explicitly enabled; it is not the default. - - PCRE is written in C and released as a C library. A number of people - have written wrappers and interfaces of various kinds. A C++ class is - included in these contributions, which can be found in the Contrib - directory at the primary FTP site, which is: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre - - Details of exactly which Perl regular expression features are and are - not supported by PCRE are given in separate documents. See the pcrepat- - tern and pcrecompat pages. - - Some features of PCRE can be included, excluded, or changed when the - library is built. The pcre_config() function makes it possible for a - client to discover which features are available. The features them- - selves are described in the pcrebuild page. Documentation about build- - ing PCRE for various operating systems can be found in the README file - in the source distribution. - - -USER DOCUMENTATION - - The user documentation for PCRE comprises a number of different sec- - tions. In the "man" format, each of these is a separate "man page". In - the HTML format, each is a separate page, linked from the index page. - In the plain text format, all the sections are concatenated, for ease - of searching. The sections are as follows: - - pcre this document - pcreapi details of PCRE's native API - pcrebuild options for building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcregrep description of the pcregrep command - pcrepartial details of the partial matching facility - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible API - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the sample program - pcretest description of the pcretest testing command - - In addition, in the "man" and HTML formats, there is a short page for - each library function, listing its arguments and results. - - -LIMITATIONS - - There are some size limitations in PCRE but it is hoped that they will - never in practice be relevant. - - The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE - is compiled with the default internal linkage size of 2. If you want to - process regular expressions that are truly enormous, you can compile - PCRE with an internal linkage size of 3 or 4 (see the README file in - the source distribution and the pcrebuild documentation for details). - In these cases the limit is substantially larger. However, the speed - of execution will be slower. - - All values in repeating quantifiers must be less than 65536. The maxi- - mum number of capturing subpatterns is 65535. - - There is no limit to the number of non-capturing subpatterns, but the - maximum depth of nesting of all kinds of parenthesized subpattern, - including capturing subpatterns, assertions, and other types of subpat- - tern, is 200. - - The maximum length of a subject string is the largest positive number - that an integer variable can hold. However, PCRE uses recursion to han- - dle subpatterns and indefinite repetition. This means that the avail- - able stack space may limit the size of a subject string that can be - processed by certain patterns. - - -UTF-8 AND UNICODE PROPERTY SUPPORT - - From release 3.3, PCRE has had some support for character strings - encoded in the UTF-8 format. For release 4.0 this was greatly extended - to cover most common requirements, and in release 5.0 additional sup- - port for Unicode general category properties was added. - - In order process UTF-8 strings, you must build PCRE to include UTF-8 - support in the code, and, in addition, you must call pcre_compile() - with the PCRE_UTF8 option flag. When you do this, both the pattern and - any subject strings that are matched against it are treated as UTF-8 - strings instead of just strings of bytes. - - If you compile PCRE with UTF-8 support, but do not use it at run time, - the library will be a bit bigger, but the additional run time overhead - is limited to testing the PCRE_UTF8 flag in several places, so should - not be very large. - - If PCRE is built with Unicode character property support (which implies - UTF-8 support), the escape sequences \p{..}, \P{..}, and \X are sup- - ported. The available properties that can be tested are limited to the - general category properties such as Lu for an upper case letter or Nd - for a decimal number. A full list is given in the pcrepattern documen- - tation. The PCRE library is increased in size by about 90K when Unicode - property support is included. - - The following comments apply when PCRE is running in UTF-8 mode: - - 1. When you set the PCRE_UTF8 flag, the strings passed as patterns and - subjects are checked for validity on entry to the relevant functions. - If an invalid UTF-8 string is passed, an error return is given. In some - situations, you may already know that your strings are valid, and - therefore want to skip these checks in order to improve performance. If - you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, - PCRE assumes that the pattern or subject it is given (respectively) - contains only valid UTF-8 codes. In this case, it does not diagnose an - invalid UTF-8 string. If you pass an invalid UTF-8 string to PCRE when - PCRE_NO_UTF8_CHECK is set, the results are undefined. Your program may - crash. - - 2. In a pattern, the escape sequence \x{...}, where the contents of the - braces is a string of hexadecimal digits, is interpreted as a UTF-8 - character whose code number is the given hexadecimal number, for exam- - ple: \x{1234}. If a non-hexadecimal digit appears between the braces, - the item is not recognized. This escape sequence can be used either as - a literal, or within a character class. - - 3. The original hexadecimal escape sequence, \xhh, matches a two-byte - UTF-8 character if the value is greater than 127. - - 4. Repeat quantifiers apply to complete UTF-8 characters, not to indi- - vidual bytes, for example: \x{100}{3}. - - 5. The dot metacharacter matches one UTF-8 character instead of a sin- - gle byte. - - 6. The escape sequence \C can be used to match a single byte in UTF-8 - mode, but its use can lead to some strange effects. - - 7. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly - test characters of any code value, but the characters that PCRE recog- - nizes as digits, spaces, or word characters remain the same set as - before, all with values less than 256. This remains true even when PCRE - includes Unicode property support, because to do otherwise would slow - down PCRE in many common cases. If you really want to test for a wider - sense of, say, "digit", you must use Unicode property tests such as - \p{Nd}. - - 8. Similarly, characters that match the POSIX named character classes - are all low-valued characters. - - 9. Case-insensitive matching applies only to characters whose values - are less than 128, unless PCRE is built with Unicode property support. - Even when Unicode property support is available, PCRE still uses its - own character tables when checking the case of low-valued characters, - so as not to degrade performance. The Unicode property information is - used only for characters with higher values. - - -AUTHOR - - Philip Hazel - University Computing Service, - Cambridge CB2 3QG, England. - Phone: +44 1223 334714 - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE BUILD-TIME OPTIONS - - This document describes the optional features of PCRE that can be - selected when the library is compiled. They are all selected, or dese- - lected, by providing options to the configure script that is run before - the make command. The complete list of options for configure (which - includes the standard ones such as the selection of the installation - directory) can be obtained by running - - ./configure --help - - The following sections describe certain options whose names begin with - --enable or --disable. These settings specify changes to the defaults - for the configure command. Because of the way that configure works, - --enable and --disable always come in pairs, so the complementary - option always exists as well, but as it specifies the default, it is - not described. - - -UTF-8 SUPPORT - - To build PCRE with support for UTF-8 character strings, add - - --enable-utf8 - - to the configure command. Of itself, this does not make PCRE treat - strings as UTF-8. As well as compiling PCRE with this option, you also - have have to set the PCRE_UTF8 option when you call the pcre_compile() - function. - - -UNICODE CHARACTER PROPERTY SUPPORT - - UTF-8 support allows PCRE to process character values greater than 255 - in the strings that it handles. On its own, however, it does not pro- - vide any facilities for accessing the properties of such characters. If - you want to be able to use the pattern escapes \P, \p, and \X, which - refer to Unicode character properties, you must add - - --enable-unicode-properties - - to the configure command. This implies UTF-8 support, even if you have - not explicitly requested it. - - Including Unicode property support adds around 90K of tables to the - PCRE library, approximately doubling its size. Only the general cate- - gory properties such as Lu and Nd are supported. Details are given in - the pcrepattern documentation. - - -CODE VALUE OF NEWLINE - - By default, PCRE treats character 10 (linefeed) as the newline charac- - ter. This is the normal newline character on Unix-like systems. You can - compile PCRE to use character 13 (carriage return) instead by adding - - --enable-newline-is-cr - - to the configure command. For completeness there is also a --enable- - newline-is-lf option, which explicitly specifies linefeed as the new- - line character. - - -BUILDING SHARED AND STATIC LIBRARIES - - The PCRE building process uses libtool to build both shared and static - Unix libraries by default. You can suppress one of these by adding one - of - - --disable-shared - --disable-static - - to the configure command, as required. - - -POSIX MALLOC USAGE - - When PCRE is called through the POSIX interface (see the pcreposix doc- - umentation), additional working storage is required for holding the - pointers to capturing substrings, because PCRE requires three integers - per substring, whereas the POSIX interface provides only two. If the - number of expected substrings is small, the wrapper function uses space - on the stack, because this is faster than using malloc() for each call. - The default threshold above which the stack is no longer used is 10; it - can be changed by adding a setting such as - - --with-posix-malloc-threshold=20 - - to the configure command. - - -LIMITING PCRE RESOURCE USAGE - - Internally, PCRE has a function called match(), which it calls repeat- - edly (possibly recursively) when matching a pattern. By controlling the - maximum number of times this function may be called during a single - matching operation, a limit can be placed on the resources used by a - single call to pcre_exec(). The limit can be changed at run time, as - described in the pcreapi documentation. The default is 10 million, but - this can be changed by adding a setting such as - - --with-match-limit=500000 - - to the configure command. - - -HANDLING VERY LARGE PATTERNS - - Within a compiled pattern, offset values are used to point from one - part to another (for example, from an opening parenthesis to an alter- - nation metacharacter). By default, two-byte values are used for these - offsets, leading to a maximum size for a compiled pattern of around - 64K. This is sufficient to handle all but the most gigantic patterns. - Nevertheless, some people do want to process enormous patterns, so it - is possible to compile PCRE to use three-byte or four-byte offsets by - adding a setting such as - - --with-link-size=3 - - to the configure command. The value given must be 2, 3, or 4. Using - longer offsets slows down the operation of PCRE because it has to load - additional bytes when handling them. - - If you build PCRE with an increased link size, test 2 (and test 5 if - you are using UTF-8) will fail. Part of the output of these tests is a - representation of the compiled pattern, and this changes with the link - size. - - -AVOIDING EXCESSIVE STACK USAGE - - PCRE implements backtracking while matching by making recursive calls - to an internal function called match(). In environments where the size - of the stack is limited, this can severely limit PCRE's operation. (The - Unix environment does not usually suffer from this problem.) An alter- - native approach that uses memory from the heap to remember data, - instead of using recursive function calls, has been implemented to work - round this problem. If you want to build a version of PCRE that works - this way, add - - --disable-stack-for-recursion - - to the configure command. With this configuration, PCRE will use the - pcre_stack_malloc and pcre_stack_free variables to call memory manage- - ment functions. Separate functions are provided because the usage is - very predictable: the block sizes requested are always the same, and - the blocks are always freed in reverse order. A calling program might - be able to implement optimized functions that perform better than the - standard malloc() and free() functions. PCRE runs noticeably more - slowly when built in this way. - - -USING EBCDIC CODE - - PCRE assumes by default that it will run in an environment where the - character code is ASCII (or Unicode, which is a superset of ASCII). - PCRE can, however, be compiled to run in an EBCDIC environment by - adding - - --enable-ebcdic - - to the configure command. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE NATIVE API - - #include - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - void pcre_free_substring(const char *stringptr); - - void pcre_free_substring_list(const char **stringptr); - - const unsigned char *pcre_maketables(void); - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - int pcre_info(const pcre *code, int *optptr, int *firstcharptr); - - int pcre_config(int what, void *where); - - char *pcre_version(void); - - void *(*pcre_malloc)(size_t); - - void (*pcre_free)(void *); - - void *(*pcre_stack_malloc)(size_t); - - void (*pcre_stack_free)(void *); - - int (*pcre_callout)(pcre_callout_block *); - - -PCRE API OVERVIEW - - PCRE has its own native API, which is described in this document. There - is also a set of wrapper functions that correspond to the POSIX regular - expression API. These are described in the pcreposix documentation. - - The native API function prototypes are defined in the header file - pcre.h, and on Unix systems the library itself is called libpcre. It - can normally be accessed by adding -lpcre to the command for linking an - application that uses PCRE. The header file defines the macros - PCRE_MAJOR and PCRE_MINOR to contain the major and minor release num- - bers for the library. Applications can use these to include support - for different releases of PCRE. - - The functions pcre_compile(), pcre_study(), and pcre_exec() are used - for compiling and matching regular expressions. A sample program that - demonstrates the simplest way of using them is provided in the file - called pcredemo.c in the source distribution. The pcresample documenta- - tion describes how to run it. - - In addition to the main compiling and matching functions, there are - convenience functions for extracting captured substrings from a matched - subject string. They are: - - pcre_copy_substring() - pcre_copy_named_substring() - pcre_get_substring() - pcre_get_named_substring() - pcre_get_substring_list() - pcre_get_stringnumber() - - pcre_free_substring() and pcre_free_substring_list() are also provided, - to free the memory used for extracted strings. - - The function pcre_maketables() is used to build a set of character - tables in the current locale for passing to pcre_compile() or - pcre_exec(). This is an optional facility that is provided for spe- - cialist use. Most commonly, no special tables are passed, in which case - internal tables that are generated when PCRE is built are used. - - The function pcre_fullinfo() is used to find out information about a - compiled pattern; pcre_info() is an obsolete version that returns only - some of the available information, but is retained for backwards com- - patibility. The function pcre_version() returns a pointer to a string - containing the version of PCRE and its date of release. - - The global variables pcre_malloc and pcre_free initially contain the - entry points of the standard malloc() and free() functions, respec- - tively. PCRE calls the memory management functions via these variables, - so a calling program can replace them if it wishes to intercept the - calls. This should be done before calling any PCRE functions. - - The global variables pcre_stack_malloc and pcre_stack_free are also - indirections to memory management functions. These special functions - are used only when PCRE is compiled to use the heap for remembering - data, instead of recursive function calls. This is a non-standard way - of building PCRE, for use in environments that have limited stacks. - Because of the greater use of memory management, it runs more slowly. - Separate functions are provided so that special-purpose external code - can be used for this case. When used, these functions are always called - in a stack-like manner (last obtained, first freed), and always for - memory blocks of the same size. - - The global variable pcre_callout initially contains NULL. It can be set - by the caller to a "callout" function, which PCRE will then call at - specified points during a matching operation. Details are given in the - pcrecallout documentation. - - -MULTITHREADING - - The PCRE functions can be used in multi-threading applications, with - the proviso that the memory management functions pointed to by - pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the - callout function pointed to by pcre_callout, are shared by all threads. - - The compiled form of a regular expression is not altered during match- - ing, so the same compiled pattern can safely be used by several threads - at once. - - -SAVING PRECOMPILED PATTERNS FOR LATER USE - - The compiled form of a regular expression can be saved and re-used at a - later time, possibly by a different program, and even on a host other - than the one on which it was compiled. Details are given in the - pcreprecompile documentation. - - -CHECKING BUILD-TIME OPTIONS - - int pcre_config(int what, void *where); - - The function pcre_config() makes it possible for a PCRE client to dis- - cover which optional features have been compiled into the PCRE library. - The pcrebuild documentation has more details about these optional fea- - tures. - - The first argument for pcre_config() is an integer, specifying which - information is required; the second argument is a pointer to a variable - into which the information is placed. The following information is - available: - - PCRE_CONFIG_UTF8 - - The output is an integer that is set to one if UTF-8 support is avail- - able; otherwise it is set to zero. - - PCRE_CONFIG_UNICODE_PROPERTIES - - The output is an integer that is set to one if support for Unicode - character properties is available; otherwise it is set to zero. - - PCRE_CONFIG_NEWLINE - - The output is an integer that is set to the value of the code that is - used for the newline character. It is either linefeed (10) or carriage - return (13), and should normally be the standard character for your - operating system. - - PCRE_CONFIG_LINK_SIZE - - The output is an integer that contains the number of bytes used for - internal linkage in compiled regular expressions. The value is 2, 3, or - 4. Larger values allow larger regular expressions to be compiled, at - the expense of slower matching. The default value of 2 is sufficient - for all but the most massive patterns, since it allows the compiled - pattern to be up to 64K in size. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - - The output is an integer that contains the threshold above which the - POSIX interface uses malloc() for output vectors. Further details are - given in the pcreposix documentation. - - PCRE_CONFIG_MATCH_LIMIT - - The output is an integer that gives the default limit for the number of - internal matching function calls in a pcre_exec() execution. Further - details are given with pcre_exec() below. - - PCRE_CONFIG_STACKRECURSE - - The output is an integer that is set to one if internal recursion is - implemented by recursive function calls that use the stack to remember - their state. This is the usual way that PCRE is compiled. The output is - zero if PCRE was compiled to use blocks of data on the heap instead of - recursive function calls. In this case, pcre_stack_malloc and - pcre_stack_free are called to manage memory blocks on the heap, thus - avoiding the use of the stack. - - -COMPILING A PATTERN - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - The function pcre_compile() is called to compile a pattern into an - internal form. The pattern is a C string terminated by a binary zero, - and is passed in the pattern argument. A pointer to a single block of - memory that is obtained via pcre_malloc is returned. This contains the - compiled code and related data. The pcre type is defined for the - returned block; this is a typedef for a structure whose contents are - not externally defined. It is up to the caller to free the memory when - it is no longer required. - - Although the compiled code of a PCRE regex is relocatable, that is, it - does not depend on memory location, the complete pcre data block is not - fully relocatable, because it may contain a copy of the tableptr argu- - ment, which is an address (see below). - - The options argument contains independent bits that affect the compila- - tion. It should be zero if no options are required. The available - options are described below. Some of them, in particular, those that - are compatible with Perl, can also be set and unset from within the - pattern (see the detailed description in the pcrepattern documenta- - tion). For these options, the contents of the options argument speci- - fies their initial settings at the start of compilation and execution. - The PCRE_ANCHORED option can be set at the time of matching as well as - at compile time. - - If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, - if compilation of a pattern fails, pcre_compile() returns NULL, and - sets the variable pointed to by errptr to point to a textual error mes- - sage. The offset from the start of the pattern to the character where - the error was discovered is placed in the variable pointed to by - erroffset, which must not be NULL. If it is, an immediate error is - given. - - If the final argument, tableptr, is NULL, PCRE uses a default set of - character tables that are built when PCRE is compiled, using the - default C locale. Otherwise, tableptr must be an address that is the - result of a call to pcre_maketables(). This value is stored with the - compiled pattern, and used again by pcre_exec(), unless another table - pointer is passed to it. For more discussion, see the section on locale - support below. - - This code fragment shows a typical straightforward call to pcre_com- - pile(): - - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - - The following names for option bits are defined in the pcre.h header - file: - - PCRE_ANCHORED - - If this bit is set, the pattern is forced to be "anchored", that is, it - is constrained to match only at the first matching point in the string - that is being searched (the "subject string"). This effect can also be - achieved by appropriate constructs in the pattern itself, which is the - only way to do it in Perl. - - PCRE_AUTO_CALLOUT - - If this bit is set, pcre_compile() automatically inserts callout items, - all with number 255, before each pattern item. For discussion of the - callout facility, see the pcrecallout documentation. - - PCRE_CASELESS - - If this bit is set, letters in the pattern match both upper and lower - case letters. It is equivalent to Perl's /i option, and it can be - changed within a pattern by a (?i) option setting. When running in - UTF-8 mode, case support for high-valued characters is available only - when PCRE is built with Unicode character property support. - - PCRE_DOLLAR_ENDONLY - - If this bit is set, a dollar metacharacter in the pattern matches only - at the end of the subject string. Without this option, a dollar also - matches immediately before the final character if it is a newline (but - not before any other newlines). The PCRE_DOLLAR_ENDONLY option is - ignored if PCRE_MULTILINE is set. There is no equivalent to this option - in Perl, and no way to set it within a pattern. - - PCRE_DOTALL - - If this bit is set, a dot metacharater in the pattern matches all char- - acters, including newlines. Without it, newlines are excluded. This - option is equivalent to Perl's /s option, and it can be changed within - a pattern by a (?s) option setting. A negative class such as [^a] - always matches a newline character, independent of the setting of this - option. - - PCRE_EXTENDED - - If this bit is set, whitespace data characters in the pattern are - totally ignored except when escaped or inside a character class. - Whitespace does not include the VT character (code 11). In addition, - characters between an unescaped # outside a character class and the - next newline character, inclusive, are also ignored. This is equivalent - to Perl's /x option, and it can be changed within a pattern by a (?x) - option setting. - - This option makes it possible to include comments inside complicated - patterns. Note, however, that this applies only to data characters. - Whitespace characters may never appear within special character - sequences in a pattern, for example within the sequence (?( which - introduces a conditional subpattern. - - PCRE_EXTRA - - This option was invented in order to turn on additional functionality - of PCRE that is incompatible with Perl, but it is currently of very - little use. When set, any backslash in a pattern that is followed by a - letter that has no special meaning causes an error, thus reserving - these combinations for future expansion. By default, as in Perl, a - backslash followed by a letter with no special meaning is treated as a - literal. There are at present no other features controlled by this - option. It can also be set by a (?X) option setting within a pattern. - - PCRE_MULTILINE - - By default, PCRE treats the subject string as consisting of a single - line of characters (even if it actually contains newlines). The "start - of line" metacharacter (^) matches only at the start of the string, - while the "end of line" metacharacter ($) matches only at the end of - the string, or before a terminating newline (unless PCRE_DOLLAR_ENDONLY - is set). This is the same as Perl. - - When PCRE_MULTILINE it is set, the "start of line" and "end of line" - constructs match immediately following or immediately before any new- - line in the subject string, respectively, as well as at the very start - and end. This is equivalent to Perl's /m option, and it can be changed - within a pattern by a (?m) option setting. If there are no "\n" charac- - ters in a subject string, or no occurrences of ^ or $ in a pattern, - setting PCRE_MULTILINE has no effect. - - PCRE_NO_AUTO_CAPTURE - - If this option is set, it disables the use of numbered capturing paren- - theses in the pattern. Any opening parenthesis that is not followed by - ? behaves as if it were followed by ?: but named parentheses can still - be used for capturing (and they acquire numbers in the usual way). - There is no equivalent of this option in Perl. - - PCRE_UNGREEDY - - This option inverts the "greediness" of the quantifiers so that they - are not greedy by default, but become greedy if followed by "?". It is - not compatible with Perl. It can also be set by a (?U) option setting - within the pattern. - - PCRE_UTF8 - - This option causes PCRE to regard both the pattern and the subject as - strings of UTF-8 characters instead of single-byte character strings. - However, it is available only when PCRE is built to include UTF-8 sup- - port. If not, the use of this option provokes an error. Details of how - this option changes the behaviour of PCRE are given in the section on - UTF-8 support in the main pcre page. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is - automatically checked. If an invalid UTF-8 sequence of bytes is found, - pcre_compile() returns an error. If you already know that your pattern - is valid, and you want to skip this check for performance reasons, you - can set the PCRE_NO_UTF8_CHECK option. When it is set, the effect of - passing an invalid UTF-8 string as a pattern is undefined. It may cause - your program to crash. Note that this option can also be passed to - pcre_exec(), to suppress the UTF-8 validity checking of subject - strings. - - -STUDYING A PATTERN - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - If a compiled pattern is going to be used several times, it is worth - spending more time analyzing it in order to speed up the time taken for - matching. The function pcre_study() takes a pointer to a compiled pat- - tern as its first argument. If studying the pattern produces additional - information that will help speed up matching, pcre_study() returns a - pointer to a pcre_extra block, in which the study_data field points to - the results of the study. - - The returned value from pcre_study() can be passed directly to - pcre_exec(). However, a pcre_extra block also contains other fields - that can be set by the caller before the block is passed; these are - described below in the section on matching a pattern. - - If studying the pattern does not produce any additional information, - pcre_study() returns NULL. In that circumstance, if the calling program - wants to pass any of the other fields to pcre_exec(), it must set up - its own pcre_extra block. - - The second argument of pcre_study() contains option bits. At present, - no options are defined, and this argument should always be zero. - - The third argument for pcre_study() is a pointer for an error message. - If studying succeeds (even if no data is returned), the variable it - points to is set to NULL. Otherwise it points to a textual error mes- - sage. You should therefore test the error pointer for NULL after call- - ing pcre_study(), to be sure that it has run successfully. - - This is a typical call to pcre_study(): - - pcre_extra *pe; - pe = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options exist */ - &error); /* set to NULL or points to a message */ - - At present, studying a pattern is useful only for non-anchored patterns - that do not have a single fixed starting character. A bitmap of possi- - ble starting bytes is created. - - -LOCALE SUPPORT - - PCRE handles caseless matching, and determines whether characters are - letters, digits, or whatever, by reference to a set of tables, indexed - by character value. (When running in UTF-8 mode, this applies only to - characters with codes less than 128. Higher-valued codes never match - escapes such as \w or \d, but can be tested with \p if PCRE is built - with Unicode character property support.) - - An internal set of tables is created in the default C locale when PCRE - is built. This is used when the final argument of pcre_compile() is - NULL, and is sufficient for many applications. An alternative set of - tables can, however, be supplied. These may be created in a different - locale from the default. As more and more applications change to using - Unicode, the need for this locale support is expected to die away. - - External tables are built by calling the pcre_maketables() function, - which has no arguments, in the relevant locale. The result can then be - passed to pcre_compile() or pcre_exec() as often as necessary. For - example, to build and use tables that are appropriate for the French - locale (where accented characters with values greater than 128 are - treated as letters), the following code could be used: - - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); - - When pcre_maketables() runs, the tables are built in memory that is - obtained via pcre_malloc. It is the caller's responsibility to ensure - that the memory containing the tables remains available for as long as - it is needed. - - The pointer that is passed to pcre_compile() is saved with the compiled - pattern, and the same tables are used via this pointer by pcre_study() - and normally also by pcre_exec(). Thus, by default, for any single pat- - tern, compilation, studying and matching all happen in the same locale, - but different patterns can be compiled in different locales. - - It is possible to pass a table pointer or NULL (indicating the use of - the internal tables) to pcre_exec(). Although not intended for this - purpose, this facility could be used to match a pattern in a different - locale from the one in which it was compiled. Passing table pointers at - run time is discussed below in the section on matching a pattern. - - -INFORMATION ABOUT A PATTERN - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - The pcre_fullinfo() function returns information about a compiled pat- - tern. It replaces the obsolete pcre_info() function, which is neverthe- - less retained for backwards compability (and is documented below). - - The first argument for pcre_fullinfo() is a pointer to the compiled - pattern. The second argument is the result of pcre_study(), or NULL if - the pattern was not studied. The third argument specifies which piece - of information is required, and the fourth argument is a pointer to a - variable to receive the data. The yield of the function is zero for - success, or one of the following negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - the argument where was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of what was invalid - - The "magic number" is placed at the start of each compiled pattern as - an simple check against passing an arbitrary memory pointer. Here is a - typical call of pcre_fullinfo(), to obtain the length of the compiled - pattern: - - int rc; - unsigned long int length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - pe, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ - - The possible values for the third argument are defined in pcre.h, and - are as follows: - - PCRE_INFO_BACKREFMAX - - Return the number of the highest back reference in the pattern. The - fourth argument should point to an int variable. Zero is returned if - there are no back references. - - PCRE_INFO_CAPTURECOUNT - - Return the number of capturing subpatterns in the pattern. The fourth - argument should point to an int variable. - - PCRE_INFO_DEFAULTTABLES - - Return a pointer to the internal default character tables within PCRE. - The fourth argument should point to an unsigned char * variable. This - information call is provided for internal use by the pcre_study() func- - tion. External callers can cause PCRE to use its internal tables by - passing a NULL table pointer. - - PCRE_INFO_FIRSTBYTE - - Return information about the first byte of any matched string, for a - non-anchored pattern. (This option used to be called - PCRE_INFO_FIRSTCHAR; the old name is still recognized for backwards - compatibility.) - - If there is a fixed first byte, for example, from a pattern such as - (cat|cow|coyote), it is returned in the integer pointed to by where. - Otherwise, if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - -1 is returned, indicating that the pattern matches only at the start - of a subject string or after any newline within the string. Otherwise - -2 is returned. For anchored patterns, -2 is returned. - - PCRE_INFO_FIRSTTABLE - - If the pattern was studied, and this resulted in the construction of a - 256-bit table indicating a fixed set of bytes for the first byte in any - matching string, a pointer to the table is returned. Otherwise NULL is - returned. The fourth argument should point to an unsigned char * vari- - able. - - PCRE_INFO_LASTLITERAL - - Return the value of the rightmost literal byte that must exist in any - matched string, other than at its start, if such a byte has been - recorded. The fourth argument should point to an int variable. If there - is no such byte, -1 is returned. For anchored patterns, a last literal - byte is recorded only if it follows something of variable length. For - example, for the pattern /^a\d+z\d+/ the returned value is "z", but for - /^a\dz\d/ the returned value is -1. - - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE - - PCRE supports the use of named as well as numbered capturing parenthe- - ses. The names are just an additional way of identifying the parenthe- - ses, which still acquire numbers. A convenience function called - pcre_get_named_substring() is provided for extracting an individual - captured substring by name. It is also possible to extract the data - directly, by first converting the name to a number in order to access - the correct pointers in the output vector (described with pcre_exec() - below). To do the conversion, you need to use the name-to-number map, - which is described by these three values. - - The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT - gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size - of each entry; both of these return an int value. The entry size - depends on the length of the longest name. PCRE_INFO_NAMETABLE returns - a pointer to the first entry of the table (a pointer to char). The - first two bytes of each entry are the number of the capturing parenthe- - sis, most significant byte first. The rest of the entry is the corre- - sponding name, zero terminated. The names are in alphabetical order. - For example, consider the following pattern (assume PCRE_EXTENDED is - set, so white space - including newlines - is ignored): - - (?P (?P(\d\d)?\d\d) - - (?P\d\d) - (?P\d\d) ) - - There are four named subpatterns, so the table has four entries, and - each entry in the table is eight bytes long. The table is as follows, - with non-printing bytes shows in hexadecimal, and undefined bytes shown - as ??: - - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? - - When writing code to extract data from named subpatterns using the - name-to-number map, remember that the length of each entry is likely to - be different for each compiled pattern. - - PCRE_INFO_OPTIONS - - Return a copy of the options with which the pattern was compiled. The - fourth argument should point to an unsigned long int variable. These - option bits are those specified in the call to pcre_compile(), modified - by any top-level option settings within the pattern itself. - - A pattern is automatically anchored by PCRE if all of its top-level - alternatives begin with one of the following: - - ^ unless PCRE_MULTILINE is set - \A always - \G always - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears - - For such patterns, the PCRE_ANCHORED bit is set in the options returned - by pcre_fullinfo(). - - PCRE_INFO_SIZE - - Return the size of the compiled pattern, that is, the value that was - passed as the argument to pcre_malloc() when PCRE was getting memory in - which to place the compiled data. The fourth argument should point to a - size_t variable. - - PCRE_INFO_STUDYSIZE - - Return the size of the data block pointed to by the study_data field in - a pcre_extra block. That is, it is the value that was passed to - pcre_malloc() when PCRE was getting memory into which to place the data - created by pcre_study(). The fourth argument should point to a size_t - variable. - - -OBSOLETE INFO FUNCTION - - int pcre_info(const pcre *code, int *optptr, int *firstcharptr); - - The pcre_info() function is now obsolete because its interface is too - restrictive to return all the available data about a compiled pattern. - New programs should use pcre_fullinfo() instead. The yield of - pcre_info() is the number of capturing subpatterns, or one of the fol- - lowing negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - - If the optptr argument is not NULL, a copy of the options with which - the pattern was compiled is placed in the integer it points to (see - PCRE_INFO_OPTIONS above). - - If the pattern is not anchored and the firstcharptr argument is not - NULL, it is used to pass back information about the first character of - any matched string (see PCRE_INFO_FIRSTBYTE above). - - -MATCHING A PATTERN - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - The function pcre_exec() is called to match a subject string against a - compiled pattern, which is passed in the code argument. If the pattern - has been studied, the result of the study should be passed in the extra - argument. - - In most applications, the pattern will have been compiled (and option- - ally studied) in the same process that calls pcre_exec(). However, it - is possible to save compiled patterns and study data, and then use them - later in different processes, possibly even on different hosts. For a - discussion about this, see the pcreprecompile documentation. - - Here is an example of a simple call to pcre_exec(): - - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements in the vector (NOT size in - bytes) */ - - Extra data for pcre_exec() - - If the extra argument is not NULL, it must point to a pcre_extra data - block. The pcre_study() function returns such a block (when it doesn't - return NULL), but you can also create one for yourself, and pass addi- - tional information in it. The fields in a pcre_extra block are as fol- - lows: - - unsigned long int flags; - void *study_data; - unsigned long int match_limit; - void *callout_data; - const unsigned char *tables; - - The flags field is a bitmap that specifies which of the other fields - are set. The flag bits are: - - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_TABLES - - Other flag bits should be set to zero. The study_data field is set in - the pcre_extra block that is returned by pcre_study(), together with - the appropriate flag bit. You should not set this yourself, but you may - add to the block by setting the other fields and their corresponding - flag bits. - - The match_limit field provides a means of preventing PCRE from using up - a vast amount of resources when running patterns that are not going to - match, but which have a very large number of possibilities in their - search trees. The classic example is the use of nested unlimited - repeats. - - Internally, PCRE uses a function called match() which it calls repeat- - edly (sometimes recursively). The limit is imposed on the number of - times this function is called during a match, which has the effect of - limiting the amount of recursion and backtracking that can take place. - For patterns that are not anchored, the count starts from zero for each - position in the subject string. - - The default limit for the library can be set when PCRE is built; the - default default is 10 million, which handles all but the most extreme - cases. You can reduce the default by suppling pcre_exec() with a - pcre_extra block in which match_limit is set to a smaller value, and - PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is - exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - - The pcre_callout field is used in conjunction with the "callout" fea- - ture, which is described in the pcrecallout documentation. - - The tables field is used to pass a character tables pointer to - pcre_exec(); this overrides the value that is stored with the compiled - pattern. A non-NULL value is stored with the compiled pattern only if - custom tables were supplied to pcre_compile() via its tableptr argu- - ment. If NULL is passed to pcre_exec() using this mechanism, it forces - PCRE's internal tables to be used. This facility is helpful when re- - using patterns that have been saved after compiling with an external - set of tables, because the external tables might be at a different - address when pcre_exec() is called. See the pcreprecompile documenta- - tion for a discussion of saving compiled patterns for later use. - - Option bits for pcre_exec() - - The unused bits of the options argument for pcre_exec() must be zero. - The only bits that may be set are PCRE_ANCHORED, PCRE_NOTBOL, - PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NO_UTF8_CHECK and PCRE_PARTIAL. - - PCRE_ANCHORED - - The PCRE_ANCHORED option limits pcre_exec() to matching at the first - matching position. If a pattern was compiled with PCRE_ANCHORED, or - turned out to be anchored by virtue of its contents, it cannot be made - unachored at matching time. - - PCRE_NOTBOL - - This option specifies that first character of the subject string is not - the beginning of a line, so the circumflex metacharacter should not - match before it. Setting this without PCRE_MULTILINE (at compile time) - causes circumflex never to match. This option affects only the - behaviour of the circumflex metacharacter. It does not affect \A. - - PCRE_NOTEOL - - This option specifies that the end of the subject string is not the end - of a line, so the dollar metacharacter should not match it nor (except - in multiline mode) a newline immediately before it. Setting this with- - out PCRE_MULTILINE (at compile time) causes dollar never to match. This - option affects only the behaviour of the dollar metacharacter. It does - not affect \Z or \z. - - PCRE_NOTEMPTY - - An empty string is not considered to be a valid match if this option is - set. If there are alternatives in the pattern, they are tried. If all - the alternatives match the empty string, the entire match fails. For - example, if the pattern - - a?b? - - is applied to a string not beginning with "a" or "b", it matches the - empty string at the start of the subject. With PCRE_NOTEMPTY set, this - match is not valid, so PCRE searches further into the string for occur- - rences of "a" or "b". - - Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a spe- - cial case of a pattern match of the empty string within its split() - function, and when using the /g modifier. It is possible to emulate - Perl's behaviour after matching a null string by first trying the match - again at the same offset with PCRE_NOTEMPTY and PCRE_ANCHORED, and then - if that fails by advancing the starting offset (see below) and trying - an ordinary match again. There is some code that demonstrates how to do - this in the pcredemo.c sample program. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set at compile time, the validity of the subject as a - UTF-8 string is automatically checked when pcre_exec() is subsequently - called. The value of startoffset is also checked to ensure that it - points to the start of a UTF-8 character. If an invalid UTF-8 sequence - of bytes is found, pcre_exec() returns the error PCRE_ERROR_BADUTF8. If - startoffset contains an invalid value, PCRE_ERROR_BADUTF8_OFFSET is - returned. - - If you already know that your subject is valid, and you want to skip - these checks for performance reasons, you can set the - PCRE_NO_UTF8_CHECK option when calling pcre_exec(). You might want to - do this for the second and subsequent calls to pcre_exec() if you are - making repeated calls to find all the matches in a single subject - string. However, you should be sure that the value of startoffset - points to the start of a UTF-8 character. When PCRE_NO_UTF8_CHECK is - set, the effect of passing an invalid UTF-8 string as a subject, or a - value of startoffset that does not point to the start of a UTF-8 char- - acter, is undefined. Your program may crash. - - PCRE_PARTIAL - - This option turns on the partial matching feature. If the subject - string fails to match the pattern, but at some point during the match- - ing process the end of the subject was reached (that is, the subject - partially matches the pattern and the failure to match occurred only - because there were not enough subject characters), pcre_exec() returns - PCRE_ERROR_PARTIAL instead of PCRE_ERROR_NOMATCH. When PCRE_PARTIAL is - used, there are restrictions on what may appear in the pattern. These - are discussed in the pcrepartial documentation. - - The string to be matched by pcre_exec() - - The subject string is passed to pcre_exec() as a pointer in subject, a - length in length, and a starting byte offset in startoffset. In UTF-8 - mode, the byte offset must point to the start of a UTF-8 character. - Unlike the pattern string, the subject may contain binary zero bytes. - When the starting offset is zero, the search for a match starts at the - beginning of the subject, and this is by far the most common case. - - A non-zero starting offset is useful when searching for another match - in the same subject by calling pcre_exec() again after a previous suc- - cess. Setting startoffset differs from just passing over a shortened - string and setting PCRE_NOTBOL in the case of a pattern that begins - with any kind of lookbehind. For example, consider the pattern - - \Biss\B - - which finds occurrences of "iss" in the middle of words. (\B matches - only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() - finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, - because \B is always false at the start of the subject, which is deemed - to be a word boundary. However, if pcre_exec() is passed the entire - string again, but with startoffset set to 4, it finds the second occur- - rence of "iss" because it is able to look behind the starting point to - discover that it is preceded by a letter. - - If a non-zero starting offset is passed when the pattern is anchored, - one attempt to match at the given offset is made. This can only succeed - if the pattern does not require the match to be at the start of the - subject. - - How pcre_exec() returns captured substrings - - In general, a pattern matches a certain portion of the subject, and in - addition, further substrings from the subject may be picked out by - parts of the pattern. Following the usage in Jeffrey Friedl's book, - this is called "capturing" in what follows, and the phrase "capturing - subpattern" is used for a fragment of a pattern that picks out a sub- - string. PCRE supports several other kinds of parenthesized subpattern - that do not cause substrings to be captured. - - Captured substrings are returned to the caller via a vector of integer - offsets whose address is passed in ovector. The number of elements in - the vector is passed in ovecsize, which must be a non-negative number. - Note: this argument is NOT the size of ovector in bytes. - - The first two-thirds of the vector is used to pass back captured sub- - strings, each substring using a pair of integers. The remaining third - of the vector is used as workspace by pcre_exec() while matching cap- - turing subpatterns, and is not available for passing back information. - The length passed in ovecsize should always be a multiple of three. If - it is not, it is rounded down. - - When a match is successful, information about captured substrings is - returned in pairs of integers, starting at the beginning of ovector, - and continuing up to two-thirds of its length at the most. The first - element of a pair is set to the offset of the first character in a sub- - string, and the second is set to the offset of the first character - after the end of a substring. The first pair, ovector[0] and ovec- - tor[1], identify the portion of the subject string matched by the - entire pattern. The next pair is used for the first capturing subpat- - tern, and so on. The value returned by pcre_exec() is the number of - pairs that have been set. If there are no capturing subpatterns, the - return value from a successful match is 1, indicating that just the - first pair of offsets has been set. - - Some convenience functions are provided for extracting the captured - substrings as separate strings. These are described in the following - section. - - It is possible for an capturing subpattern number n+1 to match some - part of the subject when subpattern n has not been used at all. For - example, if the string "abc" is matched against the pattern (a|(z))(bc) - subpatterns 1 and 3 are matched, but 2 is not. When this happens, both - offset values corresponding to the unused subpattern are set to -1. - - If a capturing subpattern is matched repeatedly, it is the last portion - of the string that it matched that is returned. - - If the vector is too small to hold all the captured substring offsets, - it is used as far as possible (up to two-thirds of its length), and the - function returns a value of zero. In particular, if the substring off- - sets are not of interest, pcre_exec() may be called with ovector passed - as NULL and ovecsize as zero. However, if the pattern contains back - references and the ovector is not big enough to remember the related - substrings, PCRE has to get additional memory for use during matching. - Thus it is usually advisable to supply an ovector. - - Note that pcre_info() can be used to find out how many capturing sub- - patterns there are in a compiled pattern. The smallest size for ovector - that will allow for n captured substrings, in addition to the offsets - of the substring matched by the whole pattern, is (n+1)*3. - - Return values from pcre_exec() - - If pcre_exec() fails, it returns a negative number. The following are - defined in the header file: - - PCRE_ERROR_NOMATCH (-1) - - The subject string did not match the pattern. - - PCRE_ERROR_NULL (-2) - - Either code or subject was passed as NULL, or ovector was NULL and - ovecsize was not zero. - - PCRE_ERROR_BADOPTION (-3) - - An unrecognized bit was set in the options argument. - - PCRE_ERROR_BADMAGIC (-4) - - PCRE stores a 4-byte "magic number" at the start of the compiled code, - to catch the case when it is passed a junk pointer and to detect when a - pattern that was compiled in an environment of one endianness is run in - an environment with the other endianness. This is the error that PCRE - gives when the magic number is not present. - - PCRE_ERROR_UNKNOWN_NODE (-5) - - While running the pattern match, an unknown item was encountered in the - compiled pattern. This error could be caused by a bug in PCRE or by - overwriting of the compiled pattern. - - PCRE_ERROR_NOMEMORY (-6) - - If a pattern contains back references, but the ovector that is passed - to pcre_exec() is not big enough to remember the referenced substrings, - PCRE gets a block of memory at the start of matching to use for this - purpose. If the call via pcre_malloc() fails, this error is given. The - memory is automatically freed at the end of matching. - - PCRE_ERROR_NOSUBSTRING (-7) - - This error is used by the pcre_copy_substring(), pcre_get_substring(), - and pcre_get_substring_list() functions (see below). It is never - returned by pcre_exec(). - - PCRE_ERROR_MATCHLIMIT (-8) - - The recursion and backtracking limit, as specified by the match_limit - field in a pcre_extra structure (or defaulted) was reached. See the - description above. - - PCRE_ERROR_CALLOUT (-9) - - This error is never generated by pcre_exec() itself. It is provided for - use by callout functions that want to yield a distinctive error code. - See the pcrecallout documentation for details. - - PCRE_ERROR_BADUTF8 (-10) - - A string that contains an invalid UTF-8 byte sequence was passed as a - subject. - - PCRE_ERROR_BADUTF8_OFFSET (-11) - - The UTF-8 byte sequence that was passed as a subject was valid, but the - value of startoffset did not point to the beginning of a UTF-8 charac- - ter. - - PCRE_ERROR_PARTIAL (-12) - - The subject string did not match, but it did match partially. See the - pcrepartial documentation for details of partial matching. - - PCRE_ERROR_BAD_PARTIAL (-13) - - The PCRE_PARTIAL option was used with a compiled pattern containing - items that are not supported for partial matching. See the pcrepartial - documentation for details of partial matching. - - PCRE_ERROR_INTERNAL (-14) - - An unexpected internal error has occurred. This error could be caused - by a bug in PCRE or by overwriting of the compiled pattern. - - PCRE_ERROR_BADCOUNT (-15) - - This error is given if the value of the ovecsize argument is negative. - - -EXTRACTING CAPTURED SUBSTRINGS BY NUMBER - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - Captured substrings can be accessed directly by using the offsets - returned by pcre_exec() in ovector. For convenience, the functions - pcre_copy_substring(), pcre_get_substring(), and pcre_get_sub- - string_list() are provided for extracting captured substrings as new, - separate, zero-terminated strings. These functions identify substrings - by number. The next section describes functions for extracting named - substrings. A substring that contains a binary zero is correctly - extracted and has a further zero added on the end, but the result is - not, of course, a C string. - - The first three arguments are the same for all three of these func- - tions: subject is the subject string that has just been successfully - matched, ovector is a pointer to the vector of integer offsets that was - passed to pcre_exec(), and stringcount is the number of substrings that - were captured by the match, including the substring that matched the - entire regular expression. This is the value returned by pcre_exec() if - it is greater than zero. If pcre_exec() returned zero, indicating that - it ran out of space in ovector, the value passed as stringcount should - be the number of elements in the vector divided by three. - - The functions pcre_copy_substring() and pcre_get_substring() extract a - single substring, whose number is given as stringnumber. A value of - zero extracts the substring that matched the entire pattern, whereas - higher values extract the captured substrings. For pcre_copy_sub- - string(), the string is placed in buffer, whose length is given by - buffersize, while for pcre_get_substring() a new block of memory is - obtained via pcre_malloc, and its address is returned via stringptr. - The yield of the function is the length of the string, not including - the terminating zero, or one of - - PCRE_ERROR_NOMEMORY (-6) - - The buffer was too small for pcre_copy_substring(), or the attempt to - get memory failed for pcre_get_substring(). - - PCRE_ERROR_NOSUBSTRING (-7) - - There is no substring whose number is stringnumber. - - The pcre_get_substring_list() function extracts all available sub- - strings and builds a list of pointers to them. All this is done in a - single block of memory that is obtained via pcre_malloc. The address of - the memory block is returned via listptr, which is also the start of - the list of string pointers. The end of the list is marked by a NULL - pointer. The yield of the function is zero if all went well, or - - PCRE_ERROR_NOMEMORY (-6) - - if the attempt to get the memory block failed. - - When any of these functions encounter a substring that is unset, which - can happen when capturing subpattern number n+1 matches some part of - the subject, but subpattern n has not been used at all, they return an - empty string. This can be distinguished from a genuine zero-length sub- - string by inspecting the appropriate offset in ovector, which is nega- - tive for unset substrings. - - The two convenience functions pcre_free_substring() and pcre_free_sub- - string_list() can be used to free the memory returned by a previous - call of pcre_get_substring() or pcre_get_substring_list(), respec- - tively. They do nothing more than call the function pointed to by - pcre_free, which of course could be called directly from a C program. - However, PCRE is used in some situations where it is linked via a spe- - cial interface to another programming language which cannot use - pcre_free directly; it is for these cases that the functions are - provided. - - -EXTRACTING CAPTURED SUBSTRINGS BY NAME - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - To extract a substring by name, you first have to find associated num- - ber. For example, for this pattern - - (a+)b(?\d+)... - - the number of the subpattern called "xxx" is 2. You can find the number - from the name by calling pcre_get_stringnumber(). The first argument is - the compiled pattern, and the second is the name. The yield of the - function is the subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if - there is no subpattern of that name. - - Given the number, you can extract the substring directly, or use one of - the functions described in the previous section. For convenience, there - are also two functions that do the whole job. - - Most of the arguments of pcre_copy_named_substring() and - pcre_get_named_substring() are the same as those for the similarly - named functions that extract by number. As these are described in the - previous section, they are not re-described here. There are just two - differences: - - First, instead of a substring number, a substring name is given. Sec- - ond, there is an extra argument, given at the start, which is a pointer - to the compiled pattern. This is needed in order to gain access to the - name-to-number translation table. - - These functions call pcre_get_stringnumber(), and if it succeeds, they - then call pcre_copy_substring() or pcre_get_substring(), as appropri- - ate. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE CALLOUTS - - int (*pcre_callout)(pcre_callout_block *); - - PCRE provides a feature called "callout", which is a means of temporar- - ily passing control to the caller of PCRE in the middle of pattern - matching. The caller of PCRE provides an external function by putting - its entry point in the global variable pcre_callout. By default, this - variable contains NULL, which disables all calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. Different callout points can be - identified by putting a number less than 256 after the letter C. The - default value is zero. For example, this pattern has two callout - points: - - (?C1)eabc(?C2)def - - If the PCRE_AUTO_CALLOUT option bit is set when pcre_compile() is - called, PCRE automatically inserts callouts, all with number 255, - before each item in the pattern. For example, if PCRE_AUTO_CALLOUT is - used with the pattern - - A(\d{2}|--) - - it is processed as if it were - - (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) - - Notice that there is a callout before and after each parenthesis and - alternation bar. Automatic callouts can be used for tracking the - progress of pattern matching. The pcretest command has an option that - sets automatic callouts; when it is used, the output indicates how the - pattern is matched. This is useful information when you are trying to - optimize the performance of a particular pattern. - - -MISSING CALLOUTS - - You should be aware that, because of optimizations in the way PCRE - matches patterns, callouts sometimes do not happen. For example, if the - pattern is - - ab(?C4)cd - - PCRE knows that any matching string must contain the letter "d". If the - subject string is "abyz", the lack of "d" means that matching doesn't - ever start, and the callout is never reached. However, with "abyd", - though the result is still no match, the callout is obeyed. - - -THE CALLOUT INTERFACE - - During matching, when PCRE reaches a callout point, the external func- - tion defined by pcre_callout is called (if it is set). The only argu- - ment is a pointer to a pcre_callout block. This structure contains the - following fields: - - int version; - int callout_number; - int *offset_vector; - const char *subject; - int subject_length; - int start_match; - int current_position; - int capture_top; - int capture_last; - void *callout_data; - int pattern_position; - int next_item_length; - - The version field is an integer containing the version number of the - block format. The initial version was 0; the current version is 1. The - version number will change again in future if additional fields are - added, but the intention is never to remove any of the existing fields. - - The callout_number field contains the number of the callout, as com- - piled into the pattern (that is, the number after ?C for manual call- - outs, and 255 for automatically generated callouts). - - The offset_vector field is a pointer to the vector of offsets that was - passed by the caller to pcre_exec(). The contents can be inspected in - order to extract substrings that have been matched so far, in the same - way as for extracting substrings after a match has completed. - - The subject and subject_length fields contain copies of the values that - were passed to pcre_exec(). - - The start_match field contains the offset within the subject at which - the current match attempt started. If the pattern is not anchored, the - callout function may be called several times from the same point in the - pattern for different starting points in the subject. - - The current_position field contains the offset within the subject of - the current match pointer. - - The capture_top field contains one more than the number of the highest - numbered captured substring so far. If no substrings have been cap- - tured, the value of capture_top is one. - - The capture_last field contains the number of the most recently cap- - tured substring. If no substrings have been captured, its value is -1. - - The callout_data field contains a value that is passed to pcre_exec() - by the caller specifically so that it can be passed back in callouts. - It is passed in the pcre_callout field of the pcre_extra data struc- - ture. If no such data was passed, the value of callout_data in a - pcre_callout block is NULL. There is a description of the pcre_extra - structure in the pcreapi documentation. - - The pattern_position field is present from version 1 of the pcre_call- - out structure. It contains the offset to the next item to be matched in - the pattern string. - - The next_item_length field is present from version 1 of the pcre_call- - out structure. It contains the length of the next item to be matched in - the pattern string. When the callout immediately precedes an alterna- - tion bar, a closing parenthesis, or the end of the pattern, the length - is zero. When the callout precedes an opening parenthesis, the length - is that of the entire subpattern. - - The pattern_position and next_item_length fields are intended to help - in distinguishing between different automatic callouts, which all have - the same callout number. However, they are set for all callouts. - - -RETURN VALUES - - The external callout function returns an integer to PCRE. If the value - is zero, matching proceeds as normal. If the value is greater than - zero, matching fails at the current point, but backtracking to test - other matching possibilities goes ahead, just as if a lookahead asser- - tion had failed. If the value is less than zero, the match is aban- - doned, and pcre_exec() returns the negative value. - - Negative values should normally be chosen from the set of - PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan- - dard "no match" failure. The error number PCRE_ERROR_CALLOUT is - reserved for use by callout functions; it will never be used by PCRE - itself. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -DIFFERENCES BETWEEN PCRE AND PERL - - This document describes the differences in the ways that PCRE and Perl - handle regular expressions. The differences described here are with - respect to Perl 5.8. - - 1. PCRE does not have full UTF-8 support. Details of what it does have - are given in the section on UTF-8 support in the main pcre page. - - 2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl - permits them, but they do not mean what you might think. For example, - (?!a){3} does not assert that the next three characters are not "a". It - just asserts that the next character is not "a" three times. - - 3. Capturing subpatterns that occur inside negative lookahead asser- - tions are counted, but their entries in the offsets vector are never - set. Perl sets its numerical variables from any such patterns that are - matched before the assertion fails to match something (thereby succeed- - ing), but only if the negative lookahead assertion contains just one - branch. - - 4. Though binary zero characters are supported in the subject string, - they are not allowed in a pattern string because it is passed as a nor- - mal C string, terminated by zero. The escape sequence \0 can be used in - the pattern to represent a binary zero. - - 5. The following Perl escape sequences are not supported: \l, \u, \L, - \U, and \N. In fact these are implemented by Perl's general string-han- - dling and are not part of its pattern matching engine. If any of these - are encountered by PCRE, an error is generated. - - 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE - is built with Unicode character property support. The properties that - can be tested with \p and \P are limited to the general category prop- - erties such as Lu and Nd. - - 7. PCRE does support the \Q...\E escape for quoting substrings. Charac- - ters in between are treated as literals. This is slightly different - from Perl in that $ and @ are also handled as literals inside the - quotes. In Perl, they cause variable interpolation (but of course PCRE - does not have variables). Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. - - 8. Fairly obviously, PCRE does not support the (?{code}) and (?p{code}) - constructions. However, there is support for recursive patterns using - the non-Perl items (?R), (?number), and (?P>name). Also, the PCRE - "callout" feature allows an external function to be called during pat- - tern matching. See the pcrecallout documentation for details. - - 9. There are some differences that are concerned with the settings of - captured strings when part of a pattern is repeated. For example, - matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 - unset, but in PCRE it is set to "b". - - 10. PCRE provides some extensions to the Perl regular expression facil- - ities: - - (a) Although lookbehind assertions must match fixed length strings, - each alternative branch of a lookbehind assertion can match a different - length of string. Perl requires them all to have the same length. - - (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ - meta-character matches only at the very end of the string. - - (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe- - cial meaning is faulted. - - (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- - fiers is inverted, that is, by default they are not greedy, but if fol- - lowed by a question mark they are. - - (e) PCRE_ANCHORED can be used at matching time to force a pattern to be - tried only at the first matching position in the subject string. - - (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, and PCRE_NO_AUTO_CAP- - TURE options for pcre_exec() have no Perl equivalents. - - (g) The (?R), (?number), and (?P>name) constructs allows for recursive - pattern matching (Perl can do this using the (?p{code}) construct, - which PCRE cannot support.) - - (h) PCRE supports named capturing substrings, using the Python syntax. - - (i) PCRE supports the possessive quantifier "++" syntax, taken from - Sun's Java package. - - (j) The (R) condition, for testing recursion, is a PCRE extension. - - (k) The callout facility is PCRE-specific. - - (l) The partial matching facility is PCRE-specific. - - (m) Patterns compiled by PCRE can be saved and re-used at a later time, - even on different hosts that have the other endianness. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION DETAILS - - The syntax and semantics of the regular expressions supported by PCRE - are described below. Regular expressions are also described in the Perl - documentation and in a number of books, some of which have copious - examples. Jeffrey Friedl's "Mastering Regular Expressions", published - by O'Reilly, covers regular expressions in great detail. This descrip- - tion of PCRE's regular expressions is intended as reference material. - - The original operation of PCRE was on strings of one-byte characters. - However, there is now also support for UTF-8 character strings. To use - this, you must build PCRE to include UTF-8 support, and then call - pcre_compile() with the PCRE_UTF8 option. How this affects pattern - matching is mentioned in several places below. There is also a summary - of UTF-8 features in the section on UTF-8 support in the main pcre - page. - - A regular expression is a pattern that is matched against a subject - string from left to right. Most characters stand for themselves in a - pattern, and match the corresponding characters in the subject. As a - trivial example, the pattern - - The quick brown fox - - matches a portion of a subject string that is identical to itself. The - power of regular expressions comes from the ability to include alterna- - tives and repetitions in the pattern. These are encoded in the pattern - by the use of metacharacters, which do not stand for themselves but - instead are interpreted in some special way. - - There are two different sets of metacharacters: those that are recog- - nized anywhere in the pattern except within square brackets, and those - that are recognized in square brackets. Outside square brackets, the - metacharacters are as follows: - - \ general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier - - Part of a pattern that is in square brackets is called a "character - class". In a character class the only metacharacters are: - - \ general escape character - ^ negate the class, but only if the first character - - indicates character range - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class - - The following sections describe the use of each of the metacharacters. - - -BACKSLASH - - The backslash character has several uses. Firstly, if it is followed by - a non-alphanumeric character, it takes away any special meaning that - character may have. This use of backslash as an escape character - applies both inside and outside character classes. - - For example, if you want to match a * character, you write \* in the - pattern. This escaping action applies whether or not the following - character would otherwise be interpreted as a metacharacter, so it is - always safe to precede a non-alphanumeric with backslash to specify - that it stands for itself. In particular, if you want to match a back- - slash, you write \\. - - If a pattern is compiled with the PCRE_EXTENDED option, whitespace in - the pattern (other than in a character class) and characters between a - # outside a character class and the next newline character are ignored. - An escaping backslash can be used to include a whitespace or # charac- - ter as part of the pattern. - - If you want to remove the special meaning from a sequence of charac- - ters, you can do so by putting them between \Q and \E. This is differ- - ent from Perl in that $ and @ are handled as literals in \Q...\E - sequences in PCRE, whereas in Perl, $ and @ cause variable interpola- - tion. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. - - Non-printing characters - - A second use of backslash provides a way of encoding non-printing char- - acters in patterns in a visible manner. There is no restriction on the - appearance of non-printing characters, apart from the binary zero that - terminates a pattern, but when a pattern is being prepared by text - editing, it is usually easier to use one of the following escape - sequences than the binary character it represents: - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any character - \e escape (hex 1B) - \f formfeed (hex 0C) - \n newline (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \ddd character with octal code ddd, or backreference - \xhh character with hex code hh - \x{hhh..} character with hex code hhh... (UTF-8 mode only) - - The precise effect of \cx is as follows: if x is a lower case letter, - it is converted to upper case. Then bit 6 of the character (hex 40) is - inverted. Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; - becomes hex 7B. - - After \x, from zero to two hexadecimal digits are read (letters can be - in upper or lower case). In UTF-8 mode, any number of hexadecimal dig- - its may appear between \x{ and }, but the value of the character code - must be less than 2**31 (that is, the maximum hexadecimal value is - 7FFFFFFF). If characters other than hexadecimal digits appear between - \x{ and }, or if there is no terminating }, this form of escape is not - recognized. Instead, the initial \x will be interpreted as a basic hex- - adecimal escape, with no following digits, giving a character whose - value is zero. - - Characters whose value is less than 256 can be defined by either of the - two syntaxes for \x when PCRE is in UTF-8 mode. There is no difference - in the way they are handled. For example, \xdc is exactly the same as - \x{dc}. - - After \0 up to two further octal digits are read. In both cases, if - there are fewer than two digits, just those that are present are used. - Thus the sequence \0\x\07 specifies two binary zeros followed by a BEL - character (code value 7). Make sure you supply two digits after the - initial zero if the pattern character that follows is itself an octal - digit. - - The handling of a backslash followed by a digit other than 0 is compli- - cated. Outside a character class, PCRE reads it and any following dig- - its as a decimal number. If the number is less than 10, or if there - have been at least that many previous capturing left parentheses in the - expression, the entire sequence is taken as a back reference. A - description of how this works is given later, following the discussion - of parenthesized subpatterns. - - Inside a character class, or if the decimal number is greater than 9 - and there have not been that many capturing subpatterns, PCRE re-reads - up to three octal digits following the backslash, and generates a sin- - gle byte from the least significant 8 bits of the value. Any subsequent - digits stand for themselves. For example: - - \040 is another way of writing a space - \40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \7 is always a back reference - \11 might be a back reference, or another way of - writing a tab - \011 is always a tab - \0113 is a tab followed by the character "3" - \113 might be a back reference, otherwise the - character with octal code 113 - \377 might be a back reference, otherwise - the byte consisting entirely of 1 bits - \81 is either a back reference, or a binary zero - followed by the two characters "8" and "1" - - Note that octal values of 100 or greater must not be introduced by a - leading zero, because no more than three octal digits are ever read. - - All the sequences that define a single byte value or a single UTF-8 - character (in UTF-8 mode) can be used both inside and outside character - classes. In addition, inside a character class, the sequence \b is - interpreted as the backspace character (hex 08), and the sequence \X is - interpreted as the character "X". Outside a character class, these - sequences have different meanings (see below). - - Generic character types - - The third use of backslash is for specifying generic character types. - The following are always recognized: - - \d any decimal digit - \D any character that is not a decimal digit - \s any whitespace character - \S any character that is not a whitespace character - \w any "word" character - \W any "non-word" character - - Each pair of escape sequences partitions the complete set of characters - into two disjoint sets. Any given character matches one, and only one, - of each pair. - - These character type sequences can appear both inside and outside char- - acter classes. They each match one character of the appropriate type. - If the current matching point is at the end of the subject string, all - of them fail, since there is no character to match. - - For compatibility with Perl, \s does not match the VT character (code - 11). This makes it different from the the POSIX "space" class. The \s - characters are HT (9), LF (10), FF (12), CR (13), and space (32). - - A "word" character is an underscore or any character less than 256 that - is a letter or digit. The definition of letters and digits is con- - trolled by PCRE's low-valued character tables, and may vary if locale- - specific matching is taking place (see "Locale support" in the pcreapi - page). For example, in the "fr_FR" (French) locale, some character - codes greater than 128 are used for accented letters, and these are - matched by \w. - - In UTF-8 mode, characters with values greater than 128 never match \d, - \s, or \w, and always match \D, \S, and \W. This is true even when Uni- - code character property support is available. - - Unicode character properties - - When PCRE is built with Unicode character property support, three addi- - tional escape sequences to match generic character types are available - when UTF-8 mode is selected. They are: - - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \X an extended Unicode sequence - - The property names represented by xx above are limited to the Unicode - general category properties. Each character has exactly one such prop- - erty, specified by a two-letter abbreviation. For compatibility with - Perl, negation can be specified by including a circumflex between the - opening brace and the property name. For example, \p{^Lu} is the same - as \P{Lu}. - - If only one letter is specified with \p or \P, it includes all the - properties that start with that letter. In this case, in the absence of - negation, the curly brackets in the escape sequence are optional; these - two examples have the same effect: - - \p{L} - \pL - - The following property codes are supported: - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - Extended properties such as "Greek" or "InMusicalSymbols" are not sup- - ported by PCRE. - - Specifying caseless matching does not affect these escape sequences. - For example, \p{Lu} always matches only upper case letters. - - The \X escape matches any number of Unicode characters that form an - extended Unicode sequence. \X is equivalent to - - (?>\PM\pM*) - - That is, it matches a character without the "mark" property, followed - by zero or more characters with the "mark" property, and treats the - sequence as an atomic group (see below). Characters with the "mark" - property are typically accents that affect the preceding character. - - Matching characters by Unicode property is not fast, because PCRE has - to search a structure that contains data for over fifteen thousand - characters. That is why the traditional escape sequences such as \d and - \w do not use Unicode properties in PCRE. - - Simple assertions - - The fourth use of backslash is for certain simple assertions. An asser- - tion specifies a condition that has to be met at a particular point in - a match, without consuming any characters from the subject string. The - use of subpatterns for more complicated assertions is described below. - The backslashed assertions are: - - \b matches at a word boundary - \B matches when not at a word boundary - \A matches at start of subject - \Z matches at end of subject or before newline at end - \z matches at end of subject - \G matches at first matching position in subject - - These assertions may not appear in character classes (but note that \b - has a different meaning, namely the backspace character, inside a char- - acter class). - - A word boundary is a position in the subject string where the current - character and the previous character do not both match \w or \W (i.e. - one matches \w and the other matches \W), or the start or end of the - string if the first or last character matches \w, respectively. - - The \A, \Z, and \z assertions differ from the traditional circumflex - and dollar (described in the next section) in that they only ever match - at the very start and end of the subject string, whatever options are - set. Thus, they are independent of multiline mode. These three asser- - tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which - affect only the behaviour of the circumflex and dollar metacharacters. - However, if the startoffset argument of pcre_exec() is non-zero, indi- - cating that matching is to start at a point other than the beginning of - the subject, \A can never match. The difference between \Z and \z is - that \Z matches before a newline that is the last character of the - string as well as at the end of the string, whereas \z matches only at - the end. - - The \G assertion is true only when the current matching position is at - the start point of the match, as specified by the startoffset argument - of pcre_exec(). It differs from \A when the value of startoffset is - non-zero. By calling pcre_exec() multiple times with appropriate argu- - ments, you can mimic Perl's /g option, and it is in this kind of imple- - mentation where \G can be useful. - - Note, however, that PCRE's interpretation of \G, as the start of the - current match, is subtly different from Perl's, which defines it as the - end of the previous match. In Perl, these can be different when the - previously matched string was empty. Because PCRE does just one match - at a time, it cannot reproduce this behaviour. - - If all the alternatives of a pattern begin with \G, the expression is - anchored to the starting match position, and the "anchored" flag is set - in the compiled regular expression. - - -CIRCUMFLEX AND DOLLAR - - Outside a character class, in the default matching mode, the circumflex - character is an assertion that is true only if the current matching - point is at the start of the subject string. If the startoffset argu- - ment of pcre_exec() is non-zero, circumflex can never match if the - PCRE_MULTILINE option is unset. Inside a character class, circumflex - has an entirely different meaning (see below). - - Circumflex need not be the first character of the pattern if a number - of alternatives are involved, but it should be the first thing in each - alternative in which it appears if the pattern is ever to match that - branch. If all possible alternatives start with a circumflex, that is, - if the pattern is constrained to match only at the start of the sub- - ject, it is said to be an "anchored" pattern. (There are also other - constructs that can cause a pattern to be anchored.) - - A dollar character is an assertion that is true only if the current - matching point is at the end of the subject string, or immediately - before a newline character that is the last character in the string (by - default). Dollar need not be the last character of the pattern if a - number of alternatives are involved, but it should be the last item in - any branch in which it appears. Dollar has no special meaning in a - character class. - - The meaning of dollar can be changed so that it matches only at the - very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at - compile time. This does not affect the \Z assertion. - - The meanings of the circumflex and dollar characters are changed if the - PCRE_MULTILINE option is set. When this is the case, they match immedi- - ately after and immediately before an internal newline character, - respectively, in addition to matching at the start and end of the sub- - ject string. For example, the pattern /^abc$/ matches the subject - string "def\nabc" (where \n represents a newline character) in multi- - line mode, but not otherwise. Consequently, patterns that are anchored - in single line mode because all branches start with ^ are not anchored - in multiline mode, and a match for circumflex is possible when the - startoffset argument of pcre_exec() is non-zero. The PCRE_DOL- - LAR_ENDONLY option is ignored if PCRE_MULTILINE is set. - - Note that the sequences \A, \Z, and \z can be used to match the start - and end of the subject in both modes, and if all branches of a pattern - start with \A it is always anchored, whether PCRE_MULTILINE is set or - not. - - -FULL STOP (PERIOD, DOT) - - Outside a character class, a dot in the pattern matches any one charac- - ter in the subject, including a non-printing character, but not (by - default) newline. In UTF-8 mode, a dot matches any UTF-8 character, - which might be more than one byte long, except (by default) newline. If - the PCRE_DOTALL option is set, dots match newlines as well. The han- - dling of dot is entirely independent of the handling of circumflex and - dollar, the only relationship being that they both involve newline - characters. Dot has no special meaning in a character class. - - -MATCHING A SINGLE BYTE - - Outside a character class, the escape sequence \C matches any one byte, - both in and out of UTF-8 mode. Unlike a dot, it can match a newline. - The feature is provided in Perl in order to match individual bytes in - UTF-8 mode. Because it breaks up UTF-8 characters into individual - bytes, what remains in the string may be a malformed UTF-8 string. For - this reason, the \C escape sequence is best avoided. - - PCRE does not allow \C to appear in lookbehind assertions (described - below), because in UTF-8 mode this would make it impossible to calcu- - late the length of the lookbehind. - - -SQUARE BRACKETS AND CHARACTER CLASSES - - An opening square bracket introduces a character class, terminated by a - closing square bracket. A closing square bracket on its own is not spe- - cial. If a closing square bracket is required as a member of the class, - it should be the first data character in the class (after an initial - circumflex, if present) or escaped with a backslash. - - A character class matches a single character in the subject. In UTF-8 - mode, the character may occupy more than one byte. A matched character - must be in the set of characters defined by the class, unless the first - character in the class definition is a circumflex, in which case the - subject character must not be in the set defined by the class. If a - circumflex is actually required as a member of the class, ensure it is - not the first character, or escape it with a backslash. - - For example, the character class [aeiou] matches any lower case vowel, - while [^aeiou] matches any character that is not a lower case vowel. - Note that a circumflex is just a convenient notation for specifying the - characters that are in the class by enumerating those that are not. A - class that starts with a circumflex is not an assertion: it still con- - sumes a character from the subject string, and therefore it fails if - the current pointer is at the end of the string. - - In UTF-8 mode, characters with values greater than 255 can be included - in a class as a literal string of bytes, or by using the \x{ escaping - mechanism. - - When caseless matching is set, any letters in a class represent both - their upper case and lower case versions, so for example, a caseless - [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not - match "A", whereas a caseful version would. When running in UTF-8 mode, - PCRE supports the concept of case for characters with values greater - than 128 only when it is compiled with Unicode property support. - - The newline character is never treated in any special way in character - classes, whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE - options is. A class such as [^a] will always match a newline. - - The minus (hyphen) character can be used to specify a range of charac- - ters in a character class. For example, [d-m] matches any letter - between d and m, inclusive. If a minus character is required in a - class, it must be escaped with a backslash or appear in a position - where it cannot be interpreted as indicating a range, typically as the - first or last character in the class. - - It is not possible to have the literal character "]" as the end charac- - ter of a range. A pattern such as [W-]46] is interpreted as a class of - two characters ("W" and "-") followed by a literal string "46]", so it - would match "W46]" or "-46]". However, if the "]" is escaped with a - backslash it is interpreted as the end of range, so [W-\]46] is inter- - preted as a class containing a range followed by two other characters. - The octal or hexadecimal representation of "]" can also be used to end - a range. - - Ranges operate in the collating sequence of character values. They can - also be used for characters specified numerically, for example - [\000-\037]. In UTF-8 mode, ranges can include characters whose values - are greater than 255, for example [\x{100}-\x{2ff}]. - - If a range that includes letters is used when caseless matching is set, - it matches the letters in either case. For example, [W-c] is equivalent - to [][\\^_`wxyzabc], matched caselessly, and in non-UTF-8 mode, if - character tables for the "fr_FR" locale are in use, [\xc8-\xcb] matches - accented E characters in both cases. In UTF-8 mode, PCRE supports the - concept of case for characters with values greater than 128 only when - it is compiled with Unicode property support. - - The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear - in a character class, and add the characters that they match to the - class. For example, [\dABCDEF] matches any hexadecimal digit. A circum- - flex can conveniently be used with the upper case character types to - specify a more restricted set of characters than the matching lower - case type. For example, the class [^\W_] matches any letter or digit, - but not underscore. - - The only metacharacters that are recognized in character classes are - backslash, hyphen (only where it can be interpreted as specifying a - range), circumflex (only at the start), opening square bracket (only - when it can be interpreted as introducing a POSIX class name - see the - next section), and the terminating closing square bracket. However, - escaping other non-alphanumeric characters does no harm. - - -POSIX CHARACTER CLASSES - - Perl supports the POSIX notation for character classes. This uses names - enclosed by [: and :] within the enclosing square brackets. PCRE also - supports this notation. For example, - - [01[:alpha:]%] - - matches "0", "1", any alphabetic character, or "%". The supported class - names are - - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \d) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits - space white space (not quite the same as \s) - upper upper case letters - word "word" characters (same as \w) - xdigit hexadecimal digits - - The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), - and space (32). Notice that this list includes the VT character (code - 11). This makes "space" different to \s, which does not include VT (for - Perl compatibility). - - The name "word" is a Perl extension, and "blank" is a GNU extension - from Perl 5.8. Another Perl extension is negation, which is indicated - by a ^ character after the colon. For example, - - [12[:^digit:]] - - matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the - POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but - these are not supported, and an error is given if they are encountered. - - In UTF-8 mode, characters with values greater than 128 do not match any - of the POSIX character classes. - - -VERTICAL BAR - - Vertical bar characters are used to separate alternative patterns. For - example, the pattern - - gilbert|sullivan - - matches either "gilbert" or "sullivan". Any number of alternatives may - appear, and an empty alternative is permitted (matching the empty - string). The matching process tries each alternative in turn, from - left to right, and the first one that succeeds is used. If the alterna- - tives are within a subpattern (defined below), "succeeds" means match- - ing the rest of the main pattern as well as the alternative in the sub- - pattern. - - -INTERNAL OPTION SETTING - - The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and - PCRE_EXTENDED options can be changed from within the pattern by a - sequence of Perl option letters enclosed between "(?" and ")". The - option letters are - - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED - - For example, (?im) sets caseless, multiline matching. It is also possi- - ble to unset these options by preceding the letter with a hyphen, and a - combined setting and unsetting such as (?im-sx), which sets PCRE_CASE- - LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, - is also permitted. If a letter appears both before and after the - hyphen, the option is unset. - - When an option change occurs at top level (that is, not inside subpat- - tern parentheses), the change applies to the remainder of the pattern - that follows. If the change is placed right at the start of a pattern, - PCRE extracts it into the global options (and it will therefore show up - in data extracted by the pcre_fullinfo() function). - - An option change within a subpattern affects only that part of the cur- - rent pattern that follows it, so - - (a(?i)b)c - - matches abc and aBc and no other strings (assuming PCRE_CASELESS is not - used). By this means, options can be made to have different settings - in different parts of the pattern. Any changes made in one alternative - do carry on into subsequent branches within the same subpattern. For - example, - - (a(?i)b|c) - - matches "ab", "aB", "c", and "C", even though when matching "C" the - first branch is abandoned before the option setting. This is because - the effects of option settings happen at compile time. There would be - some very weird behaviour otherwise. - - The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed - in the same way as the Perl-compatible options by using the characters - U and X respectively. The (?X) flag setting is special in that it must - always occur earlier in the pattern than any of the additional features - it turns on, even when it is at top level. It is best to put it at the - start. - - -SUBPATTERNS - - Subpatterns are delimited by parentheses (round brackets), which can be - nested. Turning part of a pattern into a subpattern does two things: - - 1. It localizes a set of alternatives. For example, the pattern - - cat(aract|erpillar|) - - matches one of the words "cat", "cataract", or "caterpillar". Without - the parentheses, it would match "cataract", "erpillar" or the empty - string. - - 2. It sets up the subpattern as a capturing subpattern. This means - that, when the whole pattern matches, that portion of the subject - string that matched the subpattern is passed back to the caller via the - ovector argument of pcre_exec(). Opening parentheses are counted from - left to right (starting from 1) to obtain numbers for the capturing - subpatterns. - - For example, if the string "the red king" is matched against the pat- - tern - - the ((red|white) (king|queen)) - - the captured substrings are "red king", "red", and "king", and are num- - bered 1, 2, and 3, respectively. - - The fact that plain parentheses fulfil two functions is not always - helpful. There are often times when a grouping subpattern is required - without a capturing requirement. If an opening parenthesis is followed - by a question mark and a colon, the subpattern does not do any captur- - ing, and is not counted when computing the number of any subsequent - capturing subpatterns. For example, if the string "the white queen" is - matched against the pattern - - the ((?:red|white) (king|queen)) - - the captured substrings are "white queen" and "queen", and are numbered - 1 and 2. The maximum number of capturing subpatterns is 65535, and the - maximum depth of nesting of all subpatterns, both capturing and non- - capturing, is 200. - - As a convenient shorthand, if any option settings are required at the - start of a non-capturing subpattern, the option letters may appear - between the "?" and the ":". Thus the two patterns - - (?i:saturday|sunday) - (?:(?i)saturday|sunday) - - match exactly the same set of strings. Because alternative branches are - tried from left to right, and options are not reset until the end of - the subpattern is reached, an option setting in one branch does affect - subsequent branches, so the above patterns match "SUNDAY" as well as - "Saturday". - - -NAMED SUBPATTERNS - - Identifying capturing parentheses by number is simple, but it can be - very hard to keep track of the numbers in complicated regular expres- - sions. Furthermore, if an expression is modified, the numbers may - change. To help with this difficulty, PCRE supports the naming of sub- - patterns, something that Perl does not provide. The Python syntax - (?P...) is used. Names consist of alphanumeric characters and - underscores, and must be unique within a pattern. - - Named capturing parentheses are still allocated numbers as well as - names. The PCRE API provides function calls for extracting the name-to- - number translation table from a compiled pattern. There is also a con- - venience function for extracting a captured substring by name. For fur- - ther details see the pcreapi documentation. - - -REPETITION - - Repetition is specified by quantifiers, which can follow any of the - following items: - - a literal data character - the . metacharacter - the \C escape sequence - the \X escape sequence (in UTF-8 mode with Unicode properties) - an escape such as \d that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (unless it is an assertion) - - The general repetition quantifier specifies a minimum and maximum num- - ber of permitted matches, by giving the two numbers in curly brackets - (braces), separated by a comma. The numbers must be less than 65536, - and the first must be less than or equal to the second. For example: - - z{2,4} - - matches "zz", "zzz", or "zzzz". A closing brace on its own is not a - special character. If the second number is omitted, but the comma is - present, there is no upper limit; if the second number and the comma - are both omitted, the quantifier specifies an exact number of required - matches. Thus - - [aeiou]{3,} - - matches at least 3 successive vowels, but may match many more, while - - \d{8} - - matches exactly 8 digits. An opening curly bracket that appears in a - position where a quantifier is not allowed, or one that does not match - the syntax of a quantifier, is taken as a literal character. For exam- - ple, {,6} is not a quantifier, but a literal string of four characters. - - In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to - individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 char- - acters, each of which is represented by a two-byte sequence. Similarly, - when Unicode property support is available, \X{3} matches three Unicode - extended sequences, each of which may be several bytes long (and they - may be of different lengths). - - The quantifier {0} is permitted, causing the expression to behave as if - the previous item and the quantifier were not present. - - For convenience (and historical compatibility) the three most common - quantifiers have single-character abbreviations: - - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} - - It is possible to construct infinite loops by following a subpattern - that can match no characters with a quantifier that has no upper limit, - for example: - - (a?)* - - Earlier versions of Perl and PCRE used to give an error at compile time - for such patterns. However, because there are cases where this can be - useful, such patterns are now accepted, but if any repetition of the - subpattern does in fact match no characters, the loop is forcibly bro- - ken. - - By default, the quantifiers are "greedy", that is, they match as much - as possible (up to the maximum number of permitted times), without - causing the rest of the pattern to fail. The classic example of where - this gives problems is in trying to match comments in C programs. These - appear between /* and */ and within the comment, individual * and / - characters may appear. An attempt to match C comments by applying the - pattern - - /\*.*\*/ - - to the string - - /* first comment */ not comment /* second comment */ - - fails, because it matches the entire string owing to the greediness of - the .* item. - - However, if a quantifier is followed by a question mark, it ceases to - be greedy, and instead matches the minimum number of times possible, so - the pattern - - /\*.*?\*/ - - does the right thing with the C comments. The meaning of the various - quantifiers is not otherwise changed, just the preferred number of - matches. Do not confuse this use of question mark with its use as a - quantifier in its own right. Because it has two uses, it can sometimes - appear doubled, as in - - \d??\d - - which matches one digit by preference, but can match two if that is the - only way the rest of the pattern matches. - - If the PCRE_UNGREEDY option is set (an option which is not available in - Perl), the quantifiers are not greedy by default, but individual ones - can be made greedy by following them with a question mark. In other - words, it inverts the default behaviour. - - When a parenthesized subpattern is quantified with a minimum repeat - count that is greater than 1 or with a limited maximum, more memory is - required for the compiled pattern, in proportion to the size of the - minimum or maximum. - - If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- - alent to Perl's /s) is set, thus allowing the . to match newlines, the - pattern is implicitly anchored, because whatever follows will be tried - against every character position in the subject string, so there is no - point in retrying the overall match at any position after the first. - PCRE normally treats such a pattern as though it were preceded by \A. - - In cases where it is known that the subject string contains no new- - lines, it is worth setting PCRE_DOTALL in order to obtain this opti- - mization, or alternatively using ^ to indicate anchoring explicitly. - - However, there is one situation where the optimization cannot be used. - When .* is inside capturing parentheses that are the subject of a - backreference elsewhere in the pattern, a match at the start may fail, - and a later one succeed. Consider, for example: - - (.*)abc\1 - - If the subject is "xyz123abc123" the match point is the fourth charac- - ter. For this reason, such a pattern is not implicitly anchored. - - When a capturing subpattern is repeated, the value captured is the sub- - string that matched the final iteration. For example, after - - (tweedle[dume]{3}\s*)+ - - has matched "tweedledum tweedledee" the value of the captured substring - is "tweedledee". However, if there are nested capturing subpatterns, - the corresponding captured values may have been set in previous itera- - tions. For example, after - - /(a|(b))+/ - - matches "aba" the value of the second captured substring is "b". - - -ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS - - With both maximizing and minimizing repetition, failure of what follows - normally causes the repeated item to be re-evaluated to see if a dif- - ferent number of repeats allows the rest of the pattern to match. Some- - times it is useful to prevent this, either to change the nature of the - match, or to cause it fail earlier than it otherwise might, when the - author of the pattern knows there is no point in carrying on. - - Consider, for example, the pattern \d+foo when applied to the subject - line - - 123456bar - - After matching all 6 digits and then failing to match "foo", the normal - action of the matcher is to try again with only 5 digits matching the - \d+ item, and then with 4, and so on, before ultimately failing. - "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides - the means for specifying that once a subpattern has matched, it is not - to be re-evaluated in this way. - - If we use atomic grouping for the previous example, the matcher would - give up immediately on failing to match "foo" the first time. The nota- - tion is a kind of special parenthesis, starting with (?> as in this - example: - - (?>\d+)foo - - This kind of parenthesis "locks up" the part of the pattern it con- - tains once it has matched, and a failure further into the pattern is - prevented from backtracking into it. Backtracking past it to previous - items, however, works as normal. - - An alternative description is that a subpattern of this type matches - the string of characters that an identical standalone pattern would - match, if anchored at the current point in the subject string. - - Atomic grouping subpatterns are not capturing subpatterns. Simple cases - such as the above example can be thought of as a maximizing repeat that - must swallow everything it can. So, while both \d+ and \d+? are pre- - pared to adjust the number of digits they match in order to make the - rest of the pattern match, (?>\d+) can only match an entire sequence of - digits. - - Atomic groups in general can of course contain arbitrarily complicated - subpatterns, and can be nested. However, when the subpattern for an - atomic group is just a single repeated item, as in the example above, a - simpler notation, called a "possessive quantifier" can be used. This - consists of an additional + character following a quantifier. Using - this notation, the previous example can be rewritten as - - \d++foo - - Possessive quantifiers are always greedy; the setting of the - PCRE_UNGREEDY option is ignored. They are a convenient notation for the - simpler forms of atomic group. However, there is no difference in the - meaning or processing of a possessive quantifier and the equivalent - atomic group. - - The possessive quantifier syntax is an extension to the Perl syntax. It - originates in Sun's Java package. - - When a pattern contains an unlimited repeat inside a subpattern that - can itself be repeated an unlimited number of times, the use of an - atomic group is the only way to avoid some failing matches taking a - very long time indeed. The pattern - - (\D+|<\d+>)*[!?] - - matches an unlimited number of substrings that either consist of non- - digits, or digits enclosed in <>, followed by either ! or ?. When it - matches, it runs quickly. However, if it is applied to - - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - it takes a long time before reporting failure. This is because the - string can be divided between the internal \D+ repeat and the external - * repeat in a large number of ways, and all have to be tried. (The - example uses [!?] rather than a single character at the end, because - both PCRE and Perl have an optimization that allows for fast failure - when a single character is used. They remember the last single charac- - ter that is required for a match, and fail early if it is not present - in the string.) If the pattern is changed so that it uses an atomic - group, like this: - - ((?>\D+)|<\d+>)*[!?] - - sequences of non-digits cannot be broken, and failure happens quickly. - - -BACK REFERENCES - - Outside a character class, a backslash followed by a digit greater than - 0 (and possibly further digits) is a back reference to a capturing sub- - pattern earlier (that is, to its left) in the pattern, provided there - have been that many previous capturing left parentheses. - - However, if the decimal number following the backslash is less than 10, - it is always taken as a back reference, and causes an error only if - there are not that many capturing left parentheses in the entire pat- - tern. In other words, the parentheses that are referenced need not be - to the left of the reference for numbers less than 10. See the subsec- - tion entitled "Non-printing characters" above for further details of - the handling of digits following a backslash. - - A back reference matches whatever actually matched the capturing sub- - pattern in the current subject string, rather than anything matching - the subpattern itself (see "Subpatterns as subroutines" below for a way - of doing that). So the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If caseful matching is in force at the - time of the back reference, the case of letters is relevant. For exam- - ple, - - ((?i)rah)\s+\1 - - matches "rah rah" and "RAH RAH", but not "RAH rah", even though the - original capturing subpattern is matched caselessly. - - Back references to named subpatterns use the Python syntax (?P=name). - We could rewrite the above example as follows: - - (?(?i)rah)\s+(?P=p1) - - There may be more than one back reference to the same subpattern. If a - subpattern has not actually been used in a particular match, any back - references to it always fail. For example, the pattern - - (a|(bc))\2 - - always fails if it starts to match "a" rather than "bc". Because there - may be many capturing parentheses in a pattern, all digits following - the backslash are taken as part of a potential back reference number. - If the pattern continues with a digit character, some delimiter must be - used to terminate the back reference. If the PCRE_EXTENDED option is - set, this can be whitespace. Otherwise an empty comment (see "Com- - ments" below) can be used. - - A back reference that occurs inside the parentheses to which it refers - fails when the subpattern is first used, so, for example, (a\1) never - matches. However, such references can be useful inside repeated sub- - patterns. For example, the pattern - - (a|b\1)+ - - matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- - ation of the subpattern, the back reference matches the character - string corresponding to the previous iteration. In order for this to - work, the pattern must be such that the first iteration does not need - to match the back reference. This can be done using alternation, as in - the example above, or by a quantifier with a minimum of zero. - - -ASSERTIONS - - An assertion is a test on the characters following or preceding the - current matching point that does not actually consume any characters. - The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are - described above. - - More complicated assertions are coded as subpatterns. There are two - kinds: those that look ahead of the current position in the subject - string, and those that look behind it. An assertion subpattern is - matched in the normal way, except that it does not cause the current - matching position to be changed. - - Assertion subpatterns are not capturing subpatterns, and may not be - repeated, because it makes no sense to assert the same thing several - times. If any kind of assertion contains capturing subpatterns within - it, these are counted for the purposes of numbering the capturing sub- - patterns in the whole pattern. However, substring capturing is carried - out only for positive assertions, because it does not make sense for - negative assertions. - - Lookahead assertions - - Lookahead assertions start with (?= for positive assertions and (?! for - negative assertions. For example, - - \w+(?=;) - - matches a word followed by a semicolon, but does not include the semi- - colon in the match, and - - foo(?!bar) - - matches any occurrence of "foo" that is not followed by "bar". Note - that the apparently similar pattern - - (?!foo)bar - - does not find an occurrence of "bar" that is preceded by something - other than "foo"; it finds any occurrence of "bar" whatsoever, because - the assertion (?!foo) is always true when the next three characters are - "bar". A lookbehind assertion is needed to achieve the other effect. - - If you want to force a matching failure at some point in a pattern, the - most convenient way to do it is with (?!) because an empty string - always matches, so an assertion that requires there not to be an empty - string must always fail. - - Lookbehind assertions - - Lookbehind assertions start with (?<= for positive assertions and (?.*)(?<=abcd) - - or, equivalently, using the possessive quantifier syntax, - - ^.*+(?<=abcd) - - there can be no backtracking for the .* item; it can match only the - entire string. The subsequent lookbehind assertion does a single test - on the last four characters. If it fails, the match fails immediately. - For long strings, this approach makes a significant difference to the - processing time. - - Using multiple assertions - - Several assertions (of any sort) may occur in succession. For example, - - (?<=\d{3})(?[^()]+) | (?p{$re}) )* \)}x; - - The (?p{...}) item interpolates Perl code at run time, and in this case - refers recursively to the pattern in which it appears. Obviously, PCRE - cannot support the interpolation of Perl code. Instead, it supports - some special syntax for recursion of the entire pattern, and also for - individual subpattern recursion. - - The special item that consists of (? followed by a number greater than - zero and a closing parenthesis is a recursive call of the subpattern of - the given number, provided that it occurs inside that subpattern. (If - not, it is a "subroutine" call, which is described in the next sec- - tion.) The special item (?R) is a recursive call of the entire regular - expression. - - For example, this PCRE pattern solves the nested parentheses problem - (assume the PCRE_EXTENDED option is set so that white space is - ignored): - - \( ( (?>[^()]+) | (?R) )* \) - - First it matches an opening parenthesis. Then it matches any number of - substrings which can either be a sequence of non-parentheses, or a - recursive match of the pattern itself (that is a correctly parenthe- - sized substring). Finally there is a closing parenthesis. - - If this were part of a larger pattern, you would not want to recurse - the entire pattern, so instead you could use this: - - ( \( ( (?>[^()]+) | (?1) )* \) ) - - We have put the pattern into parentheses, and caused the recursion to - refer to them instead of the whole pattern. In a larger pattern, keep- - ing track of parenthesis numbers can be tricky. It may be more conve- - nient to use named parentheses instead. For this, PCRE uses (?P>name), - which is an extension to the Python syntax that PCRE uses for named - parentheses (Perl does not provide named parentheses). We could rewrite - the above example as follows: - - (?P \( ( (?>[^()]+) | (?P>pn) )* \) ) - - This particular example pattern contains nested unlimited repeats, and - so the use of atomic grouping for matching strings of non-parentheses - is important when applying the pattern to strings that do not match. - For example, when this pattern is applied to - - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - - it yields "no match" quickly. However, if atomic grouping is not used, - the match runs for a very long time indeed because there are so many - different ways the + and * repeats can carve up the subject, and all - have to be tested before failure can be reported. - - At the end of a match, the values set for any capturing subpatterns are - those from the outermost level of the recursion at which the subpattern - value is set. If you want to obtain intermediate values, a callout - function can be used (see the next section and the pcrecallout documen- - tation). If the pattern above is matched against - - (ab(cd)ef) - - the value for the capturing parentheses is "ef", which is the last - value taken on at the top level. If additional parentheses are added, - giving - - \( ( ( (?>[^()]+) | (?R) )* ) \) - ^ ^ - ^ ^ - - the string they capture is "ab(cd)ef", the contents of the top level - parentheses. If there are more than 15 capturing parentheses in a pat- - tern, PCRE has to obtain extra memory to store data during a recursion, - which it does by using pcre_malloc, freeing it via pcre_free after- - wards. If no memory can be obtained, the match fails with the - PCRE_ERROR_NOMEMORY error. - - Do not confuse the (?R) item with the condition (R), which tests for - recursion. Consider this pattern, which matches text in angle brack- - ets, allowing for arbitrary nesting. Only digits are allowed in nested - brackets (that is, when recursing), whereas any characters are permit- - ted at the outer level. - - < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > - - In this pattern, (?(R) is the start of a conditional subpattern, with - two different alternatives for the recursive and non-recursive cases. - The (?R) item is the actual recursive call. - - -SUBPATTERNS AS SUBROUTINES - - If the syntax for a recursive subpattern reference (either by number or - by name) is used outside the parentheses to which it refers, it oper- - ates like a subroutine in a programming language. An earlier example - pointed out that the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If instead the pattern - - (sens|respons)e and (?1)ibility - - is used, it does match "sense and responsibility" as well as the other - two strings. Such references must, however, follow the subpattern to - which they refer. - - -CALLOUTS - - Perl has a feature whereby using the sequence (?{...}) causes arbitrary - Perl code to be obeyed in the middle of matching a regular expression. - This makes it possible, amongst other things, to extract different sub- - strings that match the same pair of parentheses when there is a repeti- - tion. - - PCRE provides a similar feature, but of course it cannot obey arbitrary - Perl code. The feature is called "callout". The caller of PCRE provides - an external function by putting its entry point in the global variable - pcre_callout. By default, this variable contains NULL, which disables - all calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. If you want to identify different - callout points, you can put a number less than 256 after the letter C. - The default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT flag is passed to pcre_compile(), callouts are - automatically installed before each item in the pattern. They are all - numbered 255. - - During matching, when PCRE reaches a callout point (and pcre_callout is - set), the external function is called. It is provided with the number - of the callout, the position in the pattern, and, optionally, one item - of data originally supplied by the caller of pcre_exec(). The callout - function may cause matching to proceed, to backtrack, or to fail alto- - gether. A complete description of the interface to the callout function - is given in the pcrecallout documentation. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PARTIAL MATCHING IN PCRE - - In normal use of PCRE, if the subject string that is passed to - pcre_exec() matches as far as it goes, but is too short to match the - entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances - where it might be helpful to distinguish this case from other cases in - which there is no match. - - Consider, for example, an application where a human is required to type - in data for a field with specific formatting requirements. An example - might be a date in the form ddmmmyy, defined by this pattern: - - ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$ - - If the application sees the user's keystrokes one by one, and can check - that what has been typed so far is potentially valid, it is able to - raise an error as soon as a mistake is made, possibly beeping and not - reflecting the character that has been typed. This immediate feedback - is likely to be a better user interface than a check that is delayed - until the entire string has been entered. - - PCRE supports the concept of partial matching by means of the PCRE_PAR- - TIAL option, which can be set when calling pcre_exec(). When this is - done, the return code PCRE_ERROR_NOMATCH is converted into - PCRE_ERROR_PARTIAL if at any time during the matching process the - entire subject string matched part of the pattern. No captured data is - set when this occurs. - - Using PCRE_PARTIAL disables one of PCRE's optimizations. PCRE remembers - the last literal byte in a pattern, and abandons matching immediately - if such a byte is not present in the subject string. This optimization - cannot be used for a subject string that might match only partially. - - -RESTRICTED PATTERNS FOR PCRE_PARTIAL - - Because of the way certain internal optimizations are implemented in - PCRE, the PCRE_PARTIAL option cannot be used with all patterns. - Repeated single characters such as - - a{2,4} - - and repeated single metasequences such as - - \d+ - - are not permitted if the maximum number of occurrences is greater than - one. Optional items such as \d? (where the maximum is one) are permit- - ted. Quantifiers with any values are permitted after parentheses, so - the invalid examples above can be coded thus: - - (a){2,4} - (\d)+ - - These constructions run more slowly, but for the kinds of application - that are envisaged for this facility, this is not felt to be a major - restriction. - - If PCRE_PARTIAL is set for a pattern that does not conform to the - restrictions, pcre_exec() returns the error code PCRE_ERROR_BADPARTIAL - (-13). - - -EXAMPLE OF PARTIAL MATCHING USING PCRETEST - - If the escape sequence \P is present in a pcretest data line, the - PCRE_PARTIAL flag is used for the match. Here is a run of pcretest that - uses the date example quoted above: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 25jun04P - 0: 25jun04 - 1: jun - data> 25dec3P - Partial match - data> 3juP - Partial match - data> 3jujP - No match - data> jP - No match - - The first data string is matched completely, so pcretest shows the - matched substrings. The remaining four strings do not match the com- - plete pattern, but the first two are partial matches. - -Last updated: 08 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SAVING AND RE-USING PRECOMPILED PCRE PATTERNS - - If you are running an application that uses a large number of regular - expression patterns, it may be useful to store them in a precompiled - form instead of having to compile them every time the application is - run. If you are not using any private character tables (see the - pcre_maketables() documentation), this is relatively straightforward. - If you are using private tables, it is a little bit more complicated. - - If you save compiled patterns to a file, you can copy them to a differ- - ent host and run them there. This works even if the new host has the - opposite endianness to the one on which the patterns were compiled. - There may be a small performance penalty, but it should be insignifi- - cant. - - -SAVING A COMPILED PATTERN - The value returned by pcre_compile() points to a single block of memory - that holds the compiled pattern and associated data. You can find the - length of this block in bytes by calling pcre_fullinfo() with an argu- - ment of PCRE_INFO_SIZE. You can then save the data in any appropriate - manner. Here is sample code that compiles a pattern and writes it to a - file. It assumes that the variable fd refers to a file that is open for - output: - - int erroroffset, rc, size; - char *error; - pcre *re; - - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } - - In this example, the bytes that comprise the compiled pattern are - copied exactly. Note that this is binary data that may contain any of - the 256 possible byte values. On systems that make a distinction - between binary and non-binary data, be sure that the file is opened for - binary output. - - If you want to write more than one pattern to a file, you will have to - devise a way of separating them. For binary data, preceding each pat- - tern with its length is probably the most straightforward approach. - Another possibility is to write out the data in hexadecimal instead of - binary, one pattern to a line. - - Saving compiled patterns in a file is only one possible way of storing - them for later use. They could equally well be saved in a database, or - in the memory of some daemon process that passes them via sockets to - the processes that want them. - - If the pattern has been studied, it is also possible to save the study - data in a similar way to the compiled pattern itself. When studying - generates additional information, pcre_study() returns a pointer to a - pcre_extra data block. Its format is defined in the section on matching - a pattern in the pcreapi documentation. The study_data field points to - the binary study data, and this is what you must save (not the - pcre_extra block itself). The length of the study data can be obtained - by calling pcre_fullinfo() with an argument of PCRE_INFO_STUDYSIZE. - Remember to check that pcre_study() did return a non-NULL value before - trying to save the study data. - - -RE-USING A PRECOMPILED PATTERN - - Re-using a precompiled pattern is straightforward. Having reloaded it - into main memory, you pass its pointer to pcre_exec() in the usual way. - This should work even on another host, and even if that host has the - opposite endianness to the one where the pattern was compiled. - - However, if you passed a pointer to custom character tables when the - pattern was compiled (the tableptr argument of pcre_compile()), you - must now pass a similar pointer to pcre_exec(), because the value saved - with the compiled pattern will obviously be nonsense. A field in a - pcre_extra() block is used to pass this data, as described in the sec- - tion on matching a pattern in the pcreapi documentation. - - If you did not provide custom character tables when the pattern was - compiled, the pointer in the compiled pattern is NULL, which causes - pcre_exec() to use PCRE's internal tables. Thus, you do not need to - take any special action at run time in this case. - - If you saved study data with the compiled pattern, you need to create - your own pcre_extra data block and set the study_data field to point to - the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA - bit in the flags field to indicate that study data is present. Then - pass the pcre_extra block to pcre_exec() in the usual way. - - -COMPATIBILITY WITH DIFFERENT PCRE RELEASES - - The layout of the control block that is at the start of the data that - makes up a compiled pattern was changed for release 5.0. If you have - any saved patterns that were compiled with previous releases (not a - facility that was previously advertised), you will have to recompile - them for release 5.0. However, from now on, it should be possible to - make changes in a compabible manner. - -Last updated: 10 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE PERFORMANCE - - Certain items that may appear in regular expression patterns are more - efficient than others. It is more efficient to use a character class - like [aeiou] than a set of alternatives such as (a|e|i|o|u). In gen- - eral, the simplest construction that provides the required behaviour is - usually the most efficient. Jeffrey Friedl's book contains a lot of - useful general discussion about optimizing regular expressions for - efficient performance. This document contains a few observations about - PCRE. - - Using Unicode character properties (the \p, \P, and \X escapes) is - slow, because PCRE has to scan a structure that contains data for over - fifteen thousand characters whenever it needs a character's property. - If you can find an alternative pattern that does not use character - properties, it will probably be faster. - - When a pattern begins with .* not in parentheses, or in parentheses - that are not the subject of a backreference, and the PCRE_DOTALL option - is set, the pattern is implicitly anchored by PCRE, since it can match - only at the start of a subject string. However, if PCRE_DOTALL is not - set, PCRE cannot make this optimization, because the . metacharacter - does not then match a newline, and if the subject string contains new- - lines, the pattern may match from the character immediately following - one of them instead of from the very start. For example, the pattern - - .*second - - matches the subject "first\nand second" (where \n stands for a newline - character), with the match starting at the seventh character. In order - to do this, PCRE has to retry the match starting after every newline in - the subject. - - If you are using such a pattern with subject strings that do not con- - tain newlines, the best performance is obtained by setting PCRE_DOTALL, - or starting the pattern with ^.* to indicate explicit anchoring. That - saves PCRE from having to scan along the subject looking for a newline - to restart at. - - Beware of patterns that contain nested indefinite repeats. These can - take a long time to run when applied to a string that does not match. - Consider the pattern fragment - - (a+)* - - This can match "aaaa" in 33 different ways, and this number increases - very rapidly as the string gets longer. (The * repeat can match 0, 1, - 2, 3, or 4 times, and for each of those cases other than 0, the + - repeats can match different numbers of times.) When the remainder of - the pattern is such that the entire match is going to fail, PCRE has in - principle to try every possible variation, and this can take an - extremely long time. - - An optimization catches some of the more simple cases such as - - (a+)*b - - where a literal character follows. Before embarking on the standard - matching procedure, PCRE checks that there is a "b" later in the - subject string, and if there is not, it fails the match immediately. - However, when there is no following literal this optimization cannot be - used. You can see the difference by comparing the behaviour of - - (a+)*\d - - with the pattern above. The former gives a failure almost instantly - when applied to a whole line of "a" characters, whereas the latter - takes an appreciable time with strings longer than about 20 characters. - - In many cases, the solution to this kind of performance issue is to use - an atomic group or a possessive quantifier. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS OF POSIX API - - #include - - int regcomp(regex_t *preg, const char *pattern, - int cflags); - - int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); - - void regfree(regex_t *preg); - - -DESCRIPTION - - This set of functions provides a POSIX-style API to the PCRE regular - expression package. See the pcreapi documentation for a description of - PCRE's native API, which contains additional functionality. - - The functions described here are just wrapper functions that ultimately - call the PCRE native API. Their prototypes are defined in the - pcreposix.h header file, and on Unix systems the library itself is - called pcreposix.a, so can be accessed by adding -lpcreposix to the - command for linking an application that uses them. Because the POSIX - functions call the native ones, it is also necessary to add -lpcre. - - I have implemented only those option bits that can be reasonably mapped - to PCRE native options. In addition, the options REG_EXTENDED and - REG_NOSUB are defined with the value zero. They have no effect, but - since programs that are written to the POSIX interface often use them, - this makes it easier to slot in PCRE as a replacement library. Other - POSIX options are not even defined. - - When PCRE is called via these functions, it is only the API that is - POSIX-like in style. The syntax and semantics of the regular expres- - sions themselves are still those of Perl, subject to the setting of - various PCRE options, as described below. "POSIX-like in style" means - that the API approximates to the POSIX definition; it is not fully - POSIX-compatible, and in multi-byte encoding domains it is probably - even less compatible. - - The header for these functions is supplied as pcreposix.h to avoid any - potential clash with other POSIX libraries. It can, of course, be - renamed or aliased as regex.h, which is the "correct" name. It provides - two structure types, regex_t for compiled internal forms, and reg- - match_t for returning captured substrings. It also defines some con- - stants whose names start with "REG_"; these are used for setting - options and identifying error codes. - - -COMPILING A PATTERN - - The function regcomp() is called to compile a pattern into an internal - form. The pattern is a C string terminated by a binary zero, and is - passed in the argument pattern. The preg argument is a pointer to a - regex_t structure that is used as a base for storing information about - the compiled expression. - - The argument cflags is either zero, or contains one or more of the bits - defined by the following macros: - - REG_ICASE - - The PCRE_CASELESS option is set when the expression is passed for com- - pilation to the native function. - - REG_NEWLINE - - The PCRE_MULTILINE option is set when the expression is passed for com- - pilation to the native function. Note that this does not mimic the - defined POSIX behaviour for REG_NEWLINE (see the following section). - - In the absence of these flags, no options are passed to the native - function. This means the the regex is compiled with PCRE default - semantics. In particular, the way it handles newline characters in the - subject string is the Perl way, not the POSIX way. Note that setting - PCRE_MULTILINE has only some of the effects specified for REG_NEWLINE. - It does not affect the way newlines are matched by . (they aren't) or - by a negative class such as [^a] (they are). - - The yield of regcomp() is zero on success, and non-zero otherwise. The - preg structure is filled in on success, and one member of the structure - is public: re_nsub contains the number of capturing subpatterns in the - regular expression. Various error codes are defined in the header file. - - -MATCHING NEWLINE CHARACTERS - - This area is not simple, because POSIX and Perl take different views of - things. It is not possible to get PCRE to obey POSIX semantics, but - then PCRE was never intended to be a POSIX engine. The following table - lists the different possibilities for matching newline characters in - PCRE: - - Default Change with - - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \n at end yes PCRE_DOLLARENDONLY - $ matches \n in middle no PCRE_MULTILINE - ^ matches \n in middle no PCRE_MULTILINE - - This is the equivalent table for POSIX: - - Default Change with - - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \n at end no REG_NEWLINE - $ matches \n in middle no REG_NEWLINE - ^ matches \n in middle no REG_NEWLINE - - PCRE's behaviour is the same as Perl's, except that there is no equiva- - lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is - no way to stop newline from matching [^a]. - - The default POSIX newline handling can be obtained by setting - PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE - behave exactly as for the REG_NEWLINE action. - - -MATCHING A PATTERN - - The function regexec() is called to match a compiled pattern preg - against a given string, which is terminated by a zero byte, subject to - the options in eflags. These can be: - - REG_NOTBOL - - The PCRE_NOTBOL option is set when calling the underlying PCRE matching - function. - - REG_NOTEOL - - The PCRE_NOTEOL option is set when calling the underlying PCRE matching - function. - - The portion of the string that was matched, and also any captured sub- - strings, are returned via the pmatch argument, which points to an array - of nmatch structures of type regmatch_t, containing the members rm_so - and rm_eo. These contain the offset to the first character of each sub- - string and the offset to the first character after the end of each sub- - string, respectively. The 0th element of the vector relates to the - entire portion of string that was matched; subsequent elements relate - to the capturing subpatterns of the regular expression. Unused entries - in the array have both structure members set to -1. - - A successful match yields a zero return; various error codes are - defined in the header file, of which REG_NOMATCH is the "expected" - failure code. - - -ERROR MESSAGES - - The regerror() function maps a non-zero errorcode from either regcomp() - or regexec() to a printable message. If preg is not NULL, the error - should have arisen from the use of that structure. A message terminated - by a binary zero is placed in errbuf. The length of the message, - including the zero, is limited to errbuf_size. The yield of the func- - tion is the size of buffer needed to hold the whole message. - - -MEMORY USAGE - - Compiling a regular expression causes memory to be allocated and asso- - ciated with the preg structure. The function regfree() frees all such - memory, after which preg may no longer be used as a compiled expres- - sion. - - -AUTHOR - - Philip Hazel - University Computing Service, - Cambridge CB2 3QG, England. - -Last updated: 07 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - -PCRE(3) PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE SAMPLE PROGRAM - - A simple, complete demonstration program, to get you started with using - PCRE, is supplied in the file pcredemo.c in the PCRE distribution. - - The program compiles the regular expression that is its first argument, - and matches it against the subject string in its second argument. No - PCRE options are set, and default character tables are used. If match- - ing succeeds, the program outputs the portion of the subject that - matched, together with the contents of any captured substrings. - - If the -g option is given on the command line, the program then goes on - to check for further matches of the same regular expression in the same - subject string. The logic is a little bit tricky because of the possi- - bility of matching an empty string. Comments in the code explain what - is going on. - - If PCRE is installed in the standard include and library directories - for your system, you should be able to compile the demonstration pro- - gram using this command: - - gcc -o pcredemo pcredemo.c -lpcre - - If PCRE is installed elsewhere, you may need to add additional options - to the command line. For example, on a Unix-like system that has PCRE - installed in /usr/local, you can compile the demonstration program - using a command like this: - - gcc -o pcredemo -I/usr/local/include pcredemo.c \ - -L/usr/local/lib -lpcre - - Once you have compiled the demonstration program, you can run simple - tests like this: - - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' - - Note that there is a much more comprehensive test program, called - pcretest, which supports many more facilities for testing regular - expressions and the PCRE library. The pcredemo program is provided as a - simple coding example. - - On some operating systems (e.g. Solaris), when PCRE is not installed in - the standard library directory, you may get an error like this when you - try to run pcredemo: - - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or - directory - - This is caused by the way shared library support works on those sys- - tems. You need to add - - -R/usr/local/lib - - (for example) to the compile command to get round this problem. - -Last updated: 09 September 2004 -Copyright (c) 1997-2004 University of Cambridge. ------------------------------------------------------------------------------ - diff --git a/vendor/cegui-0.4.0-custom/src/pcre/get.c b/vendor/cegui-0.4.0-custom/src/pcre/get.c deleted file mode 100644 index 225843e2e2..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/get.c +++ /dev/null @@ -1,357 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* -This is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. See -the file Tech.Notes for some information on the internals. - -Written by: Philip Hazel - - Copyright (c) 1997-2003 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* This module contains some convenience functions for extracting substrings -from the subject string after a regex match has succeeded. The original idea -for these functions came from Scott Wimer. */ - - -/* Include the internals header, which itself includes Standard C headers plus -the external pcre header. */ - -#include "internal.h" - - -/************************************************* -* Find number for named string * -*************************************************/ - -/* This function is used by the two extraction functions below, as well -as being generally available. - -Arguments: - code the compiled regex - stringname the name whose number is required - -Returns: the number of the named parentheses, or a negative number - (PCRE_ERROR_NOSUBSTRING) if not found -*/ - -int -pcre_get_stringnumber(const pcre *code, const char *stringname) -{ -int rc; -int entrysize; -int top, bot; -uschar *nametable; - -if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) - return rc; -if (top <= 0) return PCRE_ERROR_NOSUBSTRING; - -if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) - return rc; -if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) - return rc; - -bot = 0; -while (top > bot) - { - int mid = (top + bot) / 2; - uschar *entry = nametable + entrysize*mid; - int c = strcmp(stringname, (char *)(entry + 2)); - if (c == 0) return (entry[0] << 8) + entry[1]; - if (c > 0) bot = mid + 1; else top = mid; - } - -return PCRE_ERROR_NOSUBSTRING; -} - - - -/************************************************* -* Copy captured string to given buffer * -*************************************************/ - -/* This function copies a single captured substring into a given buffer. -Note that we use memcpy() rather than strncpy() in case there are binary zeros -in the string. - -Arguments: - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - stringnumber the number of the required substring - buffer where to put the substring - size the size of the buffer - -Returns: if successful: - the length of the copied string, not including the zero - that is put on the end; can be zero - if not successful: - PCRE_ERROR_NOMEMORY (-6) buffer too small - PCRE_ERROR_NOSUBSTRING (-7) no such captured substring -*/ - -int -pcre_copy_substring(const char *subject, int *ovector, int stringcount, - int stringnumber, char *buffer, int size) -{ -int yield; -if (stringnumber < 0 || stringnumber >= stringcount) - return PCRE_ERROR_NOSUBSTRING; -stringnumber *= 2; -yield = ovector[stringnumber+1] - ovector[stringnumber]; -if (size < yield + 1) return PCRE_ERROR_NOMEMORY; -memcpy(buffer, subject + ovector[stringnumber], yield); -buffer[yield] = 0; -return yield; -} - - - -/************************************************* -* Copy named captured string to given buffer * -*************************************************/ - -/* This function copies a single captured substring into a given buffer, -identifying it by name. - -Arguments: - code the compiled regex - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - stringname the name of the required substring - buffer where to put the substring - size the size of the buffer - -Returns: if successful: - the length of the copied string, not including the zero - that is put on the end; can be zero - if not successful: - PCRE_ERROR_NOMEMORY (-6) buffer too small - PCRE_ERROR_NOSUBSTRING (-7) no such captured substring -*/ - -int -pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, - int stringcount, const char *stringname, char *buffer, int size) -{ -int n = pcre_get_stringnumber(code, stringname); -if (n <= 0) return n; -return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); -} - - - -/************************************************* -* Copy all captured strings to new store * -*************************************************/ - -/* This function gets one chunk of store and builds a list of pointers and all -of the captured substrings in it. A NULL pointer is put on the end of the list. - -Arguments: - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - listptr set to point to the list of pointers - -Returns: if successful: 0 - if not successful: - PCRE_ERROR_NOMEMORY (-6) failed to get store -*/ - -int -pcre_get_substring_list(const char *subject, int *ovector, int stringcount, - const char ***listptr) -{ -int i; -int size = sizeof(char *); -int double_count = stringcount * 2; -char **stringlist; -char *p; - -for (i = 0; i < double_count; i += 2) - size += sizeof(char *) + ovector[i+1] - ovector[i] + 1; - -stringlist = (char **)(pcre_malloc)(size); -if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; - -*listptr = (const char **)stringlist; -p = (char *)(stringlist + stringcount + 1); - -for (i = 0; i < double_count; i += 2) - { - int len = ovector[i+1] - ovector[i]; - memcpy(p, subject + ovector[i], len); - *stringlist++ = p; - p += len; - *p++ = 0; - } - -*stringlist = NULL; -return 0; -} - - - -/************************************************* -* Free store obtained by get_substring_list * -*************************************************/ - -/* This function exists for the benefit of people calling PCRE from non-C -programs that can call its functions, but not free() or (pcre_free)() directly. - -Argument: the result of a previous pcre_get_substring_list() -Returns: nothing -*/ - -void -pcre_free_substring_list(const char **pointer) -{ -(pcre_free)((void *)pointer); -} - - - -/************************************************* -* Copy captured string to new store * -*************************************************/ - -/* This function copies a single captured substring into a piece of new -store - -Arguments: - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - stringnumber the number of the required substring - stringptr where to put a pointer to the substring - -Returns: if successful: - the length of the string, not including the zero that - is put on the end; can be zero - if not successful: - PCRE_ERROR_NOMEMORY (-6) failed to get store - PCRE_ERROR_NOSUBSTRING (-7) substring not present -*/ - -int -pcre_get_substring(const char *subject, int *ovector, int stringcount, - int stringnumber, const char **stringptr) -{ -int yield; -char *substring; -if (stringnumber < 0 || stringnumber >= stringcount) - return PCRE_ERROR_NOSUBSTRING; -stringnumber *= 2; -yield = ovector[stringnumber+1] - ovector[stringnumber]; -substring = (char *)(pcre_malloc)(yield + 1); -if (substring == NULL) return PCRE_ERROR_NOMEMORY; -memcpy(substring, subject + ovector[stringnumber], yield); -substring[yield] = 0; -*stringptr = substring; -return yield; -} - - - -/************************************************* -* Copy named captured string to new store * -*************************************************/ - -/* This function copies a single captured substring, identified by name, into -new store. - -Arguments: - code the compiled regex - subject the subject string that was matched - ovector pointer to the offsets table - stringcount the number of substrings that were captured - (i.e. the yield of the pcre_exec call, unless - that was zero, in which case it should be 1/3 - of the offset table size) - stringname the name of the required substring - stringptr where to put the pointer - -Returns: if successful: - the length of the copied string, not including the zero - that is put on the end; can be zero - if not successful: - PCRE_ERROR_NOMEMORY (-6) couldn't get memory - PCRE_ERROR_NOSUBSTRING (-7) no such captured substring -*/ - -int -pcre_get_named_substring(const pcre *code, const char *subject, int *ovector, - int stringcount, const char *stringname, const char **stringptr) -{ -int n = pcre_get_stringnumber(code, stringname); -if (n <= 0) return n; -return pcre_get_substring(subject, ovector, stringcount, n, stringptr); -} - - - - -/************************************************* -* Free store obtained by get_substring * -*************************************************/ - -/* This function exists for the benefit of people calling PCRE from non-C -programs that can call its functions, but not free() or (pcre_free)() directly. - -Argument: the result of a previous pcre_get_substring() -Returns: nothing -*/ - -void -pcre_free_substring(const char *pointer) -{ -(pcre_free)((void *)pointer); -} - -/* End of get.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/internal.h b/vendor/cegui-0.4.0-custom/src/pcre/internal.h deleted file mode 100644 index b1cdfaf849..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/internal.h +++ /dev/null @@ -1,753 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - - -/* This is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. See -the file doc/Tech.Notes for some information on the internals. - -Written by: Philip Hazel - - Copyright (c) 1997-2004 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* This header contains definitions that are shared between the different -modules, but which are not relevant to the outside. */ - -/* Get the definitions provided by running "configure" */ - -#include "pcreconfig.h" - -/* Standard C headers plus the external interface definition. The only time -setjmp and stdarg are used is when NO_RECURSE is set. */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef PCRE_SPY -#define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */ -#endif - -/* We need to have types that specify unsigned 16-bit and 32-bit integers. We -cannot determine these outside the compilation (e.g. by running a program as -part of "configure") because PCRE is often cross-compiled for use on other -systems. Instead we make use of the maximum sizes that are available at -preprocessor time in standard C environments. */ - -#if USHRT_MAX == 65535 - typedef unsigned short pcre_uint16; -#elif UINT_MAX == 65535 - typedef unsigned int pcre_uint16; -#else - #error Cannot determine a type for 16-bit unsigned integers -#endif - -#if UINT_MAX == 4294967295 - typedef unsigned int pcre_uint32; -#elif ULONG_MAX == 4294967295 - typedef unsigned long int pcre_uint32; -#else - #error Cannot determine a type for 32-bit unsigned integers -#endif - -/* All character handling must be done as unsigned characters. Otherwise there -are problems with top-bit-set characters and functions such as isspace(). -However, we leave the interface to the outside world as char *, because that -should make things easier for callers. We define a short type for unsigned char -to save lots of typing. I tried "uchar", but it causes problems on Digital -Unix, where it is defined in sys/types, so use "uschar" instead. */ - -typedef unsigned char uschar; - -/* Include the public PCRE header */ - -#include "pcre.h" - -/* When compiling for use with the Virtual Pascal compiler, these functions -need to have their names changed. PCRE must be compiled with the -DVPCOMPAT -option on the command line. */ - -#ifdef VPCOMPAT -#define strncmp(s1,s2,m) _strncmp(s1,s2,m) -#define memcpy(d,s,n) _memcpy(d,s,n) -#define memmove(d,s,n) _memmove(d,s,n) -#define memset(s,c,n) _memset(s,c,n) -#else /* VPCOMPAT */ - -/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), -define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY -is set. Otherwise, include an emulating function for those systems that have -neither (there some non-Unix environments where this is the case). This assumes -that all calls to memmove are moving strings upwards in store, which is the -case in PCRE. */ - -#if ! HAVE_MEMMOVE -#undef memmove /* some systems may have a macro */ -#if HAVE_BCOPY -#define memmove(a, b, c) bcopy(b, a, c) -#else /* HAVE_BCOPY */ -void * -pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n) -{ -int i; -dest += n; -src += n; -for (i = 0; i < n; ++i) *(--dest) = *(--src); -return dest; -} -#define memmove(a, b, c) pcre_memmove(a, b, c) -#endif /* not HAVE_BCOPY */ -#endif /* not HAVE_MEMMOVE */ -#endif /* not VPCOMPAT */ - - -/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored -in big-endian order) by default. These are used, for example, to link from the -start of a subpattern to its alternatives and its end. The use of 2 bytes per -offset limits the size of the compiled regex to around 64K, which is big enough -for almost everybody. However, I received a request for an even bigger limit. -For this reason, and also to make the code easier to maintain, the storing and -loading of offsets from the byte string is now handled by the macros that are -defined here. - -The macros are controlled by the value of LINK_SIZE. This defaults to 2 in -the config.h file, but can be overridden by using -D on the command line. This -is automated on Unix systems via the "configure" command. */ - -#if LINK_SIZE == 2 - -#define PUT(a,n,d) \ - (a[n] = (d) >> 8), \ - (a[(n)+1] = (d) & 255) - -#define GET(a,n) \ - (((a)[n] << 8) | (a)[(n)+1]) - -#define MAX_PATTERN_SIZE (1 << 16) - - -#elif LINK_SIZE == 3 - -#define PUT(a,n,d) \ - (a[n] = (d) >> 16), \ - (a[(n)+1] = (d) >> 8), \ - (a[(n)+2] = (d) & 255) - -#define GET(a,n) \ - (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2]) - -#define MAX_PATTERN_SIZE (1 << 24) - - -#elif LINK_SIZE == 4 - -#define PUT(a,n,d) \ - (a[n] = (d) >> 24), \ - (a[(n)+1] = (d) >> 16), \ - (a[(n)+2] = (d) >> 8), \ - (a[(n)+3] = (d) & 255) - -#define GET(a,n) \ - (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3]) - -#define MAX_PATTERN_SIZE (1 << 30) /* Keep it positive */ - - -#else -#error LINK_SIZE must be either 2, 3, or 4 -#endif - - -/* Convenience macro defined in terms of the others */ - -#define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE - - -/* PCRE uses some other 2-byte quantities that do not change when the size of -offsets changes. There are used for repeat counts and for other things such as -capturing parenthesis numbers in back references. */ - -#define PUT2(a,n,d) \ - a[n] = (d) >> 8; \ - a[(n)+1] = (d) & 255 - -#define GET2(a,n) \ - (((a)[n] << 8) | (a)[(n)+1]) - -#define PUT2INC(a,n,d) PUT2(a,n,d), a += 2 - - -/* In case there is no definition of offsetof() provided - though any proper -Standard C system should have one. */ - -#ifndef offsetof -#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) -#endif - - -/* These are the public options that can change during matching. */ - -#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) - -/* Private options flags start at the most significant end of the four bytes, -but skip the top bit so we can use ints for convenience without getting tangled -with negative values. The public options defined in pcre.h start at the least -significant end. Make sure they don't overlap, though now that we have expanded -to four bytes, there is plenty of space. */ - -#define PCRE_FIRSTSET 0x40000000 /* first_byte is set */ -#define PCRE_REQCHSET 0x20000000 /* req_byte is set */ -#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ -#define PCRE_ICHANGED 0x08000000 /* i option changes within regex */ -#define PCRE_NOPARTIAL 0x04000000 /* can't use partial with this regex */ - -/* Options for the "extra" block produced by pcre_study(). */ - -#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ - -/* Masks for identifying the public options which are permitted at compile -time, run time or study time, respectively. */ - -#define PUBLIC_OPTIONS \ - (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ - PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ - PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT) - -#define PUBLIC_EXEC_OPTIONS \ - (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ - PCRE_PARTIAL) - -#define PUBLIC_STUDY_OPTIONS 0 /* None defined */ - -/* Magic number to provide a small check against being handed junk. */ - -#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ - -/* Negative values for the firstchar and reqchar variables */ - -#define REQ_UNSET (-2) -#define REQ_NONE (-1) - -/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a -variable-length repeat, or a anything other than literal characters. */ - -#define REQ_CASELESS 0x0100 /* indicates caselessness */ -#define REQ_VARY 0x0200 /* reqbyte followed non-literal item */ - -/* Miscellaneous definitions */ - -typedef int BOOL; - -#define FALSE 0 -#define TRUE 1 - -/* Escape items that are just an encoding of a particular data value. Note that -ESC_n is defined as yet another macro, which is set in config.h to either \n -(the default) or \r (which some people want). */ - -#ifndef ESC_e -#define ESC_e 27 -#endif - -#ifndef ESC_f -#define ESC_f '\f' -#endif - -#ifndef ESC_n -#define ESC_n NEWLINE -#endif - -#ifndef ESC_r -#define ESC_r '\r' -#endif - -/* We can't officially use ESC_t because it is a POSIX reserved identifier -(presumably because of all the others like size_t). */ - -#ifndef ESC_tee -#define ESC_tee '\t' -#endif - -/* These are escaped items that aren't just an encoding of a particular data -value such as \n. They must have non-zero values, as check_escape() returns -their negation. Also, they must appear in the same order as in the opcode -definitions below, up to ESC_z. There's a dummy for OP_ANY because it -corresponds to "." rather than an escape sequence. The final one must be -ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two -tests in the code for an escape greater than ESC_b and less than ESC_Z to -detect the types that may be repeated. These are the types that consume -characters. If any new escapes are put in between that don't consume a -character, that code will have to change. */ - -enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, - ESC_w, ESC_dum1, ESC_C, ESC_P, ESC_p, ESC_X, ESC_Z, ESC_z, ESC_E, - ESC_Q, ESC_REF }; - -/* Flag bits and data types for the extended class (OP_XCLASS) for classes that -contain UTF-8 characters with values greater than 255. */ - -#define XCL_NOT 0x01 /* Flag: this is a negative class */ -#define XCL_MAP 0x02 /* Flag: a 32-byte map is present */ - -#define XCL_END 0 /* Marks end of individual items */ -#define XCL_SINGLE 1 /* Single item (one multibyte char) follows */ -#define XCL_RANGE 2 /* A range (two multibyte chars) follows */ -#define XCL_PROP 3 /* Unicode property (one property code) follows */ -#define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */ - - -/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets -that extract substrings. Starting from 1 (i.e. after OP_END), the values up to -OP_EOD must correspond in order to the list of escapes immediately above. -Note that whenever this list is updated, the two macro definitions that follow -must also be updated to match. */ - -enum { - OP_END, /* 0 End of pattern */ - - /* Values corresponding to backslashed metacharacters */ - - OP_SOD, /* 1 Start of data: \A */ - OP_SOM, /* 2 Start of match (subject + offset): \G */ - OP_NOT_WORD_BOUNDARY, /* 3 \B */ - OP_WORD_BOUNDARY, /* 4 \b */ - OP_NOT_DIGIT, /* 5 \D */ - OP_DIGIT, /* 6 \d */ - OP_NOT_WHITESPACE, /* 7 \S */ - OP_WHITESPACE, /* 8 \s */ - OP_NOT_WORDCHAR, /* 9 \W */ - OP_WORDCHAR, /* 10 \w */ - OP_ANY, /* 11 Match any character */ - OP_ANYBYTE, /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */ - OP_NOTPROP, /* 13 \P (not Unicode property) */ - OP_PROP, /* 14 \p (Unicode property) */ - OP_EXTUNI, /* 15 \X (extended Unicode sequence */ - OP_EODN, /* 16 End of data or \n at end of data: \Z. */ - OP_EOD, /* 17 End of data: \z */ - - OP_OPT, /* 18 Set runtime options */ - OP_CIRC, /* 19 Start of line - varies with multiline switch */ - OP_DOLL, /* 20 End of line - varies with multiline switch */ - OP_CHAR, /* 21 Match one character, casefully */ - OP_CHARNC, /* 22 Match one character, caselessly */ - OP_NOT, /* 23 Match anything but the following char */ - - OP_STAR, /* 24 The maximizing and minimizing versions of */ - OP_MINSTAR, /* 25 all these opcodes must come in pairs, with */ - OP_PLUS, /* 26 the minimizing one second. */ - OP_MINPLUS, /* 27 This first set applies to single characters */ - OP_QUERY, /* 28 */ - OP_MINQUERY, /* 29 */ - OP_UPTO, /* 30 From 0 to n matches */ - OP_MINUPTO, /* 31 */ - OP_EXACT, /* 32 Exactly n matches */ - - OP_NOTSTAR, /* 33 The maximizing and minimizing versions of */ - OP_NOTMINSTAR, /* 34 all these opcodes must come in pairs, with */ - OP_NOTPLUS, /* 35 the minimizing one second. */ - OP_NOTMINPLUS, /* 36 This set applies to "not" single characters */ - OP_NOTQUERY, /* 37 */ - OP_NOTMINQUERY, /* 38 */ - OP_NOTUPTO, /* 39 From 0 to n matches */ - OP_NOTMINUPTO, /* 40 */ - OP_NOTEXACT, /* 41 Exactly n matches */ - - OP_TYPESTAR, /* 42 The maximizing and minimizing versions of */ - OP_TYPEMINSTAR, /* 43 all these opcodes must come in pairs, with */ - OP_TYPEPLUS, /* 44 the minimizing one second. These codes must */ - OP_TYPEMINPLUS, /* 45 be in exactly the same order as those above. */ - OP_TYPEQUERY, /* 46 This set applies to character types such as \d */ - OP_TYPEMINQUERY, /* 47 */ - OP_TYPEUPTO, /* 48 From 0 to n matches */ - OP_TYPEMINUPTO, /* 49 */ - OP_TYPEEXACT, /* 50 Exactly n matches */ - - OP_CRSTAR, /* 51 The maximizing and minimizing versions of */ - OP_CRMINSTAR, /* 52 all these opcodes must come in pairs, with */ - OP_CRPLUS, /* 53 the minimizing one second. These codes must */ - OP_CRMINPLUS, /* 54 be in exactly the same order as those above. */ - OP_CRQUERY, /* 55 These are for character classes and back refs */ - OP_CRMINQUERY, /* 56 */ - OP_CRRANGE, /* 57 These are different to the three sets above. */ - OP_CRMINRANGE, /* 58 */ - - OP_CLASS, /* 59 Match a character class, chars < 256 only */ - OP_NCLASS, /* 60 Same, but the bitmap was created from a negative - class - the difference is relevant only when a UTF-8 - character > 255 is encountered. */ - - OP_XCLASS, /* 61 Extended class for handling UTF-8 chars within the - class. This does both positive and negative. */ - - OP_REF, /* 62 Match a back reference */ - OP_RECURSE, /* 63 Match a numbered subpattern (possibly recursive) */ - OP_CALLOUT, /* 64 Call out to external function if provided */ - - OP_ALT, /* 65 Start of alternation */ - OP_KET, /* 66 End of group that doesn't have an unbounded repeat */ - OP_KETRMAX, /* 67 These two must remain together and in this */ - OP_KETRMIN, /* 68 order. They are for groups the repeat for ever. */ - - /* The assertions must come before ONCE and COND */ - - OP_ASSERT, /* 69 Positive lookahead */ - OP_ASSERT_NOT, /* 70 Negative lookahead */ - OP_ASSERTBACK, /* 71 Positive lookbehind */ - OP_ASSERTBACK_NOT, /* 72 Negative lookbehind */ - OP_REVERSE, /* 73 Move pointer back - used in lookbehind assertions */ - - /* ONCE and COND must come after the assertions, with ONCE first, as there's - a test for >= ONCE for a subpattern that isn't an assertion. */ - - OP_ONCE, /* 74 Once matched, don't back up into the subpattern */ - OP_COND, /* 75 Conditional group */ - OP_CREF, /* 76 Used to hold an extraction string number (cond ref) */ - - OP_BRAZERO, /* 77 These two must remain together and in this */ - OP_BRAMINZERO, /* 78 order. */ - - OP_BRANUMBER, /* 79 Used for extracting brackets whose number is greater - than can fit into an opcode. */ - - OP_BRA /* 80 This and greater values are used for brackets that - extract substrings up to EXTRACT_BASIC_MAX. After - that, use is made of OP_BRANUMBER. */ -}; - -/* WARNING WARNING WARNING: There is an implicit assumption in pcre.c and -study.c that all opcodes are less than 128 in value. This makes handling UTF-8 -character sequences easier. */ - -/* The highest extraction number before we have to start using additional -bytes. (Originally PCRE didn't have support for extraction counts highter than -this number.) The value is limited by the number of opcodes left after OP_BRA, -i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional -opcodes. */ - -#define EXTRACT_BASIC_MAX 100 - - -/* This macro defines textual names for all the opcodes. There are used only -for debugging, in pcre.c when DEBUG is defined, and also in pcretest.c. The -macro is referenced only in printint.c. */ - -#define OP_NAME_LIST \ - "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d", \ - "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", \ - "notprop", "prop", "extuni", \ - "\\Z", "\\z", \ - "Opt", "^", "$", "char", "charnc", "not", \ - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ - "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ - "*", "*?", "+", "+?", "?", "??", "{", "{", \ - "class", "nclass", "xclass", "Ref", "Recurse", "Callout", \ - "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \ - "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cond ref",\ - "Brazero", "Braminzero", "Branumber", "Bra" - - -/* This macro defines the length of fixed length operations in the compiled -regex. The lengths are used when searching for specific things, and also in the -debugging printing of a compiled regex. We use a macro so that it can be -incorporated both into pcre.c and pcretest.c without being publicly exposed. - -As things have been extended, some of these are no longer fixed lenths, but are -minima instead. For example, the length of a single-character repeat may vary -in UTF-8 mode. The code that uses this table must know about such things. */ - -#define OP_LENGTHS \ - 1, /* End */ \ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \ - 1, 1, /* Any, Anybyte */ \ - 2, 2, 1, /* NOTPROP, PROP, EXTUNI */ \ - 1, 1, 2, 1, 1, /* \Z, \z, Opt, ^, $ */ \ - 2, /* Char - the minimum length */ \ - 2, /* Charnc - the minimum length */ \ - 2, /* not */ \ - /* Positive single-char repeats ** These are */ \ - 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \ - 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \ - /* Negative single-char repeats - only for chars < 256 */ \ - 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ - 4, 4, 4, /* NOT upto, minupto, exact */ \ - /* Positive type repeats */ \ - 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \ - 4, 4, 4, /* Type upto, minupto, exact */ \ - /* Character class & ref repeats */ \ - 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ - 5, 5, /* CRRANGE, CRMINRANGE */ \ - 33, /* CLASS */ \ - 33, /* NCLASS */ \ - 0, /* XCLASS - variable length */ \ - 3, /* REF */ \ - 1+LINK_SIZE, /* RECURSE */ \ - 2+2*LINK_SIZE, /* CALLOUT */ \ - 1+LINK_SIZE, /* Alt */ \ - 1+LINK_SIZE, /* Ket */ \ - 1+LINK_SIZE, /* KetRmax */ \ - 1+LINK_SIZE, /* KetRmin */ \ - 1+LINK_SIZE, /* Assert */ \ - 1+LINK_SIZE, /* Assert not */ \ - 1+LINK_SIZE, /* Assert behind */ \ - 1+LINK_SIZE, /* Assert behind not */ \ - 1+LINK_SIZE, /* Reverse */ \ - 1+LINK_SIZE, /* Once */ \ - 1+LINK_SIZE, /* COND */ \ - 3, /* CREF */ \ - 1, 1, /* BRAZERO, BRAMINZERO */ \ - 3, /* BRANUMBER */ \ - 1+LINK_SIZE /* BRA */ \ - - -/* A magic value for OP_CREF to indicate the "in recursion" condition. */ - -#define CREF_RECURSE 0xffff - -/* The texts of compile-time error messages are defined as macros here so that -they can be accessed by the POSIX wrapper and converted into error codes. Yes, -I could have used error codes in the first place, but didn't feel like changing -just to accommodate the POSIX wrapper. */ - -#define ERR1 "\\ at end of pattern" -#define ERR2 "\\c at end of pattern" -#define ERR3 "unrecognized character follows \\" -#define ERR4 "numbers out of order in {} quantifier" -#define ERR5 "number too big in {} quantifier" -#define ERR6 "missing terminating ] for character class" -#define ERR7 "invalid escape sequence in character class" -#define ERR8 "range out of order in character class" -#define ERR9 "nothing to repeat" -#define ERR10 "operand of unlimited repeat could match the empty string" -#define ERR11 "internal error: unexpected repeat" -#define ERR12 "unrecognized character after (?" -#define ERR13 "POSIX named classes are supported only within a class" -#define ERR14 "missing )" -#define ERR15 "reference to non-existent subpattern" -#define ERR16 "erroffset passed as NULL" -#define ERR17 "unknown option bit(s) set" -#define ERR18 "missing ) after comment" -#define ERR19 "parentheses nested too deeply" -#define ERR20 "regular expression too large" -#define ERR21 "failed to get memory" -#define ERR22 "unmatched parentheses" -#define ERR23 "internal error: code overflow" -#define ERR24 "unrecognized character after (?<" -#define ERR25 "lookbehind assertion is not fixed length" -#define ERR26 "malformed number after (?(" -#define ERR27 "conditional group contains more than two branches" -#define ERR28 "assertion expected after (?(" -#define ERR29 "(?R or (?digits must be followed by )" -#define ERR30 "unknown POSIX class name" -#define ERR31 "POSIX collating elements are not supported" -#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support" -#define ERR33 "spare error" -#define ERR34 "character value in \\x{...} sequence is too large" -#define ERR35 "invalid condition (?(0)" -#define ERR36 "\\C not allowed in lookbehind assertion" -#define ERR37 "PCRE does not support \\L, \\l, \\N, \\U, or \\u" -#define ERR38 "number after (?C is > 255" -#define ERR39 "closing ) for (?C expected" -#define ERR40 "recursive call could loop indefinitely" -#define ERR41 "unrecognized character after (?P" -#define ERR42 "syntax error after (?P" -#define ERR43 "two named groups have the same name" -#define ERR44 "invalid UTF-8 string" -#define ERR45 "support for \\P, \\p, and \\X has not been compiled" -#define ERR46 "malformed \\P or \\p sequence" -#define ERR47 "unknown property name after \\P or \\p" - -/* The real format of the start of the pcre block; the index of names and the -code vector run on as long as necessary after the end. We store an explicit -offset to the name table so that if a regex is compiled on one host, saved, and -then run on another where the size of pointers is different, all might still -be well. For the case of compiled-on-4 and run-on-8, we include an extra -pointer that is always NULL. For future-proofing, we also include a few dummy -fields - even though you can never get this planning right! - -NOTE NOTE NOTE: -Because people can now save and re-use compiled patterns, any additions to this -structure should be made at the end, and something earlier (e.g. a new -flag in the options or one of the dummy fields) should indicate that the new -fields are present. Currently PCRE always sets the dummy fields to zero. -NOTE NOTE NOTE: -*/ - -typedef struct real_pcre { - pcre_uint32 magic_number; - pcre_uint32 size; /* Total that was malloced */ - pcre_uint32 options; - pcre_uint32 dummy1; /* For future use, maybe */ - - pcre_uint16 top_bracket; - pcre_uint16 top_backref; - pcre_uint16 first_byte; - pcre_uint16 req_byte; - pcre_uint16 name_table_offset; /* Offset to name table that follows */ - pcre_uint16 name_entry_size; /* Size of any name items */ - pcre_uint16 name_count; /* Number of name items */ - pcre_uint16 dummy2; /* For future use, maybe */ - - const unsigned char *tables; /* Pointer to tables or NULL for std */ - const unsigned char *nullpad; /* NULL padding */ -} real_pcre; - -/* The format of the block used to store data from pcre_study(). The same -remark (see NOTE above) about extending this structure applies. */ - -typedef struct pcre_study_data { - pcre_uint32 size; /* Total that was malloced */ - pcre_uint32 options; - uschar start_bits[32]; -} pcre_study_data; - -/* Structure for passing "static" information around between the functions -doing the compiling, so that they are thread-safe. */ - -typedef struct compile_data { - const uschar *lcc; /* Points to lower casing table */ - const uschar *fcc; /* Points to case-flipping table */ - const uschar *cbits; /* Points to character type table */ - const uschar *ctypes; /* Points to table of type maps */ - const uschar *start_code; /* The start of the compiled code */ - const uschar *start_pattern; /* The start of the pattern */ - uschar *name_table; /* The name/number table */ - int names_found; /* Number of entries so far */ - int name_entry_size; /* Size of each entry */ - int top_backref; /* Maximum back reference */ - unsigned int backref_map; /* Bitmap of low back refs */ - int req_varyopt; /* "After variable item" flag for reqbyte */ - BOOL nopartial; /* Set TRUE if partial won't work */ -} compile_data; - -/* Structure for maintaining a chain of pointers to the currently incomplete -branches, for testing for left recursion. */ - -typedef struct branch_chain { - struct branch_chain *outer; - uschar *current; -} branch_chain; - -/* Structure for items in a linked list that represents an explicit recursive -call within the pattern. */ - -typedef struct recursion_info { - struct recursion_info *prevrec; /* Previous recursion record (or NULL) */ - int group_num; /* Number of group that was called */ - const uschar *after_call; /* "Return value": points after the call in the expr */ - const uschar *save_start; /* Old value of md->start_match */ - int *offset_save; /* Pointer to start of saved offsets */ - int saved_max; /* Number of saved offsets */ -} recursion_info; - -/* When compiling in a mode that doesn't use recursive calls to match(), -a structure is used to remember local variables on the heap. It is defined in -pcre.c, close to the match() function, so that it is easy to keep it in step -with any changes of local variable. However, the pointer to the current frame -must be saved in some "static" place over a longjmp(). We declare the -structure here so that we can put a pointer in the match_data structure. -NOTE: This isn't used for a "normal" compilation of pcre. */ - -struct heapframe; - -/* Structure for passing "static" information around between the functions -doing the matching, so that they are thread-safe. */ - -typedef struct match_data { - unsigned long int match_call_count; /* As it says */ - unsigned long int match_limit;/* As it says */ - int *offset_vector; /* Offset vector */ - int offset_end; /* One past the end */ - int offset_max; /* The maximum usable for return data */ - const uschar *lcc; /* Points to lower casing table */ - const uschar *ctypes; /* Points to table of type maps */ - BOOL offset_overflow; /* Set if too many extractions */ - BOOL notbol; /* NOTBOL flag */ - BOOL noteol; /* NOTEOL flag */ - BOOL utf8; /* UTF8 flag */ - BOOL endonly; /* Dollar not before final \n */ - BOOL notempty; /* Empty string match not wanted */ - BOOL partial; /* PARTIAL flag */ - BOOL hitend; /* Hit the end of the subject at some point */ - const uschar *start_code; /* For use when recursing */ - const uschar *start_subject; /* Start of the subject string */ - const uschar *end_subject; /* End of the subject string */ - const uschar *start_match; /* Start of this match attempt */ - const uschar *end_match_ptr; /* Subject position at end match */ - int end_offset_top; /* Highwater mark at end of match */ - int capture_last; /* Most recent capture number */ - int start_offset; /* The start offset value */ - recursion_info *recursive; /* Linked list of recursion data */ - void *callout_data; /* To pass back to callouts */ - struct heapframe *thisframe; /* Used only when compiling for no recursion */ -} match_data; - -/* Bit definitions for entries in the pcre_ctypes table. */ - -#define ctype_space 0x01 -#define ctype_letter 0x02 -#define ctype_digit 0x04 -#define ctype_xdigit 0x08 -#define ctype_word 0x10 /* alphameric or '_' */ -#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ - -/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set -of bits for a class map. Some classes are built by combining these tables. */ - -#define cbit_space 0 /* [:space:] or \s */ -#define cbit_xdigit 32 /* [:xdigit:] */ -#define cbit_digit 64 /* [:digit:] or \d */ -#define cbit_upper 96 /* [:upper:] */ -#define cbit_lower 128 /* [:lower:] */ -#define cbit_word 160 /* [:word:] or \w */ -#define cbit_graph 192 /* [:graph:] */ -#define cbit_print 224 /* [:print:] */ -#define cbit_punct 256 /* [:punct:] */ -#define cbit_cntrl 288 /* [:cntrl:] */ -#define cbit_length 320 /* Length of the cbits table */ - -/* Offsets of the various tables from the base tables pointer, and -total length. */ - -#define lcc_offset 0 -#define fcc_offset 256 -#define cbits_offset 512 -#define ctypes_offset (cbits_offset + cbit_length) -#define tables_length (ctypes_offset + 256) - -/* End of internal.h */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/maketables.c b/vendor/cegui-0.4.0-custom/src/pcre/maketables.c deleted file mode 100644 index f1c7b9a5c4..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/maketables.c +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - -Written by: Philip Hazel - - Copyright (c) 1997-2003 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - - -/* This file is compiled on its own as part of the PCRE library. However, -it is also included in the compilation of dftables.c, in which case the macro -DFTABLES is defined. */ - -#ifndef DFTABLES -#include "internal.h" -#endif - - - -/************************************************* -* Create PCRE character tables * -*************************************************/ - -/* This function builds a set of character tables for use by PCRE and returns -a pointer to them. They are build using the ctype functions, and consequently -their contents will depend upon the current locale setting. When compiled as -part of the library, the store is obtained via pcre_malloc(), but when compiled -inside dftables, use malloc(). - -Arguments: none -Returns: pointer to the contiguous block of data -*/ - -const unsigned char * -pcre_maketables(void) -{ -unsigned char *yield, *p; -int i; - -#ifndef DFTABLES -yield = (unsigned char*)(pcre_malloc)(tables_length); -#else -yield = (unsigned char*)malloc(tables_length); -#endif - -if (yield == NULL) return NULL; -p = yield; - -/* First comes the lower casing table */ - -for (i = 0; i < 256; i++) *p++ = tolower(i); - -/* Next the case-flipping table */ - -for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); - -/* Then the character class tables. Don't try to be clever and save effort -on exclusive ones - in some locales things may be different. Note that the -table for "space" includes everything "isspace" gives, including VT in the -default locale. This makes it work for the POSIX class [:space:]. */ - -memset(p, 0, cbit_length); -for (i = 0; i < 256; i++) - { - if (isdigit(i)) - { - p[cbit_digit + i/8] |= 1 << (i&7); - p[cbit_word + i/8] |= 1 << (i&7); - } - if (isupper(i)) - { - p[cbit_upper + i/8] |= 1 << (i&7); - p[cbit_word + i/8] |= 1 << (i&7); - } - if (islower(i)) - { - p[cbit_lower + i/8] |= 1 << (i&7); - p[cbit_word + i/8] |= 1 << (i&7); - } - if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); - if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); - if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); - if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); - if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); - if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); - if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); - } -p += cbit_length; - -/* Finally, the character type table. In this, we exclude VT from the white -space chars, because Perl doesn't recognize it as such for \s and for comments -within regexes. */ - -for (i = 0; i < 256; i++) - { - int x = 0; - if (i != 0x0b && isspace(i)) x += ctype_space; - if (isalpha(i)) x += ctype_letter; - if (isdigit(i)) x += ctype_digit; - if (isxdigit(i)) x += ctype_xdigit; - if (isalnum(i) || i == '_') x += ctype_word; - - /* Note: strchr includes the terminating zero in the characters it considers. - In this instance, that is ok because we want binary zero to be flagged as a - meta-character, which in this sense is any character that terminates a run - of data characters. */ - - if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; *p++ = x; } - -return yield; -} - -/* End of maketables.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/pcre.c b/vendor/cegui-0.4.0-custom/src/pcre/pcre.c deleted file mode 100644 index a398c51b8f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/pcre.c +++ /dev/null @@ -1,9195 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* -This is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. See -the file Tech.Notes for some information on the internals. - -Written by: Philip Hazel - - Copyright (c) 1997-2004 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -#undef DEBUG // DEBUG will not work due to missing files - -/* Define DEBUG to get debugging output on stdout. */ -/* #define DEBUG */ - -/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef -inline, and there are *still* stupid compilers about that don't like indented -pre-processor statements. I suppose it's only been 10 years... */ - -#ifdef DEBUG -#define DPRINTF(p) printf p -#else -#define DPRINTF(p) /*nothing*/ -#endif - -/* Include the internals header, which itself includes "config.h", the Standard -C headers, and the external pcre header. */ - -#include "internal.h" - -/* If Unicode Property support is wanted, include a private copy of the -function that does it, and the table that translates names to numbers. */ - -#ifdef SUPPORT_UCP -#include "ucp.c" -#include "ucptypetable.c" -#endif - -/* Maximum number of items on the nested bracket stacks at compile time. This -applies to the nesting of all kinds of parentheses. It does not limit -un-nested, non-capturing parentheses. This number can be made bigger if -necessary - it is used to dimension one int and one unsigned char vector at -compile time. */ - -#define BRASTACK_SIZE 200 - - -/* Maximum number of ints of offset to save on the stack for recursive calls. -If the offset vector is bigger, malloc is used. This should be a multiple of 3, -because the offset vector is always a multiple of 3 long. */ - -#define REC_STACK_SAVE_MAX 30 - - -/* The maximum remaining length of subject we are prepared to search for a -req_byte match. */ - -#define REQ_BYTE_MAX 1000 - - -/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that -the definition is next to the definition of the opcodes in internal.h. */ - -static const uschar OP_lengths[] = { OP_LENGTHS }; - -/* Min and max values for the common repeats; for the maxima, 0 => infinity */ - -static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; -static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; - -/* Table for handling escaped characters in the range '0'-'z'. Positive returns -are simple data values; negative values are for special things like \d and so -on. Zero means further processing is needed (for things like \x), or the escape -is invalid. */ - -#if !EBCDIC /* This is the "normal" table for ASCII systems */ -static const short int escapes[] = { - 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ - 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ - '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E, 0, -ESC_G, /* @ - G */ - 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ --ESC_P, -ESC_Q, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */ --ESC_X, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */ - '`', 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* ` - g */ - 0, 0, 0, 0, 0, 0, ESC_n, 0, /* h - o */ --ESC_p, 0, ESC_r, -ESC_s, ESC_tee, 0, 0, -ESC_w, /* p - w */ - 0, 0, -ESC_z /* x - z */ -}; - -#else /* This is the "abnormal" table for EBCDIC systems */ -static const short int escapes[] = { -/* 48 */ 0, 0, 0, '.', '<', '(', '+', '|', -/* 50 */ '&', 0, 0, 0, 0, 0, 0, 0, -/* 58 */ 0, 0, '!', '$', '*', ')', ';', '~', -/* 60 */ '-', '/', 0, 0, 0, 0, 0, 0, -/* 68 */ 0, 0, '|', ',', '%', '_', '>', '?', -/* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"', -/* 80 */ 0, 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, -/* 88 */ 0, 0, 0, '{', 0, 0, 0, 0, -/* 90 */ 0, 0, 0, 'l', 0, ESC_n, 0, -ESC_p, -/* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0, -/* A0 */ 0, '~', -ESC_s, ESC_tee, 0, 0, -ESC_w, 0, -/* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0, -/* B0 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', -/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, -/* C8 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* D0 */ '}', 0, 0, 0, 0, 0, 0, -ESC_P, -/* D8 */-ESC_Q, 0, 0, 0, 0, 0, 0, 0, -/* E0 */ '\\', 0, -ESC_S, 0, 0, 0, -ESC_W, -ESC_X, -/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, -/* F0 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* F8 */ 0, 0, 0, 0, 0, 0, 0, 0 -}; -#endif - - -/* Tables of names of POSIX character classes and their lengths. The list is -terminated by a zero length entry. The first three must be alpha, upper, lower, -as this is assumed for handling case independence. */ - -static const char *const posix_names[] = { - "alpha", "lower", "upper", - "alnum", "ascii", "blank", "cntrl", "digit", "graph", - "print", "punct", "space", "word", "xdigit" }; - -static const uschar posix_name_lengths[] = { - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; - -/* Table of class bit maps for each POSIX class; up to three may be combined -to form the class. The table for [:blank:] is dynamically modified to remove -the vertical space characters. */ - -static const int posix_class_maps[] = { - cbit_lower, cbit_upper, -1, /* alpha */ - cbit_lower, -1, -1, /* lower */ - cbit_upper, -1, -1, /* upper */ - cbit_digit, cbit_lower, cbit_upper, /* alnum */ - cbit_print, cbit_cntrl, -1, /* ascii */ - cbit_space, -1, -1, /* blank - a GNU extension */ - cbit_cntrl, -1, -1, /* cntrl */ - cbit_digit, -1, -1, /* digit */ - cbit_graph, -1, -1, /* graph */ - cbit_print, -1, -1, /* print */ - cbit_punct, -1, -1, /* punct */ - cbit_space, -1, -1, /* space */ - cbit_word, -1, -1, /* word - a Perl extension */ - cbit_xdigit,-1, -1 /* xdigit */ -}; - -/* Table to identify digits and hex digits. This is used when compiling -patterns. Note that the tables in chartables are dependent on the locale, and -may mark arbitrary characters as digits - but the PCRE compiling code expects -to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have -a private table here. It costs 256 bytes, but it is a lot faster than doing -character value tests (at least in some simple cases I timed), and in some -applications one wants PCRE to compile efficiently as well as match -efficiently. - -For convenience, we use the same bit definitions as in chartables: - - 0x04 decimal digit - 0x08 hexadecimal digit - -Then we can use ctype_digit and ctype_xdigit in the code. */ - -#if !EBCDIC /* This is the "normal" case, for ASCII systems */ -static const unsigned char digitab[] = - { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */ - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */ - 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ - 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */ - 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ - -#else /* This is the "abnormal" case, for EBCDIC systems */ -static const unsigned char digitab[] = - { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- ¬ */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ - 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ - 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */ - 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ - -static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */ - 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */ - 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ - 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ - 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ - 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */ - 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */ - 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- ¬ */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */ - 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ - 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */ - 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ - 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */ - 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ - 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */ - 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */ - 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ - 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */ - 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ - 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */ - 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ - 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */ - 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ - 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ - 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ -#endif - - -/* Definition to allow mutual recursion */ - -static BOOL - compile_regex(int, int, int *, uschar **, const uschar **, const char **, - BOOL, int, int *, int *, branch_chain *, compile_data *); - -/* Structure for building a chain of data that actually lives on the -stack, for holding the values of the subject pointer at the start of each -subpattern, so as to detect when an empty string has been matched by a -subpattern - to break infinite loops. When NO_RECURSE is set, these blocks -are on the heap, not on the stack. */ - -typedef struct eptrblock { - struct eptrblock *epb_prev; - const uschar *epb_saved_eptr; -} eptrblock; - -/* Flag bits for the match() function */ - -#define match_condassert 0x01 /* Called to check a condition assertion */ -#define match_isgroup 0x02 /* Set if start of bracketed group */ - -/* Non-error returns from the match() function. Error returns are externally -defined PCRE_ERROR_xxx codes, which are all negative. */ - -#define MATCH_MATCH 1 -#define MATCH_NOMATCH 0 - - - -/************************************************* -* Global variables * -*************************************************/ - -/* PCRE is thread-clean and doesn't use any global variables in the normal -sense. However, it calls memory allocation and free functions via the four -indirections below, and it can optionally do callouts. These values can be -changed by the caller, but are shared between all threads. However, when -compiling for Virtual Pascal, things are done differently (see pcre.in). */ - -#ifndef VPCOMPAT -#ifdef __cplusplus -extern "C" void *(*pcre_malloc)(size_t) = malloc; -extern "C" void (*pcre_free)(void *) = free; -extern "C" void *(*pcre_stack_malloc)(size_t) = malloc; -extern "C" void (*pcre_stack_free)(void *) = free; -extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL; -#else -void *(*pcre_malloc)(size_t) = malloc; -void (*pcre_free)(void *) = free; -void *(*pcre_stack_malloc)(size_t) = malloc; -void (*pcre_stack_free)(void *) = free; -int (*pcre_callout)(pcre_callout_block *) = NULL; -#endif -#endif - - -/************************************************* -* Macros and tables for character handling * -*************************************************/ - -/* When UTF-8 encoding is being used, a character is no longer just a single -byte. The macros for character handling generate simple sequences when used in -byte-mode, and more complicated ones for UTF-8 characters. */ - -#ifndef SUPPORT_UTF8 -#define GETCHAR(c, eptr) c = *eptr; -#define GETCHARINC(c, eptr) c = *eptr++; -#define GETCHARINCTEST(c, eptr) c = *eptr++; -#define GETCHARLEN(c, eptr, len) c = *eptr; -#define BACKCHAR(eptr) - -#else /* SUPPORT_UTF8 */ - -/* Get the next UTF-8 character, not advancing the pointer. This is called when -we know we are in UTF-8 mode. */ - -#define GETCHAR(c, eptr) \ - c = *eptr; \ - if ((c & 0xc0) == 0xc0) \ - { \ - int gcii; \ - int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ - int gcss = 6*gcaa; \ - c = (c & utf8_table3[gcaa]) << gcss; \ - for (gcii = 1; gcii <= gcaa; gcii++) \ - { \ - gcss -= 6; \ - c |= (eptr[gcii] & 0x3f) << gcss; \ - } \ - } - -/* Get the next UTF-8 character, advancing the pointer. This is called when we -know we are in UTF-8 mode. */ - -#define GETCHARINC(c, eptr) \ - c = *eptr++; \ - if ((c & 0xc0) == 0xc0) \ - { \ - int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ - int gcss = 6*gcaa; \ - c = (c & utf8_table3[gcaa]) << gcss; \ - while (gcaa-- > 0) \ - { \ - gcss -= 6; \ - c |= (*eptr++ & 0x3f) << gcss; \ - } \ - } - -/* Get the next character, testing for UTF-8 mode, and advancing the pointer */ - -#define GETCHARINCTEST(c, eptr) \ - c = *eptr++; \ - if (md->utf8 && (c & 0xc0) == 0xc0) \ - { \ - int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ - int gcss = 6*gcaa; \ - c = (c & utf8_table3[gcaa]) << gcss; \ - while (gcaa-- > 0) \ - { \ - gcss -= 6; \ - c |= (*eptr++ & 0x3f) << gcss; \ - } \ - } - -/* Get the next UTF-8 character, not advancing the pointer, incrementing length -if there are extra bytes. This is called when we know we are in UTF-8 mode. */ - -#define GETCHARLEN(c, eptr, len) \ - c = *eptr; \ - if ((c & 0xc0) == 0xc0) \ - { \ - int gcii; \ - int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ - int gcss = 6*gcaa; \ - c = (c & utf8_table3[gcaa]) << gcss; \ - for (gcii = 1; gcii <= gcaa; gcii++) \ - { \ - gcss -= 6; \ - c |= (eptr[gcii] & 0x3f) << gcss; \ - } \ - len += gcaa; \ - } - -/* If the pointer is not at the start of a character, move it back until -it is. Called only in UTF-8 mode. */ - -#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--; - -#endif - - - -/************************************************* -* Default character tables * -*************************************************/ - -/* A default set of character tables is included in the PCRE binary. Its source -is built by the maketables auxiliary program, which uses the default C ctypes -functions, and put in the file chartables.c. These tables are used by PCRE -whenever the caller of pcre_compile() does not provide an alternate set of -tables. */ - -#include "chartables.c" - - - -#ifdef SUPPORT_UTF8 -/************************************************* -* Tables for UTF-8 support * -*************************************************/ - -/* These are the breakpoints for different numbers of bytes in a UTF-8 -character. */ - -static const int utf8_table1[] = - { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; - -/* These are the indicator bits and the mask for the data bits to set in the -first byte of a character, indexed by the number of additional bytes. */ - -static const int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; -static const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; - -/* Table of the number of extra characters, indexed by the first character -masked with 0x3f. The highest number for a valid UTF-8 character is in fact -0x3d. */ - -static const uschar utf8_table4[] = { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; - - -/************************************************* -* Convert character value to UTF-8 * -*************************************************/ - -/* This function takes an integer value in the range 0 - 0x7fffffff -and encodes it as a UTF-8 character in 0 to 6 bytes. - -Arguments: - cvalue the character value - buffer pointer to buffer for result - at least 6 bytes long - -Returns: number of characters placed in the buffer -*/ - -static int -ord2utf8(int cvalue, uschar *buffer) -{ -register int i, j; -for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) - if (cvalue <= utf8_table1[i]) break; -buffer += i; -for (j = i; j > 0; j--) - { - *buffer-- = 0x80 | (cvalue & 0x3f); - cvalue >>= 6; - } -*buffer = utf8_table2[i] | cvalue; -return i + 1; -} -#endif - - - -/************************************************* -* Print compiled regex * -*************************************************/ - -/* The code for doing this is held in a separate file that is also included in -pcretest.c. It defines a function called print_internals(). */ - -#ifdef DEBUG -#include "printint.c" -#endif - - - -/************************************************* -* Return version string * -*************************************************/ - -#define STRING(a) # a -#define XSTRING(s) STRING(s) - -EXPORT const char * -pcre_version(void) -{ -return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE); -} - - - - -/************************************************* -* Flip bytes in an integer * -*************************************************/ - -/* This function is called when the magic number in a regex doesn't match in -order to flip its bytes to see if we are dealing with a pattern that was -compiled on a host of different endianness. If so, this function is used to -flip other byte values. - -Arguments: - value the number to flip - n the number of bytes to flip (assumed to be 2 or 4) - -Returns: the flipped value -*/ - -static long int -byteflip(long int value, int n) -{ -if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8); -return ((value & 0x000000ff) << 24) | - ((value & 0x0000ff00) << 8) | - ((value & 0x00ff0000) >> 8) | - ((value & 0xff000000) >> 24); -} - - - -/************************************************* -* Test for a byte-flipped compiled regex * -*************************************************/ - -/* This function is called from pce_exec() and also from pcre_fullinfo(). Its -job is to test whether the regex is byte-flipped - that is, it was compiled on -a system of opposite endianness. The function is called only when the native -MAGIC_NUMBER test fails. If the regex is indeed flipped, we flip all the -relevant values into a different data block, and return it. - -Arguments: - re points to the regex - study points to study data, or NULL - internal_re points to a new regex block - internal_study points to a new study block - -Returns: the new block if is is indeed a byte-flipped regex - NULL if it is not -*/ - -static real_pcre * -try_flipped(const real_pcre *re, real_pcre *internal_re, - const pcre_study_data *study, pcre_study_data *internal_study) -{ -if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER) - return NULL; - -*internal_re = *re; /* To copy other fields */ -internal_re->size = byteflip(re->size, sizeof(re->size)); -internal_re->options = byteflip(re->options, sizeof(re->options)); -internal_re->top_bracket = (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket)); -internal_re->top_backref = (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref)); -internal_re->first_byte = (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte)); -internal_re->req_byte = (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte)); -internal_re->name_table_offset = (pcre_uint16)byteflip(re->name_table_offset, - sizeof(re->name_table_offset)); -internal_re->name_entry_size = (pcre_uint16)byteflip(re->name_entry_size, - sizeof(re->name_entry_size)); -internal_re->name_count = (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count)); - -if (study != NULL) - { - *internal_study = *study; /* To copy other fields */ - internal_study->size = byteflip(study->size, sizeof(study->size)); - internal_study->options = byteflip(study->options, sizeof(study->options)); - } - -return internal_re; -} - - - -/************************************************* -* (Obsolete) Return info about compiled pattern * -*************************************************/ - -/* This is the original "info" function. It picks potentially useful data out -of the private structure, but its interface was too rigid. It remains for -backwards compatibility. The public options are passed back in an int - though -the re->options field has been expanded to a long int, all the public options -at the low end of it, and so even on 16-bit systems this will still be OK. -Therefore, I haven't changed the API for pcre_info(). - -Arguments: - argument_re points to compiled code - optptr where to pass back the options - first_byte where to pass back the first character, - or -1 if multiline and all branches start ^, - or -2 otherwise - -Returns: number of capturing subpatterns - or negative values on error -*/ - -EXPORT int -pcre_info(const pcre *argument_re, int *optptr, int *first_byte) -{ -real_pcre internal_re; -const real_pcre *re = (const real_pcre *)argument_re; -if (re == NULL) return PCRE_ERROR_NULL; -if (re->magic_number != MAGIC_NUMBER) - { - re = try_flipped(re, &internal_re, NULL, NULL); - if (re == NULL) return PCRE_ERROR_BADMAGIC; - } -if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS); -if (first_byte != NULL) - *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte : - ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; -return re->top_bracket; -} - - - -/************************************************* -* Return info about compiled pattern * -*************************************************/ - -/* This is a newer "info" function which has an extensible interface so -that additional items can be added compatibly. - -Arguments: - argument_re points to compiled code - extra_data points extra data, or NULL - what what information is required - where where to put the information - -Returns: 0 if data returned, negative on error -*/ - -EXPORT int -pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what, - void *where) -{ -real_pcre internal_re; -pcre_study_data internal_study; -const real_pcre *re = (const real_pcre *)argument_re; -const pcre_study_data *study = NULL; - -if (re == NULL || where == NULL) return PCRE_ERROR_NULL; - -if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) - study = (const pcre_study_data *)extra_data->study_data; - -if (re->magic_number != MAGIC_NUMBER) - { - re = try_flipped(re, &internal_re, study, &internal_study); - if (re == NULL) return PCRE_ERROR_BADMAGIC; - if (study != NULL) study = &internal_study; - } - -switch (what) - { - case PCRE_INFO_OPTIONS: - *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; - break; - - case PCRE_INFO_SIZE: - *((size_t *)where) = re->size; - break; - - case PCRE_INFO_STUDYSIZE: - *((size_t *)where) = (study == NULL)? 0 : study->size; - break; - - case PCRE_INFO_CAPTURECOUNT: - *((int *)where) = re->top_bracket; - break; - - case PCRE_INFO_BACKREFMAX: - *((int *)where) = re->top_backref; - break; - - case PCRE_INFO_FIRSTBYTE: - *((int *)where) = - ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte : - ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; - break; - - /* Make sure we pass back the pointer to the bit vector in the external - block, not the internal copy (with flipped integer fields). */ - - case PCRE_INFO_FIRSTTABLE: - *((const uschar **)where) = - (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? - ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL; - break; - - case PCRE_INFO_LASTLITERAL: - *((int *)where) = - ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1; - break; - - case PCRE_INFO_NAMEENTRYSIZE: - *((int *)where) = re->name_entry_size; - break; - - case PCRE_INFO_NAMECOUNT: - *((int *)where) = re->name_count; - break; - - case PCRE_INFO_NAMETABLE: - *((const uschar **)where) = (const uschar *)re + re->name_table_offset; - break; - - case PCRE_INFO_DEFAULT_TABLES: - *((const uschar **)where) = (const uschar *)pcre_default_tables; - break; - - default: return PCRE_ERROR_BADOPTION; - } - -return 0; -} - - - -/************************************************* -* Return info about what features are configured * -*************************************************/ - -/* This is function which has an extensible interface so that additional items -can be added compatibly. - -Arguments: - what what information is required - where where to put the information - -Returns: 0 if data returned, negative on error -*/ - -EXPORT int -pcre_config(int what, void *where) -{ -switch (what) - { - case PCRE_CONFIG_UTF8: -#ifdef SUPPORT_UTF8 - *((int *)where) = 1; -#else - *((int *)where) = 0; -#endif - break; - - case PCRE_CONFIG_UNICODE_PROPERTIES: -#ifdef SUPPORT_UCP - *((int *)where) = 1; -#else - *((int *)where) = 0; -#endif - break; - - case PCRE_CONFIG_NEWLINE: - *((int *)where) = NEWLINE; - break; - - case PCRE_CONFIG_LINK_SIZE: - *((int *)where) = LINK_SIZE; - break; - - case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD: - *((int *)where) = POSIX_MALLOC_THRESHOLD; - break; - - case PCRE_CONFIG_MATCH_LIMIT: - *((unsigned int *)where) = MATCH_LIMIT; - break; - - case PCRE_CONFIG_STACKRECURSE: -#ifdef NO_RECURSE - *((int *)where) = 0; -#else - *((int *)where) = 1; -#endif - break; - - default: return PCRE_ERROR_BADOPTION; - } - -return 0; -} - - - -#ifdef DEBUG -/************************************************* -* Debugging function to print chars * -*************************************************/ - -/* Print a sequence of chars in printable format, stopping at the end of the -subject if the requested. - -Arguments: - p points to characters - length number to print - is_subject TRUE if printing from within md->start_subject - md pointer to matching data block, if is_subject is TRUE - -Returns: nothing -*/ - -static void -pchars(const uschar *p, int length, BOOL is_subject, match_data *md) -{ -int c; -if (is_subject && length > md->end_subject - p) length = md->end_subject - p; -while (length-- > 0) - if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c); -} -#endif - - - - -/************************************************* -* Handle escapes * -*************************************************/ - -/* This function is called when a \ has been encountered. It either returns a -positive value for a simple escape such as \n, or a negative value which -encodes one of the more complicated things such as \d. When UTF-8 is enabled, -a positive value greater than 255 may be returned. On entry, ptr is pointing at -the \. On exit, it is on the final character of the escape sequence. - -Arguments: - ptrptr points to the pattern position pointer - errorptr points to the pointer to the error message - bracount number of previous extracting brackets - options the options bits - isclass TRUE if inside a character class - -Returns: zero or positive => a data character - negative => a special escape sequence - on error, errorptr is set -*/ - -static int -check_escape(const uschar **ptrptr, const char **errorptr, int bracount, - int options, BOOL isclass) -{ -const uschar *ptr = *ptrptr; -int c, i; - -/* If backslash is at the end of the pattern, it's an error. */ - -c = *(++ptr); -if (c == 0) *errorptr = ERR1; - -/* Non-alphamerics are literals. For digits or letters, do an initial lookup in -a table. A non-zero result is something that can be returned immediately. -Otherwise further processing may be required. */ - -#if !EBCDIC /* ASCII coding */ -else if (c < '0' || c > 'z') {} /* Not alphameric */ -else if ((i = escapes[c - '0']) != 0) c = i; - -#else /* EBCDIC coding */ -else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {} /* Not alphameric */ -else if ((i = escapes[c - 0x48]) != 0) c = i; -#endif - -/* Escapes that need further processing, or are illegal. */ - -else - { - const uschar *oldptr; - switch (c) - { - /* A number of Perl escapes are not handled by PCRE. We give an explicit - error. */ - - case 'l': - case 'L': - case 'N': - case 'u': - case 'U': - *errorptr = ERR37; - break; - - /* The handling of escape sequences consisting of a string of digits - starting with one that is not zero is not straightforward. By experiment, - the way Perl works seems to be as follows: - - Outside a character class, the digits are read as a decimal number. If the - number is less than 10, or if there are that many previous extracting - left brackets, then it is a back reference. Otherwise, up to three octal - digits are read to form an escaped byte. Thus \123 is likely to be octal - 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal - value is greater than 377, the least significant 8 bits are taken. Inside a - character class, \ followed by a digit is always an octal number. */ - - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - - if (!isclass) - { - oldptr = ptr; - c -= '0'; - while ((digitab[ptr[1]] & ctype_digit) != 0) - c = c * 10 + *(++ptr) - '0'; - if (c < 10 || c <= bracount) - { - c = -(ESC_REF + c); - break; - } - ptr = oldptr; /* Put the pointer back and fall through */ - } - - /* Handle an octal number following \. If the first digit is 8 or 9, Perl - generates a binary zero byte and treats the digit as a following literal. - Thus we have to pull back the pointer by one. */ - - if ((c = *ptr) >= '8') - { - ptr--; - c = 0; - break; - } - - /* \0 always starts an octal number, but we may drop through to here with a - larger first octal digit. */ - - case '0': - c -= '0'; - while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7') - c = c * 8 + *(++ptr) - '0'; - c &= 255; /* Take least significant 8 bits */ - break; - - /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number - which can be greater than 0xff, but only if the ddd are hex digits. */ - - case 'x': -#ifdef SUPPORT_UTF8 - if (ptr[1] == '{' && (options & PCRE_UTF8) != 0) - { - const uschar *pt = ptr + 2; - register int count = 0; - c = 0; - while ((digitab[*pt] & ctype_xdigit) != 0) - { - int cc = *pt++; - count++; -#if !EBCDIC /* ASCII coding */ - if (cc >= 'a') cc -= 32; /* Convert to upper case */ - c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10)); -#else /* EBCDIC coding */ - if (cc >= 'a' && cc <= 'z') cc += 64; /* Convert to upper case */ - c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10)); -#endif - } - if (*pt == '}') - { - if (c < 0 || count > 8) *errorptr = ERR34; - ptr = pt; - break; - } - /* If the sequence of hex digits does not end with '}', then we don't - recognize this construct; fall through to the normal \x handling. */ - } -#endif - - /* Read just a single hex char */ - - c = 0; - while (i++ < 2 && (digitab[ptr[1]] & ctype_xdigit) != 0) - { - int cc; /* Some compilers don't like ++ */ - cc = *(++ptr); /* in initializers */ -#if !EBCDIC /* ASCII coding */ - if (cc >= 'a') cc -= 32; /* Convert to upper case */ - c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10)); -#else /* EBCDIC coding */ - if (cc <= 'z') cc += 64; /* Convert to upper case */ - c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10)); -#endif - } - break; - - /* Other special escapes not starting with a digit are straightforward */ - - case 'c': - c = *(++ptr); - if (c == 0) - { - *errorptr = ERR2; - return 0; - } - - /* A letter is upper-cased; then the 0x40 bit is flipped. This coding - is ASCII-specific, but then the whole concept of \cx is ASCII-specific. - (However, an EBCDIC equivalent has now been added.) */ - -#if !EBCDIC /* ASCII coding */ - if (c >= 'a' && c <= 'z') c -= 32; - c ^= 0x40; -#else /* EBCDIC coding */ - if (c >= 'a' && c <= 'z') c += 64; - c ^= 0xC0; -#endif - break; - - /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any - other alphameric following \ is an error if PCRE_EXTRA was set; otherwise, - for Perl compatibility, it is a literal. This code looks a bit odd, but - there used to be some cases other than the default, and there may be again - in future, so I haven't "optimized" it. */ - - default: - if ((options & PCRE_EXTRA) != 0) switch(c) - { - default: - *errorptr = ERR3; - break; - } - break; - } - } - -*ptrptr = ptr; -return c; -} - - - -#ifdef SUPPORT_UCP -/************************************************* -* Handle \P and \p * -*************************************************/ - -/* This function is called after \P or \p has been encountered, provided that -PCRE is compiled with support for Unicode properties. On entry, ptrptr is -pointing at the P or p. On exit, it is pointing at the final character of the -escape sequence. - -Argument: - ptrptr points to the pattern position pointer - negptr points to a boolean that is set TRUE for negation else FALSE - errorptr points to the pointer to the error message - -Returns: value from ucp_type_table, or -1 for an invalid type -*/ - -static int -get_ucp(const uschar **ptrptr, BOOL *negptr, const char **errorptr) -{ -int c, i, bot, top; -const uschar *ptr = *ptrptr; -char name[4]; - -c = *(++ptr); -if (c == 0) goto ERROR_RETURN; - -*negptr = FALSE; - -/* \P or \p can be followed by a one- or two-character name in {}, optionally -preceded by ^ for negation. */ - -if (c == '{') - { - if (ptr[1] == '^') - { - *negptr = TRUE; - ptr++; - } - for (i = 0; i <= 2; i++) - { - c = *(++ptr); - if (c == 0) goto ERROR_RETURN; - if (c == '}') break; - name[i] = c; - } - if (c !='}') /* Try to distinguish error cases */ - { - while (*(++ptr) != 0 && *ptr != '}'); - if (*ptr == '}') goto UNKNOWN_RETURN; else goto ERROR_RETURN; - } - name[i] = 0; - } - -/* Otherwise there is just one following character */ - -else - { - name[0] = c; - name[1] = 0; - } - -*ptrptr = ptr; - -/* Search for a recognized property name using binary chop */ - -bot = 0; -top = sizeof(utt)/sizeof(ucp_type_table); - -while (bot < top) - { - i = (bot + top)/2; - c = strcmp(name, utt[i].name); - if (c == 0) return utt[i].value; - if (c > 0) bot = i + 1; else top = i; - } - -UNKNOWN_RETURN: -*errorptr = ERR47; -*ptrptr = ptr; -return -1; - -ERROR_RETURN: -*errorptr = ERR46; -*ptrptr = ptr; -return -1; -} -#endif - - - - -/************************************************* -* Check for counted repeat * -*************************************************/ - -/* This function is called when a '{' is encountered in a place where it might -start a quantifier. It looks ahead to see if it really is a quantifier or not. -It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} -where the ddds are digits. - -Arguments: - p pointer to the first char after '{' - -Returns: TRUE or FALSE -*/ - -static BOOL -is_counted_repeat(const uschar *p) -{ -if ((digitab[*p++] & ctype_digit) == 0) return FALSE; -while ((digitab[*p] & ctype_digit) != 0) p++; -if (*p == '}') return TRUE; - -if (*p++ != ',') return FALSE; -if (*p == '}') return TRUE; - -if ((digitab[*p++] & ctype_digit) == 0) return FALSE; -while ((digitab[*p] & ctype_digit) != 0) p++; - -return (*p == '}'); -} - - - -/************************************************* -* Read repeat counts * -*************************************************/ - -/* Read an item of the form {n,m} and return the values. This is called only -after is_counted_repeat() has confirmed that a repeat-count quantifier exists, -so the syntax is guaranteed to be correct, but we need to check the values. - -Arguments: - p pointer to first char after '{' - minp pointer to int for min - maxp pointer to int for max - returned as -1 if no max - errorptr points to pointer to error message - -Returns: pointer to '}' on success; - current ptr on error, with errorptr set -*/ - -static const uschar * -read_repeat_counts(const uschar *p, int *minp, int *maxp, const char **errorptr) -{ -int min = 0; -int max = -1; - -while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; - -if (*p == '}') max = min; else - { - if (*(++p) != '}') - { - max = 0; - while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; - if (max < min) - { - *errorptr = ERR4; - return p; - } - } - } - -/* Do paranoid checks, then fill in the required variables, and pass back the -pointer to the terminating '}'. */ - -if (min > 65535 || max > 65535) - *errorptr = ERR5; -else - { - *minp = min; - *maxp = max; - } -return p; -} - - - -/************************************************* -* Find first significant op code * -*************************************************/ - -/* This is called by several functions that scan a compiled expression looking -for a fixed first character, or an anchoring op code etc. It skips over things -that do not influence this. For some calls, a change of option is important. -For some calls, it makes sense to skip negative forward and all backward -assertions, and also the \b assertion; for others it does not. - -Arguments: - code pointer to the start of the group - options pointer to external options - optbit the option bit whose changing is significant, or - zero if none are - skipassert TRUE if certain assertions are to be skipped - -Returns: pointer to the first significant opcode -*/ - -static const uschar* -first_significant_code(const uschar *code, int *options, int optbit, - BOOL skipassert) -{ -for (;;) - { - switch ((int)*code) - { - case OP_OPT: - if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) - *options = (int)code[1]; - code += 2; - break; - - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - if (!skipassert) return code; - do code += GET(code, 1); while (*code == OP_ALT); - code += OP_lengths[*code]; - break; - - case OP_WORD_BOUNDARY: - case OP_NOT_WORD_BOUNDARY: - if (!skipassert) return code; - /* Fall through */ - - case OP_CALLOUT: - case OP_CREF: - case OP_BRANUMBER: - code += OP_lengths[*code]; - break; - - default: - return code; - } - } -/* Control never reaches here */ -} - - - - -/************************************************* -* Find the fixed length of a pattern * -*************************************************/ - -/* Scan a pattern and compute the fixed length of subject that will match it, -if the length is fixed. This is needed for dealing with backward assertions. -In UTF8 mode, the result is in characters rather than bytes. - -Arguments: - code points to the start of the pattern (the bracket) - options the compiling options - -Returns: the fixed length, or -1 if there is no fixed length, - or -2 if \C was encountered -*/ - -static int -find_fixedlength(uschar *code, int options) -{ -int length = -1; - -register int branchlength = 0; -register uschar *cc = code + 1 + LINK_SIZE; - -/* Scan along the opcodes for this branch. If we get to the end of the -branch, check the length against that of the other branches. */ - -for (;;) - { - int d; - register int op = *cc; - if (op >= OP_BRA) op = OP_BRA; - - switch (op) - { - case OP_BRA: - case OP_ONCE: - case OP_COND: - d = find_fixedlength(cc, options); - if (d < 0) return d; - branchlength += d; - do cc += GET(cc, 1); while (*cc == OP_ALT); - cc += 1 + LINK_SIZE; - break; - - /* Reached end of a branch; if it's a ket it is the end of a nested - call. If it's ALT it is an alternation in a nested call. If it is - END it's the end of the outer call. All can be handled by the same code. */ - - case OP_ALT: - case OP_KET: - case OP_KETRMAX: - case OP_KETRMIN: - case OP_END: - if (length < 0) length = branchlength; - else if (length != branchlength) return -1; - if (*cc != OP_ALT) return length; - cc += 1 + LINK_SIZE; - branchlength = 0; - break; - - /* Skip over assertive subpatterns */ - - case OP_ASSERT: - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - do cc += GET(cc, 1); while (*cc == OP_ALT); - /* Fall through */ - - /* Skip over things that don't match chars */ - - case OP_REVERSE: - case OP_BRANUMBER: - case OP_CREF: - case OP_OPT: - case OP_CALLOUT: - case OP_SOD: - case OP_SOM: - case OP_EOD: - case OP_EODN: - case OP_CIRC: - case OP_DOLL: - case OP_NOT_WORD_BOUNDARY: - case OP_WORD_BOUNDARY: - cc += OP_lengths[*cc]; - break; - - /* Handle literal characters */ - - case OP_CHAR: - case OP_CHARNC: - branchlength++; - cc += 2; -#ifdef SUPPORT_UTF8 - if ((options & PCRE_UTF8) != 0) - { - while ((*cc & 0xc0) == 0x80) cc++; - } -#endif - break; - - /* Handle exact repetitions. The count is already in characters, but we - need to skip over a multibyte character in UTF8 mode. */ - - case OP_EXACT: - branchlength += GET2(cc,1); - cc += 4; -#ifdef SUPPORT_UTF8 - if ((options & PCRE_UTF8) != 0) - { - while((*cc & 0x80) == 0x80) cc++; - } -#endif - break; - - case OP_TYPEEXACT: - branchlength += GET2(cc,1); - cc += 4; - break; - - /* Handle single-char matchers */ - - case OP_PROP: - case OP_NOTPROP: - cc++; - /* Fall through */ - - case OP_NOT_DIGIT: - case OP_DIGIT: - case OP_NOT_WHITESPACE: - case OP_WHITESPACE: - case OP_NOT_WORDCHAR: - case OP_WORDCHAR: - case OP_ANY: - branchlength++; - cc++; - break; - - /* The single-byte matcher isn't allowed */ - - case OP_ANYBYTE: - return -2; - - /* Check a class for variable quantification */ - -#ifdef SUPPORT_UTF8 - case OP_XCLASS: - cc += GET(cc, 1) - 33; - /* Fall through */ -#endif - - case OP_CLASS: - case OP_NCLASS: - cc += 33; - - switch (*cc) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRQUERY: - case OP_CRMINQUERY: - return -1; - - case OP_CRRANGE: - case OP_CRMINRANGE: - if (GET2(cc,1) != GET2(cc,3)) return -1; - branchlength += GET2(cc,1); - cc += 5; - break; - - default: - branchlength++; - } - break; - - /* Anything else is variable length */ - - default: - return -1; - } - } -/* Control never gets here */ -} - - - - -/************************************************* -* Scan compiled regex for numbered bracket * -*************************************************/ - -/* This little function scans through a compiled pattern until it finds a -capturing bracket with the given number. - -Arguments: - code points to start of expression - utf8 TRUE in UTF-8 mode - number the required bracket number - -Returns: pointer to the opcode for the bracket, or NULL if not found -*/ - -static const uschar * -find_bracket(const uschar *code, BOOL utf8, int number) -{ -#ifndef SUPPORT_UTF8 -utf8 = utf8; /* Stop pedantic compilers complaining */ -#endif - -for (;;) - { - register int c = *code; - if (c == OP_END) return NULL; - else if (c > OP_BRA) - { - int n = c - OP_BRA; - if (n > EXTRACT_BASIC_MAX) n = GET2(code, 2+LINK_SIZE); - if (n == number) return (uschar *)code; - code += OP_lengths[OP_BRA]; - } - else - { - code += OP_lengths[c]; - -#ifdef SUPPORT_UTF8 - - /* In UTF-8 mode, opcodes that are followed by a character may be followed - by a multi-byte character. The length in the table is a minimum, so we have - to scan along to skip the extra bytes. All opcodes are less than 128, so we - can use relatively efficient code. */ - - if (utf8) switch(c) - { - case OP_CHAR: - case OP_CHARNC: - case OP_EXACT: - case OP_UPTO: - case OP_MINUPTO: - case OP_STAR: - case OP_MINSTAR: - case OP_PLUS: - case OP_MINPLUS: - case OP_QUERY: - case OP_MINQUERY: - while ((*code & 0xc0) == 0x80) code++; - break; - - /* XCLASS is used for classes that cannot be represented just by a bit - map. This includes negated single high-valued characters. The length in - the table is zero; the actual length is stored in the compiled code. */ - - case OP_XCLASS: - code += GET(code, 1) + 1; - break; - } -#endif - } - } -} - - - -/************************************************* -* Scan compiled regex for recursion reference * -*************************************************/ - -/* This little function scans through a compiled pattern until it finds an -instance of OP_RECURSE. - -Arguments: - code points to start of expression - utf8 TRUE in UTF-8 mode - -Returns: pointer to the opcode for OP_RECURSE, or NULL if not found -*/ - -static const uschar * -find_recurse(const uschar *code, BOOL utf8) -{ -#ifndef SUPPORT_UTF8 -utf8 = utf8; /* Stop pedantic compilers complaining */ -#endif - -for (;;) - { - register int c = *code; - if (c == OP_END) return NULL; - else if (c == OP_RECURSE) return code; - else if (c > OP_BRA) - { - code += OP_lengths[OP_BRA]; - } - else - { - code += OP_lengths[c]; - -#ifdef SUPPORT_UTF8 - - /* In UTF-8 mode, opcodes that are followed by a character may be followed - by a multi-byte character. The length in the table is a minimum, so we have - to scan along to skip the extra bytes. All opcodes are less than 128, so we - can use relatively efficient code. */ - - if (utf8) switch(c) - { - case OP_CHAR: - case OP_CHARNC: - case OP_EXACT: - case OP_UPTO: - case OP_MINUPTO: - case OP_STAR: - case OP_MINSTAR: - case OP_PLUS: - case OP_MINPLUS: - case OP_QUERY: - case OP_MINQUERY: - while ((*code & 0xc0) == 0x80) code++; - break; - - /* XCLASS is used for classes that cannot be represented just by a bit - map. This includes negated single high-valued characters. The length in - the table is zero; the actual length is stored in the compiled code. */ - - case OP_XCLASS: - code += GET(code, 1) + 1; - break; - } -#endif - } - } -} - - - -/************************************************* -* Scan compiled branch for non-emptiness * -*************************************************/ - -/* This function scans through a branch of a compiled pattern to see whether it -can match the empty string or not. It is called only from could_be_empty() -below. Note that first_significant_code() skips over assertions. If we hit an -unclosed bracket, we return "empty" - this means we've struck an inner bracket -whose current branch will already have been scanned. - -Arguments: - code points to start of search - endcode points to where to stop - utf8 TRUE if in UTF8 mode - -Returns: TRUE if what is matched could be empty -*/ - -static BOOL -could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8) -{ -register int c; -for (code = first_significant_code(code + 1 + LINK_SIZE, NULL, 0, TRUE); - code < endcode; - code = first_significant_code(code + OP_lengths[c], NULL, 0, TRUE)) - { - const uschar *ccode; - - c = *code; - - if (c >= OP_BRA) - { - BOOL empty_branch; - if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ - - /* Scan a closed bracket */ - - empty_branch = FALSE; - do - { - if (!empty_branch && could_be_empty_branch(code, endcode, utf8)) - empty_branch = TRUE; - code += GET(code, 1); - } - while (*code == OP_ALT); - if (!empty_branch) return FALSE; /* All branches are non-empty */ - code += 1 + LINK_SIZE; - c = *code; - } - - else switch (c) - { - /* Check for quantifiers after a class */ - -#ifdef SUPPORT_UTF8 - case OP_XCLASS: - ccode = code + GET(code, 1); - goto CHECK_CLASS_REPEAT; -#endif - - case OP_CLASS: - case OP_NCLASS: - ccode = code + 33; - -#ifdef SUPPORT_UTF8 - CHECK_CLASS_REPEAT: -#endif - - switch (*ccode) - { - case OP_CRSTAR: /* These could be empty; continue */ - case OP_CRMINSTAR: - case OP_CRQUERY: - case OP_CRMINQUERY: - break; - - default: /* Non-repeat => class must match */ - case OP_CRPLUS: /* These repeats aren't empty */ - case OP_CRMINPLUS: - return FALSE; - - case OP_CRRANGE: - case OP_CRMINRANGE: - if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */ - break; - } - break; - - /* Opcodes that must match a character */ - - case OP_PROP: - case OP_NOTPROP: - case OP_EXTUNI: - case OP_NOT_DIGIT: - case OP_DIGIT: - case OP_NOT_WHITESPACE: - case OP_WHITESPACE: - case OP_NOT_WORDCHAR: - case OP_WORDCHAR: - case OP_ANY: - case OP_ANYBYTE: - case OP_CHAR: - case OP_CHARNC: - case OP_NOT: - case OP_PLUS: - case OP_MINPLUS: - case OP_EXACT: - case OP_NOTPLUS: - case OP_NOTMINPLUS: - case OP_NOTEXACT: - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - case OP_TYPEEXACT: - return FALSE; - - /* End of branch */ - - case OP_KET: - case OP_KETRMAX: - case OP_KETRMIN: - case OP_ALT: - return TRUE; - - /* In UTF-8 mode, STAR, MINSTAR, QUERY, MINQUERY, UPTO, and MINUPTO may be - followed by a multibyte character */ - -#ifdef SUPPORT_UTF8 - case OP_STAR: - case OP_MINSTAR: - case OP_QUERY: - case OP_MINQUERY: - case OP_UPTO: - case OP_MINUPTO: - if (utf8) while ((code[2] & 0xc0) == 0x80) code++; - break; -#endif - } - } - -return TRUE; -} - - - -/************************************************* -* Scan compiled regex for non-emptiness * -*************************************************/ - -/* This function is called to check for left recursive calls. We want to check -the current branch of the current pattern to see if it could match the empty -string. If it could, we must look outwards for branches at other levels, -stopping when we pass beyond the bracket which is the subject of the recursion. - -Arguments: - code points to start of the recursion - endcode points to where to stop (current RECURSE item) - bcptr points to the chain of current (unclosed) branch starts - utf8 TRUE if in UTF-8 mode - -Returns: TRUE if what is matched could be empty -*/ - -static BOOL -could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr, - BOOL utf8) -{ -while (bcptr != NULL && bcptr->current >= code) - { - if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE; - bcptr = bcptr->outer; - } -return TRUE; -} - - - -/************************************************* -* Check for POSIX class syntax * -*************************************************/ - -/* This function is called when the sequence "[:" or "[." or "[=" is -encountered in a character class. It checks whether this is followed by an -optional ^ and then a sequence of letters, terminated by a matching ":]" or -".]" or "=]". - -Argument: - ptr pointer to the initial [ - endptr where to return the end pointer - cd pointer to compile data - -Returns: TRUE or FALSE -*/ - -static BOOL -check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd) -{ -int terminator; /* Don't combine these lines; the Solaris cc */ -terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ -if (*(++ptr) == '^') ptr++; -while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; -if (*ptr == terminator && ptr[1] == ']') - { - *endptr = ptr; - return TRUE; - } -return FALSE; -} - - - - -/************************************************* -* Check POSIX class name * -*************************************************/ - -/* This function is called to check the name given in a POSIX-style class entry -such as [:alnum:]. - -Arguments: - ptr points to the first letter - len the length of the name - -Returns: a value representing the name, or -1 if unknown -*/ - -static int -check_posix_name(const uschar *ptr, int len) -{ -register int yield = 0; -while (posix_name_lengths[yield] != 0) - { - if (len == posix_name_lengths[yield] && - strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; - yield++; - } -return -1; -} - - -/************************************************* -* Adjust OP_RECURSE items in repeated group * -*************************************************/ - -/* OP_RECURSE items contain an offset from the start of the regex to the group -that is referenced. This means that groups can be replicated for fixed -repetition simply by copying (because the recursion is allowed to refer to -earlier groups that are outside the current group). However, when a group is -optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before -it, after it has been compiled. This means that any OP_RECURSE items within it -that refer to the group itself or any contained groups have to have their -offsets adjusted. That is the job of this function. Before it is called, the -partially compiled regex must be temporarily terminated with OP_END. - -Arguments: - group points to the start of the group - adjust the amount by which the group is to be moved - utf8 TRUE in UTF-8 mode - cd contains pointers to tables etc. - -Returns: nothing -*/ - -static void -adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd) -{ -uschar *ptr = group; -while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL) - { - int offset = GET(ptr, 1); - if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust); - ptr += 1 + LINK_SIZE; - } -} - - - -/************************************************* -* Insert an automatic callout point * -*************************************************/ - -/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert -callout points before each pattern item. - -Arguments: - code current code pointer - ptr current pattern pointer - cd pointers to tables etc - -Returns: new code pointer -*/ - -static uschar * -auto_callout(uschar *code, const uschar *ptr, compile_data *cd) -{ -*code++ = OP_CALLOUT; -*code++ = 255; -PUT(code, 0, ptr - cd->start_pattern); /* Pattern offset */ -PUT(code, LINK_SIZE, 0); /* Default length */ -return code + 2*LINK_SIZE; -} - - - -/************************************************* -* Complete a callout item * -*************************************************/ - -/* A callout item contains the length of the next item in the pattern, which -we can't fill in till after we have reached the relevant point. This is used -for both automatic and manual callouts. - -Arguments: - previous_callout points to previous callout item - ptr current pattern pointer - cd pointers to tables etc - -Returns: nothing -*/ - -static void -complete_callout(uschar *previous_callout, const uschar *ptr, compile_data *cd) -{ -int length = ptr - cd->start_pattern - GET(previous_callout, 2); -PUT(previous_callout, 2 + LINK_SIZE, length); -} - - - -#ifdef SUPPORT_UCP -/************************************************* -* Get othercase range * -*************************************************/ - -/* This function is passed the start and end of a class range, in UTF-8 mode -with UCP support. It searches up the characters, looking for internal ranges of -characters in the "other" case. Each call returns the next one, updating the -start address. - -Arguments: - cptr points to starting character value; updated - d end value - ocptr where to put start of othercase range - odptr where to put end of othercase range - -Yield: TRUE when range returned; FALSE when no more -*/ - -static BOOL -get_othercase_range(int *cptr, int d, int *ocptr, int *odptr) -{ -int c, chartype, othercase, next; - -for (c = *cptr; c <= d; c++) - { - if (ucp_findchar(c, &chartype, &othercase) == ucp_L && othercase != 0) break; - } - -if (c > d) return FALSE; - -*ocptr = othercase; -next = othercase + 1; - -for (++c; c <= d; c++) - { - if (ucp_findchar(c, &chartype, &othercase) != ucp_L || othercase != next) - break; - next++; - } - -*odptr = next - 1; -*cptr = c; - -return TRUE; -} -#endif /* SUPPORT_UCP */ - - -/************************************************* -* Compile one branch * -*************************************************/ - -/* Scan the pattern, compiling it into the code vector. If the options are -changed during the branch, the pointer is used to change the external options -bits. - -Arguments: - optionsptr pointer to the option bits - brackets points to number of extracting brackets used - codeptr points to the pointer to the current code point - ptrptr points to the current pattern pointer - errorptr points to pointer to error message - firstbyteptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE) - reqbyteptr set to the last literal character required, else < 0 - bcptr points to current branch chain - cd contains pointers to tables etc. - -Returns: TRUE on success - FALSE, with *errorptr set on error -*/ - -static BOOL -compile_branch(int *optionsptr, int *brackets, uschar **codeptr, - const uschar **ptrptr, const char **errorptr, int *firstbyteptr, - int *reqbyteptr, branch_chain *bcptr, compile_data *cd) -{ -int repeat_type, op_type; -int repeat_min = 0, repeat_max = 0; /* To please picky compilers */ -int bravalue = 0; -int greedy_default, greedy_non_default; -int firstbyte, reqbyte; -int zeroreqbyte, zerofirstbyte; -int req_caseopt, reqvary, tempreqvary; -int condcount = 0; -int options = *optionsptr; -int after_manual_callout = 0; -register int c; -register uschar *code = *codeptr; -uschar *tempcode; -BOOL inescq = FALSE; -BOOL groupsetfirstbyte = FALSE; -const uschar *ptr = *ptrptr; -const uschar *tempptr; -uschar *previous = NULL; -uschar *previous_callout = NULL; -uschar classbits[32]; - -#ifdef SUPPORT_UTF8 -BOOL class_utf8; -BOOL utf8 = (options & PCRE_UTF8) != 0; -uschar *class_utf8data; -uschar utf8_char[6]; -#else -BOOL utf8 = FALSE; -#endif - -/* Set up the default and non-default settings for greediness */ - -greedy_default = ((options & PCRE_UNGREEDY) != 0); -greedy_non_default = greedy_default ^ 1; - -/* Initialize no first byte, no required byte. REQ_UNSET means "no char -matching encountered yet". It gets changed to REQ_NONE if we hit something that -matches a non-fixed char first char; reqbyte just remains unset if we never -find one. - -When we hit a repeat whose minimum is zero, we may have to adjust these values -to take the zero repeat into account. This is implemented by setting them to -zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual -item types that can be repeated set these backoff variables appropriately. */ - -firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET; - -/* The variable req_caseopt contains either the REQ_CASELESS value or zero, -according to the current setting of the caseless flag. REQ_CASELESS is a bit -value > 255. It is added into the firstbyte or reqbyte variables to record the -case status of the value. This is used only for ASCII characters. */ - -req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; - -/* Switch on next character until the end of the branch */ - -for (;; ptr++) - { - BOOL negate_class; - BOOL possessive_quantifier; - BOOL is_quantifier; - int class_charcount; - int class_lastchar; - int newoptions; - int recno; - int skipbytes; - int subreqbyte; - int subfirstbyte; - int mclength; - uschar mcbuffer[8]; - - /* Next byte in the pattern */ - - c = *ptr; - - /* If in \Q...\E, check for the end; if not, we have a literal */ - - if (inescq && c != 0) - { - if (c == '\\' && ptr[1] == 'E') - { - inescq = FALSE; - ptr++; - continue; - } - else - { - if (previous_callout != NULL) - { - complete_callout(previous_callout, ptr, cd); - previous_callout = NULL; - } - if ((options & PCRE_AUTO_CALLOUT) != 0) - { - previous_callout = code; - code = auto_callout(code, ptr, cd); - } - goto NORMAL_CHAR; - } - } - - /* Fill in length of a previous callout, except when the next thing is - a quantifier. */ - - is_quantifier = c == '*' || c == '+' || c == '?' || - (c == '{' && is_counted_repeat(ptr+1)); - - if (!is_quantifier && previous_callout != NULL && - after_manual_callout-- <= 0) - { - complete_callout(previous_callout, ptr, cd); - previous_callout = NULL; - } - - /* In extended mode, skip white space and comments */ - - if ((options & PCRE_EXTENDED) != 0) - { - if ((cd->ctypes[c] & ctype_space) != 0) continue; - if (c == '#') - { - /* The space before the ; is to avoid a warning on a silly compiler - on the Macintosh. */ - while ((c = *(++ptr)) != 0 && c != NEWLINE) ; - if (c != 0) continue; /* Else fall through to handle end of string */ - } - } - - /* No auto callout for quantifiers. */ - - if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier) - { - previous_callout = code; - code = auto_callout(code, ptr, cd); - } - - switch(c) - { - /* The branch terminates at end of string, |, or ). */ - - case 0: - case '|': - case ')': - *firstbyteptr = firstbyte; - *reqbyteptr = reqbyte; - *codeptr = code; - *ptrptr = ptr; - return TRUE; - - /* Handle single-character metacharacters. In multiline mode, ^ disables - the setting of any following char as a first character. */ - - case '^': - if ((options & PCRE_MULTILINE) != 0) - { - if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; - } - previous = NULL; - *code++ = OP_CIRC; - break; - - case '$': - previous = NULL; - *code++ = OP_DOLL; - break; - - /* There can never be a first char if '.' is first, whatever happens about - repeats. The value of reqbyte doesn't change either. */ - - case '.': - if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; - zerofirstbyte = firstbyte; - zeroreqbyte = reqbyte; - previous = code; - *code++ = OP_ANY; - break; - - /* Character classes. If the included characters are all < 255 in value, we - build a 32-byte bitmap of the permitted characters, except in the special - case where there is only one such character. For negated classes, we build - the map as usual, then invert it at the end. However, we use a different - opcode so that data characters > 255 can be handled correctly. - - If the class contains characters outside the 0-255 range, a different - opcode is compiled. It may optionally have a bit map for characters < 256, - but those above are are explicitly listed afterwards. A flag byte tells - whether the bitmap is present, and whether this is a negated class or not. - */ - - case '[': - previous = code; - - /* PCRE supports POSIX class stuff inside a class. Perl gives an error if - they are encountered at the top level, so we'll do that too. */ - - if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && - check_posix_syntax(ptr, &tempptr, cd)) - { - *errorptr = (ptr[1] == ':')? ERR13 : ERR31; - goto FAILED; - } - - /* If the first character is '^', set the negation flag and skip it. */ - - if ((c = *(++ptr)) == '^') - { - negate_class = TRUE; - c = *(++ptr); - } - else - { - negate_class = FALSE; - } - - /* Keep a count of chars with values < 256 so that we can optimize the case - of just a single character (as long as it's < 256). For higher valued UTF-8 - characters, we don't yet do any optimization. */ - - class_charcount = 0; - class_lastchar = -1; - -#ifdef SUPPORT_UTF8 - class_utf8 = FALSE; /* No chars >= 256 */ - class_utf8data = code + LINK_SIZE + 34; /* For UTF-8 items */ -#endif - - /* Initialize the 32-char bit map to all zeros. We have to build the - map in a temporary bit of store, in case the class contains only 1 - character (< 256), because in that case the compiled code doesn't use the - bit map. */ - - memset(classbits, 0, 32 * sizeof(uschar)); - - /* Process characters until ] is reached. By writing this as a "do" it - means that an initial ] is taken as a data character. The first pass - through the regex checked the overall syntax, so we don't need to be very - strict here. At the start of the loop, c contains the first byte of the - character. */ - - do - { -#ifdef SUPPORT_UTF8 - if (utf8 && c > 127) - { /* Braces are required because the */ - GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ - } -#endif - - /* Inside \Q...\E everything is literal except \E */ - - if (inescq) - { - if (c == '\\' && ptr[1] == 'E') - { - inescq = FALSE; - ptr++; - continue; - } - else goto LONE_SINGLE_CHARACTER; - } - - /* Handle POSIX class names. Perl allows a negation extension of the - form [:^name:]. A square bracket that doesn't match the syntax is - treated as a literal. We also recognize the POSIX constructions - [.ch.] and [=ch=] ("collating elements") and fault them, as Perl - 5.6 and 5.8 do. */ - - if (c == '[' && - (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && - check_posix_syntax(ptr, &tempptr, cd)) - { - BOOL local_negate = FALSE; - int posix_class, i; - register const uschar *cbits = cd->cbits; - - if (ptr[1] != ':') - { - *errorptr = ERR31; - goto FAILED; - } - - ptr += 2; - if (*ptr == '^') - { - local_negate = TRUE; - ptr++; - } - - posix_class = check_posix_name(ptr, tempptr - ptr); - if (posix_class < 0) - { - *errorptr = ERR30; - goto FAILED; - } - - /* If matching is caseless, upper and lower are converted to - alpha. This relies on the fact that the class table starts with - alpha, lower, upper as the first 3 entries. */ - - if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) - posix_class = 0; - - /* Or into the map we are building up to 3 of the static class - tables, or their negations. The [:blank:] class sets up the same - chars as the [:space:] class (all white space). We remove the vertical - white space chars afterwards. */ - - posix_class *= 3; - for (i = 0; i < 3; i++) - { - BOOL blankclass = strncmp((char *)ptr, "blank", 5) == 0; - int taboffset = posix_class_maps[posix_class + i]; - if (taboffset < 0) break; - if (local_negate) - { - if (i == 0) - for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+taboffset]; - else - for (c = 0; c < 32; c++) classbits[c] &= ~cbits[c+taboffset]; - if (blankclass) classbits[1] |= 0x3c; - } - else - { - for (c = 0; c < 32; c++) classbits[c] |= cbits[c+taboffset]; - if (blankclass) classbits[1] &= ~0x3c; - } - } - - ptr = tempptr + 1; - class_charcount = 10; /* Set > 1; assumes more than 1 per class */ - continue; /* End of POSIX syntax handling */ - } - - /* Backslash may introduce a single character, or it may introduce one - of the specials, which just set a flag. Escaped items are checked for - validity in the pre-compiling pass. The sequence \b is a special case. - Inside a class (and only there) it is treated as backspace. Elsewhere - it marks a word boundary. Other escapes have preset maps ready to - or into the one we are building. We assume they have more than one - character in them, so set class_charcount bigger than one. */ - - if (c == '\\') - { - c = check_escape(&ptr, errorptr, *brackets, options, TRUE); - - if (-c == ESC_b) c = '\b'; /* \b is backslash in a class */ - else if (-c == ESC_X) c = 'X'; /* \X is literal X in a class */ - else if (-c == ESC_Q) /* Handle start of quoted string */ - { - if (ptr[1] == '\\' && ptr[2] == 'E') - { - ptr += 2; /* avoid empty string */ - } - else inescq = TRUE; - continue; - } - - if (c < 0) - { - register const uschar *cbits = cd->cbits; - class_charcount += 2; /* Greater than 1 is what matters */ - switch (-c) - { - case ESC_d: - for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit]; - continue; - - case ESC_D: - for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit]; - continue; - - case ESC_w: - for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word]; - continue; - - case ESC_W: - for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word]; - continue; - - case ESC_s: - for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; - classbits[1] &= ~0x08; /* Perl 5.004 onwards omits VT from \s */ - continue; - - case ESC_S: - for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space]; - classbits[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */ - continue; - -#ifdef SUPPORT_UCP - case ESC_p: - case ESC_P: - { - BOOL negated; - int property = get_ucp(&ptr, &negated, errorptr); - if (property < 0) goto FAILED; - class_utf8 = TRUE; - *class_utf8data++ = ((-c == ESC_p) != negated)? - XCL_PROP : XCL_NOTPROP; - *class_utf8data++ = property; - class_charcount -= 2; /* Not a < 256 character */ - } - continue; -#endif - - /* Unrecognized escapes are faulted if PCRE is running in its - strict mode. By default, for compatibility with Perl, they are - treated as literals. */ - - default: - if ((options & PCRE_EXTRA) != 0) - { - *errorptr = ERR7; - goto FAILED; - } - c = *ptr; /* The final character */ - class_charcount -= 2; /* Undo the default count from above */ - } - } - - /* Fall through if we have a single character (c >= 0). This may be - > 256 in UTF-8 mode. */ - - } /* End of backslash handling */ - - /* A single character may be followed by '-' to form a range. However, - Perl does not permit ']' to be the end of the range. A '-' character - here is treated as a literal. */ - - if (ptr[1] == '-' && ptr[2] != ']') - { - int d; - ptr += 2; - -#ifdef SUPPORT_UTF8 - if (utf8) - { /* Braces are required because the */ - GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */ - } - else -#endif - d = *ptr; /* Not UTF-8 mode */ - - /* The second part of a range can be a single-character escape, but - not any of the other escapes. Perl 5.6 treats a hyphen as a literal - in such circumstances. */ - - if (d == '\\') - { - const uschar *oldptr = ptr; - d = check_escape(&ptr, errorptr, *brackets, options, TRUE); - - /* \b is backslash; \X is literal X; any other special means the '-' - was literal */ - - if (d < 0) - { - if (d == -ESC_b) d = '\b'; - else if (d == -ESC_X) d = 'X'; else - { - ptr = oldptr - 2; - goto LONE_SINGLE_CHARACTER; /* A few lines below */ - } - } - } - - /* The check that the two values are in the correct order happens in - the pre-pass. Optimize one-character ranges */ - - if (d == c) goto LONE_SINGLE_CHARACTER; /* A few lines below */ - - /* In UTF-8 mode, if the upper limit is > 255, or > 127 for caseless - matching, we have to use an XCLASS with extra data items. Caseless - matching for characters > 127 is available only if UCP support is - available. */ - -#ifdef SUPPORT_UTF8 - if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127))) - { - class_utf8 = TRUE; - - /* With UCP support, we can find the other case equivalents of - the relevant characters. There may be several ranges. Optimize how - they fit with the basic range. */ - -#ifdef SUPPORT_UCP - if ((options & PCRE_CASELESS) != 0) - { - int occ, ocd; - int cc = c; - int origd = d; - while (get_othercase_range(&cc, origd, &occ, &ocd)) - { - if (occ >= c && ocd <= d) continue; /* Skip embedded ranges */ - - if (occ < c && ocd >= c - 1) /* Extend the basic range */ - { /* if there is overlap, */ - c = occ; /* noting that if occ < c */ - continue; /* we can't have ocd > d */ - } /* because a subrange is */ - if (ocd > d && occ <= d + 1) /* always shorter than */ - { /* the basic range. */ - d = ocd; - continue; - } - - if (occ == ocd) - { - *class_utf8data++ = XCL_SINGLE; - } - else - { - *class_utf8data++ = XCL_RANGE; - class_utf8data += ord2utf8(occ, class_utf8data); - } - class_utf8data += ord2utf8(ocd, class_utf8data); - } - } -#endif /* SUPPORT_UCP */ - - /* Now record the original range, possibly modified for UCP caseless - overlapping ranges. */ - - *class_utf8data++ = XCL_RANGE; - class_utf8data += ord2utf8(c, class_utf8data); - class_utf8data += ord2utf8(d, class_utf8data); - - /* With UCP support, we are done. Without UCP support, there is no - caseless matching for UTF-8 characters > 127; we can use the bit map - for the smaller ones. */ - -#ifdef SUPPORT_UCP - continue; /* With next character in the class */ -#else - if ((options & PCRE_CASELESS) == 0 || c > 127) continue; - - /* Adjust upper limit and fall through to set up the map */ - - d = 127; - -#endif /* SUPPORT_UCP */ - } -#endif /* SUPPORT_UTF8 */ - - /* We use the bit map for all cases when not in UTF-8 mode; else - ranges that lie entirely within 0-127 when there is UCP support; else - for partial ranges without UCP support. */ - - for (; c <= d; c++) - { - classbits[c/8] |= (1 << (c&7)); - if ((options & PCRE_CASELESS) != 0) - { - int uc = cd->fcc[c]; /* flip case */ - classbits[uc/8] |= (1 << (uc&7)); - } - class_charcount++; /* in case a one-char range */ - class_lastchar = c; - } - - continue; /* Go get the next char in the class */ - } - - /* Handle a lone single character - we can get here for a normal - non-escape char, or after \ that introduces a single character or for an - apparent range that isn't. */ - - LONE_SINGLE_CHARACTER: - - /* Handle a character that cannot go in the bit map */ - -#ifdef SUPPORT_UTF8 - if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127))) - { - class_utf8 = TRUE; - *class_utf8data++ = XCL_SINGLE; - class_utf8data += ord2utf8(c, class_utf8data); - -#ifdef SUPPORT_UCP - if ((options & PCRE_CASELESS) != 0) - { - int chartype; - int othercase; - if (ucp_findchar(c, &chartype, &othercase) >= 0 && othercase > 0) - { - *class_utf8data++ = XCL_SINGLE; - class_utf8data += ord2utf8(othercase, class_utf8data); - } - } -#endif /* SUPPORT_UCP */ - - } - else -#endif /* SUPPORT_UTF8 */ - - /* Handle a single-byte character */ - { - classbits[c/8] |= (1 << (c&7)); - if ((options & PCRE_CASELESS) != 0) - { - c = cd->fcc[c]; /* flip case */ - classbits[c/8] |= (1 << (c&7)); - } - class_charcount++; - class_lastchar = c; - } - } - - /* Loop until ']' reached; the check for end of string happens inside the - loop. This "while" is the end of the "do" above. */ - - while ((c = *(++ptr)) != ']' || inescq); - - /* If class_charcount is 1, we saw precisely one character whose value is - less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we - can optimize the negative case only if there were no characters >= 128 - because OP_NOT and the related opcodes like OP_NOTSTAR operate on - single-bytes only. This is an historical hangover. Maybe one day we can - tidy these opcodes to handle multi-byte characters. - - The optimization throws away the bit map. We turn the item into a - 1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note - that OP_NOT does not support multibyte characters. In the positive case, it - can cause firstbyte to be set. Otherwise, there can be no first char if - this item is first, whatever repeat count may follow. In the case of - reqbyte, save the previous value for reinstating. */ - -#ifdef SUPPORT_UTF8 - if (class_charcount == 1 && - (!utf8 || - (!class_utf8 && (!negate_class || class_lastchar < 128)))) - -#else - if (class_charcount == 1) -#endif - { - zeroreqbyte = reqbyte; - - /* The OP_NOT opcode works on one-byte characters only. */ - - if (negate_class) - { - if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; - zerofirstbyte = firstbyte; - *code++ = OP_NOT; - *code++ = class_lastchar; - break; - } - - /* For a single, positive character, get the value into mcbuffer, and - then we can handle this with the normal one-character code. */ - -#ifdef SUPPORT_UTF8 - if (utf8 && class_lastchar > 127) - mclength = ord2utf8(class_lastchar, mcbuffer); - else -#endif - { - mcbuffer[0] = class_lastchar; - mclength = 1; - } - goto ONE_CHAR; - } /* End of 1-char optimization */ - - /* The general case - not the one-char optimization. If this is the first - thing in the branch, there can be no first char setting, whatever the - repeat count. Any reqbyte setting must remain unchanged after any kind of - repeat. */ - - if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; - zerofirstbyte = firstbyte; - zeroreqbyte = reqbyte; - - /* If there are characters with values > 255, we have to compile an - extended class, with its own opcode. If there are no characters < 256, - we can omit the bitmap. */ - -#ifdef SUPPORT_UTF8 - if (class_utf8) - { - *class_utf8data++ = XCL_END; /* Marks the end of extra data */ - *code++ = OP_XCLASS; - code += LINK_SIZE; - *code = negate_class? XCL_NOT : 0; - - /* If the map is required, install it, and move on to the end of - the extra data */ - - if (class_charcount > 0) - { - *code++ |= XCL_MAP; - memcpy(code, classbits, 32); - code = class_utf8data; - } - - /* If the map is not required, slide down the extra data. */ - - else - { - int len = class_utf8data - (code + 33); - memmove(code + 1, code + 33, len); - code += len + 1; - } - - /* Now fill in the complete length of the item */ - - PUT(previous, 1, code - previous); - break; /* End of class handling */ - } -#endif - - /* If there are no characters > 255, negate the 32-byte map if necessary, - and copy it into the code vector. If this is the first thing in the branch, - there can be no first char setting, whatever the repeat count. Any reqbyte - setting must remain unchanged after any kind of repeat. */ - - if (negate_class) - { - *code++ = OP_NCLASS; - for (c = 0; c < 32; c++) code[c] = ~classbits[c]; - } - else - { - *code++ = OP_CLASS; - memcpy(code, classbits, 32); - } - code += 32; - break; - - /* Various kinds of repeat; '{' is not necessarily a quantifier, but this - has been tested above. */ - - case '{': - if (!is_quantifier) goto NORMAL_CHAR; - ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr); - if (*errorptr != NULL) goto FAILED; - goto REPEAT; - - case '*': - repeat_min = 0; - repeat_max = -1; - goto REPEAT; - - case '+': - repeat_min = 1; - repeat_max = -1; - goto REPEAT; - - case '?': - repeat_min = 0; - repeat_max = 1; - - REPEAT: - if (previous == NULL) - { - *errorptr = ERR9; - goto FAILED; - } - - if (repeat_min == 0) - { - firstbyte = zerofirstbyte; /* Adjust for zero repeat */ - reqbyte = zeroreqbyte; /* Ditto */ - } - - /* Remember whether this is a variable length repeat */ - - reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY; - - op_type = 0; /* Default single-char op codes */ - possessive_quantifier = FALSE; /* Default not possessive quantifier */ - - /* Save start of previous item, in case we have to move it up to make space - for an inserted OP_ONCE for the additional '+' extension. */ - - tempcode = previous; - - /* If the next character is '+', we have a possessive quantifier. This - implies greediness, whatever the setting of the PCRE_UNGREEDY option. - If the next character is '?' this is a minimizing repeat, by default, - but if PCRE_UNGREEDY is set, it works the other way round. We change the - repeat type to the non-default. */ - - if (ptr[1] == '+') - { - repeat_type = 0; /* Force greedy */ - possessive_quantifier = TRUE; - ptr++; - } - else if (ptr[1] == '?') - { - repeat_type = greedy_non_default; - ptr++; - } - else repeat_type = greedy_default; - - /* If previous was a recursion, we need to wrap it inside brackets so that - it can be replicated if necessary. */ - - if (*previous == OP_RECURSE) - { - memmove(previous + 1 + LINK_SIZE, previous, 1 + LINK_SIZE); - code += 1 + LINK_SIZE; - *previous = OP_BRA; - PUT(previous, 1, code - previous); - *code = OP_KET; - PUT(code, 1, code - previous); - code += 1 + LINK_SIZE; - } - - /* If previous was a character match, abolish the item and generate a - repeat item instead. If a char item has a minumum of more than one, ensure - that it is set in reqbyte - it might not be if a sequence such as x{3} is - the first thing in a branch because the x will have gone into firstbyte - instead. */ - - if (*previous == OP_CHAR || *previous == OP_CHARNC) - { - /* Deal with UTF-8 characters that take up more than one byte. It's - easier to write this out separately than try to macrify it. Use c to - hold the length of the character in bytes, plus 0x80 to flag that it's a - length rather than a small character. */ - -#ifdef SUPPORT_UTF8 - if (utf8 && (code[-1] & 0x80) != 0) - { - uschar *lastchar = code - 1; - while((*lastchar & 0xc0) == 0x80) lastchar--; - c = code - lastchar; /* Length of UTF-8 character */ - memcpy(utf8_char, lastchar, c); /* Save the char */ - c |= 0x80; /* Flag c as a length */ - } - else -#endif - - /* Handle the case of a single byte - either with no UTF8 support, or - with UTF-8 disabled, or for a UTF-8 character < 128. */ - - { - c = code[-1]; - if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt; - } - - goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ - } - - /* If previous was a single negated character ([^a] or similar), we use - one of the special opcodes, replacing it. The code is shared with single- - character repeats by setting opt_type to add a suitable offset into - repeat_type. OP_NOT is currently used only for single-byte chars. */ - - else if (*previous == OP_NOT) - { - op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */ - c = previous[1]; - goto OUTPUT_SINGLE_REPEAT; - } - - /* If previous was a character type match (\d or similar), abolish it and - create a suitable repeat item. The code is shared with single-character - repeats by setting op_type to add a suitable offset into repeat_type. Note - the the Unicode property types will be present only when SUPPORT_UCP is - defined, but we don't wrap the little bits of code here because it just - makes it horribly messy. */ - - else if (*previous < OP_EODN) - { - uschar *oldcode; - int prop_type; - op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ - c = *previous; - - OUTPUT_SINGLE_REPEAT: - prop_type = (*previous == OP_PROP || *previous == OP_NOTPROP)? - previous[1] : -1; - - oldcode = code; - code = previous; /* Usually overwrite previous item */ - - /* If the maximum is zero then the minimum must also be zero; Perl allows - this case, so we do too - by simply omitting the item altogether. */ - - if (repeat_max == 0) goto END_REPEAT; - - /* All real repeats make it impossible to handle partial matching (maybe - one day we will be able to remove this restriction). */ - - if (repeat_max != 1) cd->nopartial = TRUE; - - /* Combine the op_type with the repeat_type */ - - repeat_type += op_type; - - /* A minimum of zero is handled either as the special case * or ?, or as - an UPTO, with the maximum given. */ - - if (repeat_min == 0) - { - if (repeat_max == -1) *code++ = OP_STAR + repeat_type; - else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; - else - { - *code++ = OP_UPTO + repeat_type; - PUT2INC(code, 0, repeat_max); - } - } - - /* A repeat minimum of 1 is optimized into some special cases. If the - maximum is unlimited, we use OP_PLUS. Otherwise, the original item it - left in place and, if the maximum is greater than 1, we use OP_UPTO with - one less than the maximum. */ - - else if (repeat_min == 1) - { - if (repeat_max == -1) - *code++ = OP_PLUS + repeat_type; - else - { - code = oldcode; /* leave previous item in place */ - if (repeat_max == 1) goto END_REPEAT; - *code++ = OP_UPTO + repeat_type; - PUT2INC(code, 0, repeat_max - 1); - } - } - - /* The case {n,n} is just an EXACT, while the general case {n,m} is - handled as an EXACT followed by an UPTO. */ - - else - { - *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ - PUT2INC(code, 0, repeat_min); - - /* If the maximum is unlimited, insert an OP_STAR. Before doing so, - we have to insert the character for the previous code. For a repeated - Unicode property match, there is an extra byte that defines the - required property. In UTF-8 mode, long characters have their length in - c, with the 0x80 bit as a flag. */ - - if (repeat_max < 0) - { -#ifdef SUPPORT_UTF8 - if (utf8 && c >= 128) - { - memcpy(code, utf8_char, c & 7); - code += c & 7; - } - else -#endif - { - *code++ = c; - if (prop_type >= 0) *code++ = prop_type; - } - *code++ = OP_STAR + repeat_type; - } - - /* Else insert an UPTO if the max is greater than the min, again - preceded by the character, for the previously inserted code. */ - - else if (repeat_max != repeat_min) - { -#ifdef SUPPORT_UTF8 - if (utf8 && c >= 128) - { - memcpy(code, utf8_char, c & 7); - code += c & 7; - } - else -#endif - *code++ = c; - if (prop_type >= 0) *code++ = prop_type; - repeat_max -= repeat_min; - *code++ = OP_UPTO + repeat_type; - PUT2INC(code, 0, repeat_max); - } - } - - /* The character or character type itself comes last in all cases. */ - -#ifdef SUPPORT_UTF8 - if (utf8 && c >= 128) - { - memcpy(code, utf8_char, c & 7); - code += c & 7; - } - else -#endif - *code++ = c; - - /* For a repeated Unicode property match, there is an extra byte that - defines the required property. */ - -#ifdef SUPPORT_UCP - if (prop_type >= 0) *code++ = prop_type; -#endif - } - - /* If previous was a character class or a back reference, we put the repeat - stuff after it, but just skip the item if the repeat was {0,0}. */ - - else if (*previous == OP_CLASS || - *previous == OP_NCLASS || -#ifdef SUPPORT_UTF8 - *previous == OP_XCLASS || -#endif - *previous == OP_REF) - { - if (repeat_max == 0) - { - code = previous; - goto END_REPEAT; - } - - /* All real repeats make it impossible to handle partial matching (maybe - one day we will be able to remove this restriction). */ - - if (repeat_max != 1) cd->nopartial = TRUE; - - if (repeat_min == 0 && repeat_max == -1) - *code++ = OP_CRSTAR + repeat_type; - else if (repeat_min == 1 && repeat_max == -1) - *code++ = OP_CRPLUS + repeat_type; - else if (repeat_min == 0 && repeat_max == 1) - *code++ = OP_CRQUERY + repeat_type; - else - { - *code++ = OP_CRRANGE + repeat_type; - PUT2INC(code, 0, repeat_min); - if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ - PUT2INC(code, 0, repeat_max); - } - } - - /* If previous was a bracket group, we may have to replicate it in certain - cases. */ - - else if (*previous >= OP_BRA || *previous == OP_ONCE || - *previous == OP_COND) - { - register int i; - int ketoffset = 0; - int len = code - previous; - uschar *bralink = NULL; - - /* If the maximum repeat count is unlimited, find the end of the bracket - by scanning through from the start, and compute the offset back to it - from the current code pointer. There may be an OP_OPT setting following - the final KET, so we can't find the end just by going back from the code - pointer. */ - - if (repeat_max == -1) - { - register uschar *ket = previous; - do ket += GET(ket, 1); while (*ket != OP_KET); - ketoffset = code - ket; - } - - /* The case of a zero minimum is special because of the need to stick - OP_BRAZERO in front of it, and because the group appears once in the - data, whereas in other cases it appears the minimum number of times. For - this reason, it is simplest to treat this case separately, as otherwise - the code gets far too messy. There are several special subcases when the - minimum is zero. */ - - if (repeat_min == 0) - { - /* If the maximum is also zero, we just omit the group from the output - altogether. */ - - if (repeat_max == 0) - { - code = previous; - goto END_REPEAT; - } - - /* If the maximum is 1 or unlimited, we just have to stick in the - BRAZERO and do no more at this point. However, we do need to adjust - any OP_RECURSE calls inside the group that refer to the group itself or - any internal group, because the offset is from the start of the whole - regex. Temporarily terminate the pattern while doing this. */ - - if (repeat_max <= 1) - { - *code = OP_END; - adjust_recurse(previous, 1, utf8, cd); - memmove(previous+1, previous, len); - code++; - *previous++ = OP_BRAZERO + repeat_type; - } - - /* If the maximum is greater than 1 and limited, we have to replicate - in a nested fashion, sticking OP_BRAZERO before each set of brackets. - The first one has to be handled carefully because it's the original - copy, which has to be moved up. The remainder can be handled by code - that is common with the non-zero minimum case below. We have to - adjust the value or repeat_max, since one less copy is required. Once - again, we may have to adjust any OP_RECURSE calls inside the group. */ - - else - { - int offset; - *code = OP_END; - adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd); - memmove(previous + 2 + LINK_SIZE, previous, len); - code += 2 + LINK_SIZE; - *previous++ = OP_BRAZERO + repeat_type; - *previous++ = OP_BRA; - - /* We chain together the bracket offset fields that have to be - filled in later when the ends of the brackets are reached. */ - - offset = (bralink == NULL)? 0 : previous - bralink; - bralink = previous; - PUTINC(previous, 0, offset); - } - - repeat_max--; - } - - /* If the minimum is greater than zero, replicate the group as many - times as necessary, and adjust the maximum to the number of subsequent - copies that we need. If we set a first char from the group, and didn't - set a required char, copy the latter from the former. */ - - else - { - if (repeat_min > 1) - { - if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte; - for (i = 1; i < repeat_min; i++) - { - memcpy(code, previous, len); - code += len; - } - } - if (repeat_max > 0) repeat_max -= repeat_min; - } - - /* This code is common to both the zero and non-zero minimum cases. If - the maximum is limited, it replicates the group in a nested fashion, - remembering the bracket starts on a stack. In the case of a zero minimum, - the first one was set up above. In all cases the repeat_max now specifies - the number of additional copies needed. */ - - if (repeat_max >= 0) - { - for (i = repeat_max - 1; i >= 0; i--) - { - *code++ = OP_BRAZERO + repeat_type; - - /* All but the final copy start a new nesting, maintaining the - chain of brackets outstanding. */ - - if (i != 0) - { - int offset; - *code++ = OP_BRA; - offset = (bralink == NULL)? 0 : code - bralink; - bralink = code; - PUTINC(code, 0, offset); - } - - memcpy(code, previous, len); - code += len; - } - - /* Now chain through the pending brackets, and fill in their length - fields (which are holding the chain links pro tem). */ - - while (bralink != NULL) - { - int oldlinkoffset; - int offset = code - bralink + 1; - uschar *bra = code - offset; - oldlinkoffset = GET(bra, 1); - bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; - *code++ = OP_KET; - PUTINC(code, 0, offset); - PUT(bra, 1, offset); - } - } - - /* If the maximum is unlimited, set a repeater in the final copy. We - can't just offset backwards from the current code point, because we - don't know if there's been an options resetting after the ket. The - correct offset was computed above. */ - - else code[-ketoffset] = OP_KETRMAX + repeat_type; - } - - /* Else there's some kind of shambles */ - - else - { - *errorptr = ERR11; - goto FAILED; - } - - /* If the character following a repeat is '+', we wrap the entire repeated - item inside OP_ONCE brackets. This is just syntactic sugar, taken from - Sun's Java package. The repeated item starts at tempcode, not at previous, - which might be the first part of a string whose (former) last char we - repeated. However, we don't support '+' after a greediness '?'. */ - - if (possessive_quantifier) - { - int len = code - tempcode; - memmove(tempcode + 1+LINK_SIZE, tempcode, len); - code += 1 + LINK_SIZE; - len += 1 + LINK_SIZE; - tempcode[0] = OP_ONCE; - *code++ = OP_KET; - PUTINC(code, 0, len); - PUT(tempcode, 1, len); - } - - /* In all case we no longer have a previous item. We also set the - "follows varying string" flag for subsequently encountered reqbytes if - it isn't already set and we have just passed a varying length item. */ - - END_REPEAT: - previous = NULL; - cd->req_varyopt |= reqvary; - break; - - - /* Start of nested bracket sub-expression, or comment or lookahead or - lookbehind or option setting or condition. First deal with special things - that can come after a bracket; all are introduced by ?, and the appearance - of any of them means that this is not a referencing group. They were - checked for validity in the first pass over the string, so we don't have to - check for syntax errors here. */ - - case '(': - newoptions = options; - skipbytes = 0; - - if (*(++ptr) == '?') - { - int set, unset; - int *optset; - - switch (*(++ptr)) - { - case '#': /* Comment; skip to ket */ - ptr++; - while (*ptr != ')') ptr++; - continue; - - case ':': /* Non-extracting bracket */ - bravalue = OP_BRA; - ptr++; - break; - - case '(': - bravalue = OP_COND; /* Conditional group */ - - /* Condition to test for recursion */ - - if (ptr[1] == 'R') - { - code[1+LINK_SIZE] = OP_CREF; - PUT2(code, 2+LINK_SIZE, CREF_RECURSE); - skipbytes = 3; - ptr += 3; - } - - /* Condition to test for a numbered subpattern match. We know that - if a digit follows ( then there will just be digits until ) because - the syntax was checked in the first pass. */ - - else if ((digitab[ptr[1]] && ctype_digit) != 0) - { - int condref; /* Don't amalgamate; some compilers */ - condref = *(++ptr) - '0'; /* grumble at autoincrement in declaration */ - while (*(++ptr) != ')') condref = condref*10 + *ptr - '0'; - if (condref == 0) - { - *errorptr = ERR35; - goto FAILED; - } - ptr++; - code[1+LINK_SIZE] = OP_CREF; - PUT2(code, 2+LINK_SIZE, condref); - skipbytes = 3; - } - /* For conditions that are assertions, we just fall through, having - set bravalue above. */ - break; - - case '=': /* Positive lookahead */ - bravalue = OP_ASSERT; - ptr++; - break; - - case '!': /* Negative lookahead */ - bravalue = OP_ASSERT_NOT; - ptr++; - break; - - case '<': /* Lookbehinds */ - switch (*(++ptr)) - { - case '=': /* Positive lookbehind */ - bravalue = OP_ASSERTBACK; - ptr++; - break; - - case '!': /* Negative lookbehind */ - bravalue = OP_ASSERTBACK_NOT; - ptr++; - break; - } - break; - - case '>': /* One-time brackets */ - bravalue = OP_ONCE; - ptr++; - break; - - case 'C': /* Callout - may be followed by digits; */ - previous_callout = code; /* Save for later completion */ - after_manual_callout = 1; /* Skip one item before completing */ - *code++ = OP_CALLOUT; /* Already checked that the terminating */ - { /* closing parenthesis is present. */ - int n = 0; - while ((digitab[*(++ptr)] & ctype_digit) != 0) - n = n * 10 + *ptr - '0'; - if (n > 255) - { - *errorptr = ERR38; - goto FAILED; - } - *code++ = n; - PUT(code, 0, ptr - cd->start_pattern + 1); /* Pattern offset */ - PUT(code, LINK_SIZE, 0); /* Default length */ - code += 2 * LINK_SIZE; - } - previous = NULL; - continue; - - case 'P': /* Named subpattern handling */ - if (*(++ptr) == '<') /* Definition */ - { - int i, namelen; - uschar *slot = cd->name_table; - const uschar *name; /* Don't amalgamate; some compilers */ - name = ++ptr; /* grumble at autoincrement in declaration */ - - while (*ptr++ != '>'); - namelen = ptr - name - 1; - - for (i = 0; i < cd->names_found; i++) - { - int crc = memcmp(name, slot+2, namelen); - if (crc == 0) - { - if (slot[2+namelen] == 0) - { - *errorptr = ERR43; - goto FAILED; - } - crc = -1; /* Current name is substring */ - } - if (crc < 0) - { - memmove(slot + cd->name_entry_size, slot, - (cd->names_found - i) * cd->name_entry_size); - break; - } - slot += cd->name_entry_size; - } - - PUT2(slot, 0, *brackets + 1); - memcpy(slot + 2, name, namelen); - slot[2+namelen] = 0; - cd->names_found++; - goto NUMBERED_GROUP; - } - - if (*ptr == '=' || *ptr == '>') /* Reference or recursion */ - { - int i, namelen; - int type = *ptr++; - const uschar *name = ptr; - uschar *slot = cd->name_table; - - while (*ptr != ')') ptr++; - namelen = ptr - name; - - for (i = 0; i < cd->names_found; i++) - { - if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break; - slot += cd->name_entry_size; - } - if (i >= cd->names_found) - { - *errorptr = ERR15; - goto FAILED; - } - - recno = GET2(slot, 0); - - if (type == '>') goto HANDLE_RECURSION; /* A few lines below */ - - /* Back reference */ - - previous = code; - *code++ = OP_REF; - PUT2INC(code, 0, recno); - cd->backref_map |= (recno < 32)? (1 << recno) : 1; - if (recno > cd->top_backref) cd->top_backref = recno; - continue; - } - - /* Should never happen */ - break; - - case 'R': /* Pattern recursion */ - ptr++; /* Same as (?0) */ - /* Fall through */ - - /* Recursion or "subroutine" call */ - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - { - const uschar *called; - recno = 0; - while((digitab[*ptr] & ctype_digit) != 0) - recno = recno * 10 + *ptr++ - '0'; - - /* Come here from code above that handles a named recursion */ - - HANDLE_RECURSION: - - previous = code; - - /* Find the bracket that is being referenced. Temporarily end the - regex in case it doesn't exist. */ - - *code = OP_END; - called = (recno == 0)? - cd->start_code : find_bracket(cd->start_code, utf8, recno); - - if (called == NULL) - { - *errorptr = ERR15; - goto FAILED; - } - - /* If the subpattern is still open, this is a recursive call. We - check to see if this is a left recursion that could loop for ever, - and diagnose that case. */ - - if (GET(called, 1) == 0 && could_be_empty(called, code, bcptr, utf8)) - { - *errorptr = ERR40; - goto FAILED; - } - - /* Insert the recursion/subroutine item */ - - *code = OP_RECURSE; - PUT(code, 1, called - cd->start_code); - code += 1 + LINK_SIZE; - } - continue; - - /* Character after (? not specially recognized */ - - default: /* Option setting */ - set = unset = 0; - optset = &set; - - while (*ptr != ')' && *ptr != ':') - { - switch (*ptr++) - { - case '-': optset = &unset; break; - - case 'i': *optset |= PCRE_CASELESS; break; - case 'm': *optset |= PCRE_MULTILINE; break; - case 's': *optset |= PCRE_DOTALL; break; - case 'x': *optset |= PCRE_EXTENDED; break; - case 'U': *optset |= PCRE_UNGREEDY; break; - case 'X': *optset |= PCRE_EXTRA; break; - } - } - - /* Set up the changed option bits, but don't change anything yet. */ - - newoptions = (options | set) & (~unset); - - /* If the options ended with ')' this is not the start of a nested - group with option changes, so the options change at this level. Compile - code to change the ims options if this setting actually changes any of - them. We also pass the new setting back so that it can be put at the - start of any following branches, and when this group ends (if we are in - a group), a resetting item can be compiled. - - Note that if this item is right at the start of the pattern, the - options will have been abstracted and made global, so there will be no - change to compile. */ - - if (*ptr == ')') - { - if ((options & PCRE_IMS) != (newoptions & PCRE_IMS)) - { - *code++ = OP_OPT; - *code++ = newoptions & PCRE_IMS; - } - - /* Change options at this level, and pass them back for use - in subsequent branches. Reset the greedy defaults and the case - value for firstbyte and reqbyte. */ - - *optionsptr = options = newoptions; - greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); - greedy_non_default = greedy_default ^ 1; - req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; - - previous = NULL; /* This item can't be repeated */ - continue; /* It is complete */ - } - - /* If the options ended with ':' we are heading into a nested group - with possible change of options. Such groups are non-capturing and are - not assertions of any kind. All we need to do is skip over the ':'; - the newoptions value is handled below. */ - - bravalue = OP_BRA; - ptr++; - } - } - - /* If PCRE_NO_AUTO_CAPTURE is set, all unadorned brackets become - non-capturing and behave like (?:...) brackets */ - - else if ((options & PCRE_NO_AUTO_CAPTURE) != 0) - { - bravalue = OP_BRA; - } - - /* Else we have a referencing group; adjust the opcode. If the bracket - number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and - arrange for the true number to follow later, in an OP_BRANUMBER item. */ - - else - { - NUMBERED_GROUP: - if (++(*brackets) > EXTRACT_BASIC_MAX) - { - bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1; - code[1+LINK_SIZE] = OP_BRANUMBER; - PUT2(code, 2+LINK_SIZE, *brackets); - skipbytes = 3; - } - else bravalue = OP_BRA + *brackets; - } - - /* Process nested bracketed re. Assertions may not be repeated, but other - kinds can be. We copy code into a non-register variable in order to be able - to pass its address because some compilers complain otherwise. Pass in a - new setting for the ims options if they have changed. */ - - previous = (bravalue >= OP_ONCE)? code : NULL; - *code = bravalue; - tempcode = code; - tempreqvary = cd->req_varyopt; /* Save value before bracket */ - - if (!compile_regex( - newoptions, /* The complete new option state */ - options & PCRE_IMS, /* The previous ims option state */ - brackets, /* Extracting bracket count */ - &tempcode, /* Where to put code (updated) */ - &ptr, /* Input pointer (updated) */ - errorptr, /* Where to put an error message */ - (bravalue == OP_ASSERTBACK || - bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ - skipbytes, /* Skip over OP_COND/OP_BRANUMBER */ - &subfirstbyte, /* For possible first char */ - &subreqbyte, /* For possible last char */ - bcptr, /* Current branch chain */ - cd)) /* Tables block */ - goto FAILED; - - /* At the end of compiling, code is still pointing to the start of the - group, while tempcode has been updated to point past the end of the group - and any option resetting that may follow it. The pattern pointer (ptr) - is on the bracket. */ - - /* If this is a conditional bracket, check that there are no more than - two branches in the group. */ - - else if (bravalue == OP_COND) - { - uschar *tc = code; - condcount = 0; - - do { - condcount++; - tc += GET(tc,1); - } - while (*tc != OP_KET); - - if (condcount > 2) - { - *errorptr = ERR27; - goto FAILED; - } - - /* If there is just one branch, we must not make use of its firstbyte or - reqbyte, because this is equivalent to an empty second branch. */ - - if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE; - } - - /* Handle updating of the required and first characters. Update for normal - brackets of all kinds, and conditions with two branches (see code above). - If the bracket is followed by a quantifier with zero repeat, we have to - back off. Hence the definition of zeroreqbyte and zerofirstbyte outside the - main loop so that they can be accessed for the back off. */ - - zeroreqbyte = reqbyte; - zerofirstbyte = firstbyte; - groupsetfirstbyte = FALSE; - - if (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_COND) - { - /* If we have not yet set a firstbyte in this branch, take it from the - subpattern, remembering that it was set here so that a repeat of more - than one can replicate it as reqbyte if necessary. If the subpattern has - no firstbyte, set "none" for the whole branch. In both cases, a zero - repeat forces firstbyte to "none". */ - - if (firstbyte == REQ_UNSET) - { - if (subfirstbyte >= 0) - { - firstbyte = subfirstbyte; - groupsetfirstbyte = TRUE; - } - else firstbyte = REQ_NONE; - zerofirstbyte = REQ_NONE; - } - - /* If firstbyte was previously set, convert the subpattern's firstbyte - into reqbyte if there wasn't one, using the vary flag that was in - existence beforehand. */ - - else if (subfirstbyte >= 0 && subreqbyte < 0) - subreqbyte = subfirstbyte | tempreqvary; - - /* If the subpattern set a required byte (or set a first byte that isn't - really the first byte - see above), set it. */ - - if (subreqbyte >= 0) reqbyte = subreqbyte; - } - - /* For a forward assertion, we take the reqbyte, if set. This can be - helpful if the pattern that follows the assertion doesn't set a different - char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte - for an assertion, however because it leads to incorrect effect for patterns - such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead - of a firstbyte. This is overcome by a scan at the end if there's no - firstbyte, looking for an asserted first char. */ - - else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte; - - /* Now update the main code pointer to the end of the group. */ - - code = tempcode; - - /* Error if hit end of pattern */ - - if (*ptr != ')') - { - *errorptr = ERR14; - goto FAILED; - } - break; - - /* Check \ for being a real metacharacter; if not, fall through and handle - it as a data character at the start of a string. Escape items are checked - for validity in the pre-compiling pass. */ - - case '\\': - tempptr = ptr; - c = check_escape(&ptr, errorptr, *brackets, options, FALSE); - - /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values - are arranged to be the negation of the corresponding OP_values. For the - back references, the values are ESC_REF plus the reference number. Only - back references and those types that consume a character may be repeated. - We can test for values between ESC_b and ESC_Z for the latter; this may - have to change if any new ones are ever created. */ - - if (c < 0) - { - if (-c == ESC_Q) /* Handle start of quoted string */ - { - if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */ - else inescq = TRUE; - continue; - } - - /* For metasequences that actually match a character, we disable the - setting of a first character if it hasn't already been set. */ - - if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z) - firstbyte = REQ_NONE; - - /* Set values to reset to if this is followed by a zero repeat. */ - - zerofirstbyte = firstbyte; - zeroreqbyte = reqbyte; - - /* Back references are handled specially */ - - if (-c >= ESC_REF) - { - int number = -c - ESC_REF; - previous = code; - *code++ = OP_REF; - PUT2INC(code, 0, number); - } - - /* So are Unicode property matches, if supported. We know that get_ucp - won't fail because it was tested in the pre-pass. */ - -#ifdef SUPPORT_UCP - else if (-c == ESC_P || -c == ESC_p) - { - BOOL negated; - int value = get_ucp(&ptr, &negated, errorptr); - previous = code; - *code++ = ((-c == ESC_p) != negated)? OP_PROP : OP_NOTPROP; - *code++ = value; - } -#endif - - /* For the rest, we can obtain the OP value by negating the escape - value */ - - else - { - previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; - *code++ = -c; - } - continue; - } - - /* We have a data character whose value is in c. In UTF-8 mode it may have - a value > 127. We set its representation in the length/buffer, and then - handle it as a data character. */ - -#ifdef SUPPORT_UTF8 - if (utf8 && c > 127) - mclength = ord2utf8(c, mcbuffer); - else -#endif - - { - mcbuffer[0] = c; - mclength = 1; - } - - goto ONE_CHAR; - - /* Handle a literal character. It is guaranteed not to be whitespace or # - when the extended flag is set. If we are in UTF-8 mode, it may be a - multi-byte literal character. */ - - default: - NORMAL_CHAR: - mclength = 1; - mcbuffer[0] = c; - -#ifdef SUPPORT_UTF8 - if (utf8 && (c & 0xc0) == 0xc0) - { - while ((ptr[1] & 0xc0) == 0x80) - mcbuffer[mclength++] = *(++ptr); - } -#endif - - /* At this point we have the character's bytes in mcbuffer, and the length - in mclength. When not in UTF-8 mode, the length is always 1. */ - - ONE_CHAR: - previous = code; - *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARNC : OP_CHAR; - for (c = 0; c < mclength; c++) *code++ = mcbuffer[c]; - - /* Set the first and required bytes appropriately. If no previous first - byte, set it from this character, but revert to none on a zero repeat. - Otherwise, leave the firstbyte value alone, and don't change it on a zero - repeat. */ - - if (firstbyte == REQ_UNSET) - { - zerofirstbyte = REQ_NONE; - zeroreqbyte = reqbyte; - - /* If the character is more than one byte long, we can set firstbyte - only if it is not to be matched caselessly. */ - - if (mclength == 1 || req_caseopt == 0) - { - firstbyte = mcbuffer[0] | req_caseopt; - if (mclength != 1) reqbyte = code[-1] | cd->req_varyopt; - } - else firstbyte = reqbyte = REQ_NONE; - } - - /* firstbyte was previously set; we can set reqbyte only the length is - 1 or the matching is caseful. */ - - else - { - zerofirstbyte = firstbyte; - zeroreqbyte = reqbyte; - if (mclength == 1 || req_caseopt == 0) - reqbyte = code[-1] | req_caseopt | cd->req_varyopt; - } - - break; /* End of literal character handling */ - } - } /* end of big loop */ - -/* Control never reaches here by falling through, only by a goto for all the -error states. Pass back the position in the pattern so that it can be displayed -to the user for diagnosing the error. */ - -FAILED: -*ptrptr = ptr; -return FALSE; -} - - - - -/************************************************* -* Compile sequence of alternatives * -*************************************************/ - -/* On entry, ptr is pointing past the bracket character, but on return -it points to the closing bracket, or vertical bar, or end of string. -The code variable is pointing at the byte into which the BRA operator has been -stored. If the ims options are changed at the start (for a (?ims: group) or -during any branch, we need to insert an OP_OPT item at the start of every -following branch to ensure they get set correctly at run time, and also pass -the new options into every subsequent branch compile. - -Argument: - options option bits, including any changes for this subpattern - oldims previous settings of ims option bits - brackets -> int containing the number of extracting brackets used - codeptr -> the address of the current code pointer - ptrptr -> the address of the current pattern pointer - errorptr -> pointer to error message - lookbehind TRUE if this is a lookbehind assertion - skipbytes skip this many bytes at start (for OP_COND, OP_BRANUMBER) - firstbyteptr place to put the first required character, or a negative number - reqbyteptr place to put the last required character, or a negative number - bcptr pointer to the chain of currently open branches - cd points to the data block with tables pointers etc. - -Returns: TRUE on success -*/ - -static BOOL -compile_regex(int options, int oldims, int *brackets, uschar **codeptr, - const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int skipbytes, - int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd) -{ -const uschar *ptr = *ptrptr; -uschar *code = *codeptr; -uschar *last_branch = code; -uschar *start_bracket = code; -uschar *reverse_count = NULL; -int firstbyte, reqbyte; -int branchfirstbyte, branchreqbyte; -branch_chain bc; - -bc.outer = bcptr; -bc.current = code; - -firstbyte = reqbyte = REQ_UNSET; - -/* Offset is set zero to mark that this bracket is still open */ - -PUT(code, 1, 0); -code += 1 + LINK_SIZE + skipbytes; - -/* Loop for each alternative branch */ - -for (;;) - { - /* Handle a change of ims options at the start of the branch */ - - if ((options & PCRE_IMS) != oldims) - { - *code++ = OP_OPT; - *code++ = options & PCRE_IMS; - } - - /* Set up dummy OP_REVERSE if lookbehind assertion */ - - if (lookbehind) - { - *code++ = OP_REVERSE; - reverse_count = code; - PUTINC(code, 0, 0); - } - - /* Now compile the branch */ - - if (!compile_branch(&options, brackets, &code, &ptr, errorptr, - &branchfirstbyte, &branchreqbyte, &bc, cd)) - { - *ptrptr = ptr; - return FALSE; - } - - /* If this is the first branch, the firstbyte and reqbyte values for the - branch become the values for the regex. */ - - if (*last_branch != OP_ALT) - { - firstbyte = branchfirstbyte; - reqbyte = branchreqbyte; - } - - /* If this is not the first branch, the first char and reqbyte have to - match the values from all the previous branches, except that if the previous - value for reqbyte didn't have REQ_VARY set, it can still match, and we set - REQ_VARY for the regex. */ - - else - { - /* If we previously had a firstbyte, but it doesn't match the new branch, - we have to abandon the firstbyte for the regex, but if there was previously - no reqbyte, it takes on the value of the old firstbyte. */ - - if (firstbyte >= 0 && firstbyte != branchfirstbyte) - { - if (reqbyte < 0) reqbyte = firstbyte; - firstbyte = REQ_NONE; - } - - /* If we (now or from before) have no firstbyte, a firstbyte from the - branch becomes a reqbyte if there isn't a branch reqbyte. */ - - if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0) - branchreqbyte = branchfirstbyte; - - /* Now ensure that the reqbytes match */ - - if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY)) - reqbyte = REQ_NONE; - else reqbyte |= branchreqbyte; /* To "or" REQ_VARY */ - } - - /* If lookbehind, check that this branch matches a fixed-length string, - and put the length into the OP_REVERSE item. Temporarily mark the end of - the branch with OP_END. */ - - if (lookbehind) - { - int length; - *code = OP_END; - length = find_fixedlength(last_branch, options); - DPRINTF(("fixed length = %d\n", length)); - if (length < 0) - { - *errorptr = (length == -2)? ERR36 : ERR25; - *ptrptr = ptr; - return FALSE; - } - PUT(reverse_count, 0, length); - } - - /* Reached end of expression, either ')' or end of pattern. Go back through - the alternative branches and reverse the chain of offsets, with the field in - the BRA item now becoming an offset to the first alternative. If there are - no alternatives, it points to the end of the group. The length in the - terminating ket is always the length of the whole bracketed item. If any of - the ims options were changed inside the group, compile a resetting op-code - following, except at the very end of the pattern. Return leaving the pointer - at the terminating char. */ - - if (*ptr != '|') - { - int length = code - last_branch; - do - { - int prev_length = GET(last_branch, 1); - PUT(last_branch, 1, length); - length = prev_length; - last_branch -= length; - } - while (length > 0); - - /* Fill in the ket */ - - *code = OP_KET; - PUT(code, 1, code - start_bracket); - code += 1 + LINK_SIZE; - - /* Resetting option if needed */ - - if ((options & PCRE_IMS) != oldims && *ptr == ')') - { - *code++ = OP_OPT; - *code++ = oldims; - } - - /* Set values to pass back */ - - *codeptr = code; - *ptrptr = ptr; - *firstbyteptr = firstbyte; - *reqbyteptr = reqbyte; - return TRUE; - } - - /* Another branch follows; insert an "or" node. Its length field points back - to the previous branch while the bracket remains open. At the end the chain - is reversed. It's done like this so that the start of the bracket has a - zero offset until it is closed, making it possible to detect recursion. */ - - *code = OP_ALT; - PUT(code, 1, code - last_branch); - bc.current = last_branch = code; - code += 1 + LINK_SIZE; - ptr++; - } -/* Control never reaches here */ -} - - - - -/************************************************* -* Check for anchored expression * -*************************************************/ - -/* Try to find out if this is an anchored regular expression. Consider each -alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket -all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then -it's anchored. However, if this is a multiline pattern, then only OP_SOD -counts, since OP_CIRC can match in the middle. - -We can also consider a regex to be anchored if OP_SOM starts all its branches. -This is the code for \G, which means "match at start of match position, taking -into account the match offset". - -A branch is also implicitly anchored if it starts with .* and DOTALL is set, -because that will try the rest of the pattern at all possible matching points, -so there is no point trying again.... er .... - -.... except when the .* appears inside capturing parentheses, and there is a -subsequent back reference to those parentheses. We haven't enough information -to catch that case precisely. - -At first, the best we could do was to detect when .* was in capturing brackets -and the highest back reference was greater than or equal to that level. -However, by keeping a bitmap of the first 31 back references, we can catch some -of the more common cases more precisely. - -Arguments: - code points to start of expression (the bracket) - options points to the options setting - bracket_map a bitmap of which brackets we are inside while testing; this - handles up to substring 31; after that we just have to take - the less precise approach - backref_map the back reference bitmap - -Returns: TRUE or FALSE -*/ - -static BOOL -is_anchored(register const uschar *code, int *options, unsigned int bracket_map, - unsigned int backref_map) -{ -do { - const uschar *scode = - first_significant_code(code + 1+LINK_SIZE, options, PCRE_MULTILINE, FALSE); - register int op = *scode; - - /* Capturing brackets */ - - if (op > OP_BRA) - { - int new_map; - op -= OP_BRA; - if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE); - new_map = bracket_map | ((op < 32)? (1 << op) : 1); - if (!is_anchored(scode, options, new_map, backref_map)) return FALSE; - } - - /* Other brackets */ - - else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) - { - if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE; - } - - /* .* is not anchored unless DOTALL is set and it isn't in brackets that - are or may be referenced. */ - - else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) && - (*options & PCRE_DOTALL) != 0) - { - if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; - } - - /* Check for explicit anchoring */ - - else if (op != OP_SOD && op != OP_SOM && - ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) - return FALSE; - code += GET(code, 1); - } -while (*code == OP_ALT); /* Loop for each alternative */ -return TRUE; -} - - - -/************************************************* -* Check for starting with ^ or .* * -*************************************************/ - -/* This is called to find out if every branch starts with ^ or .* so that -"first char" processing can be done to speed things up in multiline -matching and for non-DOTALL patterns that start with .* (which must start at -the beginning or after \n). As in the case of is_anchored() (see above), we -have to take account of back references to capturing brackets that contain .* -because in that case we can't make the assumption. - -Arguments: - code points to start of expression (the bracket) - bracket_map a bitmap of which brackets we are inside while testing; this - handles up to substring 31; after that we just have to take - the less precise approach - backref_map the back reference bitmap - -Returns: TRUE or FALSE -*/ - -static BOOL -is_startline(const uschar *code, unsigned int bracket_map, - unsigned int backref_map) -{ -do { - const uschar *scode = first_significant_code(code + 1+LINK_SIZE, NULL, 0, - FALSE); - register int op = *scode; - - /* Capturing brackets */ - - if (op > OP_BRA) - { - int new_map; - op -= OP_BRA; - if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE); - new_map = bracket_map | ((op < 32)? (1 << op) : 1); - if (!is_startline(scode, new_map, backref_map)) return FALSE; - } - - /* Other brackets */ - - else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) - { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; } - - /* .* means "start at start or after \n" if it isn't in brackets that - may be referenced. */ - - else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR) - { - if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; - } - - /* Check for explicit circumflex */ - - else if (op != OP_CIRC) return FALSE; - - /* Move on to the next alternative */ - - code += GET(code, 1); - } -while (*code == OP_ALT); /* Loop for each alternative */ -return TRUE; -} - - - -/************************************************* -* Check for asserted fixed first char * -*************************************************/ - -/* During compilation, the "first char" settings from forward assertions are -discarded, because they can cause conflicts with actual literals that follow. -However, if we end up without a first char setting for an unanchored pattern, -it is worth scanning the regex to see if there is an initial asserted first -char. If all branches start with the same asserted char, or with a bracket all -of whose alternatives start with the same asserted char (recurse ad lib), then -we return that char, otherwise -1. - -Arguments: - code points to start of expression (the bracket) - options pointer to the options (used to check casing changes) - inassert TRUE if in an assertion - -Returns: -1 or the fixed first char -*/ - -static int -find_firstassertedchar(const uschar *code, int *options, BOOL inassert) -{ -register int c = -1; -do { - int d; - const uschar *scode = - first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS, TRUE); - register int op = *scode; - - if (op >= OP_BRA) op = OP_BRA; - - switch(op) - { - default: - return -1; - - case OP_BRA: - case OP_ASSERT: - case OP_ONCE: - case OP_COND: - if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0) - return -1; - if (c < 0) c = d; else if (c != d) return -1; - break; - - case OP_EXACT: /* Fall through */ - scode += 2; - - case OP_CHAR: - case OP_CHARNC: - case OP_PLUS: - case OP_MINPLUS: - if (!inassert) return -1; - if (c < 0) - { - c = scode[1]; - if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS; - } - else if (c != scode[1]) return -1; - break; - } - - code += GET(code, 1); - } -while (*code == OP_ALT); -return c; -} - - - - -#ifdef SUPPORT_UTF8 -/************************************************* -* Validate a UTF-8 string * -*************************************************/ - -/* This function is called (optionally) at the start of compile or match, to -validate that a supposed UTF-8 string is actually valid. The early check means -that subsequent code can assume it is dealing with a valid string. The check -can be turned off for maximum performance, but then consequences of supplying -an invalid string are then undefined. - -Arguments: - string points to the string - length length of string, or -1 if the string is zero-terminated - -Returns: < 0 if the string is a valid UTF-8 string - >= 0 otherwise; the value is the offset of the bad byte -*/ - -static int -valid_utf8(const uschar *string, int length) -{ -register const uschar *p; - -if (length < 0) - { - for (p = string; *p != 0; p++); - length = p - string; - } - -for (p = string; length-- > 0; p++) - { - register int ab; - register int c = *p; - if (c < 128) continue; - if ((c & 0xc0) != 0xc0) return p - string; - ab = utf8_table4[c & 0x3f]; /* Number of additional bytes */ - if (length < ab) return p - string; - length -= ab; - - /* Check top bits in the second byte */ - if ((*(++p) & 0xc0) != 0x80) return p - string; - - /* Check for overlong sequences for each different length */ - switch (ab) - { - /* Check for xx00 000x */ - case 1: - if ((c & 0x3e) == 0) return p - string; - continue; /* We know there aren't any more bytes to check */ - - /* Check for 1110 0000, xx0x xxxx */ - case 2: - if (c == 0xe0 && (*p & 0x20) == 0) return p - string; - break; - - /* Check for 1111 0000, xx00 xxxx */ - case 3: - if (c == 0xf0 && (*p & 0x30) == 0) return p - string; - break; - - /* Check for 1111 1000, xx00 0xxx */ - case 4: - if (c == 0xf8 && (*p & 0x38) == 0) return p - string; - break; - - /* Check for leading 0xfe or 0xff, and then for 1111 1100, xx00 00xx */ - case 5: - if (c == 0xfe || c == 0xff || - (c == 0xfc && (*p & 0x3c) == 0)) return p - string; - break; - } - - /* Check for valid bytes after the 2nd, if any; all must start 10 */ - while (--ab > 0) - { - if ((*(++p) & 0xc0) != 0x80) return p - string; - } - } - -return -1; -} -#endif - - - -/************************************************* -* Compile a Regular Expression * -*************************************************/ - -/* This function takes a string and returns a pointer to a block of store -holding a compiled version of the expression. - -Arguments: - pattern the regular expression - options various option bits - errorptr pointer to pointer to error text - erroroffset ptr offset in pattern where error was detected - tables pointer to character tables or NULL - -Returns: pointer to compiled data block, or NULL on error, - with errorptr and erroroffset set -*/ - -EXPORT pcre * -pcre_compile(const char *pattern, int options, const char **errorptr, - int *erroroffset, const unsigned char *tables) -{ -real_pcre *re; -int length = 1 + LINK_SIZE; /* For initial BRA plus length */ -int c, firstbyte, reqbyte; -int bracount = 0; -int branch_extra = 0; -int branch_newextra; -int item_count = -1; -int name_count = 0; -int max_name_size = 0; -int lastitemlength = 0; -#ifdef SUPPORT_UTF8 -BOOL utf8; -BOOL class_utf8; -#endif -BOOL inescq = FALSE; -unsigned int brastackptr = 0; -size_t size; -uschar *code; -const uschar *codestart; -const uschar *ptr; -compile_data compile_block; -int brastack[BRASTACK_SIZE]; -uschar bralenstack[BRASTACK_SIZE]; - -/* We can't pass back an error message if errorptr is NULL; I guess the best we -can do is just return NULL. */ - -if (errorptr == NULL) return NULL; -*errorptr = NULL; - -/* However, we can give a message for this error */ - -if (erroroffset == NULL) - { - *errorptr = ERR16; - return NULL; - } -*erroroffset = 0; - -/* Can't support UTF8 unless PCRE has been compiled to include the code. */ - -#ifdef SUPPORT_UTF8 -utf8 = (options & PCRE_UTF8) != 0; -if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 && - (*erroroffset = valid_utf8((uschar *)pattern, -1)) >= 0) - { - *errorptr = ERR44; - return NULL; - } -#else -if ((options & PCRE_UTF8) != 0) - { - *errorptr = ERR32; - return NULL; - } -#endif - -if ((options & ~PUBLIC_OPTIONS) != 0) - { - *errorptr = ERR17; - return NULL; - } - -/* Set up pointers to the individual character tables */ - -if (tables == NULL) tables = pcre_default_tables; -compile_block.lcc = tables + lcc_offset; -compile_block.fcc = tables + fcc_offset; -compile_block.cbits = tables + cbits_offset; -compile_block.ctypes = tables + ctypes_offset; - -/* Maximum back reference and backref bitmap. This is updated for numeric -references during the first pass, but for named references during the actual -compile pass. The bitmap records up to 31 back references to help in deciding -whether (.*) can be treated as anchored or not. */ - -compile_block.top_backref = 0; -compile_block.backref_map = 0; - -/* Reflect pattern for debugging output */ - -DPRINTF(("------------------------------------------------------------------\n")); -DPRINTF(("%s\n", pattern)); - -/* The first thing to do is to make a pass over the pattern to compute the -amount of store required to hold the compiled code. This does not have to be -perfect as long as errors are overestimates. At the same time we can detect any -flag settings right at the start, and extract them. Make an attempt to correct -for any counted white space if an "extended" flag setting appears late in the -pattern. We can't be so clever for #-comments. */ - -ptr = (const uschar *)(pattern - 1); -while ((c = *(++ptr)) != 0) - { - int min, max; - int class_optcount; - int bracket_length; - int duplength; - - /* If we are inside a \Q...\E sequence, all chars are literal */ - - if (inescq) - { - if ((options & PCRE_AUTO_CALLOUT) != 0) length += 2 + 2*LINK_SIZE; - goto NORMAL_CHAR; - } - - /* Otherwise, first check for ignored whitespace and comments */ - - if ((options & PCRE_EXTENDED) != 0) - { - if ((compile_block.ctypes[c] & ctype_space) != 0) continue; - if (c == '#') - { - /* The space before the ; is to avoid a warning on a silly compiler - on the Macintosh. */ - while ((c = *(++ptr)) != 0 && c != NEWLINE) ; - if (c == 0) break; - continue; - } - } - - item_count++; /* Is zero for the first non-comment item */ - - /* Allow space for auto callout before every item except quantifiers. */ - - if ((options & PCRE_AUTO_CALLOUT) != 0 && - c != '*' && c != '+' && c != '?' && - (c != '{' || !is_counted_repeat(ptr + 1))) - length += 2 + 2*LINK_SIZE; - - switch(c) - { - /* A backslashed item may be an escaped data character or it may be a - character type. */ - - case '\\': - c = check_escape(&ptr, errorptr, bracount, options, FALSE); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - - lastitemlength = 1; /* Default length of last item for repeats */ - - if (c >= 0) /* Data character */ - { - length += 2; /* For a one-byte character */ - -#ifdef SUPPORT_UTF8 - if (utf8 && c > 127) - { - int i; - for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) - if (c <= utf8_table1[i]) break; - length += i; - lastitemlength += i; - } -#endif - - continue; - } - - /* If \Q, enter "literal" mode */ - - if (-c == ESC_Q) - { - inescq = TRUE; - continue; - } - - /* \X is supported only if Unicode property support is compiled */ - -#ifndef SUPPORT_UCP - if (-c == ESC_X) - { - *errorptr = ERR45; - goto PCRE_ERROR_RETURN; - } -#endif - - /* \P and \p are for Unicode properties, but only when the support has - been compiled. Each item needs 2 bytes. */ - - else if (-c == ESC_P || -c == ESC_p) - { -#ifdef SUPPORT_UCP - BOOL negated; - length += 2; - lastitemlength = 2; - if (get_ucp(&ptr, &negated, errorptr) < 0) goto PCRE_ERROR_RETURN; - continue; -#else - *errorptr = ERR45; - goto PCRE_ERROR_RETURN; -#endif - } - - /* Other escapes need one byte */ - - length++; - - /* A back reference needs an additional 2 bytes, plus either one or 5 - bytes for a repeat. We also need to keep the value of the highest - back reference. */ - - if (c <= -ESC_REF) - { - int refnum = -c - ESC_REF; - compile_block.backref_map |= (refnum < 32)? (1 << refnum) : 1; - if (refnum > compile_block.top_backref) - compile_block.top_backref = refnum; - length += 2; /* For single back reference */ - if (ptr[1] == '{' && is_counted_repeat(ptr+2)) - { - ptr = read_repeat_counts(ptr+2, &min, &max, errorptr); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if ((min == 0 && (max == 1 || max == -1)) || - (min == 1 && max == -1)) - length++; - else length += 5; - if (ptr[1] == '?') ptr++; - } - } - continue; - - case '^': /* Single-byte metacharacters */ - case '.': - case '$': - length++; - lastitemlength = 1; - continue; - - case '*': /* These repeats won't be after brackets; */ - case '+': /* those are handled separately */ - case '?': - length++; - goto POSESSIVE; /* A few lines below */ - - /* This covers the cases of braced repeats after a single char, metachar, - class, or back reference. */ - - case '{': - if (!is_counted_repeat(ptr+1)) goto NORMAL_CHAR; - ptr = read_repeat_counts(ptr+1, &min, &max, errorptr); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - - /* These special cases just insert one extra opcode */ - - if ((min == 0 && (max == 1 || max == -1)) || - (min == 1 && max == -1)) - length++; - - /* These cases might insert additional copies of a preceding character. */ - - else - { - if (min != 1) - { - length -= lastitemlength; /* Uncount the original char or metachar */ - if (min > 0) length += 3 + lastitemlength; - } - length += lastitemlength + ((max > 0)? 3 : 1); - } - - if (ptr[1] == '?') ptr++; /* Needs no extra length */ - - POSESSIVE: /* Test for possessive quantifier */ - if (ptr[1] == '+') - { - ptr++; - length += 2 + 2*LINK_SIZE; /* Allow for atomic brackets */ - } - continue; - - /* An alternation contains an offset to the next branch or ket. If any ims - options changed in the previous branch(es), and/or if we are in a - lookbehind assertion, extra space will be needed at the start of the - branch. This is handled by branch_extra. */ - - case '|': - length += 1 + LINK_SIZE + branch_extra; - continue; - - /* A character class uses 33 characters provided that all the character - values are less than 256. Otherwise, it uses a bit map for low valued - characters, and individual items for others. Don't worry about character - types that aren't allowed in classes - they'll get picked up during the - compile. A character class that contains only one single-byte character - uses 2 or 3 bytes, depending on whether it is negated or not. Notice this - where we can. (In UTF-8 mode we can do this only for chars < 128.) */ - - case '[': - if (*(++ptr) == '^') - { - class_optcount = 10; /* Greater than one */ - ptr++; - } - else class_optcount = 0; - -#ifdef SUPPORT_UTF8 - class_utf8 = FALSE; -#endif - - /* Written as a "do" so that an initial ']' is taken as data */ - - if (*ptr != 0) do - { - /* Inside \Q...\E everything is literal except \E */ - - if (inescq) - { - if (*ptr != '\\' || ptr[1] != 'E') goto GET_ONE_CHARACTER; - inescq = FALSE; - ptr += 1; - continue; - } - - /* Outside \Q...\E, check for escapes */ - - if (*ptr == '\\') - { - c = check_escape(&ptr, errorptr, bracount, options, TRUE); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - - /* \b is backspace inside a class; \X is literal */ - - if (-c == ESC_b) c = '\b'; - else if (-c == ESC_X) c = 'X'; - - /* \Q enters quoting mode */ - - else if (-c == ESC_Q) - { - inescq = TRUE; - continue; - } - - /* Handle escapes that turn into characters */ - - if (c >= 0) goto NON_SPECIAL_CHARACTER; - - /* Escapes that are meta-things. The normal ones just affect the - bit map, but Unicode properties require an XCLASS extended item. */ - - else - { - class_optcount = 10; /* \d, \s etc; make sure > 1 */ -#ifdef SUPPORT_UTF8 - if (-c == ESC_p || -c == ESC_P) - { - if (!class_utf8) - { - class_utf8 = TRUE; - length += LINK_SIZE + 2; - } - length += 2; - } -#endif - } - } - - /* Check the syntax for POSIX stuff. The bits we actually handle are - checked during the real compile phase. */ - - else if (*ptr == '[' && check_posix_syntax(ptr, &ptr, &compile_block)) - { - ptr++; - class_optcount = 10; /* Make sure > 1 */ - } - - /* Anything else increments the possible optimization count. We have to - detect ranges here so that we can compute the number of extra ranges for - caseless wide characters when UCP support is available. If there are wide - characters, we are going to have to use an XCLASS, even for single - characters. */ - - else - { - int d; - - GET_ONE_CHARACTER: - -#ifdef SUPPORT_UTF8 - if (utf8) - { - int extra = 0; - GETCHARLEN(c, ptr, extra); - ptr += extra; - } - else c = *ptr; -#else - c = *ptr; -#endif - - /* Come here from handling \ above when it escapes to a char value */ - - NON_SPECIAL_CHARACTER: - class_optcount++; - - d = -1; - if (ptr[1] == '-') - { - uschar const *hyptr = ptr++; - if (ptr[1] == '\\') - { - ptr++; - d = check_escape(&ptr, errorptr, bracount, options, TRUE); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if (-d == ESC_b) d = '\b'; /* backspace */ - else if (-d == ESC_X) d = 'X'; /* literal X in a class */ - } - else if (ptr[1] != 0 && ptr[1] != ']') - { - ptr++; -#ifdef SUPPORT_UTF8 - if (utf8) - { - int extra = 0; - GETCHARLEN(d, ptr, extra); - ptr += extra; - } - else -#endif - d = *ptr; - } - if (d < 0) ptr = hyptr; /* go back to hyphen as data */ - } - - /* If d >= 0 we have a range. In UTF-8 mode, if the end is > 255, or > - 127 for caseless matching, we will need to use an XCLASS. */ - - if (d >= 0) - { - class_optcount = 10; /* Ensure > 1 */ - if (d < c) - { - *errorptr = ERR8; - goto PCRE_ERROR_RETURN; - } - -#ifdef SUPPORT_UTF8 - if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127))) - { - uschar buffer[6]; - if (!class_utf8) /* Allow for XCLASS overhead */ - { - class_utf8 = TRUE; - length += LINK_SIZE + 2; - } - -#ifdef SUPPORT_UCP - /* If we have UCP support, find out how many extra ranges are - needed to map the other case of characters within this range. We - have to mimic the range optimization here, because extending the - range upwards might push d over a boundary that makes is use - another byte in the UTF-8 representation. */ - - if ((options & PCRE_CASELESS) != 0) - { - int occ, ocd; - int cc = c; - int origd = d; - while (get_othercase_range(&cc, origd, &occ, &ocd)) - { - if (occ >= c && ocd <= d) continue; /* Skip embedded */ - - if (occ < c && ocd >= c - 1) /* Extend the basic range */ - { /* if there is overlap, */ - c = occ; /* noting that if occ < c */ - continue; /* we can't have ocd > d */ - } /* because a subrange is */ - if (ocd > d && occ <= d + 1) /* always shorter than */ - { /* the basic range. */ - d = ocd; - continue; - } - - /* An extra item is needed */ - - length += 1 + ord2utf8(occ, buffer) + - ((occ == ocd)? 0 : ord2utf8(ocd, buffer)); - } - } -#endif /* SUPPORT_UCP */ - - /* The length of the (possibly extended) range */ - - length += 1 + ord2utf8(c, buffer) + ord2utf8(d, buffer); - } -#endif /* SUPPORT_UTF8 */ - - } - - /* We have a single character. There is nothing to be done unless we - are in UTF-8 mode. If the char is > 255, or 127 when caseless, we must - allow for an XCL_SINGLE item, doubled for caselessness if there is UCP - support. */ - - else - { -#ifdef SUPPORT_UTF8 - if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127))) - { - uschar buffer[6]; - class_optcount = 10; /* Ensure > 1 */ - if (!class_utf8) /* Allow for XCLASS overhead */ - { - class_utf8 = TRUE; - length += LINK_SIZE + 2; - } -#ifdef SUPPORT_UCP - length += (((options & PCRE_CASELESS) != 0)? 2 : 1) * - (1 + ord2utf8(c, buffer)); -#else /* SUPPORT_UCP */ - length += 1 + ord2utf8(c, buffer); -#endif /* SUPPORT_UCP */ - } -#endif /* SUPPORT_UTF8 */ - } - } - } - while (*(++ptr) != 0 && (inescq || *ptr != ']')); /* Concludes "do" above */ - - if (*ptr == 0) /* Missing terminating ']' */ - { - *errorptr = ERR6; - goto PCRE_ERROR_RETURN; - } - - /* We can optimize when there was only one optimizable character. Repeats - for positive and negated single one-byte chars are handled by the general - code. Here, we handle repeats for the class opcodes. */ - - if (class_optcount == 1) length += 3; else - { - length += 33; - - /* A repeat needs either 1 or 5 bytes. If it is a possessive quantifier, - we also need extra for wrapping the whole thing in a sub-pattern. */ - - if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2)) - { - ptr = read_repeat_counts(ptr+2, &min, &max, errorptr); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - if ((min == 0 && (max == 1 || max == -1)) || - (min == 1 && max == -1)) - length++; - else length += 5; - if (ptr[1] == '+') - { - ptr++; - length += 2 + 2*LINK_SIZE; - } - else if (ptr[1] == '?') ptr++; - } - } - continue; - - /* Brackets may be genuine groups or special things */ - - case '(': - branch_newextra = 0; - bracket_length = 1 + LINK_SIZE; - - /* Handle special forms of bracket, which all start (? */ - - if (ptr[1] == '?') - { - int set, unset; - int *optset; - - switch (c = ptr[2]) - { - /* Skip over comments entirely */ - case '#': - ptr += 3; - while (*ptr != 0 && *ptr != ')') ptr++; - if (*ptr == 0) - { - *errorptr = ERR18; - goto PCRE_ERROR_RETURN; - } - continue; - - /* Non-referencing groups and lookaheads just move the pointer on, and - then behave like a non-special bracket, except that they don't increment - the count of extracting brackets. Ditto for the "once only" bracket, - which is in Perl from version 5.005. */ - - case ':': - case '=': - case '!': - case '>': - ptr += 2; - break; - - /* (?R) specifies a recursive call to the regex, which is an extension - to provide the facility which can be obtained by (?p{perl-code}) in - Perl 5.6. In Perl 5.8 this has become (??{perl-code}). - - From PCRE 4.00, items such as (?3) specify subroutine-like "calls" to - the appropriate numbered brackets. This includes both recursive and - non-recursive calls. (?R) is now synonymous with (?0). */ - - case 'R': - ptr++; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - ptr += 2; - if (c != 'R') - while ((digitab[*(++ptr)] & ctype_digit) != 0); - if (*ptr != ')') - { - *errorptr = ERR29; - goto PCRE_ERROR_RETURN; - } - length += 1 + LINK_SIZE; - - /* If this item is quantified, it will get wrapped inside brackets so - as to use the code for quantified brackets. We jump down and use the - code that handles this for real brackets. */ - - if (ptr[1] == '+' || ptr[1] == '*' || ptr[1] == '?' || ptr[1] == '{') - { - length += 2 + 2 * LINK_SIZE; /* to make bracketed */ - duplength = 5 + 3 * LINK_SIZE; - goto HANDLE_QUANTIFIED_BRACKETS; - } - continue; - - /* (?C) is an extension which provides "callout" - to provide a bit of - the functionality of the Perl (?{...}) feature. An optional number may - follow (default is zero). */ - - case 'C': - ptr += 2; - while ((digitab[*(++ptr)] & ctype_digit) != 0); - if (*ptr != ')') - { - *errorptr = ERR39; - goto PCRE_ERROR_RETURN; - } - length += 2 + 2*LINK_SIZE; - continue; - - /* Named subpatterns are an extension copied from Python */ - - case 'P': - ptr += 3; - if (*ptr == '<') - { - const uschar *p; /* Don't amalgamate; some compilers */ - p = ++ptr; /* grumble at autoincrement in declaration */ - while ((compile_block.ctypes[*ptr] & ctype_word) != 0) ptr++; - if (*ptr != '>') - { - *errorptr = ERR42; - goto PCRE_ERROR_RETURN; - } - name_count++; - if (ptr - p > max_name_size) max_name_size = (ptr - p); - break; - } - - if (*ptr == '=' || *ptr == '>') - { - while ((compile_block.ctypes[*(++ptr)] & ctype_word) != 0); - if (*ptr != ')') - { - *errorptr = ERR42; - goto PCRE_ERROR_RETURN; - } - break; - } - - /* Unknown character after (?P */ - - *errorptr = ERR41; - goto PCRE_ERROR_RETURN; - - /* Lookbehinds are in Perl from version 5.005 */ - - case '<': - ptr += 3; - if (*ptr == '=' || *ptr == '!') - { - branch_newextra = 1 + LINK_SIZE; - length += 1 + LINK_SIZE; /* For the first branch */ - break; - } - *errorptr = ERR24; - goto PCRE_ERROR_RETURN; - - /* Conditionals are in Perl from version 5.005. The bracket must either - be followed by a number (for bracket reference) or by an assertion - group, or (a PCRE extension) by 'R' for a recursion test. */ - - case '(': - if (ptr[3] == 'R' && ptr[4] == ')') - { - ptr += 4; - length += 3; - } - else if ((digitab[ptr[3]] & ctype_digit) != 0) - { - ptr += 4; - length += 3; - while ((digitab[*ptr] & ctype_digit) != 0) ptr++; - if (*ptr != ')') - { - *errorptr = ERR26; - goto PCRE_ERROR_RETURN; - } - } - else /* An assertion must follow */ - { - ptr++; /* Can treat like ':' as far as spacing is concerned */ - if (ptr[2] != '?' || - (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') ) - { - ptr += 2; /* To get right offset in message */ - *errorptr = ERR28; - goto PCRE_ERROR_RETURN; - } - } - break; - - /* Else loop checking valid options until ) is met. Anything else is an - error. If we are without any brackets, i.e. at top level, the settings - act as if specified in the options, so massage the options immediately. - This is for backward compatibility with Perl 5.004. */ - - default: - set = unset = 0; - optset = &set; - ptr += 2; - - for (;; ptr++) - { - c = *ptr; - switch (c) - { - case 'i': - *optset |= PCRE_CASELESS; - continue; - - case 'm': - *optset |= PCRE_MULTILINE; - continue; - - case 's': - *optset |= PCRE_DOTALL; - continue; - - case 'x': - *optset |= PCRE_EXTENDED; - continue; - - case 'X': - *optset |= PCRE_EXTRA; - continue; - - case 'U': - *optset |= PCRE_UNGREEDY; - continue; - - case '-': - optset = &unset; - continue; - - /* A termination by ')' indicates an options-setting-only item; if - this is at the very start of the pattern (indicated by item_count - being zero), we use it to set the global options. This is helpful - when analyzing the pattern for first characters, etc. Otherwise - nothing is done here and it is handled during the compiling - process. - - [Historical note: Up to Perl 5.8, options settings at top level - were always global settings, wherever they appeared in the pattern. - That is, they were equivalent to an external setting. From 5.8 - onwards, they apply only to what follows (which is what you might - expect).] */ - - case ')': - if (item_count == 0) - { - options = (options | set) & (~unset); - set = unset = 0; /* To save length */ - item_count--; /* To allow for several */ - } - - /* Fall through */ - - /* A termination by ':' indicates the start of a nested group with - the given options set. This is again handled at compile time, but - we must allow for compiled space if any of the ims options are - set. We also have to allow for resetting space at the end of - the group, which is why 4 is added to the length and not just 2. - If there are several changes of options within the same group, this - will lead to an over-estimate on the length, but this shouldn't - matter very much. We also have to allow for resetting options at - the start of any alternations, which we do by setting - branch_newextra to 2. Finally, we record whether the case-dependent - flag ever changes within the regex. This is used by the "required - character" code. */ - - case ':': - if (((set|unset) & PCRE_IMS) != 0) - { - length += 4; - branch_newextra = 2; - if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED; - } - goto END_OPTIONS; - - /* Unrecognized option character */ - - default: - *errorptr = ERR12; - goto PCRE_ERROR_RETURN; - } - } - - /* If we hit a closing bracket, that's it - this is a freestanding - option-setting. We need to ensure that branch_extra is updated if - necessary. The only values branch_newextra can have here are 0 or 2. - If the value is 2, then branch_extra must either be 2 or 5, depending - on whether this is a lookbehind group or not. */ - - END_OPTIONS: - if (c == ')') - { - if (branch_newextra == 2 && - (branch_extra == 0 || branch_extra == 1+LINK_SIZE)) - branch_extra += branch_newextra; - continue; - } - - /* If options were terminated by ':' control comes here. Fall through - to handle the group below. */ - } - } - - /* Extracting brackets must be counted so we can process escapes in a - Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to - need an additional 3 bytes of store per extracting bracket. However, if - PCRE_NO_AUTO)CAPTURE is set, unadorned brackets become non-capturing, so we - must leave the count alone (it will aways be zero). */ - - else if ((options & PCRE_NO_AUTO_CAPTURE) == 0) - { - bracount++; - if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3; - } - - /* Save length for computing whole length at end if there's a repeat that - requires duplication of the group. Also save the current value of - branch_extra, and start the new group with the new value. If non-zero, this - will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */ - - if (brastackptr >= sizeof(brastack)/sizeof(int)) - { - *errorptr = ERR19; - goto PCRE_ERROR_RETURN; - } - - bralenstack[brastackptr] = branch_extra; - branch_extra = branch_newextra; - - brastack[brastackptr++] = length; - length += bracket_length; - continue; - - /* Handle ket. Look for subsequent max/min; for certain sets of values we - have to replicate this bracket up to that many times. If brastackptr is - 0 this is an unmatched bracket which will generate an error, but take care - not to try to access brastack[-1] when computing the length and restoring - the branch_extra value. */ - - case ')': - length += 1 + LINK_SIZE; - if (brastackptr > 0) - { - duplength = length - brastack[--brastackptr]; - branch_extra = bralenstack[brastackptr]; - } - else duplength = 0; - - /* The following code is also used when a recursion such as (?3) is - followed by a quantifier, because in that case, it has to be wrapped inside - brackets so that the quantifier works. The value of duplength must be - set before arrival. */ - - HANDLE_QUANTIFIED_BRACKETS: - - /* Leave ptr at the final char; for read_repeat_counts this happens - automatically; for the others we need an increment. */ - - if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2)) - { - ptr = read_repeat_counts(ptr+2, &min, &max, errorptr); - if (*errorptr != NULL) goto PCRE_ERROR_RETURN; - } - else if (c == '*') { min = 0; max = -1; ptr++; } - else if (c == '+') { min = 1; max = -1; ptr++; } - else if (c == '?') { min = 0; max = 1; ptr++; } - else { min = 1; max = 1; } - - /* If the minimum is zero, we have to allow for an OP_BRAZERO before the - group, and if the maximum is greater than zero, we have to replicate - maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting - bracket set. */ - - if (min == 0) - { - length++; - if (max > 0) length += (max - 1) * (duplength + 3 + 2*LINK_SIZE); - } - - /* When the minimum is greater than zero, we have to replicate up to - minval-1 times, with no additions required in the copies. Then, if there - is a limited maximum we have to replicate up to maxval-1 times allowing - for a BRAZERO item before each optional copy and nesting brackets for all - but one of the optional copies. */ - - else - { - length += (min - 1) * duplength; - if (max > min) /* Need this test as max=-1 means no limit */ - length += (max - min) * (duplength + 3 + 2*LINK_SIZE) - - (2 + 2*LINK_SIZE); - } - - /* Allow space for once brackets for "possessive quantifier" */ - - if (ptr[1] == '+') - { - ptr++; - length += 2 + 2*LINK_SIZE; - } - continue; - - /* Non-special character. It won't be space or # in extended mode, so it is - always a genuine character. If we are in a \Q...\E sequence, check for the - end; if not, we have a literal. */ - - default: - NORMAL_CHAR: - - if (inescq && c == '\\' && ptr[1] == 'E') - { - inescq = FALSE; - ptr++; - continue; - } - - length += 2; /* For a one-byte character */ - lastitemlength = 1; /* Default length of last item for repeats */ - - /* In UTF-8 mode, check for additional bytes. */ - -#ifdef SUPPORT_UTF8 - if (utf8 && (c & 0xc0) == 0xc0) - { - while ((ptr[1] & 0xc0) == 0x80) /* Can't flow over the end */ - { /* because the end is marked */ - lastitemlength++; /* by a zero byte. */ - length++; - ptr++; - } - } -#endif - - continue; - } - } - -length += 2 + LINK_SIZE; /* For final KET and END */ - -if ((options & PCRE_AUTO_CALLOUT) != 0) - length += 2 + 2*LINK_SIZE; /* For final callout */ - -if (length > MAX_PATTERN_SIZE) - { - *errorptr = ERR20; - return NULL; - } - -/* Compute the size of data block needed and get it, either from malloc or -externally provided function. */ - -size = length + sizeof(real_pcre) + name_count * (max_name_size + 3); -re = (real_pcre *)(pcre_malloc)(size); - -if (re == NULL) - { - *errorptr = ERR21; - return NULL; - } - -/* Put in the magic number, and save the sizes, options, and character table -pointer. NULL is used for the default character tables. The nullpad field is at -the end; it's there to help in the case when a regex compiled on a system with -4-byte pointers is run on another with 8-byte pointers. */ - -re->magic_number = MAGIC_NUMBER; -re->size = size; -re->options = options; -re->dummy1 = re->dummy2 = 0; -re->name_table_offset = sizeof(real_pcre); -re->name_entry_size = max_name_size + 3; -re->name_count = name_count; -re->tables = (tables == pcre_default_tables)? NULL : tables; -re->nullpad = NULL; - -/* The starting points of the name/number translation table and of the code are -passed around in the compile data block. */ - -compile_block.names_found = 0; -compile_block.name_entry_size = max_name_size + 3; -compile_block.name_table = (uschar *)re + re->name_table_offset; -codestart = compile_block.name_table + re->name_entry_size * re->name_count; -compile_block.start_code = codestart; -compile_block.start_pattern = (const uschar *)pattern; -compile_block.req_varyopt = 0; -compile_block.nopartial = FALSE; - -/* Set up a starting, non-extracting bracket, then compile the expression. On -error, *errorptr will be set non-NULL, so we don't need to look at the result -of the function here. */ - -ptr = (const uschar *)pattern; -code = (uschar *)codestart; -*code = OP_BRA; -bracount = 0; -(void)compile_regex(options, options & PCRE_IMS, &bracount, &code, &ptr, - errorptr, FALSE, 0, &firstbyte, &reqbyte, NULL, &compile_block); -re->top_bracket = bracount; -re->top_backref = compile_block.top_backref; - -if (compile_block.nopartial) re->options |= PCRE_NOPARTIAL; - -/* If not reached end of pattern on success, there's an excess bracket. */ - -if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22; - -/* Fill in the terminating state and check for disastrous overflow, but -if debugging, leave the test till after things are printed out. */ - -*code++ = OP_END; - -#ifndef DEBUG -if (code - codestart > length) *errorptr = ERR23; -#endif - -/* Give an error if there's back reference to a non-existent capturing -subpattern. */ - -if (re->top_backref > re->top_bracket) *errorptr = ERR15; - -/* Failed to compile, or error while post-processing */ - -if (*errorptr != NULL) - { - (pcre_free)(re); - PCRE_ERROR_RETURN: - *erroroffset = ptr - (const uschar *)pattern; - return NULL; - } - -/* If the anchored option was not passed, set the flag if we can determine that -the pattern is anchored by virtue of ^ characters or \A or anything else (such -as starting with .* when DOTALL is set). - -Otherwise, if we know what the first character has to be, save it, because that -speeds up unanchored matches no end. If not, see if we can set the -PCRE_STARTLINE flag. This is helpful for multiline matches when all branches -start with ^. and also when all branches start with .* for non-DOTALL matches. -*/ - -if ((options & PCRE_ANCHORED) == 0) - { - int temp_options = options; - if (is_anchored(codestart, &temp_options, 0, compile_block.backref_map)) - re->options |= PCRE_ANCHORED; - else - { - if (firstbyte < 0) - firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE); - if (firstbyte >= 0) /* Remove caseless flag for non-caseable chars */ - { - int ch = firstbyte & 255; - re->first_byte = ((firstbyte & REQ_CASELESS) != 0 && - compile_block.fcc[ch] == ch)? ch : firstbyte; - re->options |= PCRE_FIRSTSET; - } - else if (is_startline(codestart, 0, compile_block.backref_map)) - re->options |= PCRE_STARTLINE; - } - } - -/* For an anchored pattern, we use the "required byte" only if it follows a -variable length item in the regex. Remove the caseless flag for non-caseable -bytes. */ - -if (reqbyte >= 0 && - ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0)) - { - int ch = reqbyte & 255; - re->req_byte = ((reqbyte & REQ_CASELESS) != 0 && - compile_block.fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte; - re->options |= PCRE_REQCHSET; - } - -/* Print out the compiled data for debugging */ - -#ifdef DEBUG - -printf("Length = %d top_bracket = %d top_backref = %d\n", - length, re->top_bracket, re->top_backref); - -if (re->options != 0) - { - printf("%s%s%s%s%s%s%s%s%s%s\n", - ((re->options & PCRE_NOPARTIAL) != 0)? "nopartial " : "", - ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "", - ((re->options & PCRE_CASELESS) != 0)? "caseless " : "", - ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "", - ((re->options & PCRE_EXTENDED) != 0)? "extended " : "", - ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "", - ((re->options & PCRE_DOTALL) != 0)? "dotall " : "", - ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "", - ((re->options & PCRE_EXTRA) != 0)? "extra " : "", - ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : ""); - } - -if ((re->options & PCRE_FIRSTSET) != 0) - { - int ch = re->first_byte & 255; - const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? "" : " (caseless)"; - if (isprint(ch)) printf("First char = %c%s\n", ch, caseless); - else printf("First char = \\x%02x%s\n", ch, caseless); - } - -if ((re->options & PCRE_REQCHSET) != 0) - { - int ch = re->req_byte & 255; - const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? "" : " (caseless)"; - if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless); - else printf("Req char = \\x%02x%s\n", ch, caseless); - } - -print_internals(re, stdout); - -/* This check is done here in the debugging case so that the code that -was compiled can be seen. */ - -if (code - codestart > length) - { - *errorptr = ERR23; - (pcre_free)(re); - *erroroffset = ptr - (uschar *)pattern; - return NULL; - } -#endif - -return (pcre *)re; -} - - - -/************************************************* -* Match a back-reference * -*************************************************/ - -/* If a back reference hasn't been set, the length that is passed is greater -than the number of characters left in the string, so the match fails. - -Arguments: - offset index into the offset vector - eptr points into the subject - length length to be matched - md points to match data block - ims the ims flags - -Returns: TRUE if matched -*/ - -static BOOL -match_ref(int offset, register const uschar *eptr, int length, match_data *md, - unsigned long int ims) -{ -const uschar *p = md->start_subject + md->offset_vector[offset]; - -#ifdef DEBUG -if (eptr >= md->end_subject) - printf("matching subject "); -else - { - printf("matching subject "); - pchars(eptr, length, TRUE, md); - } -printf(" against backref "); -pchars(p, length, FALSE, md); -printf("\n"); -#endif - -/* Always fail if not enough characters left */ - -if (length > md->end_subject - eptr) return FALSE; - -/* Separate the caselesss case for speed */ - -if ((ims & PCRE_CASELESS) != 0) - { - while (length-- > 0) - if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; - } -else - { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } - -return TRUE; -} - - -#ifdef SUPPORT_UTF8 -/************************************************* -* Match character against an XCLASS * -*************************************************/ - -/* This function is called from within the XCLASS code below, to match a -character against an extended class which might match values > 255. - -Arguments: - c the character - data points to the flag byte of the XCLASS data - -Returns: TRUE if character matches, else FALSE -*/ - -static BOOL -match_xclass(int c, const uschar *data) -{ -int t; -BOOL negated = (*data & XCL_NOT) != 0; - -/* Character values < 256 are matched against a bitmap, if one is present. If -not, we still carry on, because there may be ranges that start below 256 in the -additional data. */ - -if (c < 256) - { - if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0) - return !negated; /* char found */ - } - -/* First skip the bit map if present. Then match against the list of Unicode -properties or large chars or ranges that end with a large char. We won't ever -encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */ - -if ((*data++ & XCL_MAP) != 0) data += 32; - -while ((t = *data++) != XCL_END) - { - int x, y; - if (t == XCL_SINGLE) - { - GETCHARINC(x, data); - if (c == x) return !negated; - } - else if (t == XCL_RANGE) - { - GETCHARINC(x, data); - GETCHARINC(y, data); - if (c >= x && c <= y) return !negated; - } - -#ifdef SUPPORT_UCP - else /* XCL_PROP & XCL_NOTPROP */ - { - int chartype, othercase; - int rqdtype = *data++; - int category = ucp_findchar(c, &chartype, &othercase); - if (rqdtype >= 128) - { - if ((rqdtype - 128 == category) == (t == XCL_PROP)) return !negated; - } - else - { - if ((rqdtype == chartype) == (t == XCL_PROP)) return !negated; - } - } -#endif /* SUPPORT_UCP */ - } - -return negated; /* char did not match */ -} -#endif - - -/*************************************************************************** -**************************************************************************** - RECURSION IN THE match() FUNCTION - -The match() function is highly recursive. Some regular expressions can cause -it to recurse thousands of times. I was writing for Unix, so I just let it -call itself recursively. This uses the stack for saving everything that has -to be saved for a recursive call. On Unix, the stack can be large, and this -works fine. - -It turns out that on non-Unix systems there are problems with programs that -use a lot of stack. (This despite the fact that every last chip has oodles -of memory these days, and techniques for extending the stack have been known -for decades.) So.... - -There is a fudge, triggered by defining NO_RECURSE, which avoids recursive -calls by keeping local variables that need to be preserved in blocks of memory -obtained from malloc instead instead of on the stack. Macros are used to -achieve this so that the actual code doesn't look very different to what it -always used to. -**************************************************************************** -***************************************************************************/ - - -/* These versions of the macros use the stack, as normal */ - -#ifndef NO_RECURSE -#define REGISTER register -#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg) rx = match(ra,rb,rc,rd,re,rf,rg) -#define RRETURN(ra) return ra -#else - - -/* These versions of the macros manage a private stack on the heap. Note -that the rd argument of RMATCH isn't actually used. It's the md argument of -match(), which never changes. */ - -#define REGISTER - -#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg)\ - {\ - heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\ - if (setjmp(frame->Xwhere) == 0)\ - {\ - newframe->Xeptr = ra;\ - newframe->Xecode = rb;\ - newframe->Xoffset_top = rc;\ - newframe->Xims = re;\ - newframe->Xeptrb = rf;\ - newframe->Xflags = rg;\ - newframe->Xprevframe = frame;\ - frame = newframe;\ - DPRINTF(("restarting from line %d\n", __LINE__));\ - goto HEAP_RECURSE;\ - }\ - else\ - {\ - DPRINTF(("longjumped back to line %d\n", __LINE__));\ - frame = md->thisframe;\ - rx = frame->Xresult;\ - }\ - } - -#define RRETURN(ra)\ - {\ - heapframe *newframe = frame;\ - frame = newframe->Xprevframe;\ - (pcre_stack_free)(newframe);\ - if (frame != NULL)\ - {\ - frame->Xresult = ra;\ - md->thisframe = frame;\ - longjmp(frame->Xwhere, 1);\ - }\ - return ra;\ - } - - -/* Structure for remembering the local variables in a private frame */ - -typedef struct heapframe { - struct heapframe *Xprevframe; - - /* Function arguments that may change */ - - const uschar *Xeptr; - const uschar *Xecode; - int Xoffset_top; - long int Xims; - eptrblock *Xeptrb; - int Xflags; - - /* Function local variables */ - - const uschar *Xcallpat; - const uschar *Xcharptr; - const uschar *Xdata; - const uschar *Xnext; - const uschar *Xpp; - const uschar *Xprev; - const uschar *Xsaved_eptr; - - recursion_info Xnew_recursive; - - BOOL Xcur_is_word; - BOOL Xcondition; - BOOL Xminimize; - BOOL Xprev_is_word; - - unsigned long int Xoriginal_ims; - -#ifdef SUPPORT_UCP - int Xprop_type; - int Xprop_fail_result; - int Xprop_category; - int Xprop_chartype; - int Xprop_othercase; - int Xprop_test_against; - int *Xprop_test_variable; -#endif - - int Xctype; - int Xfc; - int Xfi; - int Xlength; - int Xmax; - int Xmin; - int Xnumber; - int Xoffset; - int Xop; - int Xsave_capture_last; - int Xsave_offset1, Xsave_offset2, Xsave_offset3; - int Xstacksave[REC_STACK_SAVE_MAX]; - - eptrblock Xnewptrb; - - /* Place to pass back result, and where to jump back to */ - - int Xresult; - jmp_buf Xwhere; - -} heapframe; - -#endif - - -/*************************************************************************** -***************************************************************************/ - - - -/************************************************* -* Match from current position * -*************************************************/ - -/* On entry ecode points to the first opcode, and eptr to the first character -in the subject string, while eptrb holds the value of eptr at the start of the -last bracketed group - used for breaking infinite loops matching zero-length -strings. This function is called recursively in many circumstances. Whenever it -returns a negative (error) response, the outer incarnation must also return the -same response. - -Performance note: It might be tempting to extract commonly used fields from the -md structure (e.g. utf8, end_subject) into individual variables to improve -performance. Tests using gcc on a SPARC disproved this; in the first case, it -made performance worse. - -Arguments: - eptr pointer in subject - ecode position in code - offset_top current top pointer - md pointer to "static" info for the match - ims current /i, /m, and /s options - eptrb pointer to chain of blocks containing eptr at start of - brackets - for testing for empty matches - flags can contain - match_condassert - this is an assertion condition - match_isgroup - this is the start of a bracketed group - -Returns: MATCH_MATCH if matched ) these values are >= 0 - MATCH_NOMATCH if failed to match ) - a negative PCRE_ERROR_xxx value if aborted by an error condition - (e.g. stopped by recursion limit) -*/ - -static int -match(REGISTER const uschar *eptr, REGISTER const uschar *ecode, - int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, - int flags) -{ -/* These variables do not need to be preserved over recursion in this function, -so they can be ordinary variables in all cases. Mark them with "register" -because they are used a lot in loops. */ - -register int rrc; /* Returns from recursive calls */ -register int i; /* Used for loops not involving calls to RMATCH() */ -register int c; /* Character values not kept over RMATCH() calls */ - -/* When recursion is not being used, all "local" variables that have to be -preserved over calls to RMATCH() are part of a "frame" which is obtained from -heap storage. Set up the top-level frame here; others are obtained from the -heap whenever RMATCH() does a "recursion". See the macro definitions above. */ - -#ifdef NO_RECURSE -heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe)); -frame->Xprevframe = NULL; /* Marks the top level */ - -/* Copy in the original argument variables */ - -frame->Xeptr = eptr; -frame->Xecode = ecode; -frame->Xoffset_top = offset_top; -frame->Xims = ims; -frame->Xeptrb = eptrb; -frame->Xflags = flags; - -/* This is where control jumps back to to effect "recursion" */ - -HEAP_RECURSE: - -/* Macros make the argument variables come from the current frame */ - -#define eptr frame->Xeptr -#define ecode frame->Xecode -#define offset_top frame->Xoffset_top -#define ims frame->Xims -#define eptrb frame->Xeptrb -#define flags frame->Xflags - -/* Ditto for the local variables */ - -#ifdef SUPPORT_UTF8 -#define charptr frame->Xcharptr -#endif -#define callpat frame->Xcallpat -#define data frame->Xdata -#define next frame->Xnext -#define pp frame->Xpp -#define prev frame->Xprev -#define saved_eptr frame->Xsaved_eptr - -#define new_recursive frame->Xnew_recursive - -#define cur_is_word frame->Xcur_is_word -#define condition frame->Xcondition -#define minimize frame->Xminimize -#define prev_is_word frame->Xprev_is_word - -#define original_ims frame->Xoriginal_ims - -#ifdef SUPPORT_UCP -#define prop_type frame->Xprop_type -#define prop_fail_result frame->Xprop_fail_result -#define prop_category frame->Xprop_category -#define prop_chartype frame->Xprop_chartype -#define prop_othercase frame->Xprop_othercase -#define prop_test_against frame->Xprop_test_against -#define prop_test_variable frame->Xprop_test_variable -#endif - -#define ctype frame->Xctype -#define fc frame->Xfc -#define fi frame->Xfi -#define length frame->Xlength -#define max frame->Xmax -#define min frame->Xmin -#define number frame->Xnumber -#define offset frame->Xoffset -#define op frame->Xop -#define save_capture_last frame->Xsave_capture_last -#define save_offset1 frame->Xsave_offset1 -#define save_offset2 frame->Xsave_offset2 -#define save_offset3 frame->Xsave_offset3 -#define stacksave frame->Xstacksave - -#define newptrb frame->Xnewptrb - -/* When recursion is being used, local variables are allocated on the stack and -get preserved during recursion in the normal way. In this environment, fi and -i, and fc and c, can be the same variables. */ - -#else -#define fi i -#define fc c - - -#ifdef SUPPORT_UTF8 /* Many of these variables are used ony */ -const uschar *charptr; /* small blocks of the code. My normal */ -#endif /* style of coding would have declared */ -const uschar *callpat; /* them within each of those blocks. */ -const uschar *data; /* However, in order to accommodate the */ -const uschar *next; /* version of this code that uses an */ -const uschar *pp; /* external "stack" implemented on the */ -const uschar *prev; /* heap, it is easier to declare them */ -const uschar *saved_eptr; /* all here, so the declarations can */ - /* be cut out in a block. The only */ -recursion_info new_recursive; /* declarations within blocks below are */ - /* for variables that do not have to */ -BOOL cur_is_word; /* be preserved over a recursive call */ -BOOL condition; /* to RMATCH(). */ -BOOL minimize; -BOOL prev_is_word; - -unsigned long int original_ims; - -#ifdef SUPPORT_UCP -int prop_type; -int prop_fail_result; -int prop_category; -int prop_chartype; -int prop_othercase; -int prop_test_against; -int *prop_test_variable; -#endif - -int ctype; -int length; -int max; -int min; -int number; -int offset; -int op; -int save_capture_last; -int save_offset1, save_offset2, save_offset3; -int stacksave[REC_STACK_SAVE_MAX]; - -eptrblock newptrb; -#endif - -/* These statements are here to stop the compiler complaining about unitialized -variables. */ - -#ifdef SUPPORT_UCP -prop_fail_result = 0; -prop_test_against = 0; -prop_test_variable = NULL; -#endif - -/* OK, now we can get on with the real code of the function. Recursion is -specified by the macros RMATCH and RRETURN. When NO_RECURSE is *not* defined, -these just turn into a recursive call to match() and a "return", respectively. -However, RMATCH isn't like a function call because it's quite a complicated -macro. It has to be used in one particular way. This shouldn't, however, impact -performance when true recursion is being used. */ - -if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT); - -original_ims = ims; /* Save for resetting on ')' */ - -/* At the start of a bracketed group, add the current subject pointer to the -stack of such pointers, to be re-instated at the end of the group when we hit -the closing ket. When match() is called in other circumstances, we don't add to -this stack. */ - -if ((flags & match_isgroup) != 0) - { - newptrb.epb_prev = eptrb; - newptrb.epb_saved_eptr = eptr; - eptrb = &newptrb; - } - -/* Now start processing the operations. */ - -for (;;) - { - op = *ecode; - minimize = FALSE; - - /* For partial matching, remember if we ever hit the end of the subject after - matching at least one subject character. */ - - if (md->partial && - eptr >= md->end_subject && - eptr > md->start_match) - md->hitend = TRUE; - - /* Opening capturing bracket. If there is space in the offset vector, save - the current subject position in the working slot at the top of the vector. We - mustn't change the current values of the data slot, because they may be set - from a previous iteration of this group, and be referred to by a reference - inside the group. - - If the bracket fails to match, we need to restore this value and also the - values of the final offsets, in case they were set by a previous iteration of - the same bracket. - - If there isn't enough space in the offset vector, treat this as if it were a - non-capturing bracket. Don't worry about setting the flag for the error case - here; that is handled in the code for KET. */ - - if (op > OP_BRA) - { - number = op - OP_BRA; - - /* For extended extraction brackets (large number), we have to fish out the - number from a dummy opcode at the start. */ - - if (number > EXTRACT_BASIC_MAX) - number = GET2(ecode, 2+LINK_SIZE); - offset = number << 1; - -#ifdef DEBUG - printf("start bracket %d subject=", number); - pchars(eptr, 16, TRUE, md); - printf("\n"); -#endif - - if (offset < md->offset_max) - { - save_offset1 = md->offset_vector[offset]; - save_offset2 = md->offset_vector[offset+1]; - save_offset3 = md->offset_vector[md->offset_end - number]; - save_capture_last = md->capture_last; - - DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); - md->offset_vector[md->offset_end - number] = eptr - md->start_subject; - - do - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, - match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - md->capture_last = save_capture_last; - ecode += GET(ecode, 1); - } - while (*ecode == OP_ALT); - - DPRINTF(("bracket %d failed\n", number)); - - md->offset_vector[offset] = save_offset1; - md->offset_vector[offset+1] = save_offset2; - md->offset_vector[md->offset_end - number] = save_offset3; - - RRETURN(MATCH_NOMATCH); - } - - /* Insufficient room for saving captured contents */ - - else op = OP_BRA; - } - - /* Other types of node can be handled by a switch */ - - switch(op) - { - case OP_BRA: /* Non-capturing bracket: optimized */ - DPRINTF(("start bracket 0\n")); - do - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, - match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - ecode += GET(ecode, 1); - } - while (*ecode == OP_ALT); - DPRINTF(("bracket 0 failed\n")); - RRETURN(MATCH_NOMATCH); - - /* Conditional group: compilation checked that there are no more than - two branches. If the condition is false, skipping the first branch takes us - past the end if there is only one branch, but that's OK because that is - exactly what going to the ket would do. */ - - case OP_COND: - if (ecode[LINK_SIZE+1] == OP_CREF) /* Condition extract or recurse test */ - { - offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ - condition = (offset == CREF_RECURSE * 2)? - (md->recursive != NULL) : - (offset < offset_top && md->offset_vector[offset] >= 0); - RMATCH(rrc, eptr, ecode + (condition? - (LINK_SIZE + 4) : (LINK_SIZE + 1 + GET(ecode, 1))), - offset_top, md, ims, eptrb, match_isgroup); - RRETURN(rrc); - } - - /* The condition is an assertion. Call match() to evaluate it - setting - the final argument TRUE causes it to stop at the end of an assertion. */ - - else - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, - match_condassert | match_isgroup); - if (rrc == MATCH_MATCH) - { - ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE+2); - while (*ecode == OP_ALT) ecode += GET(ecode, 1); - } - else if (rrc != MATCH_NOMATCH) - { - RRETURN(rrc); /* Need braces because of following else */ - } - else ecode += GET(ecode, 1); - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, - match_isgroup); - RRETURN(rrc); - } - /* Control never reaches here */ - - /* Skip over conditional reference or large extraction number data if - encountered. */ - - case OP_CREF: - case OP_BRANUMBER: - ecode += 3; - break; - - /* End of the pattern. If we are in a recursion, we should restore the - offsets appropriately and continue from after the call. */ - - case OP_END: - if (md->recursive != NULL && md->recursive->group_num == 0) - { - recursion_info *rec = md->recursive; - DPRINTF(("Hit the end in a (?0) recursion\n")); - md->recursive = rec->prevrec; - memmove(md->offset_vector, rec->offset_save, - rec->saved_max * sizeof(int)); - md->start_match = rec->save_start; - ims = original_ims; - ecode = rec->after_call; - break; - } - - /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty - string - backtracking will then try other alternatives, if any. */ - - if (md->notempty && eptr == md->start_match) RRETURN(MATCH_NOMATCH); - md->end_match_ptr = eptr; /* Record where we ended */ - md->end_offset_top = offset_top; /* and how many extracts were taken */ - RRETURN(MATCH_MATCH); - - /* Change option settings */ - - case OP_OPT: - ims = ecode[1]; - ecode += 2; - DPRINTF(("ims set to %02lx\n", ims)); - break; - - /* Assertion brackets. Check the alternative branches in turn - the - matching won't pass the KET for an assertion. If any one branch matches, - the assertion is true. Lookbehind assertions have an OP_REVERSE item at the - start of each branch to move the current point backwards, so the code at - this level is identical to the lookahead case. */ - - case OP_ASSERT: - case OP_ASSERTBACK: - do - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, - match_isgroup); - if (rrc == MATCH_MATCH) break; - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - ecode += GET(ecode, 1); - } - while (*ecode == OP_ALT); - if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH); - - /* If checking an assertion for a condition, return MATCH_MATCH. */ - - if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); - - /* Continue from after the assertion, updating the offsets high water - mark, since extracts may have been taken during the assertion. */ - - do ecode += GET(ecode,1); while (*ecode == OP_ALT); - ecode += 1 + LINK_SIZE; - offset_top = md->end_offset_top; - continue; - - /* Negative assertion: all branches must fail to match */ - - case OP_ASSERT_NOT: - case OP_ASSERTBACK_NOT: - do - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, - match_isgroup); - if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - ecode += GET(ecode,1); - } - while (*ecode == OP_ALT); - - if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); - - ecode += 1 + LINK_SIZE; - continue; - - /* Move the subject pointer back. This occurs only at the start of - each branch of a lookbehind assertion. If we are too close to the start to - move back, this match function fails. When working with UTF-8 we move - back a number of characters, not bytes. */ - - case OP_REVERSE: -#ifdef SUPPORT_UTF8 - if (md->utf8) - { - c = GET(ecode,1); - for (i = 0; i < c; i++) - { - eptr--; - if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); - BACKCHAR(eptr) - } - } - else -#endif - - /* No UTF-8 support, or not in UTF-8 mode: count is byte count */ - - { - eptr -= GET(ecode,1); - if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); - } - - /* Skip to next op code */ - - ecode += 1 + LINK_SIZE; - break; - - /* The callout item calls an external function, if one is provided, passing - details of the match so far. This is mainly for debugging, though the - function is able to force a failure. */ - - case OP_CALLOUT: - if (pcre_callout != NULL) - { - pcre_callout_block cb; - cb.version = 1; /* Version 1 of the callout block */ - cb.callout_number = ecode[1]; - cb.offset_vector = md->offset_vector; - cb.subject = (const char *)md->start_subject; - cb.subject_length = md->end_subject - md->start_subject; - cb.start_match = md->start_match - md->start_subject; - cb.current_position = eptr - md->start_subject; - cb.pattern_position = GET(ecode, 2); - cb.next_item_length = GET(ecode, 2 + LINK_SIZE); - cb.capture_top = offset_top/2; - cb.capture_last = md->capture_last; - cb.callout_data = md->callout_data; - if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH); - if (rrc < 0) RRETURN(rrc); - } - ecode += 2 + 2*LINK_SIZE; - break; - - /* Recursion either matches the current regex, or some subexpression. The - offset data is the offset to the starting bracket from the start of the - whole pattern. (This is so that it works from duplicated subpatterns.) - - If there are any capturing brackets started but not finished, we have to - save their starting points and reinstate them after the recursion. However, - we don't know how many such there are (offset_top records the completed - total) so we just have to save all the potential data. There may be up to - 65535 such values, which is too large to put on the stack, but using malloc - for small numbers seems expensive. As a compromise, the stack is used when - there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc - is used. A problem is what to do if the malloc fails ... there is no way of - returning to the top level with an error. Save the top REC_STACK_SAVE_MAX - values on the stack, and accept that the rest may be wrong. - - There are also other values that have to be saved. We use a chained - sequence of blocks that actually live on the stack. Thanks to Robin Houston - for the original version of this logic. */ - - case OP_RECURSE: - { - callpat = md->start_code + GET(ecode, 1); - new_recursive.group_num = *callpat - OP_BRA; - - /* For extended extraction brackets (large number), we have to fish out - the number from a dummy opcode at the start. */ - - if (new_recursive.group_num > EXTRACT_BASIC_MAX) - new_recursive.group_num = GET2(callpat, 2+LINK_SIZE); - - /* Add to "recursing stack" */ - - new_recursive.prevrec = md->recursive; - md->recursive = &new_recursive; - - /* Find where to continue from afterwards */ - - ecode += 1 + LINK_SIZE; - new_recursive.after_call = ecode; - - /* Now save the offset data. */ - - new_recursive.saved_max = md->offset_end; - if (new_recursive.saved_max <= REC_STACK_SAVE_MAX) - new_recursive.offset_save = stacksave; - else - { - new_recursive.offset_save = - (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int)); - if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY); - } - - memcpy(new_recursive.offset_save, md->offset_vector, - new_recursive.saved_max * sizeof(int)); - new_recursive.save_start = md->start_match; - md->start_match = eptr; - - /* OK, now we can do the recursion. For each top-level alternative we - restore the offset and recursion data. */ - - DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); - do - { - RMATCH(rrc, eptr, callpat + 1 + LINK_SIZE, offset_top, md, ims, - eptrb, match_isgroup); - if (rrc == MATCH_MATCH) - { - md->recursive = new_recursive.prevrec; - if (new_recursive.offset_save != stacksave) - (pcre_free)(new_recursive.offset_save); - RRETURN(MATCH_MATCH); - } - else if (rrc != MATCH_NOMATCH) RRETURN(rrc); - - md->recursive = &new_recursive; - memcpy(md->offset_vector, new_recursive.offset_save, - new_recursive.saved_max * sizeof(int)); - callpat += GET(callpat, 1); - } - while (*callpat == OP_ALT); - - DPRINTF(("Recursion didn't match\n")); - md->recursive = new_recursive.prevrec; - if (new_recursive.offset_save != stacksave) - (pcre_free)(new_recursive.offset_save); - RRETURN(MATCH_NOMATCH); - } - /* Control never reaches here */ - - /* "Once" brackets are like assertion brackets except that after a match, - the point in the subject string is not moved back. Thus there can never be - a move back into the brackets. Friedl calls these "atomic" subpatterns. - Check the alternative branches in turn - the matching won't pass the KET - for this kind of subpattern. If any one branch matches, we carry on as at - the end of a normal bracket, leaving the subject pointer. */ - - case OP_ONCE: - { - prev = ecode; - saved_eptr = eptr; - - do - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, - eptrb, match_isgroup); - if (rrc == MATCH_MATCH) break; - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - ecode += GET(ecode,1); - } - while (*ecode == OP_ALT); - - /* If hit the end of the group (which could be repeated), fail */ - - if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH); - - /* Continue as from after the assertion, updating the offsets high water - mark, since extracts may have been taken. */ - - do ecode += GET(ecode,1); while (*ecode == OP_ALT); - - offset_top = md->end_offset_top; - eptr = md->end_match_ptr; - - /* For a non-repeating ket, just continue at this level. This also - happens for a repeating ket if no characters were matched in the group. - This is the forcible breaking of infinite loops as implemented in Perl - 5.005. If there is an options reset, it will get obeyed in the normal - course of events. */ - - if (*ecode == OP_KET || eptr == saved_eptr) - { - ecode += 1+LINK_SIZE; - break; - } - - /* The repeating kets try the rest of the pattern or restart from the - preceding bracket, in the appropriate order. We need to reset any options - that changed within the bracket before re-running it, so check the next - opcode. */ - - if (ecode[1+LINK_SIZE] == OP_OPT) - { - ims = (ims & ~PCRE_IMS) | ecode[4]; - DPRINTF(("ims set to %02lx at group repeat\n", ims)); - } - - if (*ecode == OP_KETRMIN) - { - RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - else /* OP_KETRMAX */ - { - RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - } - RRETURN(MATCH_NOMATCH); - - /* An alternation is the end of a branch; scan along to find the end of the - bracketed group and go to there. */ - - case OP_ALT: - do ecode += GET(ecode,1); while (*ecode == OP_ALT); - break; - - /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating - that it may occur zero times. It may repeat infinitely, or not at all - - i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper - repeat limits are compiled as a number of copies, with the optional ones - preceded by BRAZERO or BRAMINZERO. */ - - case OP_BRAZERO: - { - next = ecode+1; - RMATCH(rrc, eptr, next, offset_top, md, ims, eptrb, match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - do next += GET(next,1); while (*next == OP_ALT); - ecode = next + 1+LINK_SIZE; - } - break; - - case OP_BRAMINZERO: - { - next = ecode+1; - do next += GET(next,1); while (*next == OP_ALT); - RMATCH(rrc, eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb, - match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - ecode++; - } - break; - - /* End of a group, repeated or non-repeating. If we are at the end of - an assertion "group", stop matching and return MATCH_MATCH, but record the - current high water mark for use by positive assertions. Do this also - for the "once" (not-backup up) groups. */ - - case OP_KET: - case OP_KETRMIN: - case OP_KETRMAX: - { - prev = ecode - GET(ecode, 1); - saved_eptr = eptrb->epb_saved_eptr; - - /* Back up the stack of bracket start pointers. */ - - eptrb = eptrb->epb_prev; - - if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || - *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || - *prev == OP_ONCE) - { - md->end_match_ptr = eptr; /* For ONCE */ - md->end_offset_top = offset_top; - RRETURN(MATCH_MATCH); - } - - /* In all other cases except a conditional group we have to check the - group number back at the start and if necessary complete handling an - extraction by setting the offsets and bumping the high water mark. */ - - if (*prev != OP_COND) - { - number = *prev - OP_BRA; - - /* For extended extraction brackets (large number), we have to fish out - the number from a dummy opcode at the start. */ - - if (number > EXTRACT_BASIC_MAX) number = GET2(prev, 2+LINK_SIZE); - offset = number << 1; - -#ifdef DEBUG - printf("end bracket %d", number); - printf("\n"); -#endif - - /* Test for a numbered group. This includes groups called as a result - of recursion. Note that whole-pattern recursion is coded as a recurse - into group 0, so it won't be picked up here. Instead, we catch it when - the OP_END is reached. */ - - if (number > 0) - { - md->capture_last = number; - if (offset >= md->offset_max) md->offset_overflow = TRUE; else - { - md->offset_vector[offset] = - md->offset_vector[md->offset_end - number]; - md->offset_vector[offset+1] = eptr - md->start_subject; - if (offset_top <= offset) offset_top = offset + 2; - } - - /* Handle a recursively called group. Restore the offsets - appropriately and continue from after the call. */ - - if (md->recursive != NULL && md->recursive->group_num == number) - { - recursion_info *rec = md->recursive; - DPRINTF(("Recursion (%d) succeeded - continuing\n", number)); - md->recursive = rec->prevrec; - md->start_match = rec->save_start; - memcpy(md->offset_vector, rec->offset_save, - rec->saved_max * sizeof(int)); - ecode = rec->after_call; - ims = original_ims; - break; - } - } - } - - /* Reset the value of the ims flags, in case they got changed during - the group. */ - - ims = original_ims; - DPRINTF(("ims reset to %02lx\n", ims)); - - /* For a non-repeating ket, just continue at this level. This also - happens for a repeating ket if no characters were matched in the group. - This is the forcible breaking of infinite loops as implemented in Perl - 5.005. If there is an options reset, it will get obeyed in the normal - course of events. */ - - if (*ecode == OP_KET || eptr == saved_eptr) - { - ecode += 1 + LINK_SIZE; - break; - } - - /* The repeating kets try the rest of the pattern or restart from the - preceding bracket, in the appropriate order. */ - - if (*ecode == OP_KETRMIN) - { - RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - else /* OP_KETRMAX */ - { - RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - } - - RRETURN(MATCH_NOMATCH); - - /* Start of subject unless notbol, or after internal newline if multiline */ - - case OP_CIRC: - if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); - if ((ims & PCRE_MULTILINE) != 0) - { - if (eptr != md->start_subject && eptr[-1] != NEWLINE) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - } - /* ... else fall through */ - - /* Start of subject assertion */ - - case OP_SOD: - if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH); - ecode++; - break; - - /* Start of match assertion */ - - case OP_SOM: - if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH); - ecode++; - break; - - /* Assert before internal newline if multiline, or before a terminating - newline unless endonly is set, else end of subject unless noteol is set. */ - - case OP_DOLL: - if ((ims & PCRE_MULTILINE) != 0) - { - if (eptr < md->end_subject) - { if (*eptr != NEWLINE) RRETURN(MATCH_NOMATCH); } - else - { if (md->noteol) RRETURN(MATCH_NOMATCH); } - ecode++; - break; - } - else - { - if (md->noteol) RRETURN(MATCH_NOMATCH); - if (!md->endonly) - { - if (eptr < md->end_subject - 1 || - (eptr == md->end_subject - 1 && *eptr != NEWLINE)) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - } - } - /* ... else fall through */ - - /* End of subject assertion (\z) */ - - case OP_EOD: - if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH); - ecode++; - break; - - /* End of subject or ending \n assertion (\Z) */ - - case OP_EODN: - if (eptr < md->end_subject - 1 || - (eptr == md->end_subject - 1 && *eptr != NEWLINE)) RRETURN(MATCH_NOMATCH); - ecode++; - break; - - /* Word boundary assertions */ - - case OP_NOT_WORD_BOUNDARY: - case OP_WORD_BOUNDARY: - { - - /* Find out if the previous and current characters are "word" characters. - It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to - be "non-word" characters. */ - -#ifdef SUPPORT_UTF8 - if (md->utf8) - { - if (eptr == md->start_subject) prev_is_word = FALSE; else - { - const uschar *lastptr = eptr - 1; - while((*lastptr & 0xc0) == 0x80) lastptr--; - GETCHAR(c, lastptr); - prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; - } - if (eptr >= md->end_subject) cur_is_word = FALSE; else - { - GETCHAR(c, eptr); - cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; - } - } - else -#endif - - /* More streamlined when not in UTF-8 mode */ - - { - prev_is_word = (eptr != md->start_subject) && - ((md->ctypes[eptr[-1]] & ctype_word) != 0); - cur_is_word = (eptr < md->end_subject) && - ((md->ctypes[*eptr] & ctype_word) != 0); - } - - /* Now see if the situation is what we want */ - - if ((*ecode++ == OP_WORD_BOUNDARY)? - cur_is_word == prev_is_word : cur_is_word != prev_is_word) - RRETURN(MATCH_NOMATCH); - } - break; - - /* Match a single character type; inline for speed */ - - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == NEWLINE) - RRETURN(MATCH_NOMATCH); - if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); -#ifdef SUPPORT_UTF8 - if (md->utf8) - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; -#endif - ecode++; - break; - - /* Match a single byte, even in UTF-8 mode. This opcode really does match - any byte, even newline, independent of the setting of PCRE_DOTALL. */ - - case OP_ANYBYTE: - if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); - ecode++; - break; - - case OP_NOT_DIGIT: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - if ( -#ifdef SUPPORT_UTF8 - c < 256 && -#endif - (md->ctypes[c] & ctype_digit) != 0 - ) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - - case OP_DIGIT: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - if ( -#ifdef SUPPORT_UTF8 - c >= 256 || -#endif - (md->ctypes[c] & ctype_digit) == 0 - ) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - - case OP_NOT_WHITESPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - if ( -#ifdef SUPPORT_UTF8 - c < 256 && -#endif - (md->ctypes[c] & ctype_space) != 0 - ) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - - case OP_WHITESPACE: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - if ( -#ifdef SUPPORT_UTF8 - c >= 256 || -#endif - (md->ctypes[c] & ctype_space) == 0 - ) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - - case OP_NOT_WORDCHAR: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - if ( -#ifdef SUPPORT_UTF8 - c < 256 && -#endif - (md->ctypes[c] & ctype_word) != 0 - ) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - - case OP_WORDCHAR: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - if ( -#ifdef SUPPORT_UTF8 - c >= 256 || -#endif - (md->ctypes[c] & ctype_word) == 0 - ) - RRETURN(MATCH_NOMATCH); - ecode++; - break; - -#ifdef SUPPORT_UCP - /* Check the next character by Unicode property. We will get here only - if the support is in the binary; otherwise a compile-time error occurs. */ - - case OP_PROP: - case OP_NOTPROP: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - { - int chartype, rqdtype; - int othercase; - int category = ucp_findchar(c, &chartype, &othercase); - - rqdtype = *(++ecode); - ecode++; - - if (rqdtype >= 128) - { - if ((rqdtype - 128 != category) == (op == OP_PROP)) - RRETURN(MATCH_NOMATCH); - } - else - { - if ((rqdtype != chartype) == (op == OP_PROP)) - RRETURN(MATCH_NOMATCH); - } - } - break; - - /* Match an extended Unicode sequence. We will get here only if the support - is in the binary; otherwise a compile-time error occurs. */ - - case OP_EXTUNI: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - { - int chartype; - int othercase; - int category = ucp_findchar(c, &chartype, &othercase); - if (category == ucp_M) RRETURN(MATCH_NOMATCH); - while (eptr < md->end_subject) - { - int len = 1; - if (!md->utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } - category = ucp_findchar(c, &chartype, &othercase); - if (category != ucp_M) break; - eptr += len; - } - } - ecode++; - break; -#endif - - - /* Match a back reference, possibly repeatedly. Look past the end of the - item to see if there is repeat information following. The code is similar - to that for character classes, but repeated for efficiency. Then obey - similar code to character type repeats - written out again for speed. - However, if the referenced string is the empty string, always treat - it as matched, any number of times (otherwise there could be infinite - loops). */ - - case OP_REF: - { - offset = GET2(ecode, 1) << 1; /* Doubled ref number */ - ecode += 3; /* Advance past item */ - - /* If the reference is unset, set the length to be longer than the amount - of subject left; this ensures that every attempt at a match fails. We - can't just fail here, because of the possibility of quantifiers with zero - minima. */ - - length = (offset >= offset_top || md->offset_vector[offset] < 0)? - md->end_subject - eptr + 1 : - md->offset_vector[offset+1] - md->offset_vector[offset]; - - /* Set up for repetition, or handle the non-repeated case */ - - switch (*ecode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - minimize = (*ecode == OP_CRMINRANGE); - min = GET2(ecode, 1); - max = GET2(ecode, 3); - if (max == 0) max = INT_MAX; - ecode += 5; - break; - - default: /* No repeat follows */ - if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); - eptr += length; - continue; /* With the main loop */ - } - - /* If the length of the reference is zero, just continue with the - main loop. */ - - if (length == 0) continue; - - /* First, ensure the minimum number of matches are present. We get back - the length of the reference string explicitly rather than passing the - address of eptr, so that eptr can be a register variable. */ - - for (i = 1; i <= min; i++) - { - if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); - eptr += length; - } - - /* If min = max, continue at the same level without recursion. - They are not both allowed to be zero. */ - - if (min == max) continue; - - /* If minimizing, keep trying and advancing the pointer */ - - if (minimize) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || !match_ref(offset, eptr, length, md, ims)) - RRETURN(MATCH_NOMATCH); - eptr += length; - } - /* Control never gets here */ - } - - /* If maximizing, find the longest string and work backwards */ - - else - { - pp = eptr; - for (i = min; i < max; i++) - { - if (!match_ref(offset, eptr, length, md, ims)) break; - eptr += length; - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - eptr -= length; - } - RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - - - - /* Match a bit-mapped character class, possibly repeatedly. This op code is - used when all the characters in the class have values in the range 0-255, - and either the matching is caseful, or the characters are in the range - 0-127 when UTF-8 processing is enabled. The only difference between - OP_CLASS and OP_NCLASS occurs when a data character outside the range is - encountered. - - First, look past the end of the item to see if there is repeat information - following. Then obey similar code to character type repeats - written out - again for speed. */ - - case OP_NCLASS: - case OP_CLASS: - { - data = ecode + 1; /* Save for matching */ - ecode += 33; /* Advance past the item */ - - switch (*ecode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - minimize = (*ecode == OP_CRMINRANGE); - min = GET2(ecode, 1); - max = GET2(ecode, 3); - if (max == 0) max = INT_MAX; - ecode += 5; - break; - - default: /* No repeat follows */ - min = max = 1; - break; - } - - /* First, ensure the minimum number of matches are present. */ - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); - if (c > 255) - { - if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); - } - else - { - if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); - } - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - c = *eptr++; - if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); - } - } - - /* If max == min we can continue with the main loop without the - need to recurse. */ - - if (min == max) continue; - - /* If minimizing, keep testing the rest of the expression and advancing - the pointer while it matches the class. */ - - if (minimize) - { -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); - if (c > 255) - { - if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); - } - else - { - if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); - } - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - c = *eptr++; - if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - } - - /* If maximizing, find the longest possible run, then work backwards. */ - - else - { - pp = eptr; - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c > 255) - { - if (op == OP_CLASS) break; - } - else - { - if ((data[c/8] & (1 << (c&7))) == 0) break; - } - eptr += len; - } - for (;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - BACKCHAR(eptr); - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject) break; - c = *eptr; - if ((data[c/8] & (1 << (c&7))) == 0) break; - eptr++; - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - eptr--; - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - } - - RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - - - /* Match an extended character class. This opcode is encountered only - in UTF-8 mode, because that's the only time it is compiled. */ - -#ifdef SUPPORT_UTF8 - case OP_XCLASS: - { - data = ecode + 1 + LINK_SIZE; /* Save for matching */ - ecode += GET(ecode, 1); /* Advance past the item */ - - switch (*ecode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRPLUS: - case OP_CRMINPLUS: - case OP_CRQUERY: - case OP_CRMINQUERY: - c = *ecode++ - OP_CRSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - minimize = (*ecode == OP_CRMINRANGE); - min = GET2(ecode, 1); - max = GET2(ecode, 3); - if (max == 0) max = INT_MAX; - ecode += 5; - break; - - default: /* No repeat follows */ - min = max = 1; - break; - } - - /* First, ensure the minimum number of matches are present. */ - - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); - if (!match_xclass(c, data)) RRETURN(MATCH_NOMATCH); - } - - /* If max == min we can continue with the main loop without the - need to recurse. */ - - if (min == max) continue; - - /* If minimizing, keep testing the rest of the expression and advancing - the pointer while it matches the class. */ - - if (minimize) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); - if (!match_xclass(c, data)) RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - } - - /* If maximizing, find the longest possible run, then work backwards. */ - - else - { - pp = eptr; - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (!match_xclass(c, data)) break; - eptr += len; - } - for(;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - BACKCHAR(eptr) - } - RRETURN(MATCH_NOMATCH); - } - - /* Control never gets here */ - } -#endif /* End of XCLASS */ - - /* Match a single character, casefully */ - - case OP_CHAR: -#ifdef SUPPORT_UTF8 - if (md->utf8) - { - length = 1; - ecode++; - GETCHARLEN(fc, ecode, length); - if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); - while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); - } - else -#endif - - /* Non-UTF-8 mode */ - { - if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); - if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); - ecode += 2; - } - break; - - /* Match a single character, caselessly */ - - case OP_CHARNC: -#ifdef SUPPORT_UTF8 - if (md->utf8) - { - length = 1; - ecode++; - GETCHARLEN(fc, ecode, length); - - if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); - - /* If the pattern character's value is < 128, we have only one byte, and - can use the fast lookup table. */ - - if (fc < 128) - { - if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); - } - - /* Otherwise we must pick up the subject character */ - - else - { - int dc; - GETCHARINC(dc, eptr); - ecode += length; - - /* If we have Unicode property support, we can use it to test the other - case of the character, if there is one. The result of ucp_findchar() is - < 0 if the char isn't found, and othercase is returned as zero if there - isn't one. */ - - if (fc != dc) - { -#ifdef SUPPORT_UCP - int chartype; - int othercase; - if (ucp_findchar(fc, &chartype, &othercase) < 0 || dc != othercase) -#endif - RRETURN(MATCH_NOMATCH); - } - } - } - else -#endif /* SUPPORT_UTF8 */ - - /* Non-UTF-8 mode */ - { - if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); - if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); - ecode += 2; - } - break; - - /* Match a single character repeatedly; different opcodes share code. */ - - case OP_EXACT: - min = max = GET2(ecode, 1); - ecode += 3; - goto REPEATCHAR; - - case OP_UPTO: - case OP_MINUPTO: - min = 0; - max = GET2(ecode, 1); - minimize = *ecode == OP_MINUPTO; - ecode += 3; - goto REPEATCHAR; - - case OP_STAR: - case OP_MINSTAR: - case OP_PLUS: - case OP_MINPLUS: - case OP_QUERY: - case OP_MINQUERY: - c = *ecode++ - OP_STAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - - /* Common code for all repeated single-character matches. We can give - up quickly if there are fewer than the minimum number of characters left in - the subject. */ - - REPEATCHAR: -#ifdef SUPPORT_UTF8 - if (md->utf8) - { - length = 1; - charptr = ecode; - GETCHARLEN(fc, ecode, length); - if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); - ecode += length; - - /* Handle multibyte character matching specially here. There is - support for caseless matching if UCP support is present. */ - - if (length > 1) - { - int oclength = 0; - uschar occhars[8]; - -#ifdef SUPPORT_UCP - int othercase; - int chartype; - if ((ims & PCRE_CASELESS) != 0 && - ucp_findchar(fc, &chartype, &othercase) >= 0 && - othercase > 0) - oclength = ord2utf8(othercase, occhars); -#endif /* SUPPORT_UCP */ - - for (i = 1; i <= min; i++) - { - if (memcmp(eptr, charptr, length) == 0) eptr += length; - /* Need braces because of following else */ - else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } - else - { - if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); - eptr += oclength; - } - } - - if (min == max) continue; - - if (minimize) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - if (memcmp(eptr, charptr, length) == 0) eptr += length; - /* Need braces because of following else */ - else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } - else - { - if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); - eptr += oclength; - } - } - /* Control never gets here */ - } - else - { - pp = eptr; - for (i = min; i < max; i++) - { - if (eptr > md->end_subject - length) break; - if (memcmp(eptr, charptr, length) == 0) eptr += length; - else if (oclength == 0) break; - else - { - if (memcmp(eptr, occhars, oclength) != 0) break; - eptr += oclength; - } - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - eptr -= length; - } - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - } - - /* If the length of a UTF-8 character is 1, we fall through here, and - obey the code as for non-UTF-8 characters below, though in this case the - value of fc will always be < 128. */ - } - else -#endif /* SUPPORT_UTF8 */ - - /* When not in UTF-8 mode, load a single-byte character. */ - { - if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); - fc = *ecode++; - } - - /* The value of fc at this point is always less than 256, though we may or - may not be in UTF-8 mode. The code is duplicated for the caseless and - caseful cases, for speed, since matching characters is likely to be quite - common. First, ensure the minimum number of matches are present. If min = - max, continue at the same level without recursing. Otherwise, if - minimizing, keep trying the rest of the expression and advancing one - matching character if failing, up to the maximum. Alternatively, if - maximizing, find the maximum number of characters and work backwards. */ - - DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max, - max, eptr)); - - if ((ims & PCRE_CASELESS) != 0) - { - fc = md->lcc[fc]; - for (i = 1; i <= min; i++) - if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); - if (min == max) continue; - if (minimize) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || - fc != md->lcc[*eptr++]) - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - } - else - { - pp = eptr; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; - eptr++; - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - eptr--; - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - } - - /* Caseful comparisons (includes all multi-byte characters) */ - - else - { - for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH); - if (min == max) continue; - if (minimize) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || fc != *eptr++) - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - } - else - { - pp = eptr; - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || fc != *eptr) break; - eptr++; - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - eptr--; - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - - /* Match a negated single one-byte character. The character we are - checking can be multibyte. */ - - case OP_NOT: - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - ecode++; - GETCHARINCTEST(c, eptr); - if ((ims & PCRE_CASELESS) != 0) - { -#ifdef SUPPORT_UTF8 - if (c < 256) -#endif - c = md->lcc[c]; - if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH); - } - else - { - if (*ecode++ == c) RRETURN(MATCH_NOMATCH); - } - break; - - /* Match a negated single one-byte character repeatedly. This is almost a - repeat of the code for a repeated single character, but I haven't found a - nice way of commoning these up that doesn't require a test of the - positive/negative option for each character match. Maybe that wouldn't add - very much to the time taken, but character matching *is* what this is all - about... */ - - case OP_NOTEXACT: - min = max = GET2(ecode, 1); - ecode += 3; - goto REPEATNOTCHAR; - - case OP_NOTUPTO: - case OP_NOTMINUPTO: - min = 0; - max = GET2(ecode, 1); - minimize = *ecode == OP_NOTMINUPTO; - ecode += 3; - goto REPEATNOTCHAR; - - case OP_NOTSTAR: - case OP_NOTMINSTAR: - case OP_NOTPLUS: - case OP_NOTMINPLUS: - case OP_NOTQUERY: - case OP_NOTMINQUERY: - c = *ecode++ - OP_NOTSTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - - /* Common code for all repeated single-byte matches. We can give up quickly - if there are fewer than the minimum number of bytes left in the - subject. */ - - REPEATNOTCHAR: - if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); - fc = *ecode++; - - /* The code is duplicated for the caseless and caseful cases, for speed, - since matching characters is likely to be quite common. First, ensure the - minimum number of matches are present. If min = max, continue at the same - level without recursing. Otherwise, if minimizing, keep trying the rest of - the expression and advancing one matching character if failing, up to the - maximum. Alternatively, if maximizing, find the maximum number of - characters and work backwards. */ - - DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max, - max, eptr)); - - if ((ims & PCRE_CASELESS) != 0) - { - fc = md->lcc[fc]; - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - register int d; - for (i = 1; i <= min; i++) - { - GETCHARINC(d, eptr); - if (d < 256) d = md->lcc[d]; - if (fc == d) RRETURN(MATCH_NOMATCH); - } - } - else -#endif - - /* Not UTF-8 mode */ - { - for (i = 1; i <= min; i++) - if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); - } - - if (min == max) continue; - - if (minimize) - { -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - register int d; - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - GETCHARINC(d, eptr); - if (d < 256) d = md->lcc[d]; - if (fi >= max || eptr >= md->end_subject || fc == d) - RRETURN(MATCH_NOMATCH); - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++]) - RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - } - - /* Maximize case */ - - else - { - pp = eptr; - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - register int d; - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(d, eptr, len); - if (d < 256) d = md->lcc[d]; - if (fc == d) break; - eptr += len; - } - for(;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - BACKCHAR(eptr); - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; - eptr++; - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - eptr--; - } - } - - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - } - - /* Caseful comparisons */ - - else - { -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - register int d; - for (i = 1; i <= min; i++) - { - GETCHARINC(d, eptr); - if (fc == d) RRETURN(MATCH_NOMATCH); - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (i = 1; i <= min; i++) - if (fc == *eptr++) RRETURN(MATCH_NOMATCH); - } - - if (min == max) continue; - - if (minimize) - { -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - register int d; - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - GETCHARINC(d, eptr); - if (fi >= max || eptr >= md->end_subject || fc == d) - RRETURN(MATCH_NOMATCH); - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject || fc == *eptr++) - RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - } - - /* Maximize case */ - - else - { - pp = eptr; - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - register int d; - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(d, eptr, len); - if (fc == d) break; - eptr += len; - } - for(;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - BACKCHAR(eptr); - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || fc == *eptr) break; - eptr++; - } - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - eptr--; - } - } - - RRETURN(MATCH_NOMATCH); - } - } - /* Control never gets here */ - - /* Match a single character type repeatedly; several different opcodes - share code. This is very similar to the code for single characters, but we - repeat it in the interests of efficiency. */ - - case OP_TYPEEXACT: - min = max = GET2(ecode, 1); - minimize = TRUE; - ecode += 3; - goto REPEATTYPE; - - case OP_TYPEUPTO: - case OP_TYPEMINUPTO: - min = 0; - max = GET2(ecode, 1); - minimize = *ecode == OP_TYPEMINUPTO; - ecode += 3; - goto REPEATTYPE; - - case OP_TYPESTAR: - case OP_TYPEMINSTAR: - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - case OP_TYPEQUERY: - case OP_TYPEMINQUERY: - c = *ecode++ - OP_TYPESTAR; - minimize = (c & 1) != 0; - min = rep_min[c]; /* Pick up values from tables; */ - max = rep_max[c]; /* zero for max => infinity */ - if (max == 0) max = INT_MAX; - - /* Common code for all repeated single character type matches. Note that - in UTF-8 mode, '.' matches a character of any length, but for the other - character types, the valid characters are all one-byte long. */ - - REPEATTYPE: - ctype = *ecode++; /* Code for the character type */ - -#ifdef SUPPORT_UCP - if (ctype == OP_PROP || ctype == OP_NOTPROP) - { - prop_fail_result = ctype == OP_NOTPROP; - prop_type = *ecode++; - if (prop_type >= 128) - { - prop_test_against = prop_type - 128; - prop_test_variable = &prop_category; - } - else - { - prop_test_against = prop_type; - prop_test_variable = &prop_chartype; - } - } - else prop_type = -1; -#endif - - /* First, ensure the minimum number of matches are present. Use inline - code for maximizing the speed, and do the type test once at the start - (i.e. keep it out of the loop). Also we can test that there are at least - the minimum number of bytes before we start. This isn't as effective in - UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that - is tidier. Also separate the UCP code, which can be the same for both UTF-8 - and single-bytes. */ - - if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); - if (min > 0) - { -#ifdef SUPPORT_UCP - if (prop_type > 0) - { - for (i = 1; i <= min; i++) - { - GETCHARINC(c, eptr); - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if ((*prop_test_variable == prop_test_against) == prop_fail_result) - RRETURN(MATCH_NOMATCH); - } - } - - /* Match extended Unicode sequences. We will get here only if the - support is in the binary; otherwise a compile-time error occurs. */ - - else if (ctype == OP_EXTUNI) - { - for (i = 1; i <= min; i++) - { - GETCHARINCTEST(c, eptr); - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); - while (eptr < md->end_subject) - { - int len = 1; - if (!md->utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category != ucp_M) break; - eptr += len; - } - } - } - - else -#endif /* SUPPORT_UCP */ - -/* Handle all other cases when the coding is UTF-8 */ - -#ifdef SUPPORT_UTF8 - if (md->utf8) switch(ctype) - { - case OP_ANY: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - (*eptr++ == NEWLINE && (ims & PCRE_DOTALL) == 0)) - RRETURN(MATCH_NOMATCH); - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - break; - - case OP_ANYBYTE: - eptr += min; - break; - - case OP_NOT_DIGIT: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); - if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) - RRETURN(MATCH_NOMATCH); - } - break; - - case OP_DIGIT: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) - RRETURN(MATCH_NOMATCH); - /* No need to skip more bytes - we know it's a 1-byte character */ - } - break; - - case OP_NOT_WHITESPACE: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0)) - RRETURN(MATCH_NOMATCH); - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - break; - - case OP_WHITESPACE: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) - RRETURN(MATCH_NOMATCH); - /* No need to skip more bytes - we know it's a 1-byte character */ - } - break; - - case OP_NOT_WORDCHAR: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0)) - RRETURN(MATCH_NOMATCH); - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - break; - - case OP_WORDCHAR: - for (i = 1; i <= min; i++) - { - if (eptr >= md->end_subject || - *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) - RRETURN(MATCH_NOMATCH); - /* No need to skip more bytes - we know it's a 1-byte character */ - } - break; - - default: - RRETURN(PCRE_ERROR_INTERNAL); - } /* End switch(ctype) */ - - else -#endif /* SUPPORT_UTF8 */ - - /* Code for the non-UTF-8 case for minimum matching of operators other - than OP_PROP and OP_NOTPROP. */ - - switch(ctype) - { - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0) - { - for (i = 1; i <= min; i++) - if (*eptr++ == NEWLINE) RRETURN(MATCH_NOMATCH); - } - else eptr += min; - break; - - case OP_ANYBYTE: - eptr += min; - break; - - case OP_NOT_DIGIT: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_DIGIT: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_NOT_WHITESPACE: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_WHITESPACE: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_NOT_WORDCHAR: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_word) != 0) - RRETURN(MATCH_NOMATCH); - break; - - case OP_WORDCHAR: - for (i = 1; i <= min; i++) - if ((md->ctypes[*eptr++] & ctype_word) == 0) - RRETURN(MATCH_NOMATCH); - break; - - default: - RRETURN(PCRE_ERROR_INTERNAL); - } - } - - /* If min = max, continue at the same level without recursing */ - - if (min == max) continue; - - /* If minimizing, we have to test the rest of the pattern before each - subsequent match. Again, separate the UTF-8 case for speed, and also - separate the UCP cases. */ - - if (minimize) - { -#ifdef SUPPORT_UCP - if (prop_type > 0) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINC(c, eptr); - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if ((*prop_test_variable == prop_test_against) == prop_fail_result) - RRETURN(MATCH_NOMATCH); - } - } - - /* Match extended Unicode sequences. We will get here only if the - support is in the binary; otherwise a compile-time error occurs. */ - - else if (ctype == OP_EXTUNI) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - GETCHARINCTEST(c, eptr); - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); - while (eptr < md->end_subject) - { - int len = 1; - if (!md->utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category != ucp_M) break; - eptr += len; - } - } - } - - else -#endif /* SUPPORT_UCP */ - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - if (md->utf8) - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - - GETCHARINC(c, eptr); - switch(ctype) - { - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH); - break; - - case OP_ANYBYTE: - break; - - case OP_NOT_DIGIT: - if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) - RRETURN(MATCH_NOMATCH); - break; - - case OP_DIGIT: - if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0) - RRETURN(MATCH_NOMATCH); - break; - - case OP_NOT_WHITESPACE: - if (c < 256 && (md->ctypes[c] & ctype_space) != 0) - RRETURN(MATCH_NOMATCH); - break; - - case OP_WHITESPACE: - if (c >= 256 || (md->ctypes[c] & ctype_space) == 0) - RRETURN(MATCH_NOMATCH); - break; - - case OP_NOT_WORDCHAR: - if (c < 256 && (md->ctypes[c] & ctype_word) != 0) - RRETURN(MATCH_NOMATCH); - break; - - case OP_WORDCHAR: - if (c >= 256 && (md->ctypes[c] & ctype_word) == 0) - RRETURN(MATCH_NOMATCH); - break; - - default: - RRETURN(PCRE_ERROR_INTERNAL); - } - } - } - else -#endif - /* Not UTF-8 mode */ - { - for (fi = min;; fi++) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); - c = *eptr++; - switch(ctype) - { - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH); - break; - - case OP_ANYBYTE: - break; - - case OP_NOT_DIGIT: - if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_DIGIT: - if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_NOT_WHITESPACE: - if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_WHITESPACE: - if ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_NOT_WORDCHAR: - if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); - break; - - case OP_WORDCHAR: - if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); - break; - - default: - RRETURN(PCRE_ERROR_INTERNAL); - } - } - } - /* Control never gets here */ - } - - /* If maximizing it is worth using inline code for speed, doing the type - test once at the start (i.e. keep it out of the loop). Again, keep the - UTF-8 and UCP stuff separate. */ - - else - { - pp = eptr; /* Remember where we started */ - -#ifdef SUPPORT_UCP - if (prop_type > 0) - { - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if ((*prop_test_variable == prop_test_against) == prop_fail_result) - break; - eptr+= len; - } - - /* eptr is now past the end of the maximum run */ - - for(;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - BACKCHAR(eptr); - } - } - - /* Match extended Unicode sequences. We will get here only if the - support is in the binary; otherwise a compile-time error occurs. */ - - else if (ctype == OP_EXTUNI) - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject) break; - GETCHARINCTEST(c, eptr); - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category == ucp_M) break; - while (eptr < md->end_subject) - { - int len = 1; - if (!md->utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category != ucp_M) break; - eptr += len; - } - } - - /* eptr is now past the end of the maximum run */ - - for(;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - for (;;) /* Move back over one extended */ - { - int len = 1; - BACKCHAR(eptr); - if (!md->utf8) c = *eptr; else - { - GETCHARLEN(c, eptr, len); - } - prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase); - if (prop_category != ucp_M) break; - eptr--; - } - } - } - - else -#endif /* SUPPORT_UCP */ - -#ifdef SUPPORT_UTF8 - /* UTF-8 mode */ - - if (md->utf8) - { - switch(ctype) - { - case OP_ANY: - - /* Special code is required for UTF8, but when the maximum is unlimited - we don't need it, so we repeat the non-UTF8 code. This is probably - worth it, because .* is quite a common idiom. */ - - if (max < INT_MAX) - { - if ((ims & PCRE_DOTALL) == 0) - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || *eptr == NEWLINE) break; - eptr++; - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - } - else - { - for (i = min; i < max; i++) - { - eptr++; - while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; - } - } - } - - /* Handle unlimited UTF-8 repeat */ - - else - { - if ((ims & PCRE_DOTALL) == 0) - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || *eptr == NEWLINE) break; - eptr++; - } - break; - } - else - { - c = max - min; - if (c > md->end_subject - eptr) c = md->end_subject - eptr; - eptr += c; - } - } - break; - - /* The byte case is the same as non-UTF8 */ - - case OP_ANYBYTE: - c = max - min; - if (c > md->end_subject - eptr) c = md->end_subject - eptr; - eptr += c; - break; - - case OP_NOT_DIGIT: - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break; - eptr+= len; - } - break; - - case OP_DIGIT: - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break; - eptr+= len; - } - break; - - case OP_NOT_WHITESPACE: - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break; - eptr+= len; - } - break; - - case OP_WHITESPACE: - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break; - eptr+= len; - } - break; - - case OP_NOT_WORDCHAR: - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break; - eptr+= len; - } - break; - - case OP_WORDCHAR: - for (i = min; i < max; i++) - { - int len = 1; - if (eptr >= md->end_subject) break; - GETCHARLEN(c, eptr, len); - if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break; - eptr+= len; - } - break; - - default: - RRETURN(PCRE_ERROR_INTERNAL); - } - - /* eptr is now past the end of the maximum run */ - - for(;;) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ - BACKCHAR(eptr); - } - } - else -#endif - - /* Not UTF-8 mode */ - { - switch(ctype) - { - case OP_ANY: - if ((ims & PCRE_DOTALL) == 0) - { - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || *eptr == NEWLINE) break; - eptr++; - } - break; - } - /* For DOTALL case, fall through and treat as \C */ - - case OP_ANYBYTE: - c = max - min; - if (c > md->end_subject - eptr) c = md->end_subject - eptr; - eptr += c; - break; - - case OP_NOT_DIGIT: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) - break; - eptr++; - } - break; - - case OP_DIGIT: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) - break; - eptr++; - } - break; - - case OP_NOT_WHITESPACE: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) - break; - eptr++; - } - break; - - case OP_WHITESPACE: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) - break; - eptr++; - } - break; - - case OP_NOT_WORDCHAR: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) - break; - eptr++; - } - break; - - case OP_WORDCHAR: - for (i = min; i < max; i++) - { - if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) - break; - eptr++; - } - break; - - default: - RRETURN(PCRE_ERROR_INTERNAL); - } - - /* eptr is now past the end of the maximum run */ - - while (eptr >= pp) - { - RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); - eptr--; - if (rrc != MATCH_NOMATCH) RRETURN(rrc); - } - } - - /* Get here if we can't make it match with any permitted repetitions */ - - RRETURN(MATCH_NOMATCH); - } - /* Control never gets here */ - - /* There's been some horrible disaster. Since all codes > OP_BRA are - for capturing brackets, and there shouldn't be any gaps between 0 and - OP_BRA, arrival here can only mean there is something seriously wrong - in the code above or the OP_xxx definitions. */ - - default: - DPRINTF(("Unknown opcode %d\n", *ecode)); - RRETURN(PCRE_ERROR_UNKNOWN_NODE); - } - - /* Do not stick any code in here without much thought; it is assumed - that "continue" in the code above comes out to here to repeat the main - loop. */ - - } /* End of main loop */ -/* Control never reaches here */ -} - - -/*************************************************************************** -**************************************************************************** - RECURSION IN THE match() FUNCTION - -Undefine all the macros that were defined above to handle this. */ - -#ifdef NO_RECURSE -#undef eptr -#undef ecode -#undef offset_top -#undef ims -#undef eptrb -#undef flags - -#undef callpat -#undef charptr -#undef data -#undef next -#undef pp -#undef prev -#undef saved_eptr - -#undef new_recursive - -#undef cur_is_word -#undef condition -#undef minimize -#undef prev_is_word - -#undef original_ims - -#undef ctype -#undef length -#undef max -#undef min -#undef number -#undef offset -#undef op -#undef save_capture_last -#undef save_offset1 -#undef save_offset2 -#undef save_offset3 -#undef stacksave - -#undef newptrb - -#endif - -/* These two are defined as macros in both cases */ - -#undef fc -#undef fi - -/*************************************************************************** -***************************************************************************/ - - - -/************************************************* -* Execute a Regular Expression * -*************************************************/ - -/* This function applies a compiled re to a subject string and picks out -portions of the string if it matches. Two elements in the vector are set for -each substring: the offsets to the start and end of the substring. - -Arguments: - argument_re points to the compiled expression - extra_data points to extra data or is NULL - subject points to the subject string - length length of subject string (may contain binary zeros) - start_offset where to start in the subject string - options option bits - offsets points to a vector of ints to be filled in with offsets - offsetcount the number of elements in the vector - -Returns: > 0 => success; value is the number of elements filled in - = 0 => success, but offsets is not big enough - -1 => failed to match - < -1 => some kind of unexpected problem -*/ - -EXPORT int -pcre_exec(const pcre *argument_re, const pcre_extra *extra_data, - const char *subject, int length, int start_offset, int options, int *offsets, - int offsetcount) -{ -int rc, resetcount, ocount; -int first_byte = -1; -int req_byte = -1; -int req_byte2 = -1; -unsigned long int ims = 0; -BOOL using_temporary_offsets = FALSE; -BOOL anchored; -BOOL startline; -BOOL first_byte_caseless = FALSE; -BOOL req_byte_caseless = FALSE; -match_data match_block; -const uschar *tables; -const uschar *start_bits = NULL; -const uschar *start_match = (const uschar *)subject + start_offset; -const uschar *end_subject; -const uschar *req_byte_ptr = start_match - 1; - -pcre_study_data internal_study; -const pcre_study_data *study; - -real_pcre internal_re; -const real_pcre *external_re = (const real_pcre *)argument_re; -const real_pcre *re = external_re; - -/* Plausibility checks */ - -if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; -if (re == NULL || subject == NULL || - (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; -if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; - -/* Fish out the optional data from the extra_data structure, first setting -the default values. */ - -study = NULL; -match_block.match_limit = MATCH_LIMIT; -match_block.callout_data = NULL; - -/* The table pointer is always in native byte order. */ - -tables = external_re->tables; - -if (extra_data != NULL) - { - register unsigned int flags = extra_data->flags; - if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) - study = (const pcre_study_data *)extra_data->study_data; - if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) - match_block.match_limit = extra_data->match_limit; - if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) - match_block.callout_data = extra_data->callout_data; - if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables; - } - -/* If the exec call supplied NULL for tables, use the inbuilt ones. This -is a feature that makes it possible to save compiled regex and re-use them -in other programs later. */ - -if (tables == NULL) tables = pcre_default_tables; - -/* Check that the first field in the block is the magic number. If it is not, -test for a regex that was compiled on a host of opposite endianness. If this is -the case, flipped values are put in internal_re and internal_study if there was -study data too. */ - -if (re->magic_number != MAGIC_NUMBER) - { - re = try_flipped(re, &internal_re, study, &internal_study); - if (re == NULL) return PCRE_ERROR_BADMAGIC; - if (study != NULL) study = &internal_study; - } - -/* Set up other data */ - -anchored = ((re->options | options) & PCRE_ANCHORED) != 0; -startline = (re->options & PCRE_STARTLINE) != 0; - -/* The code starts after the real_pcre block and the capture name table. */ - -match_block.start_code = (const uschar *)external_re + re->name_table_offset + - re->name_count * re->name_entry_size; - -match_block.start_subject = (const uschar *)subject; -match_block.start_offset = start_offset; -match_block.end_subject = match_block.start_subject + length; -end_subject = match_block.end_subject; - -match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; -match_block.utf8 = (re->options & PCRE_UTF8) != 0; - -match_block.notbol = (options & PCRE_NOTBOL) != 0; -match_block.noteol = (options & PCRE_NOTEOL) != 0; -match_block.notempty = (options & PCRE_NOTEMPTY) != 0; -match_block.partial = (options & PCRE_PARTIAL) != 0; -match_block.hitend = FALSE; - -match_block.recursive = NULL; /* No recursion at top level */ - -match_block.lcc = tables + lcc_offset; -match_block.ctypes = tables + ctypes_offset; - -/* Partial matching is supported only for a restricted set of regexes at the -moment. */ - -if (match_block.partial && (re->options & PCRE_NOPARTIAL) != 0) - return PCRE_ERROR_BADPARTIAL; - -/* Check a UTF-8 string if required. Unfortunately there's no way of passing -back the character offset. */ - -#ifdef SUPPORT_UTF8 -if (match_block.utf8 && (options & PCRE_NO_UTF8_CHECK) == 0) - { - if (valid_utf8((uschar *)subject, length) >= 0) - return PCRE_ERROR_BADUTF8; - if (start_offset > 0 && start_offset < length) - { - int tb = ((uschar *)subject)[start_offset]; - if (tb > 127) - { - tb &= 0xc0; - if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET; - } - } - } -#endif - -/* The ims options can vary during the matching as a result of the presence -of (?ims) items in the pattern. They are kept in a local variable so that -restoring at the exit of a group is easy. */ - -ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); - -/* If the expression has got more back references than the offsets supplied can -hold, we get a temporary chunk of working store to use during the matching. -Otherwise, we can use the vector supplied, rounding down its size to a multiple -of 3. */ - -ocount = offsetcount - (offsetcount % 3); - -if (re->top_backref > 0 && re->top_backref >= ocount/3) - { - ocount = re->top_backref * 3 + 3; - match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); - if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY; - using_temporary_offsets = TRUE; - DPRINTF(("Got memory to hold back references\n")); - } -else match_block.offset_vector = offsets; - -match_block.offset_end = ocount; -match_block.offset_max = (2*ocount)/3; -match_block.offset_overflow = FALSE; -match_block.capture_last = -1; - -/* Compute the minimum number of offsets that we need to reset each time. Doing -this makes a huge difference to execution time when there aren't many brackets -in the pattern. */ - -resetcount = 2 + re->top_bracket * 2; -if (resetcount > offsetcount) resetcount = ocount; - -/* Reset the working variable associated with each extraction. These should -never be used unless previously set, but they get saved and restored, and so we -initialize them to avoid reading uninitialized locations. */ - -if (match_block.offset_vector != NULL) - { - register int *iptr = match_block.offset_vector + ocount; - register int *iend = iptr - resetcount/2 + 1; - while (--iptr >= iend) *iptr = -1; - } - -/* Set up the first character to match, if available. The first_byte value is -never set for an anchored regular expression, but the anchoring may be forced -at run time, so we have to test for anchoring. The first char may be unset for -an unanchored pattern, of course. If there's no first char and the pattern was -studied, there may be a bitmap of possible first characters. */ - -if (!anchored) - { - if ((re->options & PCRE_FIRSTSET) != 0) - { - first_byte = re->first_byte & 255; - if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE) - first_byte = match_block.lcc[first_byte]; - } - else - if (!startline && study != NULL && - (study->options & PCRE_STUDY_MAPPED) != 0) - start_bits = study->start_bits; - } - -/* For anchored or unanchored matches, there may be a "last known required -character" set. */ - -if ((re->options & PCRE_REQCHSET) != 0) - { - req_byte = re->req_byte & 255; - req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0; - req_byte2 = (tables + fcc_offset)[req_byte]; /* case flipped */ - } - -/* Loop for handling unanchored repeated matching attempts; for anchored regexs -the loop runs just once. */ - -do - { - /* Reset the maximum number of extractions we might see. */ - - if (match_block.offset_vector != NULL) - { - register int *iptr = match_block.offset_vector; - register int *iend = iptr + resetcount; - while (iptr < iend) *iptr++ = -1; - } - - /* Advance to a unique first char if possible */ - - if (first_byte >= 0) - { - if (first_byte_caseless) - while (start_match < end_subject && - match_block.lcc[*start_match] != first_byte) - start_match++; - else - while (start_match < end_subject && *start_match != first_byte) - start_match++; - } - - /* Or to just after \n for a multiline match if possible */ - - else if (startline) - { - if (start_match > match_block.start_subject + start_offset) - { - while (start_match < end_subject && start_match[-1] != NEWLINE) - start_match++; - } - } - - /* Or to a non-unique first char after study */ - - else if (start_bits != NULL) - { - while (start_match < end_subject) - { - register unsigned int c = *start_match; - if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break; - } - } - -#ifdef DEBUG /* Sigh. Some compilers never learn. */ - printf(">>>> Match against: "); - pchars(start_match, end_subject - start_match, TRUE, &match_block); - printf("\n"); -#endif - - /* If req_byte is set, we know that that character must appear in the subject - for the match to succeed. If the first character is set, req_byte must be - later in the subject; otherwise the test starts at the match point. This - optimization can save a huge amount of backtracking in patterns with nested - unlimited repeats that aren't going to match. Writing separate code for - cased/caseless versions makes it go faster, as does using an autoincrement - and backing off on a match. - - HOWEVER: when the subject string is very, very long, searching to its end can - take a long time, and give bad performance on quite ordinary patterns. This - showed up when somebody was matching /^C/ on a 32-megabyte string... so we - don't do this when the string is sufficiently long. - - ALSO: this processing is disabled when partial matching is requested. - */ - - if (req_byte >= 0 && - end_subject - start_match < REQ_BYTE_MAX && - !match_block.partial) - { - register const uschar *p = start_match + ((first_byte >= 0)? 1 : 0); - - /* We don't need to repeat the search if we haven't yet reached the - place we found it at last time. */ - - if (p > req_byte_ptr) - { - if (req_byte_caseless) - { - while (p < end_subject) - { - register int pp = *p++; - if (pp == req_byte || pp == req_byte2) { p--; break; } - } - } - else - { - while (p < end_subject) - { - if (*p++ == req_byte) { p--; break; } - } - } - - /* If we can't find the required character, break the matching loop */ - - if (p >= end_subject) break; - - /* If we have found the required character, save the point where we - found it, so that we don't search again next time round the loop if - the start hasn't passed this character yet. */ - - req_byte_ptr = p; - } - } - - /* When a match occurs, substrings will be set for all internal extractions; - we just need to set up the whole thing as substring 0 before returning. If - there were too many extractions, set the return code to zero. In the case - where we had to get some local store to hold offsets for backreferences, copy - those back references that we can. In this case there need not be overflow - if certain parts of the pattern were not used. */ - - match_block.start_match = start_match; - match_block.match_call_count = 0; - - rc = match(start_match, match_block.start_code, 2, &match_block, ims, NULL, - match_isgroup); - - if (rc == MATCH_NOMATCH) - { - start_match++; -#ifdef SUPPORT_UTF8 - if (match_block.utf8) - while(start_match < end_subject && (*start_match & 0xc0) == 0x80) - start_match++; -#endif - continue; - } - - if (rc != MATCH_MATCH) - { - DPRINTF((">>>> error: returning %d\n", rc)); - return rc; - } - - /* We have a match! Copy the offset information from temporary store if - necessary */ - - if (using_temporary_offsets) - { - if (offsetcount >= 4) - { - memcpy(offsets + 2, match_block.offset_vector + 2, - (offsetcount - 2) * sizeof(int)); - DPRINTF(("Copied offsets from temporary memory\n")); - } - if (match_block.end_offset_top > offsetcount) - match_block.offset_overflow = TRUE; - - DPRINTF(("Freeing temporary memory\n")); - (pcre_free)(match_block.offset_vector); - } - - rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2; - - if (offsetcount < 2) rc = 0; else - { - offsets[0] = start_match - match_block.start_subject; - offsets[1] = match_block.end_match_ptr - match_block.start_subject; - } - - DPRINTF((">>>> returning %d\n", rc)); - return rc; - } - -/* This "while" is the end of the "do" above */ - -while (!anchored && start_match <= end_subject); - -if (using_temporary_offsets) - { - DPRINTF(("Freeing temporary memory\n")); - (pcre_free)(match_block.offset_vector); - } - -if (match_block.partial && match_block.hitend) - { - DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); - return PCRE_ERROR_PARTIAL; - } -else - { - DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n")); - return PCRE_ERROR_NOMATCH; - } -} - -/* End of pcre.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/pcre.h b/vendor/cegui-0.4.0-custom/src/pcre/pcre.h deleted file mode 100644 index bccbcc0539..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/pcre.h +++ /dev/null @@ -1,204 +0,0 @@ -#ifndef _PCRE_H -#define _PCRE_H - -/* The file pcre.h is build by "configure". Do not edit it; instead -make changes to pcre.in. */ - -#define PCRE_MAJOR 5 -#define PCRE_MINOR 0 -#define PCRE_DATE 13-Sep-2004 - - -/* Win32 uses DLL by default */ -/* -#ifdef _WIN32 -# ifdef PCRE_DEFINITION -# ifdef DLL_EXPORT -# define PCRE_DATA_SCOPE __declspec(dllexport) -# endif -# else -# ifndef PCRE_STATIC -# define PCRE_DATA_SCOPE extern __declspec(dllimport) -# endif -# endif -#endif -*/ - -#ifndef PCRE_DATA_SCOPE -# define PCRE_DATA_SCOPE extern -#endif - -/* Have to include stdlib.h in order to ensure that size_t is defined; -it is needed here for malloc. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options */ - -#define PCRE_CASELESS 0x0001 -#define PCRE_MULTILINE 0x0002 -#define PCRE_DOTALL 0x0004 -#define PCRE_EXTENDED 0x0008 -#define PCRE_ANCHORED 0x0010 -#define PCRE_DOLLAR_ENDONLY 0x0020 -#define PCRE_EXTRA 0x0040 -#define PCRE_NOTBOL 0x0080 -#define PCRE_NOTEOL 0x0100 -#define PCRE_UNGREEDY 0x0200 -#define PCRE_NOTEMPTY 0x0400 -#define PCRE_UTF8 0x0800 -#define PCRE_NO_AUTO_CAPTURE 0x1000 -#define PCRE_NO_UTF8_CHECK 0x2000 -#define PCRE_AUTO_CALLOUT 0x4000 -#define PCRE_PARTIAL 0x8000 - -/* Exec-time and get/set-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_NODE (-5) -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) -#define PCRE_ERROR_MATCHLIMIT (-8) -#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ -#define PCRE_ERROR_BADUTF8 (-10) -#define PCRE_ERROR_BADUTF8_OFFSET (-11) -#define PCRE_ERROR_PARTIAL (-12) -#define PCRE_ERROR_BADPARTIAL (-13) -#define PCRE_ERROR_INTERNAL (-14) -#define PCRE_ERROR_BADCOUNT (-15) - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTBYTE 4 -#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 -#define PCRE_INFO_NAMEENTRYSIZE 7 -#define PCRE_INFO_NAMECOUNT 8 -#define PCRE_INFO_NAMETABLE 9 -#define PCRE_INFO_STUDYSIZE 10 -#define PCRE_INFO_DEFAULT_TABLES 11 - -/* Request types for pcre_config() */ - -#define PCRE_CONFIG_UTF8 0 -#define PCRE_CONFIG_NEWLINE 1 -#define PCRE_CONFIG_LINK_SIZE 2 -#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 -#define PCRE_CONFIG_MATCH_LIMIT 4 -#define PCRE_CONFIG_STACKRECURSE 5 -#define PCRE_CONFIG_UNICODE_PROPERTIES 6 - -/* Bit flags for the pcre_extra structure */ - -#define PCRE_EXTRA_STUDY_DATA 0x0001 -#define PCRE_EXTRA_MATCH_LIMIT 0x0002 -#define PCRE_EXTRA_CALLOUT_DATA 0x0004 -#define PCRE_EXTRA_TABLES 0x0008 - -/* Types */ - -struct real_pcre; /* declaration; the definition is private */ -typedef struct real_pcre pcre; - -/* The structure for passing additional data to pcre_exec(). This is defined in -such as way as to be extensible. Always add new fields at the end, in order to -remain compatible. */ - -typedef struct pcre_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ -} pcre_extra; - -/* The structure for passing out data via the pcre_callout_function. We use a -structure so that new fields can be added on the end in future versions, -without changing the API of the function, thereby allowing old clients to work -without modification. */ - -typedef struct pcre_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - const char *subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------------------------------------------------------ */ -} pcre_callout_block; - -/* Indirection for store get and free functions. These can be set to -alternative malloc/free functions if required. Special ones are used in the -non-recursive case for "frames". There is also an optional callout function -that is triggered by the (?) regex item. Some magic is required for Win32 DLL; -it is null on other OS. For Virtual Pascal, these have to be different again. -*/ - -#ifndef VPCOMPAT -PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t); -PCRE_DATA_SCOPE void (*pcre_free)(void *); -PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t); -PCRE_DATA_SCOPE void (*pcre_stack_free)(void *); -PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *); -#else /* VPCOMPAT */ -extern void *pcre_malloc(size_t); -extern void pcre_free(void *); -extern void *pcre_stack_malloc(size_t); -extern void pcre_stack_free(void *); -extern int pcre_callout(pcre_callout_block *); -#endif /* VPCOMPAT */ - -/* Exported PCRE functions */ - -extern pcre *pcre_compile(const char *, int, const char **, - int *, const unsigned char *); -extern int pcre_config(int, void *); -extern int pcre_copy_named_substring(const pcre *, const char *, - int *, int, const char *, char *, int); -extern int pcre_copy_substring(const char *, int *, int, int, - char *, int); -extern int pcre_exec(const pcre *, const pcre_extra *, - const char *, int, int, int, int *, int); -extern void pcre_free_substring(const char *); -extern void pcre_free_substring_list(const char **); -extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, - void *); -extern int pcre_get_named_substring(const pcre *, const char *, - int *, int, const char *, const char **); -extern int pcre_get_stringnumber(const pcre *, const char *); -extern int pcre_get_substring(const char *, int *, int, int, - const char **); -extern int pcre_get_substring_list(const char *, int *, int, - const char ***); -extern int pcre_info(const pcre *, int *, int *); -extern const unsigned char *pcre_maketables(void); -extern pcre_extra *pcre_study(const pcre *, int, const char **); -extern const char *pcre_version(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/pcreconfig.h b/vendor/cegui-0.4.0-custom/src/pcre/pcreconfig.h deleted file mode 100644 index 3686e11d37..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/pcreconfig.h +++ /dev/null @@ -1,109 +0,0 @@ -/* On Unix systems config.in is converted by configure into config.h. PCRE is -written in Standard C, but there are a few non-standard things it can cope -with, allowing it to run on SunOS4 and other "close to standard" systems. - -On a non-Unix system you should just copy this file into config.h, and set up -the macros the way you need them. You should normally change the definitions of -HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf -works, these cannot be made the defaults. If your system has bcopy() and not -memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your -system has neither bcopy() nor memmove(), leave them both as 0; an emulation -function will be used. */ - -/* CEGUI::String uses utf8, so allow regex support for this. */ -#define SUPPORT_UTF8 1 - -/* If you are compiling for a system that uses EBCDIC instead of ASCII -character codes, define this macro as 1. On systems that can use "configure", -this can be done via --enable-ebcdic. */ - -#ifndef EBCDIC -#define EBCDIC 0 -#endif - -/* If you are compiling for a system that needs some magic to be inserted -before the definition of an exported function, define this macro to contain the -relevant magic. It apears at the start of every exported function. */ - -#define EXPORT - -/* Define to empty if the "const" keyword does not work. */ - -#undef const - -/* Define to "unsigned" if doesn't define size_t. */ - -#undef size_t - -/* The following two definitions are mainly for the benefit of SunOS4, which -doesn't have the strerror() or memmove() functions that should be present in -all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should -normally be defined with the value 1 for other systems, but unfortunately we -can't make this the default because "configure" files generated by autoconf -will only change 0 to 1; they won't change 1 to 0 if the functions are not -found. */ - -#define HAVE_STRERROR 1 -#define HAVE_MEMMOVE 1 - -/* There are some non-Unix systems that don't even have bcopy(). If this macro -is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of -HAVE_BCOPY is not relevant. */ - -#define HAVE_BCOPY 0 - -/* The value of NEWLINE determines the newline character. The default is to -leave it up to the compiler, but some sites want to force a particular value. -On Unix systems, "configure" can be used to override this default. */ - -#ifndef NEWLINE -#define NEWLINE '\n' -#endif - -/* The value of LINK_SIZE determines the number of bytes used to store -links as offsets within the compiled regex. The default is 2, which allows for -compiled patterns up to 64K long. This covers the vast majority of cases. -However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for -longer patterns in extreme cases. On Unix systems, "configure" can be used to -override this default. */ - -#ifndef LINK_SIZE -#define LINK_SIZE 2 -#endif - -/* The value of MATCH_LIMIT determines the default number of times the match() -function can be called during a single execution of pcre_exec(). (There is a -runtime method of setting a different limit.) The limit exists in order to -catch runaway regular expressions that take for ever to determine that they do -not match. The default is set very large so that it does not accidentally catch -legitimate cases. On Unix systems, "configure" can be used to override this -default default. */ - -#ifndef MATCH_LIMIT -#define MATCH_LIMIT 10000000 -#endif - -/* When calling PCRE via the POSIX interface, additional working storage is -required for holding the pointers to capturing substrings because PCRE requires -three integers per substring, whereas the POSIX interface provides only two. If -the number of expected substrings is small, the wrapper function uses space on -the stack, because this is faster than using malloc() for each call. The -threshold above which the stack is no longer use is defined by POSIX_MALLOC_ -THRESHOLD. On Unix systems, "configure" can be used to override this default. -*/ - -#ifndef POSIX_MALLOC_THRESHOLD -#define POSIX_MALLOC_THRESHOLD 10 -#endif - -/* PCRE uses recursive function calls to handle backtracking while matching. -This can sometimes be a problem on systems that have stacks of limited size. -Define NO_RECURSE to get a version that doesn't use recursion in the match() -function; instead it creates its own stack by steam using pcre_recurse_malloc -to get memory. For more detail, see comments and other stuff just above the -match() function. On Unix systems, "configure" can be used to set this in the -Makefile (use --disable-stack-for-recursion). */ - -/* #define NO_RECURSE */ - -/* End */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/pcreposix.c b/vendor/cegui-0.4.0-custom/src/pcre/pcreposix.c deleted file mode 100644 index 1e8b6a72b1..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/pcreposix.c +++ /dev/null @@ -1,316 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* -This is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. See -the file Tech.Notes for some information on the internals. - -This module is a wrapper that provides a POSIX API to the underlying PCRE -functions. - -Written by: Philip Hazel - - Copyright (c) 1997-2004 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -#include "internal.h" -#include "pcreposix.h" -#include "stdlib.h" - - - -/* Corresponding tables of PCRE error messages and POSIX error codes. */ - -static const char *const estring[] = { - ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, - ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20, - ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30, - ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40, - ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47 }; - -static const int eint[] = { - REG_EESCAPE, /* "\\ at end of pattern" */ - REG_EESCAPE, /* "\\c at end of pattern" */ - REG_EESCAPE, /* "unrecognized character follows \\" */ - REG_BADBR, /* "numbers out of order in {} quantifier" */ - REG_BADBR, /* "number too big in {} quantifier" */ - REG_EBRACK, /* "missing terminating ] for character class" */ - REG_ECTYPE, /* "invalid escape sequence in character class" */ - REG_ERANGE, /* "range out of order in character class" */ - REG_BADRPT, /* "nothing to repeat" */ - REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */ - REG_ASSERT, /* "internal error: unexpected repeat" */ - REG_BADPAT, /* "unrecognized character after (?" */ - REG_BADPAT, /* "POSIX named classes are supported only within a class" */ - REG_EPAREN, /* "missing )" */ - REG_ESUBREG, /* "reference to non-existent subpattern" */ - REG_INVARG, /* "erroffset passed as NULL" */ - REG_INVARG, /* "unknown option bit(s) set" */ - REG_EPAREN, /* "missing ) after comment" */ - REG_ESIZE, /* "parentheses nested too deeply" */ - REG_ESIZE, /* "regular expression too large" */ - REG_ESPACE, /* "failed to get memory" */ - REG_EPAREN, /* "unmatched brackets" */ - REG_ASSERT, /* "internal error: code overflow" */ - REG_BADPAT, /* "unrecognized character after (?<" */ - REG_BADPAT, /* "lookbehind assertion is not fixed length" */ - REG_BADPAT, /* "malformed number after (?(" */ - REG_BADPAT, /* "conditional group containe more than two branches" */ - REG_BADPAT, /* "assertion expected after (?(" */ - REG_BADPAT, /* "(?R or (?digits must be followed by )" */ - REG_ECTYPE, /* "unknown POSIX class name" */ - REG_BADPAT, /* "POSIX collating elements are not supported" */ - REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */ - REG_BADPAT, /* "spare error" */ - REG_BADPAT, /* "character value in \x{...} sequence is too large" */ - REG_BADPAT, /* "invalid condition (?(0)" */ - REG_BADPAT, /* "\\C not allowed in lookbehind assertion" */ - REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\U, or \\u" */ - REG_BADPAT, /* "number after (?C is > 255" */ - REG_BADPAT, /* "closing ) for (?C expected" */ - REG_BADPAT, /* "recursive call could loop indefinitely" */ - REG_BADPAT, /* "unrecognized character after (?P" */ - REG_BADPAT, /* "syntax error after (?P" */ - REG_BADPAT, /* "two named groups have the same name" */ - REG_BADPAT, /* "invalid UTF-8 string" */ - REG_BADPAT, /* "support for \\P, \\p, and \\X has not been compiled" */ - REG_BADPAT, /* "malformed \\P or \\p sequence" */ - REG_BADPAT /* "unknown property name after \\P or \\p" */ -}; - -/* Table of texts corresponding to POSIX error codes */ - -static const char *const pstring[] = { - "", /* Dummy for value 0 */ - "internal error", /* REG_ASSERT */ - "invalid repeat counts in {}", /* BADBR */ - "pattern error", /* BADPAT */ - "? * + invalid", /* BADRPT */ - "unbalanced {}", /* EBRACE */ - "unbalanced []", /* EBRACK */ - "collation error - not relevant", /* ECOLLATE */ - "bad class", /* ECTYPE */ - "bad escape sequence", /* EESCAPE */ - "empty expression", /* EMPTY */ - "unbalanced ()", /* EPAREN */ - "bad range inside []", /* ERANGE */ - "expression too big", /* ESIZE */ - "failed to get memory", /* ESPACE */ - "bad back reference", /* ESUBREG */ - "bad argument", /* INVARG */ - "match failed" /* NOMATCH */ -}; - - - - -/************************************************* -* Translate PCRE text code to int * -*************************************************/ - -/* PCRE compile-time errors are given as strings defined as macros. We can just -look them up in a table to turn them into POSIX-style error codes. */ - -static int -pcre_posix_error_code(const char *s) -{ -size_t i; -for (i = 0; i < sizeof(estring)/sizeof(char *); i++) - if (strcmp(s, estring[i]) == 0) return eint[i]; -return REG_ASSERT; -} - - - -/************************************************* -* Translate error code to string * -*************************************************/ - -EXPORT size_t -regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) -{ -const char *message, *addmessage; -size_t length, addlength; - -message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))? - "unknown error code" : pstring[errcode]; -length = strlen(message) + 1; - -addmessage = " at offset "; -addlength = (preg != NULL && (int)preg->re_erroffset != -1)? - strlen(addmessage) + 6 : 0; - -if (errbuf_size > 0) - { - if (addlength > 0 && errbuf_size >= length + addlength) - sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset); - else - { - strncpy(errbuf, message, errbuf_size - 1); - errbuf[errbuf_size-1] = 0; - } - } - -return length + addlength; -} - - - - -/************************************************* -* Free store held by a regex * -*************************************************/ - -EXPORT void -regfree(regex_t *preg) -{ -(pcre_free)(preg->re_pcre); -} - - - - -/************************************************* -* Compile a regular expression * -*************************************************/ - -/* -Arguments: - preg points to a structure for recording the compiled expression - pattern the pattern to compile - cflags compilation flags - -Returns: 0 on success - various non-zero codes on failure -*/ - -EXPORT int -regcomp(regex_t *preg, const char *pattern, int cflags) -{ -const char *errorptr; -int erroffset; -int options = 0; - -if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; -if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; - -preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL); -preg->re_erroffset = erroffset; - -if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr); - -preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL); -return 0; -} - - - - -/************************************************* -* Match a regular expression * -*************************************************/ - -/* Unfortunately, PCRE requires 3 ints of working space for each captured -substring, so we have to get and release working store instead of just using -the POSIX structures as was done in earlier releases when PCRE needed only 2 -ints. However, if the number of possible capturing brackets is small, use a -block of store on the stack, to reduce the use of malloc/free. The threshold is -in a macro that can be changed at configure time. */ - -EXPORT int -regexec(const regex_t *preg, const char *string, size_t nmatch, - regmatch_t pmatch[], int eflags) -{ -int rc; -int options = 0; -int *ovector = NULL; -int small_ovector[POSIX_MALLOC_THRESHOLD * 3]; -BOOL allocated_ovector = FALSE; - -if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL; -if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL; - -((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */ - -if (nmatch > 0) - { - if (nmatch <= POSIX_MALLOC_THRESHOLD) - { - ovector = &(small_ovector[0]); - } - else - { - ovector = (int *)malloc(sizeof(int) * nmatch * 3); - if (ovector == NULL) return REG_ESPACE; - allocated_ovector = TRUE; - } - } - -rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string), - 0, options, ovector, nmatch * 3); - -if (rc == 0) rc = nmatch; /* All captured slots were filled in */ - -if (rc >= 0) - { - size_t i; - for (i = 0; i < (size_t)rc; i++) - { - pmatch[i].rm_so = ovector[i*2]; - pmatch[i].rm_eo = ovector[i*2+1]; - } - if (allocated_ovector) free(ovector); - for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; - return 0; - } - -else - { - if (allocated_ovector) free(ovector); - switch(rc) - { - case PCRE_ERROR_NOMATCH: return REG_NOMATCH; - case PCRE_ERROR_NULL: return REG_INVARG; - case PCRE_ERROR_BADOPTION: return REG_INVARG; - case PCRE_ERROR_BADMAGIC: return REG_INVARG; - case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; - case PCRE_ERROR_NOMEMORY: return REG_ESPACE; - case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE; - case PCRE_ERROR_BADUTF8: return REG_INVARG; - case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG; - default: return REG_ASSERT; - } - } -} - -/* End of pcreposix.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/pcreposix.h b/vendor/cegui-0.4.0-custom/src/pcre/pcreposix.h deleted file mode 100644 index a8056bd77c..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/pcreposix.h +++ /dev/null @@ -1,117 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -#ifndef _PCREPOSIX_H -#define _PCREPOSIX_H - -/* This is the header for the POSIX wrapper interface to the PCRE Perl- -Compatible Regular Expression library. It defines the things POSIX says should -be there. I hope. - - Copyright (c) 1997-2004 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* Have to include stdlib.h in order to ensure that size_t is defined. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options defined by POSIX. */ - -#define REG_ICASE 0x01 -#define REG_NEWLINE 0x02 -#define REG_NOTBOL 0x04 -#define REG_NOTEOL 0x08 - -/* These are not used by PCRE, but by defining them we make it easier -to slot PCRE into existing programs that make POSIX calls. */ - -#define REG_EXTENDED 0 -#define REG_NOSUB 0 - -/* Error values. Not all these are relevant or used by the wrapper. */ - -enum { - REG_ASSERT = 1, /* internal error ? */ - REG_BADBR, /* invalid repeat counts in {} */ - REG_BADPAT, /* pattern error */ - REG_BADRPT, /* ? * + invalid */ - REG_EBRACE, /* unbalanced {} */ - REG_EBRACK, /* unbalanced [] */ - REG_ECOLLATE, /* collation error - not relevant */ - REG_ECTYPE, /* bad class */ - REG_EESCAPE, /* bad escape sequence */ - REG_EMPTY, /* empty expression */ - REG_EPAREN, /* unbalanced () */ - REG_ERANGE, /* bad range inside [] */ - REG_ESIZE, /* expression too big */ - REG_ESPACE, /* failed to get memory */ - REG_ESUBREG, /* bad back reference */ - REG_INVARG, /* bad argument */ - REG_NOMATCH /* match failed */ -}; - - -/* The structure representing a compiled regular expression. */ - -typedef struct { - void *re_pcre; - size_t re_nsub; - size_t re_erroffset; -} regex_t; - -/* The structure in which a captured offset is returned. */ - -typedef int regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -/* The functions */ - -extern int regcomp(regex_t *, const char *, int); -extern int regexec(const regex_t *, const char *, size_t, regmatch_t *, int); -extern size_t regerror(int, const regex_t *, char *, size_t); -extern void regfree(regex_t *); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcreposix.h */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/study.c b/vendor/cegui-0.4.0-custom/src/pcre/study.c deleted file mode 100644 index d67070a4b3..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/study.c +++ /dev/null @@ -1,484 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* -This is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. See -the file Tech.Notes for some information on the internals. - -Written by: Philip Hazel - - Copyright (c) 1997-2004 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - - -/* Include the internals header, which itself includes Standard C headers plus -the external pcre header. */ - -#include "internal.h" - - - -/************************************************* -* Set a bit and maybe its alternate case * -*************************************************/ - -/* Given a character, set its bit in the table, and also the bit for the other -version of a letter if we are caseless. - -Arguments: - start_bits points to the bit map - c is the character - caseless the caseless flag - cd the block with char table pointers - -Returns: nothing -*/ - -static void -set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd) -{ -start_bits[c/8] |= (1 << (c&7)); -if (caseless && (cd->ctypes[c] & ctype_letter) != 0) - start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7)); -} - - - -/************************************************* -* Create bitmap of starting chars * -*************************************************/ - -/* This function scans a compiled unanchored expression and attempts to build a -bitmap of the set of initial characters. If it can't, it returns FALSE. As time -goes by, we may be able to get more clever at doing this. - -Arguments: - code points to an expression - start_bits points to a 32-byte table, initialized to 0 - caseless the current state of the caseless flag - utf8 TRUE if in UTF-8 mode - cd the block with char table pointers - -Returns: TRUE if table built, FALSE otherwise -*/ - -static BOOL -set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless, - BOOL utf8, compile_data *cd) -{ -register int c; - -/* This next statement and the later reference to dummy are here in order to -trick the optimizer of the IBM C compiler for OS/2 into generating correct -code. Apparently IBM isn't going to fix the problem, and we would rather not -disable optimization (in this module it actually makes a big difference, and -the pcre module can use all the optimization it can get). */ - -volatile int dummy; - -do - { - const uschar *tcode = code + 1 + LINK_SIZE; - BOOL try_next = TRUE; - - while (try_next) - { - /* If a branch starts with a bracket or a positive lookahead assertion, - recurse to set bits from within them. That's all for this branch. */ - - if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT) - { - if (!set_start_bits(tcode, start_bits, caseless, utf8, cd)) - return FALSE; - try_next = FALSE; - } - - else switch(*tcode) - { - default: - return FALSE; - - /* Skip over callout */ - - case OP_CALLOUT: - tcode += 2 + 2*LINK_SIZE; - break; - - /* Skip over extended extraction bracket number */ - - case OP_BRANUMBER: - tcode += 3; - break; - - /* Skip over lookbehind and negative lookahead assertions */ - - case OP_ASSERT_NOT: - case OP_ASSERTBACK: - case OP_ASSERTBACK_NOT: - do tcode += GET(tcode, 1); while (*tcode == OP_ALT); - tcode += 1+LINK_SIZE; - break; - - /* Skip over an option setting, changing the caseless flag */ - - case OP_OPT: - caseless = (tcode[1] & PCRE_CASELESS) != 0; - tcode += 2; - break; - - /* BRAZERO does the bracket, but carries on. */ - - case OP_BRAZERO: - case OP_BRAMINZERO: - if (!set_start_bits(++tcode, start_bits, caseless, utf8, cd)) - return FALSE; - dummy = 1; - do tcode += GET(tcode,1); while (*tcode == OP_ALT); - tcode += 1+LINK_SIZE; - break; - - /* Single-char * or ? sets the bit and tries the next item */ - - case OP_STAR: - case OP_MINSTAR: - case OP_QUERY: - case OP_MINQUERY: - set_bit(start_bits, tcode[1], caseless, cd); - tcode += 2; -#ifdef SUPPORT_UTF8 - if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++; -#endif - break; - - /* Single-char upto sets the bit and tries the next */ - - case OP_UPTO: - case OP_MINUPTO: - set_bit(start_bits, tcode[3], caseless, cd); - tcode += 4; -#ifdef SUPPORT_UTF8 - if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++; -#endif - break; - - /* At least one single char sets the bit and stops */ - - case OP_EXACT: /* Fall through */ - tcode += 2; - - case OP_CHAR: - case OP_CHARNC: - case OP_PLUS: - case OP_MINPLUS: - set_bit(start_bits, tcode[1], caseless, cd); - try_next = FALSE; - break; - - /* Single character type sets the bits and stops */ - - case OP_NOT_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_digit]; - try_next = FALSE; - break; - - case OP_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_digit]; - try_next = FALSE; - break; - - case OP_NOT_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_space]; - try_next = FALSE; - break; - - case OP_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_space]; - try_next = FALSE; - break; - - case OP_NOT_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_word]; - try_next = FALSE; - break; - - case OP_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_word]; - try_next = FALSE; - break; - - /* One or more character type fudges the pointer and restarts, knowing - it will hit a single character type and stop there. */ - - case OP_TYPEPLUS: - case OP_TYPEMINPLUS: - tcode++; - break; - - case OP_TYPEEXACT: - tcode += 3; - break; - - /* Zero or more repeats of character types set the bits and then - try again. */ - - case OP_TYPEUPTO: - case OP_TYPEMINUPTO: - tcode += 2; /* Fall through */ - - case OP_TYPESTAR: - case OP_TYPEMINSTAR: - case OP_TYPEQUERY: - case OP_TYPEMINQUERY: - switch(tcode[1]) - { - case OP_ANY: - return FALSE; - - case OP_NOT_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_digit]; - break; - - case OP_DIGIT: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_digit]; - break; - - case OP_NOT_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_space]; - break; - - case OP_WHITESPACE: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_space]; - break; - - case OP_NOT_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= ~cd->cbits[c+cbit_word]; - break; - - case OP_WORDCHAR: - for (c = 0; c < 32; c++) - start_bits[c] |= cd->cbits[c+cbit_word]; - break; - } - - tcode += 2; - break; - - /* Character class where all the information is in a bit map: set the - bits and either carry on or not, according to the repeat count. If it was - a negative class, and we are operating with UTF-8 characters, any byte - with a value >= 0xc4 is a potentially valid starter because it starts a - character with a value > 255. */ - - case OP_NCLASS: - if (utf8) - { - start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */ - memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */ - } - /* Fall through */ - - case OP_CLASS: - { - tcode++; - - /* In UTF-8 mode, the bits in a bit map correspond to character - values, not to byte values. However, the bit map we are constructing is - for byte values. So we have to do a conversion for characters whose - value is > 127. In fact, there are only two possible starting bytes for - characters in the range 128 - 255. */ - - if (utf8) - { - for (c = 0; c < 16; c++) start_bits[c] |= tcode[c]; - for (c = 128; c < 256; c++) - { - if ((tcode[c/8] && (1 << (c&7))) != 0) - { - int d = (c >> 6) | 0xc0; /* Set bit for this starter */ - start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */ - c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ - } - } - } - - /* In non-UTF-8 mode, the two bit maps are completely compatible. */ - - else - { - for (c = 0; c < 32; c++) start_bits[c] |= tcode[c]; - } - - /* Advance past the bit map, and act on what follows */ - - tcode += 32; - switch (*tcode) - { - case OP_CRSTAR: - case OP_CRMINSTAR: - case OP_CRQUERY: - case OP_CRMINQUERY: - tcode++; - break; - - case OP_CRRANGE: - case OP_CRMINRANGE: - if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5; - else try_next = FALSE; - break; - - default: - try_next = FALSE; - break; - } - } - break; /* End of bitmap class handling */ - - } /* End of switch */ - } /* End of try_next loop */ - - code += GET(code, 1); /* Advance to next branch */ - } -while (*code == OP_ALT); -return TRUE; -} - - - -/************************************************* -* Study a compiled expression * -*************************************************/ - -/* This function is handed a compiled expression that it must study to produce -information that will speed up the matching. It returns a pcre_extra block -which then gets handed back to pcre_exec(). - -Arguments: - re points to the compiled expression - options contains option bits - errorptr points to where to place error messages; - set NULL unless error - -Returns: pointer to a pcre_extra block, with study_data filled in and the - appropriate flag set; - NULL on error or if no optimization possible -*/ - -EXPORT pcre_extra * -pcre_study(const pcre *external_re, int options, const char **errorptr) -{ -uschar start_bits[32]; -pcre_extra *extra; -pcre_study_data *study; -const uschar *tables; -const real_pcre *re = (const real_pcre *)external_re; -uschar *code = (uschar *)re + re->name_table_offset + - (re->name_count * re->name_entry_size); -compile_data compile_block; - -*errorptr = NULL; - -if (re == NULL || re->magic_number != MAGIC_NUMBER) - { - *errorptr = "argument is not a compiled regular expression"; - return NULL; - } - -if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) - { - *errorptr = "unknown or incorrect option bit(s) set"; - return NULL; - } - -/* For an anchored pattern, or an unanchored pattern that has a first char, or -a multiline pattern that matches only at "line starts", no further processing -at present. */ - -if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) - return NULL; - -/* Set the character tables in the block that is passed around */ - -tables = re->tables; -if (tables == NULL) - (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, (void*)&tables); - -compile_block.lcc = tables + lcc_offset; -compile_block.fcc = tables + fcc_offset; -compile_block.cbits = tables + cbits_offset; -compile_block.ctypes = tables + ctypes_offset; - -/* See if we can find a fixed set of initial characters for the pattern. */ - -memset(start_bits, 0, 32 * sizeof(uschar)); -if (!set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0, - (re->options & PCRE_UTF8) != 0, &compile_block)) return NULL; - -/* Get a pcre_extra block and a pcre_study_data block. The study data is put in -the latter, which is pointed to by the former, which may also get additional -data set later by the calling program. At the moment, the size of -pcre_study_data is fixed. We nevertheless save it in a field for returning via -the pcre_fullinfo() function so that if it becomes variable in the future, we -don't have to change that code. */ - -extra = (pcre_extra *)(pcre_malloc) - (sizeof(pcre_extra) + sizeof(pcre_study_data)); - -if (extra == NULL) - { - *errorptr = "failed to get memory"; - return NULL; - } - -study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra)); -extra->flags = PCRE_EXTRA_STUDY_DATA; -extra->study_data = study; - -study->size = sizeof(pcre_study_data); -study->options = PCRE_STUDY_MAPPED; -memcpy(study->start_bits, start_bits, sizeof(start_bits)); - -return extra; -} - -/* End of study.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/ucp.c b/vendor/cegui-0.4.0-custom/src/pcre/ucp.c deleted file mode 100644 index 3d69653bb6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/ucp.c +++ /dev/null @@ -1,151 +0,0 @@ -/************************************************* -* libucp - Unicode Property Table handler * -*************************************************/ - -/* This function provides a fast way of obtaining the basic Unicode properties -of a character, using a compact binary tree that occupies less than 100K bytes. - - Copyright (c) 2004 University of Cambridge - -------------------------------------------------------------------------------- -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -*/ - - -#include "ucp.h" /* Exported interface */ -#include "ucpinternal.h" /* Internal table details */ -#include "ucptable.c" /* The table itself */ - - - -/************************************************* -* Search table and return data * -*************************************************/ - -/* Two values are returned: the category is ucp_C, ucp_L, etc. The detailed -character type is ucp_Lu, ucp_Nd, etc. - -Arguments: - c the character value - type_ptr the detailed character type is returned here - case_ptr for letters, the opposite case is returned here, if there - is one, else zero - -Returns: the character type category or -1 if not found -*/ - -static int -ucp_findchar(const int c, int *type_ptr, int *case_ptr) -{ -cnode *node = ucp_table; -register int cc = c; -int case_offset; - -for (;;) - { - register int d = node->f1 | ((node->f0 & f0_chhmask) << 16); - if (cc == d) break; - if (cc < d) - { - if ((node->f0 & f0_leftexists) == 0) return -1; - node ++; - } - else - { - register int roffset = (node->f2 & f2_rightmask) >> f2_rightshift; - if (roffset == 0) return -1; - node += 1 << (roffset - 1); - } - } - -switch ((*type_ptr = ((node->f0 & f0_typemask) >> f0_typeshift))) - { - case ucp_Cc: - case ucp_Cf: - case ucp_Cn: - case ucp_Co: - case ucp_Cs: - return ucp_C; - break; - - case ucp_Ll: - case ucp_Lu: - case_offset = node->f2 & f2_casemask; - if ((case_offset & 0x0100) != 0) case_offset |= 0xfffff000; - *case_ptr = (case_offset == 0)? 0 : cc + case_offset; - return ucp_L; - - case ucp_Lm: - case ucp_Lo: - case ucp_Lt: - *case_ptr = 0; - return ucp_L; - break; - - case ucp_Mc: - case ucp_Me: - case ucp_Mn: - return ucp_M; - break; - - case ucp_Nd: - case ucp_Nl: - case ucp_No: - return ucp_N; - break; - - case ucp_Pc: - case ucp_Pd: - case ucp_Pe: - case ucp_Pf: - case ucp_Pi: - case ucp_Ps: - case ucp_Po: - return ucp_P; - break; - - case ucp_Sc: - case ucp_Sk: - case ucp_Sm: - case ucp_So: - return ucp_S; - break; - - case ucp_Zl: - case ucp_Zp: - case ucp_Zs: - return ucp_Z; - break; - - default: /* "Should never happen" */ - return -1; - break; - } -} - -/* End of ucp.c */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/ucp.h b/vendor/cegui-0.4.0-custom/src/pcre/ucp.h deleted file mode 100644 index c013978e23..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/ucp.h +++ /dev/null @@ -1,58 +0,0 @@ -/************************************************* -* libucp - Unicode Property Table handler * -*************************************************/ - -/* These are the character categories that are returned by ucp_findchar */ - -enum { - ucp_C, /* Other */ - ucp_L, /* Letter */ - ucp_M, /* Mark */ - ucp_N, /* Number */ - ucp_P, /* Punctuation */ - ucp_S, /* Symbol */ - ucp_Z /* Separator */ -}; - -/* These are the detailed character types that are returned by ucp_findchar */ - -enum { - ucp_Cc, /* Control */ - ucp_Cf, /* Format */ - ucp_Cn, /* Unassigned */ - ucp_Co, /* Private use */ - ucp_Cs, /* Surrogate */ - ucp_Ll, /* Lower case letter */ - ucp_Lm, /* Modifier letter */ - ucp_Lo, /* Other letter */ - ucp_Lt, /* Title case letter */ - ucp_Lu, /* Upper case letter */ - ucp_Mc, /* Spacing mark */ - ucp_Me, /* Enclosing mark */ - ucp_Mn, /* Non-spacing mark */ - ucp_Nd, /* Decimal number */ - ucp_Nl, /* Letter number */ - ucp_No, /* Other number */ - ucp_Pc, /* Connector punctuation */ - ucp_Pd, /* Dash punctuation */ - ucp_Pe, /* Close punctuation */ - ucp_Pf, /* Final punctuation */ - ucp_Pi, /* Initial punctuation */ - ucp_Po, /* Other punctuation */ - ucp_Ps, /* Open punctuation */ - ucp_Sc, /* Currency symbol */ - ucp_Sk, /* Modifier symbol */ - ucp_Sm, /* Mathematical symbol */ - ucp_So, /* Other symbol */ - ucp_Zl, /* Line separator */ - ucp_Zp, /* Paragraph separator */ - ucp_Zs /* Space separator */ -}; - -/* For use in PCRE we make this function static so that there is no conflict if -PCRE is linked with an application that makes use of an external version - -assuming an external version is ever released... */ - -static int ucp_findchar(const int, int *, int *); - -/* End of ucp.h */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/ucpinternal.h b/vendor/cegui-0.4.0-custom/src/pcre/ucpinternal.h deleted file mode 100644 index faefb030c9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/ucpinternal.h +++ /dev/null @@ -1,91 +0,0 @@ -/************************************************* -* libucp - Unicode Property Table handler * -*************************************************/ - -/* Internal header file defining the layout of compact nodes in the tree. */ - -typedef struct cnode { - unsigned short int f0; - unsigned short int f1; - unsigned short int f2; -} cnode; - -/* Things for the f0 field */ - -#define f0_leftexists 0x8000 /* Left child exists */ -#define f0_typemask 0x3f00 /* Type bits */ -#define f0_typeshift 8 /* Type shift */ -#define f0_chhmask 0x00ff /* Character high bits */ - -/* Things for the f2 field */ - -#define f2_rightmask 0xf000 /* Mask for right offset bits */ -#define f2_rightshift 12 /* Shift for right offset */ -#define f2_casemask 0x0fff /* Mask for case offset */ - -/* The tree consists of a vector of structures of type cnode, with the root -node as the first element. The three short ints (16-bits) are used as follows: - -(f0) (1) The 0x8000 bit of f0 is set if a left child exists. The child's node - is the next node in the vector. - (2) The 0x4000 bits of f0 is spare. - (3) The 0x3f00 bits of f0 contain the character type; this is a number - defined by the enumeration in ucp.h (e.g. ucp_Lu). - (4) The bottom 8 bits of f0 contain the most significant byte of the - character's 24-bit codepoint. - -(f1) (1) The f1 field contains the two least significant bytes of the - codepoint. - -(f2) (1) The 0xf000 bits of f2 contain zero if there is no right child of this - node. Otherwise, they contain one plus the exponent of the power of - two of the offset to the right node (e.g. a value of 3 means 8). The - units of the offset are node items. - - (2) The 0x0fff bits of f2 contain the signed offset from this character to - its alternate cased value. They are zero if there is no such - character. - - ------------------------------------------------------------------------------ -||.|.| type (6) | ms char (8) || ls char (16) ||....| case offset (12) || ------------------------------------------------------------------------------ - | | | - | |-> spare | - | exponent of right - |-> left child exists child offset - - -The upper/lower casing information is set only for characters that come in -pairs. There are (at present) four non-one-to-one mappings in the Unicode data. -These are ignored. They are: - - 1FBE Greek Prosgegrammeni (lower, with upper -> capital iota) - 2126 Ohm - 212A Kelvin - 212B Angstrom - -Certainly for the last three, having an alternate case would seem to be a -mistake. I don't know any Greek, so cannot comment on the first one. - - -When searching the tree, proceed as follows: - -(1) Start at the first node. - -(2) Extract the character value from f1 and the bottom 8 bits of f0; - -(3) Compare with the character being sought. If equal, we are done. - -(4) If the test character is smaller, inspect the f0_leftexists flag. If it is - not set, the character is not in the tree. If it is set, move to the next - node, and go to (2). - -(5) If the test character is bigger, extract the f2_rightmask bits from f2, and - shift them right by f2_rightshift. If the result is zero, the character is - not in the tree. Otherwise, calculate the number of nodes to skip by - shifting the value 1 left by this number minus one. Go to (2). -*/ - - -/* End of internal.h */ diff --git a/vendor/cegui-0.4.0-custom/src/pcre/ucptable.c b/vendor/cegui-0.4.0-custom/src/pcre/ucptable.c deleted file mode 100644 index 7fb3a12343..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/ucptable.c +++ /dev/null @@ -1,15105 +0,0 @@ -/* This source module is automatically generated from the Unicode -property table. See internal.h for a description of the layout. */ - -static cnode ucp_table[] = { - { 0x9a00, 0x2f1f, 0xe000 }, - { 0x8700, 0x1558, 0xd000 }, - { 0x8700, 0x0a99, 0xc000 }, - { 0x8500, 0x0435, 0xbfe0 }, - { 0x8500, 0x01ff, 0xafff }, - { 0x8500, 0x00ff, 0x9079 }, - { 0x8000, 0x007f, 0x8000 }, - { 0x9500, 0x003f, 0x7000 }, - { 0x8000, 0x001f, 0x6000 }, - { 0x8000, 0x000f, 0x5000 }, - { 0x8000, 0x0007, 0x4000 }, - { 0x8000, 0x0003, 0x3000 }, - { 0x8000, 0x0001, 0x2000 }, - { 0x0000, 0x0000, 0x0000 }, - { 0x0000, 0x0002, 0x0000 }, - { 0x8000, 0x0005, 0x2000 }, - { 0x0000, 0x0004, 0x0000 }, - { 0x0000, 0x0006, 0x0000 }, - { 0x8000, 0x000b, 0x3000 }, - { 0x8000, 0x0009, 0x2000 }, - { 0x0000, 0x0008, 0x0000 }, - { 0x0000, 0x000a, 0x0000 }, - { 0x8000, 0x000d, 0x2000 }, - { 0x0000, 0x000c, 0x0000 }, - { 0x0000, 0x000e, 0x0000 }, - { 0x8000, 0x0017, 0x4000 }, - { 0x8000, 0x0013, 0x3000 }, - { 0x8000, 0x0011, 0x2000 }, - { 0x0000, 0x0010, 0x0000 }, - { 0x0000, 0x0012, 0x0000 }, - { 0x8000, 0x0015, 0x2000 }, - { 0x0000, 0x0014, 0x0000 }, - { 0x0000, 0x0016, 0x0000 }, - { 0x8000, 0x001b, 0x3000 }, - { 0x8000, 0x0019, 0x2000 }, - { 0x0000, 0x0018, 0x0000 }, - { 0x0000, 0x001a, 0x0000 }, - { 0x8000, 0x001d, 0x2000 }, - { 0x0000, 0x001c, 0x0000 }, - { 0x0000, 0x001e, 0x0000 }, - { 0x9500, 0x002f, 0x5000 }, - { 0x9500, 0x0027, 0x4000 }, - { 0x9500, 0x0023, 0x3000 }, - { 0x9500, 0x0021, 0x2000 }, - { 0x1d00, 0x0020, 0x0000 }, - { 0x1500, 0x0022, 0x0000 }, - { 0x9500, 0x0025, 0x2000 }, - { 0x1700, 0x0024, 0x0000 }, - { 0x1500, 0x0026, 0x0000 }, - { 0x9900, 0x002b, 0x3000 }, - { 0x9200, 0x0029, 0x2000 }, - { 0x1600, 0x0028, 0x0000 }, - { 0x1500, 0x002a, 0x0000 }, - { 0x9100, 0x002d, 0x2000 }, - { 0x1500, 0x002c, 0x0000 }, - { 0x1500, 0x002e, 0x0000 }, - { 0x8d00, 0x0037, 0x4000 }, - { 0x8d00, 0x0033, 0x3000 }, - { 0x8d00, 0x0031, 0x2000 }, - { 0x0d00, 0x0030, 0x0000 }, - { 0x0d00, 0x0032, 0x0000 }, - { 0x8d00, 0x0035, 0x2000 }, - { 0x0d00, 0x0034, 0x0000 }, - { 0x0d00, 0x0036, 0x0000 }, - { 0x9500, 0x003b, 0x3000 }, - { 0x8d00, 0x0039, 0x2000 }, - { 0x0d00, 0x0038, 0x0000 }, - { 0x1500, 0x003a, 0x0000 }, - { 0x9900, 0x003d, 0x2000 }, - { 0x1900, 0x003c, 0x0000 }, - { 0x1900, 0x003e, 0x0000 }, - { 0x9000, 0x005f, 0x6000 }, - { 0x8900, 0x004f, 0x5020 }, - { 0x8900, 0x0047, 0x4020 }, - { 0x8900, 0x0043, 0x3020 }, - { 0x8900, 0x0041, 0x2020 }, - { 0x1500, 0x0040, 0x0000 }, - { 0x0900, 0x0042, 0x0020 }, - { 0x8900, 0x0045, 0x2020 }, - { 0x0900, 0x0044, 0x0020 }, - { 0x0900, 0x0046, 0x0020 }, - { 0x8900, 0x004b, 0x3020 }, - { 0x8900, 0x0049, 0x2020 }, - { 0x0900, 0x0048, 0x0020 }, - { 0x0900, 0x004a, 0x0020 }, - { 0x8900, 0x004d, 0x2020 }, - { 0x0900, 0x004c, 0x0020 }, - { 0x0900, 0x004e, 0x0020 }, - { 0x8900, 0x0057, 0x4020 }, - { 0x8900, 0x0053, 0x3020 }, - { 0x8900, 0x0051, 0x2020 }, - { 0x0900, 0x0050, 0x0020 }, - { 0x0900, 0x0052, 0x0020 }, - { 0x8900, 0x0055, 0x2020 }, - { 0x0900, 0x0054, 0x0020 }, - { 0x0900, 0x0056, 0x0020 }, - { 0x9600, 0x005b, 0x3000 }, - { 0x8900, 0x0059, 0x2020 }, - { 0x0900, 0x0058, 0x0020 }, - { 0x0900, 0x005a, 0x0020 }, - { 0x9200, 0x005d, 0x2000 }, - { 0x1500, 0x005c, 0x0000 }, - { 0x1800, 0x005e, 0x0000 }, - { 0x8500, 0x006f, 0x5fe0 }, - { 0x8500, 0x0067, 0x4fe0 }, - { 0x8500, 0x0063, 0x3fe0 }, - { 0x8500, 0x0061, 0x2fe0 }, - { 0x1800, 0x0060, 0x0000 }, - { 0x0500, 0x0062, 0x0fe0 }, - { 0x8500, 0x0065, 0x2fe0 }, - { 0x0500, 0x0064, 0x0fe0 }, - { 0x0500, 0x0066, 0x0fe0 }, - { 0x8500, 0x006b, 0x3fe0 }, - { 0x8500, 0x0069, 0x2fe0 }, - { 0x0500, 0x0068, 0x0fe0 }, - { 0x0500, 0x006a, 0x0fe0 }, - { 0x8500, 0x006d, 0x2fe0 }, - { 0x0500, 0x006c, 0x0fe0 }, - { 0x0500, 0x006e, 0x0fe0 }, - { 0x8500, 0x0077, 0x4fe0 }, - { 0x8500, 0x0073, 0x3fe0 }, - { 0x8500, 0x0071, 0x2fe0 }, - { 0x0500, 0x0070, 0x0fe0 }, - { 0x0500, 0x0072, 0x0fe0 }, - { 0x8500, 0x0075, 0x2fe0 }, - { 0x0500, 0x0074, 0x0fe0 }, - { 0x0500, 0x0076, 0x0fe0 }, - { 0x9600, 0x007b, 0x3000 }, - { 0x8500, 0x0079, 0x2fe0 }, - { 0x0500, 0x0078, 0x0fe0 }, - { 0x0500, 0x007a, 0x0fe0 }, - { 0x9200, 0x007d, 0x2000 }, - { 0x1900, 0x007c, 0x0000 }, - { 0x1900, 0x007e, 0x0000 }, - { 0x9500, 0x00bf, 0x7000 }, - { 0x8000, 0x009f, 0x6000 }, - { 0x8000, 0x008f, 0x5000 }, - { 0x8000, 0x0087, 0x4000 }, - { 0x8000, 0x0083, 0x3000 }, - { 0x8000, 0x0081, 0x2000 }, - { 0x0000, 0x0080, 0x0000 }, - { 0x0000, 0x0082, 0x0000 }, - { 0x8000, 0x0085, 0x2000 }, - { 0x0000, 0x0084, 0x0000 }, - { 0x0000, 0x0086, 0x0000 }, - { 0x8000, 0x008b, 0x3000 }, - { 0x8000, 0x0089, 0x2000 }, - { 0x0000, 0x0088, 0x0000 }, - { 0x0000, 0x008a, 0x0000 }, - { 0x8000, 0x008d, 0x2000 }, - { 0x0000, 0x008c, 0x0000 }, - { 0x0000, 0x008e, 0x0000 }, - { 0x8000, 0x0097, 0x4000 }, - { 0x8000, 0x0093, 0x3000 }, - { 0x8000, 0x0091, 0x2000 }, - { 0x0000, 0x0090, 0x0000 }, - { 0x0000, 0x0092, 0x0000 }, - { 0x8000, 0x0095, 0x2000 }, - { 0x0000, 0x0094, 0x0000 }, - { 0x0000, 0x0096, 0x0000 }, - { 0x8000, 0x009b, 0x3000 }, - { 0x8000, 0x0099, 0x2000 }, - { 0x0000, 0x0098, 0x0000 }, - { 0x0000, 0x009a, 0x0000 }, - { 0x8000, 0x009d, 0x2000 }, - { 0x0000, 0x009c, 0x0000 }, - { 0x0000, 0x009e, 0x0000 }, - { 0x9800, 0x00af, 0x5000 }, - { 0x9a00, 0x00a7, 0x4000 }, - { 0x9700, 0x00a3, 0x3000 }, - { 0x9500, 0x00a1, 0x2000 }, - { 0x1d00, 0x00a0, 0x0000 }, - { 0x1700, 0x00a2, 0x0000 }, - { 0x9700, 0x00a5, 0x2000 }, - { 0x1700, 0x00a4, 0x0000 }, - { 0x1a00, 0x00a6, 0x0000 }, - { 0x9400, 0x00ab, 0x3000 }, - { 0x9a00, 0x00a9, 0x2000 }, - { 0x1800, 0x00a8, 0x0000 }, - { 0x0500, 0x00aa, 0x0000 }, - { 0x8100, 0x00ad, 0x2000 }, - { 0x1900, 0x00ac, 0x0000 }, - { 0x1a00, 0x00ae, 0x0000 }, - { 0x9500, 0x00b7, 0x4000 }, - { 0x8f00, 0x00b3, 0x3000 }, - { 0x9900, 0x00b1, 0x2000 }, - { 0x1a00, 0x00b0, 0x0000 }, - { 0x0f00, 0x00b2, 0x0000 }, - { 0x8500, 0x00b5, 0x22e7 }, - { 0x1800, 0x00b4, 0x0000 }, - { 0x1a00, 0x00b6, 0x0000 }, - { 0x9300, 0x00bb, 0x3000 }, - { 0x8f00, 0x00b9, 0x2000 }, - { 0x1800, 0x00b8, 0x0000 }, - { 0x0500, 0x00ba, 0x0000 }, - { 0x8f00, 0x00bd, 0x2000 }, - { 0x0f00, 0x00bc, 0x0000 }, - { 0x0f00, 0x00be, 0x0000 }, - { 0x8500, 0x00df, 0x6000 }, - { 0x8900, 0x00cf, 0x5020 }, - { 0x8900, 0x00c7, 0x4020 }, - { 0x8900, 0x00c3, 0x3020 }, - { 0x8900, 0x00c1, 0x2020 }, - { 0x0900, 0x00c0, 0x0020 }, - { 0x0900, 0x00c2, 0x0020 }, - { 0x8900, 0x00c5, 0x2020 }, - { 0x0900, 0x00c4, 0x0020 }, - { 0x0900, 0x00c6, 0x0020 }, - { 0x8900, 0x00cb, 0x3020 }, - { 0x8900, 0x00c9, 0x2020 }, - { 0x0900, 0x00c8, 0x0020 }, - { 0x0900, 0x00ca, 0x0020 }, - { 0x8900, 0x00cd, 0x2020 }, - { 0x0900, 0x00cc, 0x0020 }, - { 0x0900, 0x00ce, 0x0020 }, - { 0x9900, 0x00d7, 0x4000 }, - { 0x8900, 0x00d3, 0x3020 }, - { 0x8900, 0x00d1, 0x2020 }, - { 0x0900, 0x00d0, 0x0020 }, - { 0x0900, 0x00d2, 0x0020 }, - { 0x8900, 0x00d5, 0x2020 }, - { 0x0900, 0x00d4, 0x0020 }, - { 0x0900, 0x00d6, 0x0020 }, - { 0x8900, 0x00db, 0x3020 }, - { 0x8900, 0x00d9, 0x2020 }, - { 0x0900, 0x00d8, 0x0020 }, - { 0x0900, 0x00da, 0x0020 }, - { 0x8900, 0x00dd, 0x2020 }, - { 0x0900, 0x00dc, 0x0020 }, - { 0x0900, 0x00de, 0x0020 }, - { 0x8500, 0x00ef, 0x5fe0 }, - { 0x8500, 0x00e7, 0x4fe0 }, - { 0x8500, 0x00e3, 0x3fe0 }, - { 0x8500, 0x00e1, 0x2fe0 }, - { 0x0500, 0x00e0, 0x0fe0 }, - { 0x0500, 0x00e2, 0x0fe0 }, - { 0x8500, 0x00e5, 0x2fe0 }, - { 0x0500, 0x00e4, 0x0fe0 }, - { 0x0500, 0x00e6, 0x0fe0 }, - { 0x8500, 0x00eb, 0x3fe0 }, - { 0x8500, 0x00e9, 0x2fe0 }, - { 0x0500, 0x00e8, 0x0fe0 }, - { 0x0500, 0x00ea, 0x0fe0 }, - { 0x8500, 0x00ed, 0x2fe0 }, - { 0x0500, 0x00ec, 0x0fe0 }, - { 0x0500, 0x00ee, 0x0fe0 }, - { 0x9900, 0x00f7, 0x4000 }, - { 0x8500, 0x00f3, 0x3fe0 }, - { 0x8500, 0x00f1, 0x2fe0 }, - { 0x0500, 0x00f0, 0x0fe0 }, - { 0x0500, 0x00f2, 0x0fe0 }, - { 0x8500, 0x00f5, 0x2fe0 }, - { 0x0500, 0x00f4, 0x0fe0 }, - { 0x0500, 0x00f6, 0x0fe0 }, - { 0x8500, 0x00fb, 0x3fe0 }, - { 0x8500, 0x00f9, 0x2fe0 }, - { 0x0500, 0x00f8, 0x0fe0 }, - { 0x0500, 0x00fa, 0x0fe0 }, - { 0x8500, 0x00fd, 0x2fe0 }, - { 0x0500, 0x00fc, 0x0fe0 }, - { 0x0500, 0x00fe, 0x0fe0 }, - { 0x8500, 0x017f, 0x8ed4 }, - { 0x8900, 0x013f, 0x7001 }, - { 0x8500, 0x011f, 0x6fff }, - { 0x8500, 0x010f, 0x5fff }, - { 0x8500, 0x0107, 0x4fff }, - { 0x8500, 0x0103, 0x3fff }, - { 0x8500, 0x0101, 0x2fff }, - { 0x0900, 0x0100, 0x0001 }, - { 0x0900, 0x0102, 0x0001 }, - { 0x8500, 0x0105, 0x2fff }, - { 0x0900, 0x0104, 0x0001 }, - { 0x0900, 0x0106, 0x0001 }, - { 0x8500, 0x010b, 0x3fff }, - { 0x8500, 0x0109, 0x2fff }, - { 0x0900, 0x0108, 0x0001 }, - { 0x0900, 0x010a, 0x0001 }, - { 0x8500, 0x010d, 0x2fff }, - { 0x0900, 0x010c, 0x0001 }, - { 0x0900, 0x010e, 0x0001 }, - { 0x8500, 0x0117, 0x4fff }, - { 0x8500, 0x0113, 0x3fff }, - { 0x8500, 0x0111, 0x2fff }, - { 0x0900, 0x0110, 0x0001 }, - { 0x0900, 0x0112, 0x0001 }, - { 0x8500, 0x0115, 0x2fff }, - { 0x0900, 0x0114, 0x0001 }, - { 0x0900, 0x0116, 0x0001 }, - { 0x8500, 0x011b, 0x3fff }, - { 0x8500, 0x0119, 0x2fff }, - { 0x0900, 0x0118, 0x0001 }, - { 0x0900, 0x011a, 0x0001 }, - { 0x8500, 0x011d, 0x2fff }, - { 0x0900, 0x011c, 0x0001 }, - { 0x0900, 0x011e, 0x0001 }, - { 0x8500, 0x012f, 0x5fff }, - { 0x8500, 0x0127, 0x4fff }, - { 0x8500, 0x0123, 0x3fff }, - { 0x8500, 0x0121, 0x2fff }, - { 0x0900, 0x0120, 0x0001 }, - { 0x0900, 0x0122, 0x0001 }, - { 0x8500, 0x0125, 0x2fff }, - { 0x0900, 0x0124, 0x0001 }, - { 0x0900, 0x0126, 0x0001 }, - { 0x8500, 0x012b, 0x3fff }, - { 0x8500, 0x0129, 0x2fff }, - { 0x0900, 0x0128, 0x0001 }, - { 0x0900, 0x012a, 0x0001 }, - { 0x8500, 0x012d, 0x2fff }, - { 0x0900, 0x012c, 0x0001 }, - { 0x0900, 0x012e, 0x0001 }, - { 0x8500, 0x0137, 0x4fff }, - { 0x8500, 0x0133, 0x3fff }, - { 0x8500, 0x0131, 0x2f18 }, - { 0x0900, 0x0130, 0x0f39 }, - { 0x0900, 0x0132, 0x0001 }, - { 0x8500, 0x0135, 0x2fff }, - { 0x0900, 0x0134, 0x0001 }, - { 0x0900, 0x0136, 0x0001 }, - { 0x8900, 0x013b, 0x3001 }, - { 0x8900, 0x0139, 0x2001 }, - { 0x0500, 0x0138, 0x0000 }, - { 0x0500, 0x013a, 0x0fff }, - { 0x8900, 0x013d, 0x2001 }, - { 0x0500, 0x013c, 0x0fff }, - { 0x0500, 0x013e, 0x0fff }, - { 0x8500, 0x015f, 0x6fff }, - { 0x8500, 0x014f, 0x5fff }, - { 0x8900, 0x0147, 0x4001 }, - { 0x8900, 0x0143, 0x3001 }, - { 0x8900, 0x0141, 0x2001 }, - { 0x0500, 0x0140, 0x0fff }, - { 0x0500, 0x0142, 0x0fff }, - { 0x8900, 0x0145, 0x2001 }, - { 0x0500, 0x0144, 0x0fff }, - { 0x0500, 0x0146, 0x0fff }, - { 0x8500, 0x014b, 0x3fff }, - { 0x8500, 0x0149, 0x2000 }, - { 0x0500, 0x0148, 0x0fff }, - { 0x0900, 0x014a, 0x0001 }, - { 0x8500, 0x014d, 0x2fff }, - { 0x0900, 0x014c, 0x0001 }, - { 0x0900, 0x014e, 0x0001 }, - { 0x8500, 0x0157, 0x4fff }, - { 0x8500, 0x0153, 0x3fff }, - { 0x8500, 0x0151, 0x2fff }, - { 0x0900, 0x0150, 0x0001 }, - { 0x0900, 0x0152, 0x0001 }, - { 0x8500, 0x0155, 0x2fff }, - { 0x0900, 0x0154, 0x0001 }, - { 0x0900, 0x0156, 0x0001 }, - { 0x8500, 0x015b, 0x3fff }, - { 0x8500, 0x0159, 0x2fff }, - { 0x0900, 0x0158, 0x0001 }, - { 0x0900, 0x015a, 0x0001 }, - { 0x8500, 0x015d, 0x2fff }, - { 0x0900, 0x015c, 0x0001 }, - { 0x0900, 0x015e, 0x0001 }, - { 0x8500, 0x016f, 0x5fff }, - { 0x8500, 0x0167, 0x4fff }, - { 0x8500, 0x0163, 0x3fff }, - { 0x8500, 0x0161, 0x2fff }, - { 0x0900, 0x0160, 0x0001 }, - { 0x0900, 0x0162, 0x0001 }, - { 0x8500, 0x0165, 0x2fff }, - { 0x0900, 0x0164, 0x0001 }, - { 0x0900, 0x0166, 0x0001 }, - { 0x8500, 0x016b, 0x3fff }, - { 0x8500, 0x0169, 0x2fff }, - { 0x0900, 0x0168, 0x0001 }, - { 0x0900, 0x016a, 0x0001 }, - { 0x8500, 0x016d, 0x2fff }, - { 0x0900, 0x016c, 0x0001 }, - { 0x0900, 0x016e, 0x0001 }, - { 0x8500, 0x0177, 0x4fff }, - { 0x8500, 0x0173, 0x3fff }, - { 0x8500, 0x0171, 0x2fff }, - { 0x0900, 0x0170, 0x0001 }, - { 0x0900, 0x0172, 0x0001 }, - { 0x8500, 0x0175, 0x2fff }, - { 0x0900, 0x0174, 0x0001 }, - { 0x0900, 0x0176, 0x0001 }, - { 0x8900, 0x017b, 0x3001 }, - { 0x8900, 0x0179, 0x2001 }, - { 0x0900, 0x0178, 0x0f87 }, - { 0x0500, 0x017a, 0x0fff }, - { 0x8900, 0x017d, 0x2001 }, - { 0x0500, 0x017c, 0x0fff }, - { 0x0500, 0x017e, 0x0fff }, - { 0x8500, 0x01bf, 0x7038 }, - { 0x8900, 0x019f, 0x60d6 }, - { 0x8900, 0x018f, 0x50ca }, - { 0x8900, 0x0187, 0x4001 }, - { 0x8500, 0x0183, 0x3fff }, - { 0x8900, 0x0181, 0x20d2 }, - { 0x0500, 0x0180, 0x0000 }, - { 0x0900, 0x0182, 0x0001 }, - { 0x8500, 0x0185, 0x2fff }, - { 0x0900, 0x0184, 0x0001 }, - { 0x0900, 0x0186, 0x00ce }, - { 0x8900, 0x018b, 0x3001 }, - { 0x8900, 0x0189, 0x20cd }, - { 0x0500, 0x0188, 0x0fff }, - { 0x0900, 0x018a, 0x00cd }, - { 0x8500, 0x018d, 0x2000 }, - { 0x0500, 0x018c, 0x0fff }, - { 0x0900, 0x018e, 0x004f }, - { 0x8900, 0x0197, 0x40d1 }, - { 0x8900, 0x0193, 0x30cd }, - { 0x8900, 0x0191, 0x2001 }, - { 0x0900, 0x0190, 0x00cb }, - { 0x0500, 0x0192, 0x0fff }, - { 0x8500, 0x0195, 0x2061 }, - { 0x0900, 0x0194, 0x00cf }, - { 0x0900, 0x0196, 0x00d3 }, - { 0x8500, 0x019b, 0x3000 }, - { 0x8500, 0x0199, 0x2fff }, - { 0x0900, 0x0198, 0x0001 }, - { 0x0500, 0x019a, 0x0000 }, - { 0x8900, 0x019d, 0x20d5 }, - { 0x0900, 0x019c, 0x00d3 }, - { 0x0500, 0x019e, 0x0082 }, - { 0x8900, 0x01af, 0x5001 }, - { 0x8900, 0x01a7, 0x4001 }, - { 0x8500, 0x01a3, 0x3fff }, - { 0x8500, 0x01a1, 0x2fff }, - { 0x0900, 0x01a0, 0x0001 }, - { 0x0900, 0x01a2, 0x0001 }, - { 0x8500, 0x01a5, 0x2fff }, - { 0x0900, 0x01a4, 0x0001 }, - { 0x0900, 0x01a6, 0x00da }, - { 0x8500, 0x01ab, 0x3000 }, - { 0x8900, 0x01a9, 0x20da }, - { 0x0500, 0x01a8, 0x0fff }, - { 0x0500, 0x01aa, 0x0000 }, - { 0x8500, 0x01ad, 0x2fff }, - { 0x0900, 0x01ac, 0x0001 }, - { 0x0900, 0x01ae, 0x00da }, - { 0x8900, 0x01b7, 0x40db }, - { 0x8900, 0x01b3, 0x3001 }, - { 0x8900, 0x01b1, 0x20d9 }, - { 0x0500, 0x01b0, 0x0fff }, - { 0x0900, 0x01b2, 0x00d9 }, - { 0x8900, 0x01b5, 0x2001 }, - { 0x0500, 0x01b4, 0x0fff }, - { 0x0500, 0x01b6, 0x0fff }, - { 0x8700, 0x01bb, 0x3000 }, - { 0x8500, 0x01b9, 0x2fff }, - { 0x0900, 0x01b8, 0x0001 }, - { 0x0500, 0x01ba, 0x0000 }, - { 0x8500, 0x01bd, 0x2fff }, - { 0x0900, 0x01bc, 0x0001 }, - { 0x0500, 0x01be, 0x0000 }, - { 0x8500, 0x01df, 0x6fff }, - { 0x8900, 0x01cf, 0x5001 }, - { 0x8900, 0x01c7, 0x4002 }, - { 0x8700, 0x01c3, 0x3000 }, - { 0x8700, 0x01c1, 0x2000 }, - { 0x0700, 0x01c0, 0x0000 }, - { 0x0700, 0x01c2, 0x0000 }, - { 0x8800, 0x01c5, 0x2000 }, - { 0x0900, 0x01c4, 0x0002 }, - { 0x0500, 0x01c6, 0x0ffe }, - { 0x8800, 0x01cb, 0x3000 }, - { 0x8500, 0x01c9, 0x2ffe }, - { 0x0800, 0x01c8, 0x0000 }, - { 0x0900, 0x01ca, 0x0002 }, - { 0x8900, 0x01cd, 0x2001 }, - { 0x0500, 0x01cc, 0x0ffe }, - { 0x0500, 0x01ce, 0x0fff }, - { 0x8900, 0x01d7, 0x4001 }, - { 0x8900, 0x01d3, 0x3001 }, - { 0x8900, 0x01d1, 0x2001 }, - { 0x0500, 0x01d0, 0x0fff }, - { 0x0500, 0x01d2, 0x0fff }, - { 0x8900, 0x01d5, 0x2001 }, - { 0x0500, 0x01d4, 0x0fff }, - { 0x0500, 0x01d6, 0x0fff }, - { 0x8900, 0x01db, 0x3001 }, - { 0x8900, 0x01d9, 0x2001 }, - { 0x0500, 0x01d8, 0x0fff }, - { 0x0500, 0x01da, 0x0fff }, - { 0x8500, 0x01dd, 0x2fb1 }, - { 0x0500, 0x01dc, 0x0fff }, - { 0x0900, 0x01de, 0x0001 }, - { 0x8500, 0x01ef, 0x5fff }, - { 0x8500, 0x01e7, 0x4fff }, - { 0x8500, 0x01e3, 0x3fff }, - { 0x8500, 0x01e1, 0x2fff }, - { 0x0900, 0x01e0, 0x0001 }, - { 0x0900, 0x01e2, 0x0001 }, - { 0x8500, 0x01e5, 0x2fff }, - { 0x0900, 0x01e4, 0x0001 }, - { 0x0900, 0x01e6, 0x0001 }, - { 0x8500, 0x01eb, 0x3fff }, - { 0x8500, 0x01e9, 0x2fff }, - { 0x0900, 0x01e8, 0x0001 }, - { 0x0900, 0x01ea, 0x0001 }, - { 0x8500, 0x01ed, 0x2fff }, - { 0x0900, 0x01ec, 0x0001 }, - { 0x0900, 0x01ee, 0x0001 }, - { 0x8900, 0x01f7, 0x4fc8 }, - { 0x8500, 0x01f3, 0x3ffe }, - { 0x8900, 0x01f1, 0x2002 }, - { 0x0500, 0x01f0, 0x0000 }, - { 0x0800, 0x01f2, 0x0000 }, - { 0x8500, 0x01f5, 0x2fff }, - { 0x0900, 0x01f4, 0x0001 }, - { 0x0900, 0x01f6, 0x0f9f }, - { 0x8500, 0x01fb, 0x3fff }, - { 0x8500, 0x01f9, 0x2fff }, - { 0x0900, 0x01f8, 0x0001 }, - { 0x0900, 0x01fa, 0x0001 }, - { 0x8500, 0x01fd, 0x2fff }, - { 0x0900, 0x01fc, 0x0001 }, - { 0x0900, 0x01fe, 0x0001 }, - { 0x8c00, 0x0318, 0x9000 }, - { 0x8500, 0x0298, 0x8000 }, - { 0x8500, 0x0258, 0x7000 }, - { 0x8500, 0x021f, 0x6fff }, - { 0x8500, 0x020f, 0x5fff }, - { 0x8500, 0x0207, 0x4fff }, - { 0x8500, 0x0203, 0x3fff }, - { 0x8500, 0x0201, 0x2fff }, - { 0x0900, 0x0200, 0x0001 }, - { 0x0900, 0x0202, 0x0001 }, - { 0x8500, 0x0205, 0x2fff }, - { 0x0900, 0x0204, 0x0001 }, - { 0x0900, 0x0206, 0x0001 }, - { 0x8500, 0x020b, 0x3fff }, - { 0x8500, 0x0209, 0x2fff }, - { 0x0900, 0x0208, 0x0001 }, - { 0x0900, 0x020a, 0x0001 }, - { 0x8500, 0x020d, 0x2fff }, - { 0x0900, 0x020c, 0x0001 }, - { 0x0900, 0x020e, 0x0001 }, - { 0x8500, 0x0217, 0x4fff }, - { 0x8500, 0x0213, 0x3fff }, - { 0x8500, 0x0211, 0x2fff }, - { 0x0900, 0x0210, 0x0001 }, - { 0x0900, 0x0212, 0x0001 }, - { 0x8500, 0x0215, 0x2fff }, - { 0x0900, 0x0214, 0x0001 }, - { 0x0900, 0x0216, 0x0001 }, - { 0x8500, 0x021b, 0x3fff }, - { 0x8500, 0x0219, 0x2fff }, - { 0x0900, 0x0218, 0x0001 }, - { 0x0900, 0x021a, 0x0001 }, - { 0x8500, 0x021d, 0x2fff }, - { 0x0900, 0x021c, 0x0001 }, - { 0x0900, 0x021e, 0x0001 }, - { 0x8500, 0x022f, 0x5fff }, - { 0x8500, 0x0227, 0x4fff }, - { 0x8500, 0x0223, 0x3fff }, - { 0x8500, 0x0221, 0x2000 }, - { 0x0900, 0x0220, 0x0f7e }, - { 0x0900, 0x0222, 0x0001 }, - { 0x8500, 0x0225, 0x2fff }, - { 0x0900, 0x0224, 0x0001 }, - { 0x0900, 0x0226, 0x0001 }, - { 0x8500, 0x022b, 0x3fff }, - { 0x8500, 0x0229, 0x2fff }, - { 0x0900, 0x0228, 0x0001 }, - { 0x0900, 0x022a, 0x0001 }, - { 0x8500, 0x022d, 0x2fff }, - { 0x0900, 0x022c, 0x0001 }, - { 0x0900, 0x022e, 0x0001 }, - { 0x8500, 0x0250, 0x4000 }, - { 0x8500, 0x0233, 0x3fff }, - { 0x8500, 0x0231, 0x2fff }, - { 0x0900, 0x0230, 0x0001 }, - { 0x0900, 0x0232, 0x0001 }, - { 0x8500, 0x0235, 0x2000 }, - { 0x0500, 0x0234, 0x0000 }, - { 0x0500, 0x0236, 0x0000 }, - { 0x8500, 0x0254, 0x3f32 }, - { 0x8500, 0x0252, 0x2000 }, - { 0x0500, 0x0251, 0x0000 }, - { 0x0500, 0x0253, 0x0f2e }, - { 0x8500, 0x0256, 0x2f33 }, - { 0x0500, 0x0255, 0x0000 }, - { 0x0500, 0x0257, 0x0f33 }, - { 0x8500, 0x0278, 0x6000 }, - { 0x8500, 0x0268, 0x5f2f }, - { 0x8500, 0x0260, 0x4f33 }, - { 0x8500, 0x025c, 0x3000 }, - { 0x8500, 0x025a, 0x2000 }, - { 0x0500, 0x0259, 0x0f36 }, - { 0x0500, 0x025b, 0x0f35 }, - { 0x8500, 0x025e, 0x2000 }, - { 0x0500, 0x025d, 0x0000 }, - { 0x0500, 0x025f, 0x0000 }, - { 0x8500, 0x0264, 0x3000 }, - { 0x8500, 0x0262, 0x2000 }, - { 0x0500, 0x0261, 0x0000 }, - { 0x0500, 0x0263, 0x0f31 }, - { 0x8500, 0x0266, 0x2000 }, - { 0x0500, 0x0265, 0x0000 }, - { 0x0500, 0x0267, 0x0000 }, - { 0x8500, 0x0270, 0x4000 }, - { 0x8500, 0x026c, 0x3000 }, - { 0x8500, 0x026a, 0x2000 }, - { 0x0500, 0x0269, 0x0f2d }, - { 0x0500, 0x026b, 0x0000 }, - { 0x8500, 0x026e, 0x2000 }, - { 0x0500, 0x026d, 0x0000 }, - { 0x0500, 0x026f, 0x0f2d }, - { 0x8500, 0x0274, 0x3000 }, - { 0x8500, 0x0272, 0x2f2b }, - { 0x0500, 0x0271, 0x0000 }, - { 0x0500, 0x0273, 0x0000 }, - { 0x8500, 0x0276, 0x2000 }, - { 0x0500, 0x0275, 0x0f2a }, - { 0x0500, 0x0277, 0x0000 }, - { 0x8500, 0x0288, 0x5f26 }, - { 0x8500, 0x0280, 0x4f26 }, - { 0x8500, 0x027c, 0x3000 }, - { 0x8500, 0x027a, 0x2000 }, - { 0x0500, 0x0279, 0x0000 }, - { 0x0500, 0x027b, 0x0000 }, - { 0x8500, 0x027e, 0x2000 }, - { 0x0500, 0x027d, 0x0000 }, - { 0x0500, 0x027f, 0x0000 }, - { 0x8500, 0x0284, 0x3000 }, - { 0x8500, 0x0282, 0x2000 }, - { 0x0500, 0x0281, 0x0000 }, - { 0x0500, 0x0283, 0x0f26 }, - { 0x8500, 0x0286, 0x2000 }, - { 0x0500, 0x0285, 0x0000 }, - { 0x0500, 0x0287, 0x0000 }, - { 0x8500, 0x0290, 0x4000 }, - { 0x8500, 0x028c, 0x3000 }, - { 0x8500, 0x028a, 0x2f27 }, - { 0x0500, 0x0289, 0x0000 }, - { 0x0500, 0x028b, 0x0f27 }, - { 0x8500, 0x028e, 0x2000 }, - { 0x0500, 0x028d, 0x0000 }, - { 0x0500, 0x028f, 0x0000 }, - { 0x8500, 0x0294, 0x3000 }, - { 0x8500, 0x0292, 0x2f25 }, - { 0x0500, 0x0291, 0x0000 }, - { 0x0500, 0x0293, 0x0000 }, - { 0x8500, 0x0296, 0x2000 }, - { 0x0500, 0x0295, 0x0000 }, - { 0x0500, 0x0297, 0x0000 }, - { 0x9800, 0x02d8, 0x7000 }, - { 0x8600, 0x02b8, 0x6000 }, - { 0x8500, 0x02a8, 0x5000 }, - { 0x8500, 0x02a0, 0x4000 }, - { 0x8500, 0x029c, 0x3000 }, - { 0x8500, 0x029a, 0x2000 }, - { 0x0500, 0x0299, 0x0000 }, - { 0x0500, 0x029b, 0x0000 }, - { 0x8500, 0x029e, 0x2000 }, - { 0x0500, 0x029d, 0x0000 }, - { 0x0500, 0x029f, 0x0000 }, - { 0x8500, 0x02a4, 0x3000 }, - { 0x8500, 0x02a2, 0x2000 }, - { 0x0500, 0x02a1, 0x0000 }, - { 0x0500, 0x02a3, 0x0000 }, - { 0x8500, 0x02a6, 0x2000 }, - { 0x0500, 0x02a5, 0x0000 }, - { 0x0500, 0x02a7, 0x0000 }, - { 0x8600, 0x02b0, 0x4000 }, - { 0x8500, 0x02ac, 0x3000 }, - { 0x8500, 0x02aa, 0x2000 }, - { 0x0500, 0x02a9, 0x0000 }, - { 0x0500, 0x02ab, 0x0000 }, - { 0x8500, 0x02ae, 0x2000 }, - { 0x0500, 0x02ad, 0x0000 }, - { 0x0500, 0x02af, 0x0000 }, - { 0x8600, 0x02b4, 0x3000 }, - { 0x8600, 0x02b2, 0x2000 }, - { 0x0600, 0x02b1, 0x0000 }, - { 0x0600, 0x02b3, 0x0000 }, - { 0x8600, 0x02b6, 0x2000 }, - { 0x0600, 0x02b5, 0x0000 }, - { 0x0600, 0x02b7, 0x0000 }, - { 0x8600, 0x02c8, 0x5000 }, - { 0x8600, 0x02c0, 0x4000 }, - { 0x8600, 0x02bc, 0x3000 }, - { 0x8600, 0x02ba, 0x2000 }, - { 0x0600, 0x02b9, 0x0000 }, - { 0x0600, 0x02bb, 0x0000 }, - { 0x8600, 0x02be, 0x2000 }, - { 0x0600, 0x02bd, 0x0000 }, - { 0x0600, 0x02bf, 0x0000 }, - { 0x9800, 0x02c4, 0x3000 }, - { 0x9800, 0x02c2, 0x2000 }, - { 0x0600, 0x02c1, 0x0000 }, - { 0x1800, 0x02c3, 0x0000 }, - { 0x8600, 0x02c6, 0x2000 }, - { 0x1800, 0x02c5, 0x0000 }, - { 0x0600, 0x02c7, 0x0000 }, - { 0x8600, 0x02d0, 0x4000 }, - { 0x8600, 0x02cc, 0x3000 }, - { 0x8600, 0x02ca, 0x2000 }, - { 0x0600, 0x02c9, 0x0000 }, - { 0x0600, 0x02cb, 0x0000 }, - { 0x8600, 0x02ce, 0x2000 }, - { 0x0600, 0x02cd, 0x0000 }, - { 0x0600, 0x02cf, 0x0000 }, - { 0x9800, 0x02d4, 0x3000 }, - { 0x9800, 0x02d2, 0x2000 }, - { 0x0600, 0x02d1, 0x0000 }, - { 0x1800, 0x02d3, 0x0000 }, - { 0x9800, 0x02d6, 0x2000 }, - { 0x1800, 0x02d5, 0x0000 }, - { 0x1800, 0x02d7, 0x0000 }, - { 0x9800, 0x02f8, 0x6000 }, - { 0x9800, 0x02e8, 0x5000 }, - { 0x8600, 0x02e0, 0x4000 }, - { 0x9800, 0x02dc, 0x3000 }, - { 0x9800, 0x02da, 0x2000 }, - { 0x1800, 0x02d9, 0x0000 }, - { 0x1800, 0x02db, 0x0000 }, - { 0x9800, 0x02de, 0x2000 }, - { 0x1800, 0x02dd, 0x0000 }, - { 0x1800, 0x02df, 0x0000 }, - { 0x8600, 0x02e4, 0x3000 }, - { 0x8600, 0x02e2, 0x2000 }, - { 0x0600, 0x02e1, 0x0000 }, - { 0x0600, 0x02e3, 0x0000 }, - { 0x9800, 0x02e6, 0x2000 }, - { 0x1800, 0x02e5, 0x0000 }, - { 0x1800, 0x02e7, 0x0000 }, - { 0x9800, 0x02f0, 0x4000 }, - { 0x9800, 0x02ec, 0x3000 }, - { 0x9800, 0x02ea, 0x2000 }, - { 0x1800, 0x02e9, 0x0000 }, - { 0x1800, 0x02eb, 0x0000 }, - { 0x8600, 0x02ee, 0x2000 }, - { 0x1800, 0x02ed, 0x0000 }, - { 0x1800, 0x02ef, 0x0000 }, - { 0x9800, 0x02f4, 0x3000 }, - { 0x9800, 0x02f2, 0x2000 }, - { 0x1800, 0x02f1, 0x0000 }, - { 0x1800, 0x02f3, 0x0000 }, - { 0x9800, 0x02f6, 0x2000 }, - { 0x1800, 0x02f5, 0x0000 }, - { 0x1800, 0x02f7, 0x0000 }, - { 0x8c00, 0x0308, 0x5000 }, - { 0x8c00, 0x0300, 0x4000 }, - { 0x9800, 0x02fc, 0x3000 }, - { 0x9800, 0x02fa, 0x2000 }, - { 0x1800, 0x02f9, 0x0000 }, - { 0x1800, 0x02fb, 0x0000 }, - { 0x9800, 0x02fe, 0x2000 }, - { 0x1800, 0x02fd, 0x0000 }, - { 0x1800, 0x02ff, 0x0000 }, - { 0x8c00, 0x0304, 0x3000 }, - { 0x8c00, 0x0302, 0x2000 }, - { 0x0c00, 0x0301, 0x0000 }, - { 0x0c00, 0x0303, 0x0000 }, - { 0x8c00, 0x0306, 0x2000 }, - { 0x0c00, 0x0305, 0x0000 }, - { 0x0c00, 0x0307, 0x0000 }, - { 0x8c00, 0x0310, 0x4000 }, - { 0x8c00, 0x030c, 0x3000 }, - { 0x8c00, 0x030a, 0x2000 }, - { 0x0c00, 0x0309, 0x0000 }, - { 0x0c00, 0x030b, 0x0000 }, - { 0x8c00, 0x030e, 0x2000 }, - { 0x0c00, 0x030d, 0x0000 }, - { 0x0c00, 0x030f, 0x0000 }, - { 0x8c00, 0x0314, 0x3000 }, - { 0x8c00, 0x0312, 0x2000 }, - { 0x0c00, 0x0311, 0x0000 }, - { 0x0c00, 0x0313, 0x0000 }, - { 0x8c00, 0x0316, 0x2000 }, - { 0x0c00, 0x0315, 0x0000 }, - { 0x0c00, 0x0317, 0x0000 }, - { 0x8500, 0x03b0, 0x8000 }, - { 0x8c00, 0x035d, 0x7000 }, - { 0x8c00, 0x0338, 0x6000 }, - { 0x8c00, 0x0328, 0x5000 }, - { 0x8c00, 0x0320, 0x4000 }, - { 0x8c00, 0x031c, 0x3000 }, - { 0x8c00, 0x031a, 0x2000 }, - { 0x0c00, 0x0319, 0x0000 }, - { 0x0c00, 0x031b, 0x0000 }, - { 0x8c00, 0x031e, 0x2000 }, - { 0x0c00, 0x031d, 0x0000 }, - { 0x0c00, 0x031f, 0x0000 }, - { 0x8c00, 0x0324, 0x3000 }, - { 0x8c00, 0x0322, 0x2000 }, - { 0x0c00, 0x0321, 0x0000 }, - { 0x0c00, 0x0323, 0x0000 }, - { 0x8c00, 0x0326, 0x2000 }, - { 0x0c00, 0x0325, 0x0000 }, - { 0x0c00, 0x0327, 0x0000 }, - { 0x8c00, 0x0330, 0x4000 }, - { 0x8c00, 0x032c, 0x3000 }, - { 0x8c00, 0x032a, 0x2000 }, - { 0x0c00, 0x0329, 0x0000 }, - { 0x0c00, 0x032b, 0x0000 }, - { 0x8c00, 0x032e, 0x2000 }, - { 0x0c00, 0x032d, 0x0000 }, - { 0x0c00, 0x032f, 0x0000 }, - { 0x8c00, 0x0334, 0x3000 }, - { 0x8c00, 0x0332, 0x2000 }, - { 0x0c00, 0x0331, 0x0000 }, - { 0x0c00, 0x0333, 0x0000 }, - { 0x8c00, 0x0336, 0x2000 }, - { 0x0c00, 0x0335, 0x0000 }, - { 0x0c00, 0x0337, 0x0000 }, - { 0x8c00, 0x0348, 0x5000 }, - { 0x8c00, 0x0340, 0x4000 }, - { 0x8c00, 0x033c, 0x3000 }, - { 0x8c00, 0x033a, 0x2000 }, - { 0x0c00, 0x0339, 0x0000 }, - { 0x0c00, 0x033b, 0x0000 }, - { 0x8c00, 0x033e, 0x2000 }, - { 0x0c00, 0x033d, 0x0000 }, - { 0x0c00, 0x033f, 0x0000 }, - { 0x8c00, 0x0344, 0x3000 }, - { 0x8c00, 0x0342, 0x2000 }, - { 0x0c00, 0x0341, 0x0000 }, - { 0x0c00, 0x0343, 0x0000 }, - { 0x8c00, 0x0346, 0x2000 }, - { 0x0c00, 0x0345, 0x0000 }, - { 0x0c00, 0x0347, 0x0000 }, - { 0x8c00, 0x0350, 0x4000 }, - { 0x8c00, 0x034c, 0x3000 }, - { 0x8c00, 0x034a, 0x2000 }, - { 0x0c00, 0x0349, 0x0000 }, - { 0x0c00, 0x034b, 0x0000 }, - { 0x8c00, 0x034e, 0x2000 }, - { 0x0c00, 0x034d, 0x0000 }, - { 0x0c00, 0x034f, 0x0000 }, - { 0x8c00, 0x0354, 0x3000 }, - { 0x8c00, 0x0352, 0x2000 }, - { 0x0c00, 0x0351, 0x0000 }, - { 0x0c00, 0x0353, 0x0000 }, - { 0x8c00, 0x0356, 0x2000 }, - { 0x0c00, 0x0355, 0x0000 }, - { 0x0c00, 0x0357, 0x0000 }, - { 0x8900, 0x038f, 0x603f }, - { 0x8c00, 0x036d, 0x5000 }, - { 0x8c00, 0x0365, 0x4000 }, - { 0x8c00, 0x0361, 0x3000 }, - { 0x8c00, 0x035f, 0x2000 }, - { 0x0c00, 0x035e, 0x0000 }, - { 0x0c00, 0x0360, 0x0000 }, - { 0x8c00, 0x0363, 0x2000 }, - { 0x0c00, 0x0362, 0x0000 }, - { 0x0c00, 0x0364, 0x0000 }, - { 0x8c00, 0x0369, 0x3000 }, - { 0x8c00, 0x0367, 0x2000 }, - { 0x0c00, 0x0366, 0x0000 }, - { 0x0c00, 0x0368, 0x0000 }, - { 0x8c00, 0x036b, 0x2000 }, - { 0x0c00, 0x036a, 0x0000 }, - { 0x0c00, 0x036c, 0x0000 }, - { 0x9800, 0x0385, 0x4000 }, - { 0x9800, 0x0375, 0x3000 }, - { 0x8c00, 0x036f, 0x2000 }, - { 0x0c00, 0x036e, 0x0000 }, - { 0x1800, 0x0374, 0x0000 }, - { 0x9500, 0x037e, 0x2000 }, - { 0x0600, 0x037a, 0x0000 }, - { 0x1800, 0x0384, 0x0000 }, - { 0x8900, 0x0389, 0x3025 }, - { 0x9500, 0x0387, 0x2000 }, - { 0x0900, 0x0386, 0x0026 }, - { 0x0900, 0x0388, 0x0025 }, - { 0x8900, 0x038c, 0x2040 }, - { 0x0900, 0x038a, 0x0025 }, - { 0x0900, 0x038e, 0x003f }, - { 0x8900, 0x039f, 0x5020 }, - { 0x8900, 0x0397, 0x4020 }, - { 0x8900, 0x0393, 0x3020 }, - { 0x8900, 0x0391, 0x2020 }, - { 0x0500, 0x0390, 0x0000 }, - { 0x0900, 0x0392, 0x0020 }, - { 0x8900, 0x0395, 0x2020 }, - { 0x0900, 0x0394, 0x0020 }, - { 0x0900, 0x0396, 0x0020 }, - { 0x8900, 0x039b, 0x3020 }, - { 0x8900, 0x0399, 0x2020 }, - { 0x0900, 0x0398, 0x0020 }, - { 0x0900, 0x039a, 0x0020 }, - { 0x8900, 0x039d, 0x2020 }, - { 0x0900, 0x039c, 0x0020 }, - { 0x0900, 0x039e, 0x0020 }, - { 0x8900, 0x03a8, 0x4020 }, - { 0x8900, 0x03a4, 0x3020 }, - { 0x8900, 0x03a1, 0x2020 }, - { 0x0900, 0x03a0, 0x0020 }, - { 0x0900, 0x03a3, 0x0020 }, - { 0x8900, 0x03a6, 0x2020 }, - { 0x0900, 0x03a5, 0x0020 }, - { 0x0900, 0x03a7, 0x0020 }, - { 0x8500, 0x03ac, 0x3fda }, - { 0x8900, 0x03aa, 0x2020 }, - { 0x0900, 0x03a9, 0x0020 }, - { 0x0900, 0x03ab, 0x0020 }, - { 0x8500, 0x03ae, 0x2fdb }, - { 0x0500, 0x03ad, 0x0fdb }, - { 0x0500, 0x03af, 0x0fdb }, - { 0x8500, 0x03f1, 0x7fb0 }, - { 0x8500, 0x03d1, 0x6fc7 }, - { 0x8500, 0x03c0, 0x5fe0 }, - { 0x8500, 0x03b8, 0x4fe0 }, - { 0x8500, 0x03b4, 0x3fe0 }, - { 0x8500, 0x03b2, 0x2fe0 }, - { 0x0500, 0x03b1, 0x0fe0 }, - { 0x0500, 0x03b3, 0x0fe0 }, - { 0x8500, 0x03b6, 0x2fe0 }, - { 0x0500, 0x03b5, 0x0fe0 }, - { 0x0500, 0x03b7, 0x0fe0 }, - { 0x8500, 0x03bc, 0x3fe0 }, - { 0x8500, 0x03ba, 0x2fe0 }, - { 0x0500, 0x03b9, 0x0fe0 }, - { 0x0500, 0x03bb, 0x0fe0 }, - { 0x8500, 0x03be, 0x2fe0 }, - { 0x0500, 0x03bd, 0x0fe0 }, - { 0x0500, 0x03bf, 0x0fe0 }, - { 0x8500, 0x03c8, 0x4fe0 }, - { 0x8500, 0x03c4, 0x3fe0 }, - { 0x8500, 0x03c2, 0x2fe1 }, - { 0x0500, 0x03c1, 0x0fe0 }, - { 0x0500, 0x03c3, 0x0fe0 }, - { 0x8500, 0x03c6, 0x2fe0 }, - { 0x0500, 0x03c5, 0x0fe0 }, - { 0x0500, 0x03c7, 0x0fe0 }, - { 0x8500, 0x03cc, 0x3fc0 }, - { 0x8500, 0x03ca, 0x2fe0 }, - { 0x0500, 0x03c9, 0x0fe0 }, - { 0x0500, 0x03cb, 0x0fe0 }, - { 0x8500, 0x03ce, 0x2fc1 }, - { 0x0500, 0x03cd, 0x0fc1 }, - { 0x0500, 0x03d0, 0x0fc2 }, - { 0x8500, 0x03e1, 0x5fff }, - { 0x8500, 0x03d9, 0x4fff }, - { 0x8500, 0x03d5, 0x3fd1 }, - { 0x8900, 0x03d3, 0x2000 }, - { 0x0900, 0x03d2, 0x0000 }, - { 0x0900, 0x03d4, 0x0000 }, - { 0x8500, 0x03d7, 0x2000 }, - { 0x0500, 0x03d6, 0x0fca }, - { 0x0900, 0x03d8, 0x0001 }, - { 0x8500, 0x03dd, 0x3fff }, - { 0x8500, 0x03db, 0x2fff }, - { 0x0900, 0x03da, 0x0001 }, - { 0x0900, 0x03dc, 0x0001 }, - { 0x8500, 0x03df, 0x2fff }, - { 0x0900, 0x03de, 0x0001 }, - { 0x0900, 0x03e0, 0x0001 }, - { 0x8500, 0x03e9, 0x4fff }, - { 0x8500, 0x03e5, 0x3fff }, - { 0x8500, 0x03e3, 0x2fff }, - { 0x0900, 0x03e2, 0x0001 }, - { 0x0900, 0x03e4, 0x0001 }, - { 0x8500, 0x03e7, 0x2fff }, - { 0x0900, 0x03e6, 0x0001 }, - { 0x0900, 0x03e8, 0x0001 }, - { 0x8500, 0x03ed, 0x3fff }, - { 0x8500, 0x03eb, 0x2fff }, - { 0x0900, 0x03ea, 0x0001 }, - { 0x0900, 0x03ec, 0x0001 }, - { 0x8500, 0x03ef, 0x2fff }, - { 0x0900, 0x03ee, 0x0001 }, - { 0x0500, 0x03f0, 0x0faa }, - { 0x8900, 0x0415, 0x6020 }, - { 0x8900, 0x0405, 0x5050 }, - { 0x8900, 0x03f9, 0x4ff9 }, - { 0x8500, 0x03f5, 0x3fa0 }, - { 0x8500, 0x03f3, 0x2000 }, - { 0x0500, 0x03f2, 0x0007 }, - { 0x0900, 0x03f4, 0x0fc4 }, - { 0x8900, 0x03f7, 0x2001 }, - { 0x1900, 0x03f6, 0x0000 }, - { 0x0500, 0x03f8, 0x0fff }, - { 0x8900, 0x0401, 0x3050 }, - { 0x8500, 0x03fb, 0x2fff }, - { 0x0900, 0x03fa, 0x0001 }, - { 0x0900, 0x0400, 0x0050 }, - { 0x8900, 0x0403, 0x2050 }, - { 0x0900, 0x0402, 0x0050 }, - { 0x0900, 0x0404, 0x0050 }, - { 0x8900, 0x040d, 0x4050 }, - { 0x8900, 0x0409, 0x3050 }, - { 0x8900, 0x0407, 0x2050 }, - { 0x0900, 0x0406, 0x0050 }, - { 0x0900, 0x0408, 0x0050 }, - { 0x8900, 0x040b, 0x2050 }, - { 0x0900, 0x040a, 0x0050 }, - { 0x0900, 0x040c, 0x0050 }, - { 0x8900, 0x0411, 0x3020 }, - { 0x8900, 0x040f, 0x2050 }, - { 0x0900, 0x040e, 0x0050 }, - { 0x0900, 0x0410, 0x0020 }, - { 0x8900, 0x0413, 0x2020 }, - { 0x0900, 0x0412, 0x0020 }, - { 0x0900, 0x0414, 0x0020 }, - { 0x8900, 0x0425, 0x5020 }, - { 0x8900, 0x041d, 0x4020 }, - { 0x8900, 0x0419, 0x3020 }, - { 0x8900, 0x0417, 0x2020 }, - { 0x0900, 0x0416, 0x0020 }, - { 0x0900, 0x0418, 0x0020 }, - { 0x8900, 0x041b, 0x2020 }, - { 0x0900, 0x041a, 0x0020 }, - { 0x0900, 0x041c, 0x0020 }, - { 0x8900, 0x0421, 0x3020 }, - { 0x8900, 0x041f, 0x2020 }, - { 0x0900, 0x041e, 0x0020 }, - { 0x0900, 0x0420, 0x0020 }, - { 0x8900, 0x0423, 0x2020 }, - { 0x0900, 0x0422, 0x0020 }, - { 0x0900, 0x0424, 0x0020 }, - { 0x8900, 0x042d, 0x4020 }, - { 0x8900, 0x0429, 0x3020 }, - { 0x8900, 0x0427, 0x2020 }, - { 0x0900, 0x0426, 0x0020 }, - { 0x0900, 0x0428, 0x0020 }, - { 0x8900, 0x042b, 0x2020 }, - { 0x0900, 0x042a, 0x0020 }, - { 0x0900, 0x042c, 0x0020 }, - { 0x8500, 0x0431, 0x3fe0 }, - { 0x8900, 0x042f, 0x2020 }, - { 0x0900, 0x042e, 0x0020 }, - { 0x0500, 0x0430, 0x0fe0 }, - { 0x8500, 0x0433, 0x2fe0 }, - { 0x0500, 0x0432, 0x0fe0 }, - { 0x0500, 0x0434, 0x0fe0 }, - { 0x8700, 0x06a4, 0xa000 }, - { 0x8500, 0x0563, 0x9fd0 }, - { 0x8900, 0x04b6, 0x8001 }, - { 0x8500, 0x0475, 0x7fff }, - { 0x8500, 0x0455, 0x6fb0 }, - { 0x8500, 0x0445, 0x5fe0 }, - { 0x8500, 0x043d, 0x4fe0 }, - { 0x8500, 0x0439, 0x3fe0 }, - { 0x8500, 0x0437, 0x2fe0 }, - { 0x0500, 0x0436, 0x0fe0 }, - { 0x0500, 0x0438, 0x0fe0 }, - { 0x8500, 0x043b, 0x2fe0 }, - { 0x0500, 0x043a, 0x0fe0 }, - { 0x0500, 0x043c, 0x0fe0 }, - { 0x8500, 0x0441, 0x3fe0 }, - { 0x8500, 0x043f, 0x2fe0 }, - { 0x0500, 0x043e, 0x0fe0 }, - { 0x0500, 0x0440, 0x0fe0 }, - { 0x8500, 0x0443, 0x2fe0 }, - { 0x0500, 0x0442, 0x0fe0 }, - { 0x0500, 0x0444, 0x0fe0 }, - { 0x8500, 0x044d, 0x4fe0 }, - { 0x8500, 0x0449, 0x3fe0 }, - { 0x8500, 0x0447, 0x2fe0 }, - { 0x0500, 0x0446, 0x0fe0 }, - { 0x0500, 0x0448, 0x0fe0 }, - { 0x8500, 0x044b, 0x2fe0 }, - { 0x0500, 0x044a, 0x0fe0 }, - { 0x0500, 0x044c, 0x0fe0 }, - { 0x8500, 0x0451, 0x3fb0 }, - { 0x8500, 0x044f, 0x2fe0 }, - { 0x0500, 0x044e, 0x0fe0 }, - { 0x0500, 0x0450, 0x0fb0 }, - { 0x8500, 0x0453, 0x2fb0 }, - { 0x0500, 0x0452, 0x0fb0 }, - { 0x0500, 0x0454, 0x0fb0 }, - { 0x8500, 0x0465, 0x5fff }, - { 0x8500, 0x045d, 0x4fb0 }, - { 0x8500, 0x0459, 0x3fb0 }, - { 0x8500, 0x0457, 0x2fb0 }, - { 0x0500, 0x0456, 0x0fb0 }, - { 0x0500, 0x0458, 0x0fb0 }, - { 0x8500, 0x045b, 0x2fb0 }, - { 0x0500, 0x045a, 0x0fb0 }, - { 0x0500, 0x045c, 0x0fb0 }, - { 0x8500, 0x0461, 0x3fff }, - { 0x8500, 0x045f, 0x2fb0 }, - { 0x0500, 0x045e, 0x0fb0 }, - { 0x0900, 0x0460, 0x0001 }, - { 0x8500, 0x0463, 0x2fff }, - { 0x0900, 0x0462, 0x0001 }, - { 0x0900, 0x0464, 0x0001 }, - { 0x8500, 0x046d, 0x4fff }, - { 0x8500, 0x0469, 0x3fff }, - { 0x8500, 0x0467, 0x2fff }, - { 0x0900, 0x0466, 0x0001 }, - { 0x0900, 0x0468, 0x0001 }, - { 0x8500, 0x046b, 0x2fff }, - { 0x0900, 0x046a, 0x0001 }, - { 0x0900, 0x046c, 0x0001 }, - { 0x8500, 0x0471, 0x3fff }, - { 0x8500, 0x046f, 0x2fff }, - { 0x0900, 0x046e, 0x0001 }, - { 0x0900, 0x0470, 0x0001 }, - { 0x8500, 0x0473, 0x2fff }, - { 0x0900, 0x0472, 0x0001 }, - { 0x0900, 0x0474, 0x0001 }, - { 0x8900, 0x0496, 0x6001 }, - { 0x8c00, 0x0485, 0x5000 }, - { 0x8500, 0x047d, 0x4fff }, - { 0x8500, 0x0479, 0x3fff }, - { 0x8500, 0x0477, 0x2fff }, - { 0x0900, 0x0476, 0x0001 }, - { 0x0900, 0x0478, 0x0001 }, - { 0x8500, 0x047b, 0x2fff }, - { 0x0900, 0x047a, 0x0001 }, - { 0x0900, 0x047c, 0x0001 }, - { 0x8500, 0x0481, 0x3fff }, - { 0x8500, 0x047f, 0x2fff }, - { 0x0900, 0x047e, 0x0001 }, - { 0x0900, 0x0480, 0x0001 }, - { 0x8c00, 0x0483, 0x2000 }, - { 0x1a00, 0x0482, 0x0000 }, - { 0x0c00, 0x0484, 0x0000 }, - { 0x8900, 0x048e, 0x4001 }, - { 0x8900, 0x048a, 0x3001 }, - { 0x8b00, 0x0488, 0x2000 }, - { 0x0c00, 0x0486, 0x0000 }, - { 0x0b00, 0x0489, 0x0000 }, - { 0x8900, 0x048c, 0x2001 }, - { 0x0500, 0x048b, 0x0fff }, - { 0x0500, 0x048d, 0x0fff }, - { 0x8900, 0x0492, 0x3001 }, - { 0x8900, 0x0490, 0x2001 }, - { 0x0500, 0x048f, 0x0fff }, - { 0x0500, 0x0491, 0x0fff }, - { 0x8900, 0x0494, 0x2001 }, - { 0x0500, 0x0493, 0x0fff }, - { 0x0500, 0x0495, 0x0fff }, - { 0x8900, 0x04a6, 0x5001 }, - { 0x8900, 0x049e, 0x4001 }, - { 0x8900, 0x049a, 0x3001 }, - { 0x8900, 0x0498, 0x2001 }, - { 0x0500, 0x0497, 0x0fff }, - { 0x0500, 0x0499, 0x0fff }, - { 0x8900, 0x049c, 0x2001 }, - { 0x0500, 0x049b, 0x0fff }, - { 0x0500, 0x049d, 0x0fff }, - { 0x8900, 0x04a2, 0x3001 }, - { 0x8900, 0x04a0, 0x2001 }, - { 0x0500, 0x049f, 0x0fff }, - { 0x0500, 0x04a1, 0x0fff }, - { 0x8900, 0x04a4, 0x2001 }, - { 0x0500, 0x04a3, 0x0fff }, - { 0x0500, 0x04a5, 0x0fff }, - { 0x8900, 0x04ae, 0x4001 }, - { 0x8900, 0x04aa, 0x3001 }, - { 0x8900, 0x04a8, 0x2001 }, - { 0x0500, 0x04a7, 0x0fff }, - { 0x0500, 0x04a9, 0x0fff }, - { 0x8900, 0x04ac, 0x2001 }, - { 0x0500, 0x04ab, 0x0fff }, - { 0x0500, 0x04ad, 0x0fff }, - { 0x8900, 0x04b2, 0x3001 }, - { 0x8900, 0x04b0, 0x2001 }, - { 0x0500, 0x04af, 0x0fff }, - { 0x0500, 0x04b1, 0x0fff }, - { 0x8900, 0x04b4, 0x2001 }, - { 0x0500, 0x04b3, 0x0fff }, - { 0x0500, 0x04b5, 0x0fff }, - { 0x8500, 0x04f9, 0x7fff }, - { 0x8500, 0x04d7, 0x6fff }, - { 0x8500, 0x04c6, 0x5fff }, - { 0x8900, 0x04be, 0x4001 }, - { 0x8900, 0x04ba, 0x3001 }, - { 0x8900, 0x04b8, 0x2001 }, - { 0x0500, 0x04b7, 0x0fff }, - { 0x0500, 0x04b9, 0x0fff }, - { 0x8900, 0x04bc, 0x2001 }, - { 0x0500, 0x04bb, 0x0fff }, - { 0x0500, 0x04bd, 0x0fff }, - { 0x8500, 0x04c2, 0x3fff }, - { 0x8900, 0x04c0, 0x2000 }, - { 0x0500, 0x04bf, 0x0fff }, - { 0x0900, 0x04c1, 0x0001 }, - { 0x8500, 0x04c4, 0x2fff }, - { 0x0900, 0x04c3, 0x0001 }, - { 0x0900, 0x04c5, 0x0001 }, - { 0x8500, 0x04ce, 0x4fff }, - { 0x8500, 0x04ca, 0x3fff }, - { 0x8500, 0x04c8, 0x2fff }, - { 0x0900, 0x04c7, 0x0001 }, - { 0x0900, 0x04c9, 0x0001 }, - { 0x8500, 0x04cc, 0x2fff }, - { 0x0900, 0x04cb, 0x0001 }, - { 0x0900, 0x04cd, 0x0001 }, - { 0x8500, 0x04d3, 0x3fff }, - { 0x8500, 0x04d1, 0x2fff }, - { 0x0900, 0x04d0, 0x0001 }, - { 0x0900, 0x04d2, 0x0001 }, - { 0x8500, 0x04d5, 0x2fff }, - { 0x0900, 0x04d4, 0x0001 }, - { 0x0900, 0x04d6, 0x0001 }, - { 0x8500, 0x04e7, 0x5fff }, - { 0x8500, 0x04df, 0x4fff }, - { 0x8500, 0x04db, 0x3fff }, - { 0x8500, 0x04d9, 0x2fff }, - { 0x0900, 0x04d8, 0x0001 }, - { 0x0900, 0x04da, 0x0001 }, - { 0x8500, 0x04dd, 0x2fff }, - { 0x0900, 0x04dc, 0x0001 }, - { 0x0900, 0x04de, 0x0001 }, - { 0x8500, 0x04e3, 0x3fff }, - { 0x8500, 0x04e1, 0x2fff }, - { 0x0900, 0x04e0, 0x0001 }, - { 0x0900, 0x04e2, 0x0001 }, - { 0x8500, 0x04e5, 0x2fff }, - { 0x0900, 0x04e4, 0x0001 }, - { 0x0900, 0x04e6, 0x0001 }, - { 0x8500, 0x04ef, 0x4fff }, - { 0x8500, 0x04eb, 0x3fff }, - { 0x8500, 0x04e9, 0x2fff }, - { 0x0900, 0x04e8, 0x0001 }, - { 0x0900, 0x04ea, 0x0001 }, - { 0x8500, 0x04ed, 0x2fff }, - { 0x0900, 0x04ec, 0x0001 }, - { 0x0900, 0x04ee, 0x0001 }, - { 0x8500, 0x04f3, 0x3fff }, - { 0x8500, 0x04f1, 0x2fff }, - { 0x0900, 0x04f0, 0x0001 }, - { 0x0900, 0x04f2, 0x0001 }, - { 0x8500, 0x04f5, 0x2fff }, - { 0x0900, 0x04f4, 0x0001 }, - { 0x0900, 0x04f8, 0x0001 }, - { 0x8900, 0x0540, 0x6030 }, - { 0x8500, 0x050f, 0x5fff }, - { 0x8500, 0x0507, 0x4fff }, - { 0x8500, 0x0503, 0x3fff }, - { 0x8500, 0x0501, 0x2fff }, - { 0x0900, 0x0500, 0x0001 }, - { 0x0900, 0x0502, 0x0001 }, - { 0x8500, 0x0505, 0x2fff }, - { 0x0900, 0x0504, 0x0001 }, - { 0x0900, 0x0506, 0x0001 }, - { 0x8500, 0x050b, 0x3fff }, - { 0x8500, 0x0509, 0x2fff }, - { 0x0900, 0x0508, 0x0001 }, - { 0x0900, 0x050a, 0x0001 }, - { 0x8500, 0x050d, 0x2fff }, - { 0x0900, 0x050c, 0x0001 }, - { 0x0900, 0x050e, 0x0001 }, - { 0x8900, 0x0538, 0x4030 }, - { 0x8900, 0x0534, 0x3030 }, - { 0x8900, 0x0532, 0x2030 }, - { 0x0900, 0x0531, 0x0030 }, - { 0x0900, 0x0533, 0x0030 }, - { 0x8900, 0x0536, 0x2030 }, - { 0x0900, 0x0535, 0x0030 }, - { 0x0900, 0x0537, 0x0030 }, - { 0x8900, 0x053c, 0x3030 }, - { 0x8900, 0x053a, 0x2030 }, - { 0x0900, 0x0539, 0x0030 }, - { 0x0900, 0x053b, 0x0030 }, - { 0x8900, 0x053e, 0x2030 }, - { 0x0900, 0x053d, 0x0030 }, - { 0x0900, 0x053f, 0x0030 }, - { 0x8900, 0x0550, 0x5030 }, - { 0x8900, 0x0548, 0x4030 }, - { 0x8900, 0x0544, 0x3030 }, - { 0x8900, 0x0542, 0x2030 }, - { 0x0900, 0x0541, 0x0030 }, - { 0x0900, 0x0543, 0x0030 }, - { 0x8900, 0x0546, 0x2030 }, - { 0x0900, 0x0545, 0x0030 }, - { 0x0900, 0x0547, 0x0030 }, - { 0x8900, 0x054c, 0x3030 }, - { 0x8900, 0x054a, 0x2030 }, - { 0x0900, 0x0549, 0x0030 }, - { 0x0900, 0x054b, 0x0030 }, - { 0x8900, 0x054e, 0x2030 }, - { 0x0900, 0x054d, 0x0030 }, - { 0x0900, 0x054f, 0x0030 }, - { 0x9500, 0x055a, 0x4000 }, - { 0x8900, 0x0554, 0x3030 }, - { 0x8900, 0x0552, 0x2030 }, - { 0x0900, 0x0551, 0x0030 }, - { 0x0900, 0x0553, 0x0030 }, - { 0x8900, 0x0556, 0x2030 }, - { 0x0900, 0x0555, 0x0030 }, - { 0x0600, 0x0559, 0x0000 }, - { 0x9500, 0x055e, 0x3000 }, - { 0x9500, 0x055c, 0x2000 }, - { 0x1500, 0x055b, 0x0000 }, - { 0x1500, 0x055d, 0x0000 }, - { 0x8500, 0x0561, 0x2fd0 }, - { 0x1500, 0x055f, 0x0000 }, - { 0x0500, 0x0562, 0x0fd0 }, - { 0x9a00, 0x060f, 0x8000 }, - { 0x8c00, 0x05ab, 0x7000 }, - { 0x8500, 0x0583, 0x6fd0 }, - { 0x8500, 0x0573, 0x5fd0 }, - { 0x8500, 0x056b, 0x4fd0 }, - { 0x8500, 0x0567, 0x3fd0 }, - { 0x8500, 0x0565, 0x2fd0 }, - { 0x0500, 0x0564, 0x0fd0 }, - { 0x0500, 0x0566, 0x0fd0 }, - { 0x8500, 0x0569, 0x2fd0 }, - { 0x0500, 0x0568, 0x0fd0 }, - { 0x0500, 0x056a, 0x0fd0 }, - { 0x8500, 0x056f, 0x3fd0 }, - { 0x8500, 0x056d, 0x2fd0 }, - { 0x0500, 0x056c, 0x0fd0 }, - { 0x0500, 0x056e, 0x0fd0 }, - { 0x8500, 0x0571, 0x2fd0 }, - { 0x0500, 0x0570, 0x0fd0 }, - { 0x0500, 0x0572, 0x0fd0 }, - { 0x8500, 0x057b, 0x4fd0 }, - { 0x8500, 0x0577, 0x3fd0 }, - { 0x8500, 0x0575, 0x2fd0 }, - { 0x0500, 0x0574, 0x0fd0 }, - { 0x0500, 0x0576, 0x0fd0 }, - { 0x8500, 0x0579, 0x2fd0 }, - { 0x0500, 0x0578, 0x0fd0 }, - { 0x0500, 0x057a, 0x0fd0 }, - { 0x8500, 0x057f, 0x3fd0 }, - { 0x8500, 0x057d, 0x2fd0 }, - { 0x0500, 0x057c, 0x0fd0 }, - { 0x0500, 0x057e, 0x0fd0 }, - { 0x8500, 0x0581, 0x2fd0 }, - { 0x0500, 0x0580, 0x0fd0 }, - { 0x0500, 0x0582, 0x0fd0 }, - { 0x8c00, 0x059a, 0x5000 }, - { 0x8c00, 0x0592, 0x4000 }, - { 0x8500, 0x0587, 0x3000 }, - { 0x8500, 0x0585, 0x2fd0 }, - { 0x0500, 0x0584, 0x0fd0 }, - { 0x0500, 0x0586, 0x0fd0 }, - { 0x9100, 0x058a, 0x2000 }, - { 0x1500, 0x0589, 0x0000 }, - { 0x0c00, 0x0591, 0x0000 }, - { 0x8c00, 0x0596, 0x3000 }, - { 0x8c00, 0x0594, 0x2000 }, - { 0x0c00, 0x0593, 0x0000 }, - { 0x0c00, 0x0595, 0x0000 }, - { 0x8c00, 0x0598, 0x2000 }, - { 0x0c00, 0x0597, 0x0000 }, - { 0x0c00, 0x0599, 0x0000 }, - { 0x8c00, 0x05a3, 0x4000 }, - { 0x8c00, 0x059e, 0x3000 }, - { 0x8c00, 0x059c, 0x2000 }, - { 0x0c00, 0x059b, 0x0000 }, - { 0x0c00, 0x059d, 0x0000 }, - { 0x8c00, 0x05a0, 0x2000 }, - { 0x0c00, 0x059f, 0x0000 }, - { 0x0c00, 0x05a1, 0x0000 }, - { 0x8c00, 0x05a7, 0x3000 }, - { 0x8c00, 0x05a5, 0x2000 }, - { 0x0c00, 0x05a4, 0x0000 }, - { 0x0c00, 0x05a6, 0x0000 }, - { 0x8c00, 0x05a9, 0x2000 }, - { 0x0c00, 0x05a8, 0x0000 }, - { 0x0c00, 0x05aa, 0x0000 }, - { 0x8700, 0x05d7, 0x6000 }, - { 0x8c00, 0x05bc, 0x5000 }, - { 0x8c00, 0x05b3, 0x4000 }, - { 0x8c00, 0x05af, 0x3000 }, - { 0x8c00, 0x05ad, 0x2000 }, - { 0x0c00, 0x05ac, 0x0000 }, - { 0x0c00, 0x05ae, 0x0000 }, - { 0x8c00, 0x05b1, 0x2000 }, - { 0x0c00, 0x05b0, 0x0000 }, - { 0x0c00, 0x05b2, 0x0000 }, - { 0x8c00, 0x05b7, 0x3000 }, - { 0x8c00, 0x05b5, 0x2000 }, - { 0x0c00, 0x05b4, 0x0000 }, - { 0x0c00, 0x05b6, 0x0000 }, - { 0x8c00, 0x05b9, 0x2000 }, - { 0x0c00, 0x05b8, 0x0000 }, - { 0x0c00, 0x05bb, 0x0000 }, - { 0x8c00, 0x05c4, 0x4000 }, - { 0x9500, 0x05c0, 0x3000 }, - { 0x9500, 0x05be, 0x2000 }, - { 0x0c00, 0x05bd, 0x0000 }, - { 0x0c00, 0x05bf, 0x0000 }, - { 0x8c00, 0x05c2, 0x2000 }, - { 0x0c00, 0x05c1, 0x0000 }, - { 0x1500, 0x05c3, 0x0000 }, - { 0x8700, 0x05d3, 0x3000 }, - { 0x8700, 0x05d1, 0x2000 }, - { 0x0700, 0x05d0, 0x0000 }, - { 0x0700, 0x05d2, 0x0000 }, - { 0x8700, 0x05d5, 0x2000 }, - { 0x0700, 0x05d4, 0x0000 }, - { 0x0700, 0x05d6, 0x0000 }, - { 0x8700, 0x05e7, 0x5000 }, - { 0x8700, 0x05df, 0x4000 }, - { 0x8700, 0x05db, 0x3000 }, - { 0x8700, 0x05d9, 0x2000 }, - { 0x0700, 0x05d8, 0x0000 }, - { 0x0700, 0x05da, 0x0000 }, - { 0x8700, 0x05dd, 0x2000 }, - { 0x0700, 0x05dc, 0x0000 }, - { 0x0700, 0x05de, 0x0000 }, - { 0x8700, 0x05e3, 0x3000 }, - { 0x8700, 0x05e1, 0x2000 }, - { 0x0700, 0x05e0, 0x0000 }, - { 0x0700, 0x05e2, 0x0000 }, - { 0x8700, 0x05e5, 0x2000 }, - { 0x0700, 0x05e4, 0x0000 }, - { 0x0700, 0x05e6, 0x0000 }, - { 0x9500, 0x05f4, 0x4000 }, - { 0x8700, 0x05f0, 0x3000 }, - { 0x8700, 0x05e9, 0x2000 }, - { 0x0700, 0x05e8, 0x0000 }, - { 0x0700, 0x05ea, 0x0000 }, - { 0x8700, 0x05f2, 0x2000 }, - { 0x0700, 0x05f1, 0x0000 }, - { 0x1500, 0x05f3, 0x0000 }, - { 0x8100, 0x0603, 0x3000 }, - { 0x8100, 0x0601, 0x2000 }, - { 0x0100, 0x0600, 0x0000 }, - { 0x0100, 0x0602, 0x0000 }, - { 0x9500, 0x060d, 0x2000 }, - { 0x1500, 0x060c, 0x0000 }, - { 0x1a00, 0x060e, 0x0000 }, - { 0x8d00, 0x0664, 0x7000 }, - { 0x8700, 0x0638, 0x6000 }, - { 0x8700, 0x0628, 0x5000 }, - { 0x9500, 0x061f, 0x4000 }, - { 0x8c00, 0x0613, 0x3000 }, - { 0x8c00, 0x0611, 0x2000 }, - { 0x0c00, 0x0610, 0x0000 }, - { 0x0c00, 0x0612, 0x0000 }, - { 0x8c00, 0x0615, 0x2000 }, - { 0x0c00, 0x0614, 0x0000 }, - { 0x1500, 0x061b, 0x0000 }, - { 0x8700, 0x0624, 0x3000 }, - { 0x8700, 0x0622, 0x2000 }, - { 0x0700, 0x0621, 0x0000 }, - { 0x0700, 0x0623, 0x0000 }, - { 0x8700, 0x0626, 0x2000 }, - { 0x0700, 0x0625, 0x0000 }, - { 0x0700, 0x0627, 0x0000 }, - { 0x8700, 0x0630, 0x4000 }, - { 0x8700, 0x062c, 0x3000 }, - { 0x8700, 0x062a, 0x2000 }, - { 0x0700, 0x0629, 0x0000 }, - { 0x0700, 0x062b, 0x0000 }, - { 0x8700, 0x062e, 0x2000 }, - { 0x0700, 0x062d, 0x0000 }, - { 0x0700, 0x062f, 0x0000 }, - { 0x8700, 0x0634, 0x3000 }, - { 0x8700, 0x0632, 0x2000 }, - { 0x0700, 0x0631, 0x0000 }, - { 0x0700, 0x0633, 0x0000 }, - { 0x8700, 0x0636, 0x2000 }, - { 0x0700, 0x0635, 0x0000 }, - { 0x0700, 0x0637, 0x0000 }, - { 0x8c00, 0x064d, 0x5000 }, - { 0x8700, 0x0645, 0x4000 }, - { 0x8700, 0x0641, 0x3000 }, - { 0x8700, 0x063a, 0x2000 }, - { 0x0700, 0x0639, 0x0000 }, - { 0x0600, 0x0640, 0x0000 }, - { 0x8700, 0x0643, 0x2000 }, - { 0x0700, 0x0642, 0x0000 }, - { 0x0700, 0x0644, 0x0000 }, - { 0x8700, 0x0649, 0x3000 }, - { 0x8700, 0x0647, 0x2000 }, - { 0x0700, 0x0646, 0x0000 }, - { 0x0700, 0x0648, 0x0000 }, - { 0x8c00, 0x064b, 0x2000 }, - { 0x0700, 0x064a, 0x0000 }, - { 0x0c00, 0x064c, 0x0000 }, - { 0x8c00, 0x0655, 0x4000 }, - { 0x8c00, 0x0651, 0x3000 }, - { 0x8c00, 0x064f, 0x2000 }, - { 0x0c00, 0x064e, 0x0000 }, - { 0x0c00, 0x0650, 0x0000 }, - { 0x8c00, 0x0653, 0x2000 }, - { 0x0c00, 0x0652, 0x0000 }, - { 0x0c00, 0x0654, 0x0000 }, - { 0x8d00, 0x0660, 0x3000 }, - { 0x8c00, 0x0657, 0x2000 }, - { 0x0c00, 0x0656, 0x0000 }, - { 0x0c00, 0x0658, 0x0000 }, - { 0x8d00, 0x0662, 0x2000 }, - { 0x0d00, 0x0661, 0x0000 }, - { 0x0d00, 0x0663, 0x0000 }, - { 0x8700, 0x0684, 0x6000 }, - { 0x8700, 0x0674, 0x5000 }, - { 0x9500, 0x066c, 0x4000 }, - { 0x8d00, 0x0668, 0x3000 }, - { 0x8d00, 0x0666, 0x2000 }, - { 0x0d00, 0x0665, 0x0000 }, - { 0x0d00, 0x0667, 0x0000 }, - { 0x9500, 0x066a, 0x2000 }, - { 0x0d00, 0x0669, 0x0000 }, - { 0x1500, 0x066b, 0x0000 }, - { 0x8c00, 0x0670, 0x3000 }, - { 0x8700, 0x066e, 0x2000 }, - { 0x1500, 0x066d, 0x0000 }, - { 0x0700, 0x066f, 0x0000 }, - { 0x8700, 0x0672, 0x2000 }, - { 0x0700, 0x0671, 0x0000 }, - { 0x0700, 0x0673, 0x0000 }, - { 0x8700, 0x067c, 0x4000 }, - { 0x8700, 0x0678, 0x3000 }, - { 0x8700, 0x0676, 0x2000 }, - { 0x0700, 0x0675, 0x0000 }, - { 0x0700, 0x0677, 0x0000 }, - { 0x8700, 0x067a, 0x2000 }, - { 0x0700, 0x0679, 0x0000 }, - { 0x0700, 0x067b, 0x0000 }, - { 0x8700, 0x0680, 0x3000 }, - { 0x8700, 0x067e, 0x2000 }, - { 0x0700, 0x067d, 0x0000 }, - { 0x0700, 0x067f, 0x0000 }, - { 0x8700, 0x0682, 0x2000 }, - { 0x0700, 0x0681, 0x0000 }, - { 0x0700, 0x0683, 0x0000 }, - { 0x8700, 0x0694, 0x5000 }, - { 0x8700, 0x068c, 0x4000 }, - { 0x8700, 0x0688, 0x3000 }, - { 0x8700, 0x0686, 0x2000 }, - { 0x0700, 0x0685, 0x0000 }, - { 0x0700, 0x0687, 0x0000 }, - { 0x8700, 0x068a, 0x2000 }, - { 0x0700, 0x0689, 0x0000 }, - { 0x0700, 0x068b, 0x0000 }, - { 0x8700, 0x0690, 0x3000 }, - { 0x8700, 0x068e, 0x2000 }, - { 0x0700, 0x068d, 0x0000 }, - { 0x0700, 0x068f, 0x0000 }, - { 0x8700, 0x0692, 0x2000 }, - { 0x0700, 0x0691, 0x0000 }, - { 0x0700, 0x0693, 0x0000 }, - { 0x8700, 0x069c, 0x4000 }, - { 0x8700, 0x0698, 0x3000 }, - { 0x8700, 0x0696, 0x2000 }, - { 0x0700, 0x0695, 0x0000 }, - { 0x0700, 0x0697, 0x0000 }, - { 0x8700, 0x069a, 0x2000 }, - { 0x0700, 0x0699, 0x0000 }, - { 0x0700, 0x069b, 0x0000 }, - { 0x8700, 0x06a0, 0x3000 }, - { 0x8700, 0x069e, 0x2000 }, - { 0x0700, 0x069d, 0x0000 }, - { 0x0700, 0x069f, 0x0000 }, - { 0x8700, 0x06a2, 0x2000 }, - { 0x0700, 0x06a1, 0x0000 }, - { 0x0700, 0x06a3, 0x0000 }, - { 0x8700, 0x0926, 0x9000 }, - { 0x8700, 0x0725, 0x8000 }, - { 0x8c00, 0x06e4, 0x7000 }, - { 0x8700, 0x06c4, 0x6000 }, - { 0x8700, 0x06b4, 0x5000 }, - { 0x8700, 0x06ac, 0x4000 }, - { 0x8700, 0x06a8, 0x3000 }, - { 0x8700, 0x06a6, 0x2000 }, - { 0x0700, 0x06a5, 0x0000 }, - { 0x0700, 0x06a7, 0x0000 }, - { 0x8700, 0x06aa, 0x2000 }, - { 0x0700, 0x06a9, 0x0000 }, - { 0x0700, 0x06ab, 0x0000 }, - { 0x8700, 0x06b0, 0x3000 }, - { 0x8700, 0x06ae, 0x2000 }, - { 0x0700, 0x06ad, 0x0000 }, - { 0x0700, 0x06af, 0x0000 }, - { 0x8700, 0x06b2, 0x2000 }, - { 0x0700, 0x06b1, 0x0000 }, - { 0x0700, 0x06b3, 0x0000 }, - { 0x8700, 0x06bc, 0x4000 }, - { 0x8700, 0x06b8, 0x3000 }, - { 0x8700, 0x06b6, 0x2000 }, - { 0x0700, 0x06b5, 0x0000 }, - { 0x0700, 0x06b7, 0x0000 }, - { 0x8700, 0x06ba, 0x2000 }, - { 0x0700, 0x06b9, 0x0000 }, - { 0x0700, 0x06bb, 0x0000 }, - { 0x8700, 0x06c0, 0x3000 }, - { 0x8700, 0x06be, 0x2000 }, - { 0x0700, 0x06bd, 0x0000 }, - { 0x0700, 0x06bf, 0x0000 }, - { 0x8700, 0x06c2, 0x2000 }, - { 0x0700, 0x06c1, 0x0000 }, - { 0x0700, 0x06c3, 0x0000 }, - { 0x9500, 0x06d4, 0x5000 }, - { 0x8700, 0x06cc, 0x4000 }, - { 0x8700, 0x06c8, 0x3000 }, - { 0x8700, 0x06c6, 0x2000 }, - { 0x0700, 0x06c5, 0x0000 }, - { 0x0700, 0x06c7, 0x0000 }, - { 0x8700, 0x06ca, 0x2000 }, - { 0x0700, 0x06c9, 0x0000 }, - { 0x0700, 0x06cb, 0x0000 }, - { 0x8700, 0x06d0, 0x3000 }, - { 0x8700, 0x06ce, 0x2000 }, - { 0x0700, 0x06cd, 0x0000 }, - { 0x0700, 0x06cf, 0x0000 }, - { 0x8700, 0x06d2, 0x2000 }, - { 0x0700, 0x06d1, 0x0000 }, - { 0x0700, 0x06d3, 0x0000 }, - { 0x8c00, 0x06dc, 0x4000 }, - { 0x8c00, 0x06d8, 0x3000 }, - { 0x8c00, 0x06d6, 0x2000 }, - { 0x0700, 0x06d5, 0x0000 }, - { 0x0c00, 0x06d7, 0x0000 }, - { 0x8c00, 0x06da, 0x2000 }, - { 0x0c00, 0x06d9, 0x0000 }, - { 0x0c00, 0x06db, 0x0000 }, - { 0x8c00, 0x06e0, 0x3000 }, - { 0x8b00, 0x06de, 0x2000 }, - { 0x0100, 0x06dd, 0x0000 }, - { 0x0c00, 0x06df, 0x0000 }, - { 0x8c00, 0x06e2, 0x2000 }, - { 0x0c00, 0x06e1, 0x0000 }, - { 0x0c00, 0x06e3, 0x0000 }, - { 0x9500, 0x0704, 0x6000 }, - { 0x8d00, 0x06f4, 0x5000 }, - { 0x8c00, 0x06ec, 0x4000 }, - { 0x8c00, 0x06e8, 0x3000 }, - { 0x8600, 0x06e6, 0x2000 }, - { 0x0600, 0x06e5, 0x0000 }, - { 0x0c00, 0x06e7, 0x0000 }, - { 0x8c00, 0x06ea, 0x2000 }, - { 0x1a00, 0x06e9, 0x0000 }, - { 0x0c00, 0x06eb, 0x0000 }, - { 0x8d00, 0x06f0, 0x3000 }, - { 0x8700, 0x06ee, 0x2000 }, - { 0x0c00, 0x06ed, 0x0000 }, - { 0x0700, 0x06ef, 0x0000 }, - { 0x8d00, 0x06f2, 0x2000 }, - { 0x0d00, 0x06f1, 0x0000 }, - { 0x0d00, 0x06f3, 0x0000 }, - { 0x8700, 0x06fc, 0x4000 }, - { 0x8d00, 0x06f8, 0x3000 }, - { 0x8d00, 0x06f6, 0x2000 }, - { 0x0d00, 0x06f5, 0x0000 }, - { 0x0d00, 0x06f7, 0x0000 }, - { 0x8700, 0x06fa, 0x2000 }, - { 0x0d00, 0x06f9, 0x0000 }, - { 0x0700, 0x06fb, 0x0000 }, - { 0x9500, 0x0700, 0x3000 }, - { 0x9a00, 0x06fe, 0x2000 }, - { 0x1a00, 0x06fd, 0x0000 }, - { 0x0700, 0x06ff, 0x0000 }, - { 0x9500, 0x0702, 0x2000 }, - { 0x1500, 0x0701, 0x0000 }, - { 0x1500, 0x0703, 0x0000 }, - { 0x8700, 0x0715, 0x5000 }, - { 0x9500, 0x070c, 0x4000 }, - { 0x9500, 0x0708, 0x3000 }, - { 0x9500, 0x0706, 0x2000 }, - { 0x1500, 0x0705, 0x0000 }, - { 0x1500, 0x0707, 0x0000 }, - { 0x9500, 0x070a, 0x2000 }, - { 0x1500, 0x0709, 0x0000 }, - { 0x1500, 0x070b, 0x0000 }, - { 0x8c00, 0x0711, 0x3000 }, - { 0x8100, 0x070f, 0x2000 }, - { 0x1500, 0x070d, 0x0000 }, - { 0x0700, 0x0710, 0x0000 }, - { 0x8700, 0x0713, 0x2000 }, - { 0x0700, 0x0712, 0x0000 }, - { 0x0700, 0x0714, 0x0000 }, - { 0x8700, 0x071d, 0x4000 }, - { 0x8700, 0x0719, 0x3000 }, - { 0x8700, 0x0717, 0x2000 }, - { 0x0700, 0x0716, 0x0000 }, - { 0x0700, 0x0718, 0x0000 }, - { 0x8700, 0x071b, 0x2000 }, - { 0x0700, 0x071a, 0x0000 }, - { 0x0700, 0x071c, 0x0000 }, - { 0x8700, 0x0721, 0x3000 }, - { 0x8700, 0x071f, 0x2000 }, - { 0x0700, 0x071e, 0x0000 }, - { 0x0700, 0x0720, 0x0000 }, - { 0x8700, 0x0723, 0x2000 }, - { 0x0700, 0x0722, 0x0000 }, - { 0x0700, 0x0724, 0x0000 }, - { 0x8700, 0x0797, 0x7000 }, - { 0x8c00, 0x0745, 0x6000 }, - { 0x8c00, 0x0735, 0x5000 }, - { 0x8700, 0x072d, 0x4000 }, - { 0x8700, 0x0729, 0x3000 }, - { 0x8700, 0x0727, 0x2000 }, - { 0x0700, 0x0726, 0x0000 }, - { 0x0700, 0x0728, 0x0000 }, - { 0x8700, 0x072b, 0x2000 }, - { 0x0700, 0x072a, 0x0000 }, - { 0x0700, 0x072c, 0x0000 }, - { 0x8c00, 0x0731, 0x3000 }, - { 0x8700, 0x072f, 0x2000 }, - { 0x0700, 0x072e, 0x0000 }, - { 0x0c00, 0x0730, 0x0000 }, - { 0x8c00, 0x0733, 0x2000 }, - { 0x0c00, 0x0732, 0x0000 }, - { 0x0c00, 0x0734, 0x0000 }, - { 0x8c00, 0x073d, 0x4000 }, - { 0x8c00, 0x0739, 0x3000 }, - { 0x8c00, 0x0737, 0x2000 }, - { 0x0c00, 0x0736, 0x0000 }, - { 0x0c00, 0x0738, 0x0000 }, - { 0x8c00, 0x073b, 0x2000 }, - { 0x0c00, 0x073a, 0x0000 }, - { 0x0c00, 0x073c, 0x0000 }, - { 0x8c00, 0x0741, 0x3000 }, - { 0x8c00, 0x073f, 0x2000 }, - { 0x0c00, 0x073e, 0x0000 }, - { 0x0c00, 0x0740, 0x0000 }, - { 0x8c00, 0x0743, 0x2000 }, - { 0x0c00, 0x0742, 0x0000 }, - { 0x0c00, 0x0744, 0x0000 }, - { 0x8700, 0x0787, 0x5000 }, - { 0x8700, 0x074f, 0x4000 }, - { 0x8c00, 0x0749, 0x3000 }, - { 0x8c00, 0x0747, 0x2000 }, - { 0x0c00, 0x0746, 0x0000 }, - { 0x0c00, 0x0748, 0x0000 }, - { 0x8700, 0x074d, 0x2000 }, - { 0x0c00, 0x074a, 0x0000 }, - { 0x0700, 0x074e, 0x0000 }, - { 0x8700, 0x0783, 0x3000 }, - { 0x8700, 0x0781, 0x2000 }, - { 0x0700, 0x0780, 0x0000 }, - { 0x0700, 0x0782, 0x0000 }, - { 0x8700, 0x0785, 0x2000 }, - { 0x0700, 0x0784, 0x0000 }, - { 0x0700, 0x0786, 0x0000 }, - { 0x8700, 0x078f, 0x4000 }, - { 0x8700, 0x078b, 0x3000 }, - { 0x8700, 0x0789, 0x2000 }, - { 0x0700, 0x0788, 0x0000 }, - { 0x0700, 0x078a, 0x0000 }, - { 0x8700, 0x078d, 0x2000 }, - { 0x0700, 0x078c, 0x0000 }, - { 0x0700, 0x078e, 0x0000 }, - { 0x8700, 0x0793, 0x3000 }, - { 0x8700, 0x0791, 0x2000 }, - { 0x0700, 0x0790, 0x0000 }, - { 0x0700, 0x0792, 0x0000 }, - { 0x8700, 0x0795, 0x2000 }, - { 0x0700, 0x0794, 0x0000 }, - { 0x0700, 0x0796, 0x0000 }, - { 0x8700, 0x0906, 0x6000 }, - { 0x8c00, 0x07a7, 0x5000 }, - { 0x8700, 0x079f, 0x4000 }, - { 0x8700, 0x079b, 0x3000 }, - { 0x8700, 0x0799, 0x2000 }, - { 0x0700, 0x0798, 0x0000 }, - { 0x0700, 0x079a, 0x0000 }, - { 0x8700, 0x079d, 0x2000 }, - { 0x0700, 0x079c, 0x0000 }, - { 0x0700, 0x079e, 0x0000 }, - { 0x8700, 0x07a3, 0x3000 }, - { 0x8700, 0x07a1, 0x2000 }, - { 0x0700, 0x07a0, 0x0000 }, - { 0x0700, 0x07a2, 0x0000 }, - { 0x8700, 0x07a5, 0x2000 }, - { 0x0700, 0x07a4, 0x0000 }, - { 0x0c00, 0x07a6, 0x0000 }, - { 0x8c00, 0x07af, 0x4000 }, - { 0x8c00, 0x07ab, 0x3000 }, - { 0x8c00, 0x07a9, 0x2000 }, - { 0x0c00, 0x07a8, 0x0000 }, - { 0x0c00, 0x07aa, 0x0000 }, - { 0x8c00, 0x07ad, 0x2000 }, - { 0x0c00, 0x07ac, 0x0000 }, - { 0x0c00, 0x07ae, 0x0000 }, - { 0x8c00, 0x0902, 0x3000 }, - { 0x8700, 0x07b1, 0x2000 }, - { 0x0c00, 0x07b0, 0x0000 }, - { 0x0c00, 0x0901, 0x0000 }, - { 0x8700, 0x0904, 0x2000 }, - { 0x0a00, 0x0903, 0x0000 }, - { 0x0700, 0x0905, 0x0000 }, - { 0x8700, 0x0916, 0x5000 }, - { 0x8700, 0x090e, 0x4000 }, - { 0x8700, 0x090a, 0x3000 }, - { 0x8700, 0x0908, 0x2000 }, - { 0x0700, 0x0907, 0x0000 }, - { 0x0700, 0x0909, 0x0000 }, - { 0x8700, 0x090c, 0x2000 }, - { 0x0700, 0x090b, 0x0000 }, - { 0x0700, 0x090d, 0x0000 }, - { 0x8700, 0x0912, 0x3000 }, - { 0x8700, 0x0910, 0x2000 }, - { 0x0700, 0x090f, 0x0000 }, - { 0x0700, 0x0911, 0x0000 }, - { 0x8700, 0x0914, 0x2000 }, - { 0x0700, 0x0913, 0x0000 }, - { 0x0700, 0x0915, 0x0000 }, - { 0x8700, 0x091e, 0x4000 }, - { 0x8700, 0x091a, 0x3000 }, - { 0x8700, 0x0918, 0x2000 }, - { 0x0700, 0x0917, 0x0000 }, - { 0x0700, 0x0919, 0x0000 }, - { 0x8700, 0x091c, 0x2000 }, - { 0x0700, 0x091b, 0x0000 }, - { 0x0700, 0x091d, 0x0000 }, - { 0x8700, 0x0922, 0x3000 }, - { 0x8700, 0x0920, 0x2000 }, - { 0x0700, 0x091f, 0x0000 }, - { 0x0700, 0x0921, 0x0000 }, - { 0x8700, 0x0924, 0x2000 }, - { 0x0700, 0x0923, 0x0000 }, - { 0x0700, 0x0925, 0x0000 }, - { 0x8c00, 0x09cd, 0x8000 }, - { 0x8d00, 0x096d, 0x7000 }, - { 0x8c00, 0x0948, 0x6000 }, - { 0x8700, 0x0936, 0x5000 }, - { 0x8700, 0x092e, 0x4000 }, - { 0x8700, 0x092a, 0x3000 }, - { 0x8700, 0x0928, 0x2000 }, - { 0x0700, 0x0927, 0x0000 }, - { 0x0700, 0x0929, 0x0000 }, - { 0x8700, 0x092c, 0x2000 }, - { 0x0700, 0x092b, 0x0000 }, - { 0x0700, 0x092d, 0x0000 }, - { 0x8700, 0x0932, 0x3000 }, - { 0x8700, 0x0930, 0x2000 }, - { 0x0700, 0x092f, 0x0000 }, - { 0x0700, 0x0931, 0x0000 }, - { 0x8700, 0x0934, 0x2000 }, - { 0x0700, 0x0933, 0x0000 }, - { 0x0700, 0x0935, 0x0000 }, - { 0x8a00, 0x0940, 0x4000 }, - { 0x8c00, 0x093c, 0x3000 }, - { 0x8700, 0x0938, 0x2000 }, - { 0x0700, 0x0937, 0x0000 }, - { 0x0700, 0x0939, 0x0000 }, - { 0x8a00, 0x093e, 0x2000 }, - { 0x0700, 0x093d, 0x0000 }, - { 0x0a00, 0x093f, 0x0000 }, - { 0x8c00, 0x0944, 0x3000 }, - { 0x8c00, 0x0942, 0x2000 }, - { 0x0c00, 0x0941, 0x0000 }, - { 0x0c00, 0x0943, 0x0000 }, - { 0x8c00, 0x0946, 0x2000 }, - { 0x0c00, 0x0945, 0x0000 }, - { 0x0c00, 0x0947, 0x0000 }, - { 0x8700, 0x095d, 0x5000 }, - { 0x8c00, 0x0952, 0x4000 }, - { 0x8a00, 0x094c, 0x3000 }, - { 0x8a00, 0x094a, 0x2000 }, - { 0x0a00, 0x0949, 0x0000 }, - { 0x0a00, 0x094b, 0x0000 }, - { 0x8700, 0x0950, 0x2000 }, - { 0x0c00, 0x094d, 0x0000 }, - { 0x0c00, 0x0951, 0x0000 }, - { 0x8700, 0x0959, 0x3000 }, - { 0x8c00, 0x0954, 0x2000 }, - { 0x0c00, 0x0953, 0x0000 }, - { 0x0700, 0x0958, 0x0000 }, - { 0x8700, 0x095b, 0x2000 }, - { 0x0700, 0x095a, 0x0000 }, - { 0x0700, 0x095c, 0x0000 }, - { 0x9500, 0x0965, 0x4000 }, - { 0x8700, 0x0961, 0x3000 }, - { 0x8700, 0x095f, 0x2000 }, - { 0x0700, 0x095e, 0x0000 }, - { 0x0700, 0x0960, 0x0000 }, - { 0x8c00, 0x0963, 0x2000 }, - { 0x0c00, 0x0962, 0x0000 }, - { 0x1500, 0x0964, 0x0000 }, - { 0x8d00, 0x0969, 0x3000 }, - { 0x8d00, 0x0967, 0x2000 }, - { 0x0d00, 0x0966, 0x0000 }, - { 0x0d00, 0x0968, 0x0000 }, - { 0x8d00, 0x096b, 0x2000 }, - { 0x0d00, 0x096a, 0x0000 }, - { 0x0d00, 0x096c, 0x0000 }, - { 0x8700, 0x09a2, 0x6000 }, - { 0x8700, 0x0990, 0x5000 }, - { 0x8700, 0x0986, 0x4000 }, - { 0x8c00, 0x0981, 0x3000 }, - { 0x8d00, 0x096f, 0x2000 }, - { 0x0d00, 0x096e, 0x0000 }, - { 0x1500, 0x0970, 0x0000 }, - { 0x8a00, 0x0983, 0x2000 }, - { 0x0a00, 0x0982, 0x0000 }, - { 0x0700, 0x0985, 0x0000 }, - { 0x8700, 0x098a, 0x3000 }, - { 0x8700, 0x0988, 0x2000 }, - { 0x0700, 0x0987, 0x0000 }, - { 0x0700, 0x0989, 0x0000 }, - { 0x8700, 0x098c, 0x2000 }, - { 0x0700, 0x098b, 0x0000 }, - { 0x0700, 0x098f, 0x0000 }, - { 0x8700, 0x099a, 0x4000 }, - { 0x8700, 0x0996, 0x3000 }, - { 0x8700, 0x0994, 0x2000 }, - { 0x0700, 0x0993, 0x0000 }, - { 0x0700, 0x0995, 0x0000 }, - { 0x8700, 0x0998, 0x2000 }, - { 0x0700, 0x0997, 0x0000 }, - { 0x0700, 0x0999, 0x0000 }, - { 0x8700, 0x099e, 0x3000 }, - { 0x8700, 0x099c, 0x2000 }, - { 0x0700, 0x099b, 0x0000 }, - { 0x0700, 0x099d, 0x0000 }, - { 0x8700, 0x09a0, 0x2000 }, - { 0x0700, 0x099f, 0x0000 }, - { 0x0700, 0x09a1, 0x0000 }, - { 0x8700, 0x09b7, 0x5000 }, - { 0x8700, 0x09ab, 0x4000 }, - { 0x8700, 0x09a6, 0x3000 }, - { 0x8700, 0x09a4, 0x2000 }, - { 0x0700, 0x09a3, 0x0000 }, - { 0x0700, 0x09a5, 0x0000 }, - { 0x8700, 0x09a8, 0x2000 }, - { 0x0700, 0x09a7, 0x0000 }, - { 0x0700, 0x09aa, 0x0000 }, - { 0x8700, 0x09af, 0x3000 }, - { 0x8700, 0x09ad, 0x2000 }, - { 0x0700, 0x09ac, 0x0000 }, - { 0x0700, 0x09ae, 0x0000 }, - { 0x8700, 0x09b2, 0x2000 }, - { 0x0700, 0x09b0, 0x0000 }, - { 0x0700, 0x09b6, 0x0000 }, - { 0x8c00, 0x09c1, 0x4000 }, - { 0x8700, 0x09bd, 0x3000 }, - { 0x8700, 0x09b9, 0x2000 }, - { 0x0700, 0x09b8, 0x0000 }, - { 0x0c00, 0x09bc, 0x0000 }, - { 0x8a00, 0x09bf, 0x2000 }, - { 0x0a00, 0x09be, 0x0000 }, - { 0x0a00, 0x09c0, 0x0000 }, - { 0x8a00, 0x09c7, 0x3000 }, - { 0x8c00, 0x09c3, 0x2000 }, - { 0x0c00, 0x09c2, 0x0000 }, - { 0x0c00, 0x09c4, 0x0000 }, - { 0x8a00, 0x09cb, 0x2000 }, - { 0x0a00, 0x09c8, 0x0000 }, - { 0x0a00, 0x09cc, 0x0000 }, - { 0x8700, 0x0a2b, 0x7000 }, - { 0x8a00, 0x0a03, 0x6000 }, - { 0x8d00, 0x09ed, 0x5000 }, - { 0x8c00, 0x09e3, 0x4000 }, - { 0x8700, 0x09df, 0x3000 }, - { 0x8700, 0x09dc, 0x2000 }, - { 0x0a00, 0x09d7, 0x0000 }, - { 0x0700, 0x09dd, 0x0000 }, - { 0x8700, 0x09e1, 0x2000 }, - { 0x0700, 0x09e0, 0x0000 }, - { 0x0c00, 0x09e2, 0x0000 }, - { 0x8d00, 0x09e9, 0x3000 }, - { 0x8d00, 0x09e7, 0x2000 }, - { 0x0d00, 0x09e6, 0x0000 }, - { 0x0d00, 0x09e8, 0x0000 }, - { 0x8d00, 0x09eb, 0x2000 }, - { 0x0d00, 0x09ea, 0x0000 }, - { 0x0d00, 0x09ec, 0x0000 }, - { 0x8f00, 0x09f5, 0x4000 }, - { 0x8700, 0x09f1, 0x3000 }, - { 0x8d00, 0x09ef, 0x2000 }, - { 0x0d00, 0x09ee, 0x0000 }, - { 0x0700, 0x09f0, 0x0000 }, - { 0x9700, 0x09f3, 0x2000 }, - { 0x1700, 0x09f2, 0x0000 }, - { 0x0f00, 0x09f4, 0x0000 }, - { 0x8f00, 0x09f9, 0x3000 }, - { 0x8f00, 0x09f7, 0x2000 }, - { 0x0f00, 0x09f6, 0x0000 }, - { 0x0f00, 0x09f8, 0x0000 }, - { 0x8c00, 0x0a01, 0x2000 }, - { 0x1a00, 0x09fa, 0x0000 }, - { 0x0c00, 0x0a02, 0x0000 }, - { 0x8700, 0x0a1a, 0x5000 }, - { 0x8700, 0x0a10, 0x4000 }, - { 0x8700, 0x0a08, 0x3000 }, - { 0x8700, 0x0a06, 0x2000 }, - { 0x0700, 0x0a05, 0x0000 }, - { 0x0700, 0x0a07, 0x0000 }, - { 0x8700, 0x0a0a, 0x2000 }, - { 0x0700, 0x0a09, 0x0000 }, - { 0x0700, 0x0a0f, 0x0000 }, - { 0x8700, 0x0a16, 0x3000 }, - { 0x8700, 0x0a14, 0x2000 }, - { 0x0700, 0x0a13, 0x0000 }, - { 0x0700, 0x0a15, 0x0000 }, - { 0x8700, 0x0a18, 0x2000 }, - { 0x0700, 0x0a17, 0x0000 }, - { 0x0700, 0x0a19, 0x0000 }, - { 0x8700, 0x0a22, 0x4000 }, - { 0x8700, 0x0a1e, 0x3000 }, - { 0x8700, 0x0a1c, 0x2000 }, - { 0x0700, 0x0a1b, 0x0000 }, - { 0x0700, 0x0a1d, 0x0000 }, - { 0x8700, 0x0a20, 0x2000 }, - { 0x0700, 0x0a1f, 0x0000 }, - { 0x0700, 0x0a21, 0x0000 }, - { 0x8700, 0x0a26, 0x3000 }, - { 0x8700, 0x0a24, 0x2000 }, - { 0x0700, 0x0a23, 0x0000 }, - { 0x0700, 0x0a25, 0x0000 }, - { 0x8700, 0x0a28, 0x2000 }, - { 0x0700, 0x0a27, 0x0000 }, - { 0x0700, 0x0a2a, 0x0000 }, - { 0x8d00, 0x0a6a, 0x6000 }, - { 0x8c00, 0x0a41, 0x5000 }, - { 0x8700, 0x0a35, 0x4000 }, - { 0x8700, 0x0a2f, 0x3000 }, - { 0x8700, 0x0a2d, 0x2000 }, - { 0x0700, 0x0a2c, 0x0000 }, - { 0x0700, 0x0a2e, 0x0000 }, - { 0x8700, 0x0a32, 0x2000 }, - { 0x0700, 0x0a30, 0x0000 }, - { 0x0700, 0x0a33, 0x0000 }, - { 0x8c00, 0x0a3c, 0x3000 }, - { 0x8700, 0x0a38, 0x2000 }, - { 0x0700, 0x0a36, 0x0000 }, - { 0x0700, 0x0a39, 0x0000 }, - { 0x8a00, 0x0a3f, 0x2000 }, - { 0x0a00, 0x0a3e, 0x0000 }, - { 0x0a00, 0x0a40, 0x0000 }, - { 0x8700, 0x0a5a, 0x4000 }, - { 0x8c00, 0x0a4b, 0x3000 }, - { 0x8c00, 0x0a47, 0x2000 }, - { 0x0c00, 0x0a42, 0x0000 }, - { 0x0c00, 0x0a48, 0x0000 }, - { 0x8c00, 0x0a4d, 0x2000 }, - { 0x0c00, 0x0a4c, 0x0000 }, - { 0x0700, 0x0a59, 0x0000 }, - { 0x8d00, 0x0a66, 0x3000 }, - { 0x8700, 0x0a5c, 0x2000 }, - { 0x0700, 0x0a5b, 0x0000 }, - { 0x0700, 0x0a5e, 0x0000 }, - { 0x8d00, 0x0a68, 0x2000 }, - { 0x0d00, 0x0a67, 0x0000 }, - { 0x0d00, 0x0a69, 0x0000 }, - { 0x8700, 0x0a87, 0x5000 }, - { 0x8700, 0x0a72, 0x4000 }, - { 0x8d00, 0x0a6e, 0x3000 }, - { 0x8d00, 0x0a6c, 0x2000 }, - { 0x0d00, 0x0a6b, 0x0000 }, - { 0x0d00, 0x0a6d, 0x0000 }, - { 0x8c00, 0x0a70, 0x2000 }, - { 0x0d00, 0x0a6f, 0x0000 }, - { 0x0c00, 0x0a71, 0x0000 }, - { 0x8c00, 0x0a82, 0x3000 }, - { 0x8700, 0x0a74, 0x2000 }, - { 0x0700, 0x0a73, 0x0000 }, - { 0x0c00, 0x0a81, 0x0000 }, - { 0x8700, 0x0a85, 0x2000 }, - { 0x0a00, 0x0a83, 0x0000 }, - { 0x0700, 0x0a86, 0x0000 }, - { 0x8700, 0x0a90, 0x4000 }, - { 0x8700, 0x0a8b, 0x3000 }, - { 0x8700, 0x0a89, 0x2000 }, - { 0x0700, 0x0a88, 0x0000 }, - { 0x0700, 0x0a8a, 0x0000 }, - { 0x8700, 0x0a8d, 0x2000 }, - { 0x0700, 0x0a8c, 0x0000 }, - { 0x0700, 0x0a8f, 0x0000 }, - { 0x8700, 0x0a95, 0x3000 }, - { 0x8700, 0x0a93, 0x2000 }, - { 0x0700, 0x0a91, 0x0000 }, - { 0x0700, 0x0a94, 0x0000 }, - { 0x8700, 0x0a97, 0x2000 }, - { 0x0700, 0x0a96, 0x0000 }, - { 0x0700, 0x0a98, 0x0000 }, - { 0x8700, 0x10ef, 0xb000 }, - { 0x8700, 0x0dc6, 0xa000 }, - { 0x8700, 0x0c31, 0x9000 }, - { 0x8700, 0x0b5f, 0x8000 }, - { 0x8a00, 0x0b03, 0x7000 }, - { 0x8a00, 0x0abe, 0x6000 }, - { 0x8700, 0x0aaa, 0x5000 }, - { 0x8700, 0x0aa1, 0x4000 }, - { 0x8700, 0x0a9d, 0x3000 }, - { 0x8700, 0x0a9b, 0x2000 }, - { 0x0700, 0x0a9a, 0x0000 }, - { 0x0700, 0x0a9c, 0x0000 }, - { 0x8700, 0x0a9f, 0x2000 }, - { 0x0700, 0x0a9e, 0x0000 }, - { 0x0700, 0x0aa0, 0x0000 }, - { 0x8700, 0x0aa5, 0x3000 }, - { 0x8700, 0x0aa3, 0x2000 }, - { 0x0700, 0x0aa2, 0x0000 }, - { 0x0700, 0x0aa4, 0x0000 }, - { 0x8700, 0x0aa7, 0x2000 }, - { 0x0700, 0x0aa6, 0x0000 }, - { 0x0700, 0x0aa8, 0x0000 }, - { 0x8700, 0x0ab3, 0x4000 }, - { 0x8700, 0x0aae, 0x3000 }, - { 0x8700, 0x0aac, 0x2000 }, - { 0x0700, 0x0aab, 0x0000 }, - { 0x0700, 0x0aad, 0x0000 }, - { 0x8700, 0x0ab0, 0x2000 }, - { 0x0700, 0x0aaf, 0x0000 }, - { 0x0700, 0x0ab2, 0x0000 }, - { 0x8700, 0x0ab8, 0x3000 }, - { 0x8700, 0x0ab6, 0x2000 }, - { 0x0700, 0x0ab5, 0x0000 }, - { 0x0700, 0x0ab7, 0x0000 }, - { 0x8c00, 0x0abc, 0x2000 }, - { 0x0700, 0x0ab9, 0x0000 }, - { 0x0700, 0x0abd, 0x0000 }, - { 0x8700, 0x0ae1, 0x5000 }, - { 0x8c00, 0x0ac7, 0x4000 }, - { 0x8c00, 0x0ac2, 0x3000 }, - { 0x8a00, 0x0ac0, 0x2000 }, - { 0x0a00, 0x0abf, 0x0000 }, - { 0x0c00, 0x0ac1, 0x0000 }, - { 0x8c00, 0x0ac4, 0x2000 }, - { 0x0c00, 0x0ac3, 0x0000 }, - { 0x0c00, 0x0ac5, 0x0000 }, - { 0x8a00, 0x0acc, 0x3000 }, - { 0x8a00, 0x0ac9, 0x2000 }, - { 0x0c00, 0x0ac8, 0x0000 }, - { 0x0a00, 0x0acb, 0x0000 }, - { 0x8700, 0x0ad0, 0x2000 }, - { 0x0c00, 0x0acd, 0x0000 }, - { 0x0700, 0x0ae0, 0x0000 }, - { 0x8d00, 0x0aeb, 0x4000 }, - { 0x8d00, 0x0ae7, 0x3000 }, - { 0x8c00, 0x0ae3, 0x2000 }, - { 0x0c00, 0x0ae2, 0x0000 }, - { 0x0d00, 0x0ae6, 0x0000 }, - { 0x8d00, 0x0ae9, 0x2000 }, - { 0x0d00, 0x0ae8, 0x0000 }, - { 0x0d00, 0x0aea, 0x0000 }, - { 0x8d00, 0x0aef, 0x3000 }, - { 0x8d00, 0x0aed, 0x2000 }, - { 0x0d00, 0x0aec, 0x0000 }, - { 0x0d00, 0x0aee, 0x0000 }, - { 0x8c00, 0x0b01, 0x2000 }, - { 0x1700, 0x0af1, 0x0000 }, - { 0x0a00, 0x0b02, 0x0000 }, - { 0x8700, 0x0b28, 0x6000 }, - { 0x8700, 0x0b18, 0x5000 }, - { 0x8700, 0x0b0c, 0x4000 }, - { 0x8700, 0x0b08, 0x3000 }, - { 0x8700, 0x0b06, 0x2000 }, - { 0x0700, 0x0b05, 0x0000 }, - { 0x0700, 0x0b07, 0x0000 }, - { 0x8700, 0x0b0a, 0x2000 }, - { 0x0700, 0x0b09, 0x0000 }, - { 0x0700, 0x0b0b, 0x0000 }, - { 0x8700, 0x0b14, 0x3000 }, - { 0x8700, 0x0b10, 0x2000 }, - { 0x0700, 0x0b0f, 0x0000 }, - { 0x0700, 0x0b13, 0x0000 }, - { 0x8700, 0x0b16, 0x2000 }, - { 0x0700, 0x0b15, 0x0000 }, - { 0x0700, 0x0b17, 0x0000 }, - { 0x8700, 0x0b20, 0x4000 }, - { 0x8700, 0x0b1c, 0x3000 }, - { 0x8700, 0x0b1a, 0x2000 }, - { 0x0700, 0x0b19, 0x0000 }, - { 0x0700, 0x0b1b, 0x0000 }, - { 0x8700, 0x0b1e, 0x2000 }, - { 0x0700, 0x0b1d, 0x0000 }, - { 0x0700, 0x0b1f, 0x0000 }, - { 0x8700, 0x0b24, 0x3000 }, - { 0x8700, 0x0b22, 0x2000 }, - { 0x0700, 0x0b21, 0x0000 }, - { 0x0700, 0x0b23, 0x0000 }, - { 0x8700, 0x0b26, 0x2000 }, - { 0x0700, 0x0b25, 0x0000 }, - { 0x0700, 0x0b27, 0x0000 }, - { 0x8700, 0x0b3d, 0x5000 }, - { 0x8700, 0x0b32, 0x4000 }, - { 0x8700, 0x0b2d, 0x3000 }, - { 0x8700, 0x0b2b, 0x2000 }, - { 0x0700, 0x0b2a, 0x0000 }, - { 0x0700, 0x0b2c, 0x0000 }, - { 0x8700, 0x0b2f, 0x2000 }, - { 0x0700, 0x0b2e, 0x0000 }, - { 0x0700, 0x0b30, 0x0000 }, - { 0x8700, 0x0b37, 0x3000 }, - { 0x8700, 0x0b35, 0x2000 }, - { 0x0700, 0x0b33, 0x0000 }, - { 0x0700, 0x0b36, 0x0000 }, - { 0x8700, 0x0b39, 0x2000 }, - { 0x0700, 0x0b38, 0x0000 }, - { 0x0c00, 0x0b3c, 0x0000 }, - { 0x8a00, 0x0b48, 0x4000 }, - { 0x8c00, 0x0b41, 0x3000 }, - { 0x8c00, 0x0b3f, 0x2000 }, - { 0x0a00, 0x0b3e, 0x0000 }, - { 0x0a00, 0x0b40, 0x0000 }, - { 0x8c00, 0x0b43, 0x2000 }, - { 0x0c00, 0x0b42, 0x0000 }, - { 0x0a00, 0x0b47, 0x0000 }, - { 0x8c00, 0x0b56, 0x3000 }, - { 0x8a00, 0x0b4c, 0x2000 }, - { 0x0a00, 0x0b4b, 0x0000 }, - { 0x0c00, 0x0b4d, 0x0000 }, - { 0x8700, 0x0b5c, 0x2000 }, - { 0x0a00, 0x0b57, 0x0000 }, - { 0x0700, 0x0b5d, 0x0000 }, - { 0x8d00, 0x0be7, 0x7000 }, - { 0x8700, 0x0b9c, 0x6000 }, - { 0x8700, 0x0b83, 0x5000 }, - { 0x8d00, 0x0b6b, 0x4000 }, - { 0x8d00, 0x0b67, 0x3000 }, - { 0x8700, 0x0b61, 0x2000 }, - { 0x0700, 0x0b60, 0x0000 }, - { 0x0d00, 0x0b66, 0x0000 }, - { 0x8d00, 0x0b69, 0x2000 }, - { 0x0d00, 0x0b68, 0x0000 }, - { 0x0d00, 0x0b6a, 0x0000 }, - { 0x8d00, 0x0b6f, 0x3000 }, - { 0x8d00, 0x0b6d, 0x2000 }, - { 0x0d00, 0x0b6c, 0x0000 }, - { 0x0d00, 0x0b6e, 0x0000 }, - { 0x8700, 0x0b71, 0x2000 }, - { 0x1a00, 0x0b70, 0x0000 }, - { 0x0c00, 0x0b82, 0x0000 }, - { 0x8700, 0x0b8f, 0x4000 }, - { 0x8700, 0x0b88, 0x3000 }, - { 0x8700, 0x0b86, 0x2000 }, - { 0x0700, 0x0b85, 0x0000 }, - { 0x0700, 0x0b87, 0x0000 }, - { 0x8700, 0x0b8a, 0x2000 }, - { 0x0700, 0x0b89, 0x0000 }, - { 0x0700, 0x0b8e, 0x0000 }, - { 0x8700, 0x0b94, 0x3000 }, - { 0x8700, 0x0b92, 0x2000 }, - { 0x0700, 0x0b90, 0x0000 }, - { 0x0700, 0x0b93, 0x0000 }, - { 0x8700, 0x0b99, 0x2000 }, - { 0x0700, 0x0b95, 0x0000 }, - { 0x0700, 0x0b9a, 0x0000 }, - { 0x8700, 0x0bb7, 0x5000 }, - { 0x8700, 0x0bae, 0x4000 }, - { 0x8700, 0x0ba4, 0x3000 }, - { 0x8700, 0x0b9f, 0x2000 }, - { 0x0700, 0x0b9e, 0x0000 }, - { 0x0700, 0x0ba3, 0x0000 }, - { 0x8700, 0x0ba9, 0x2000 }, - { 0x0700, 0x0ba8, 0x0000 }, - { 0x0700, 0x0baa, 0x0000 }, - { 0x8700, 0x0bb2, 0x3000 }, - { 0x8700, 0x0bb0, 0x2000 }, - { 0x0700, 0x0baf, 0x0000 }, - { 0x0700, 0x0bb1, 0x0000 }, - { 0x8700, 0x0bb4, 0x2000 }, - { 0x0700, 0x0bb3, 0x0000 }, - { 0x0700, 0x0bb5, 0x0000 }, - { 0x8a00, 0x0bc6, 0x4000 }, - { 0x8a00, 0x0bbf, 0x3000 }, - { 0x8700, 0x0bb9, 0x2000 }, - { 0x0700, 0x0bb8, 0x0000 }, - { 0x0a00, 0x0bbe, 0x0000 }, - { 0x8a00, 0x0bc1, 0x2000 }, - { 0x0c00, 0x0bc0, 0x0000 }, - { 0x0a00, 0x0bc2, 0x0000 }, - { 0x8a00, 0x0bcb, 0x3000 }, - { 0x8a00, 0x0bc8, 0x2000 }, - { 0x0a00, 0x0bc7, 0x0000 }, - { 0x0a00, 0x0bca, 0x0000 }, - { 0x8c00, 0x0bcd, 0x2000 }, - { 0x0a00, 0x0bcc, 0x0000 }, - { 0x0a00, 0x0bd7, 0x0000 }, - { 0x8700, 0x0c0f, 0x6000 }, - { 0x9a00, 0x0bf7, 0x5000 }, - { 0x8d00, 0x0bef, 0x4000 }, - { 0x8d00, 0x0beb, 0x3000 }, - { 0x8d00, 0x0be9, 0x2000 }, - { 0x0d00, 0x0be8, 0x0000 }, - { 0x0d00, 0x0bea, 0x0000 }, - { 0x8d00, 0x0bed, 0x2000 }, - { 0x0d00, 0x0bec, 0x0000 }, - { 0x0d00, 0x0bee, 0x0000 }, - { 0x9a00, 0x0bf3, 0x3000 }, - { 0x8f00, 0x0bf1, 0x2000 }, - { 0x0f00, 0x0bf0, 0x0000 }, - { 0x0f00, 0x0bf2, 0x0000 }, - { 0x9a00, 0x0bf5, 0x2000 }, - { 0x1a00, 0x0bf4, 0x0000 }, - { 0x1a00, 0x0bf6, 0x0000 }, - { 0x8700, 0x0c06, 0x4000 }, - { 0x8a00, 0x0c01, 0x3000 }, - { 0x9700, 0x0bf9, 0x2000 }, - { 0x1a00, 0x0bf8, 0x0000 }, - { 0x1a00, 0x0bfa, 0x0000 }, - { 0x8a00, 0x0c03, 0x2000 }, - { 0x0a00, 0x0c02, 0x0000 }, - { 0x0700, 0x0c05, 0x0000 }, - { 0x8700, 0x0c0a, 0x3000 }, - { 0x8700, 0x0c08, 0x2000 }, - { 0x0700, 0x0c07, 0x0000 }, - { 0x0700, 0x0c09, 0x0000 }, - { 0x8700, 0x0c0c, 0x2000 }, - { 0x0700, 0x0c0b, 0x0000 }, - { 0x0700, 0x0c0e, 0x0000 }, - { 0x8700, 0x0c20, 0x5000 }, - { 0x8700, 0x0c18, 0x4000 }, - { 0x8700, 0x0c14, 0x3000 }, - { 0x8700, 0x0c12, 0x2000 }, - { 0x0700, 0x0c10, 0x0000 }, - { 0x0700, 0x0c13, 0x0000 }, - { 0x8700, 0x0c16, 0x2000 }, - { 0x0700, 0x0c15, 0x0000 }, - { 0x0700, 0x0c17, 0x0000 }, - { 0x8700, 0x0c1c, 0x3000 }, - { 0x8700, 0x0c1a, 0x2000 }, - { 0x0700, 0x0c19, 0x0000 }, - { 0x0700, 0x0c1b, 0x0000 }, - { 0x8700, 0x0c1e, 0x2000 }, - { 0x0700, 0x0c1d, 0x0000 }, - { 0x0700, 0x0c1f, 0x0000 }, - { 0x8700, 0x0c28, 0x4000 }, - { 0x8700, 0x0c24, 0x3000 }, - { 0x8700, 0x0c22, 0x2000 }, - { 0x0700, 0x0c21, 0x0000 }, - { 0x0700, 0x0c23, 0x0000 }, - { 0x8700, 0x0c26, 0x2000 }, - { 0x0700, 0x0c25, 0x0000 }, - { 0x0700, 0x0c27, 0x0000 }, - { 0x8700, 0x0c2d, 0x3000 }, - { 0x8700, 0x0c2b, 0x2000 }, - { 0x0700, 0x0c2a, 0x0000 }, - { 0x0700, 0x0c2c, 0x0000 }, - { 0x8700, 0x0c2f, 0x2000 }, - { 0x0700, 0x0c2e, 0x0000 }, - { 0x0700, 0x0c30, 0x0000 }, - { 0x8700, 0x0d0e, 0x8000 }, - { 0x8700, 0x0ca1, 0x7000 }, - { 0x8d00, 0x0c6c, 0x6000 }, - { 0x8c00, 0x0c47, 0x5000 }, - { 0x8c00, 0x0c3e, 0x4000 }, - { 0x8700, 0x0c36, 0x3000 }, - { 0x8700, 0x0c33, 0x2000 }, - { 0x0700, 0x0c32, 0x0000 }, - { 0x0700, 0x0c35, 0x0000 }, - { 0x8700, 0x0c38, 0x2000 }, - { 0x0700, 0x0c37, 0x0000 }, - { 0x0700, 0x0c39, 0x0000 }, - { 0x8a00, 0x0c42, 0x3000 }, - { 0x8c00, 0x0c40, 0x2000 }, - { 0x0c00, 0x0c3f, 0x0000 }, - { 0x0a00, 0x0c41, 0x0000 }, - { 0x8a00, 0x0c44, 0x2000 }, - { 0x0a00, 0x0c43, 0x0000 }, - { 0x0c00, 0x0c46, 0x0000 }, - { 0x8700, 0x0c60, 0x4000 }, - { 0x8c00, 0x0c4c, 0x3000 }, - { 0x8c00, 0x0c4a, 0x2000 }, - { 0x0c00, 0x0c48, 0x0000 }, - { 0x0c00, 0x0c4b, 0x0000 }, - { 0x8c00, 0x0c55, 0x2000 }, - { 0x0c00, 0x0c4d, 0x0000 }, - { 0x0c00, 0x0c56, 0x0000 }, - { 0x8d00, 0x0c68, 0x3000 }, - { 0x8d00, 0x0c66, 0x2000 }, - { 0x0700, 0x0c61, 0x0000 }, - { 0x0d00, 0x0c67, 0x0000 }, - { 0x8d00, 0x0c6a, 0x2000 }, - { 0x0d00, 0x0c69, 0x0000 }, - { 0x0d00, 0x0c6b, 0x0000 }, - { 0x8700, 0x0c90, 0x5000 }, - { 0x8700, 0x0c87, 0x4000 }, - { 0x8a00, 0x0c82, 0x3000 }, - { 0x8d00, 0x0c6e, 0x2000 }, - { 0x0d00, 0x0c6d, 0x0000 }, - { 0x0d00, 0x0c6f, 0x0000 }, - { 0x8700, 0x0c85, 0x2000 }, - { 0x0a00, 0x0c83, 0x0000 }, - { 0x0700, 0x0c86, 0x0000 }, - { 0x8700, 0x0c8b, 0x3000 }, - { 0x8700, 0x0c89, 0x2000 }, - { 0x0700, 0x0c88, 0x0000 }, - { 0x0700, 0x0c8a, 0x0000 }, - { 0x8700, 0x0c8e, 0x2000 }, - { 0x0700, 0x0c8c, 0x0000 }, - { 0x0700, 0x0c8f, 0x0000 }, - { 0x8700, 0x0c99, 0x4000 }, - { 0x8700, 0x0c95, 0x3000 }, - { 0x8700, 0x0c93, 0x2000 }, - { 0x0700, 0x0c92, 0x0000 }, - { 0x0700, 0x0c94, 0x0000 }, - { 0x8700, 0x0c97, 0x2000 }, - { 0x0700, 0x0c96, 0x0000 }, - { 0x0700, 0x0c98, 0x0000 }, - { 0x8700, 0x0c9d, 0x3000 }, - { 0x8700, 0x0c9b, 0x2000 }, - { 0x0700, 0x0c9a, 0x0000 }, - { 0x0700, 0x0c9c, 0x0000 }, - { 0x8700, 0x0c9f, 0x2000 }, - { 0x0700, 0x0c9e, 0x0000 }, - { 0x0700, 0x0ca0, 0x0000 }, - { 0x8c00, 0x0cc6, 0x6000 }, - { 0x8700, 0x0cb2, 0x5000 }, - { 0x8700, 0x0caa, 0x4000 }, - { 0x8700, 0x0ca5, 0x3000 }, - { 0x8700, 0x0ca3, 0x2000 }, - { 0x0700, 0x0ca2, 0x0000 }, - { 0x0700, 0x0ca4, 0x0000 }, - { 0x8700, 0x0ca7, 0x2000 }, - { 0x0700, 0x0ca6, 0x0000 }, - { 0x0700, 0x0ca8, 0x0000 }, - { 0x8700, 0x0cae, 0x3000 }, - { 0x8700, 0x0cac, 0x2000 }, - { 0x0700, 0x0cab, 0x0000 }, - { 0x0700, 0x0cad, 0x0000 }, - { 0x8700, 0x0cb0, 0x2000 }, - { 0x0700, 0x0caf, 0x0000 }, - { 0x0700, 0x0cb1, 0x0000 }, - { 0x8700, 0x0cbd, 0x4000 }, - { 0x8700, 0x0cb7, 0x3000 }, - { 0x8700, 0x0cb5, 0x2000 }, - { 0x0700, 0x0cb3, 0x0000 }, - { 0x0700, 0x0cb6, 0x0000 }, - { 0x8700, 0x0cb9, 0x2000 }, - { 0x0700, 0x0cb8, 0x0000 }, - { 0x0c00, 0x0cbc, 0x0000 }, - { 0x8a00, 0x0cc1, 0x3000 }, - { 0x8c00, 0x0cbf, 0x2000 }, - { 0x0a00, 0x0cbe, 0x0000 }, - { 0x0a00, 0x0cc0, 0x0000 }, - { 0x8a00, 0x0cc3, 0x2000 }, - { 0x0a00, 0x0cc2, 0x0000 }, - { 0x0a00, 0x0cc4, 0x0000 }, - { 0x8d00, 0x0cea, 0x5000 }, - { 0x8a00, 0x0cd6, 0x4000 }, - { 0x8a00, 0x0ccb, 0x3000 }, - { 0x8a00, 0x0cc8, 0x2000 }, - { 0x0a00, 0x0cc7, 0x0000 }, - { 0x0a00, 0x0cca, 0x0000 }, - { 0x8c00, 0x0ccd, 0x2000 }, - { 0x0c00, 0x0ccc, 0x0000 }, - { 0x0a00, 0x0cd5, 0x0000 }, - { 0x8d00, 0x0ce6, 0x3000 }, - { 0x8700, 0x0ce0, 0x2000 }, - { 0x0700, 0x0cde, 0x0000 }, - { 0x0700, 0x0ce1, 0x0000 }, - { 0x8d00, 0x0ce8, 0x2000 }, - { 0x0d00, 0x0ce7, 0x0000 }, - { 0x0d00, 0x0ce9, 0x0000 }, - { 0x8700, 0x0d05, 0x4000 }, - { 0x8d00, 0x0cee, 0x3000 }, - { 0x8d00, 0x0cec, 0x2000 }, - { 0x0d00, 0x0ceb, 0x0000 }, - { 0x0d00, 0x0ced, 0x0000 }, - { 0x8a00, 0x0d02, 0x2000 }, - { 0x0d00, 0x0cef, 0x0000 }, - { 0x0a00, 0x0d03, 0x0000 }, - { 0x8700, 0x0d09, 0x3000 }, - { 0x8700, 0x0d07, 0x2000 }, - { 0x0700, 0x0d06, 0x0000 }, - { 0x0700, 0x0d08, 0x0000 }, - { 0x8700, 0x0d0b, 0x2000 }, - { 0x0700, 0x0d0a, 0x0000 }, - { 0x0700, 0x0d0c, 0x0000 }, - { 0x8d00, 0x0d6c, 0x7000 }, - { 0x8700, 0x0d30, 0x6000 }, - { 0x8700, 0x0d1f, 0x5000 }, - { 0x8700, 0x0d17, 0x4000 }, - { 0x8700, 0x0d13, 0x3000 }, - { 0x8700, 0x0d10, 0x2000 }, - { 0x0700, 0x0d0f, 0x0000 }, - { 0x0700, 0x0d12, 0x0000 }, - { 0x8700, 0x0d15, 0x2000 }, - { 0x0700, 0x0d14, 0x0000 }, - { 0x0700, 0x0d16, 0x0000 }, - { 0x8700, 0x0d1b, 0x3000 }, - { 0x8700, 0x0d19, 0x2000 }, - { 0x0700, 0x0d18, 0x0000 }, - { 0x0700, 0x0d1a, 0x0000 }, - { 0x8700, 0x0d1d, 0x2000 }, - { 0x0700, 0x0d1c, 0x0000 }, - { 0x0700, 0x0d1e, 0x0000 }, - { 0x8700, 0x0d27, 0x4000 }, - { 0x8700, 0x0d23, 0x3000 }, - { 0x8700, 0x0d21, 0x2000 }, - { 0x0700, 0x0d20, 0x0000 }, - { 0x0700, 0x0d22, 0x0000 }, - { 0x8700, 0x0d25, 0x2000 }, - { 0x0700, 0x0d24, 0x0000 }, - { 0x0700, 0x0d26, 0x0000 }, - { 0x8700, 0x0d2c, 0x3000 }, - { 0x8700, 0x0d2a, 0x2000 }, - { 0x0700, 0x0d28, 0x0000 }, - { 0x0700, 0x0d2b, 0x0000 }, - { 0x8700, 0x0d2e, 0x2000 }, - { 0x0700, 0x0d2d, 0x0000 }, - { 0x0700, 0x0d2f, 0x0000 }, - { 0x8a00, 0x0d46, 0x5000 }, - { 0x8700, 0x0d38, 0x4000 }, - { 0x8700, 0x0d34, 0x3000 }, - { 0x8700, 0x0d32, 0x2000 }, - { 0x0700, 0x0d31, 0x0000 }, - { 0x0700, 0x0d33, 0x0000 }, - { 0x8700, 0x0d36, 0x2000 }, - { 0x0700, 0x0d35, 0x0000 }, - { 0x0700, 0x0d37, 0x0000 }, - { 0x8a00, 0x0d40, 0x3000 }, - { 0x8a00, 0x0d3e, 0x2000 }, - { 0x0700, 0x0d39, 0x0000 }, - { 0x0a00, 0x0d3f, 0x0000 }, - { 0x8c00, 0x0d42, 0x2000 }, - { 0x0c00, 0x0d41, 0x0000 }, - { 0x0c00, 0x0d43, 0x0000 }, - { 0x8700, 0x0d60, 0x4000 }, - { 0x8a00, 0x0d4b, 0x3000 }, - { 0x8a00, 0x0d48, 0x2000 }, - { 0x0a00, 0x0d47, 0x0000 }, - { 0x0a00, 0x0d4a, 0x0000 }, - { 0x8c00, 0x0d4d, 0x2000 }, - { 0x0a00, 0x0d4c, 0x0000 }, - { 0x0a00, 0x0d57, 0x0000 }, - { 0x8d00, 0x0d68, 0x3000 }, - { 0x8d00, 0x0d66, 0x2000 }, - { 0x0700, 0x0d61, 0x0000 }, - { 0x0d00, 0x0d67, 0x0000 }, - { 0x8d00, 0x0d6a, 0x2000 }, - { 0x0d00, 0x0d69, 0x0000 }, - { 0x0d00, 0x0d6b, 0x0000 }, - { 0x8700, 0x0da2, 0x6000 }, - { 0x8700, 0x0d8f, 0x5000 }, - { 0x8700, 0x0d87, 0x4000 }, - { 0x8a00, 0x0d82, 0x3000 }, - { 0x8d00, 0x0d6e, 0x2000 }, - { 0x0d00, 0x0d6d, 0x0000 }, - { 0x0d00, 0x0d6f, 0x0000 }, - { 0x8700, 0x0d85, 0x2000 }, - { 0x0a00, 0x0d83, 0x0000 }, - { 0x0700, 0x0d86, 0x0000 }, - { 0x8700, 0x0d8b, 0x3000 }, - { 0x8700, 0x0d89, 0x2000 }, - { 0x0700, 0x0d88, 0x0000 }, - { 0x0700, 0x0d8a, 0x0000 }, - { 0x8700, 0x0d8d, 0x2000 }, - { 0x0700, 0x0d8c, 0x0000 }, - { 0x0700, 0x0d8e, 0x0000 }, - { 0x8700, 0x0d9a, 0x4000 }, - { 0x8700, 0x0d93, 0x3000 }, - { 0x8700, 0x0d91, 0x2000 }, - { 0x0700, 0x0d90, 0x0000 }, - { 0x0700, 0x0d92, 0x0000 }, - { 0x8700, 0x0d95, 0x2000 }, - { 0x0700, 0x0d94, 0x0000 }, - { 0x0700, 0x0d96, 0x0000 }, - { 0x8700, 0x0d9e, 0x3000 }, - { 0x8700, 0x0d9c, 0x2000 }, - { 0x0700, 0x0d9b, 0x0000 }, - { 0x0700, 0x0d9d, 0x0000 }, - { 0x8700, 0x0da0, 0x2000 }, - { 0x0700, 0x0d9f, 0x0000 }, - { 0x0700, 0x0da1, 0x0000 }, - { 0x8700, 0x0db3, 0x5000 }, - { 0x8700, 0x0daa, 0x4000 }, - { 0x8700, 0x0da6, 0x3000 }, - { 0x8700, 0x0da4, 0x2000 }, - { 0x0700, 0x0da3, 0x0000 }, - { 0x0700, 0x0da5, 0x0000 }, - { 0x8700, 0x0da8, 0x2000 }, - { 0x0700, 0x0da7, 0x0000 }, - { 0x0700, 0x0da9, 0x0000 }, - { 0x8700, 0x0dae, 0x3000 }, - { 0x8700, 0x0dac, 0x2000 }, - { 0x0700, 0x0dab, 0x0000 }, - { 0x0700, 0x0dad, 0x0000 }, - { 0x8700, 0x0db0, 0x2000 }, - { 0x0700, 0x0daf, 0x0000 }, - { 0x0700, 0x0db1, 0x0000 }, - { 0x8700, 0x0dbb, 0x4000 }, - { 0x8700, 0x0db7, 0x3000 }, - { 0x8700, 0x0db5, 0x2000 }, - { 0x0700, 0x0db4, 0x0000 }, - { 0x0700, 0x0db6, 0x0000 }, - { 0x8700, 0x0db9, 0x2000 }, - { 0x0700, 0x0db8, 0x0000 }, - { 0x0700, 0x0dba, 0x0000 }, - { 0x8700, 0x0dc2, 0x3000 }, - { 0x8700, 0x0dc0, 0x2000 }, - { 0x0700, 0x0dbd, 0x0000 }, - { 0x0700, 0x0dc1, 0x0000 }, - { 0x8700, 0x0dc4, 0x2000 }, - { 0x0700, 0x0dc3, 0x0000 }, - { 0x0700, 0x0dc5, 0x0000 }, - { 0x8700, 0x0f55, 0x9000 }, - { 0x8700, 0x0ea5, 0x8000 }, - { 0x8700, 0x0e2d, 0x7000 }, - { 0x8700, 0x0e0d, 0x6000 }, - { 0x8a00, 0x0ddf, 0x5000 }, - { 0x8c00, 0x0dd6, 0x4000 }, - { 0x8a00, 0x0dd1, 0x3000 }, - { 0x8a00, 0x0dcf, 0x2000 }, - { 0x0c00, 0x0dca, 0x0000 }, - { 0x0a00, 0x0dd0, 0x0000 }, - { 0x8c00, 0x0dd3, 0x2000 }, - { 0x0c00, 0x0dd2, 0x0000 }, - { 0x0c00, 0x0dd4, 0x0000 }, - { 0x8a00, 0x0ddb, 0x3000 }, - { 0x8a00, 0x0dd9, 0x2000 }, - { 0x0a00, 0x0dd8, 0x0000 }, - { 0x0a00, 0x0dda, 0x0000 }, - { 0x8a00, 0x0ddd, 0x2000 }, - { 0x0a00, 0x0ddc, 0x0000 }, - { 0x0a00, 0x0dde, 0x0000 }, - { 0x8700, 0x0e05, 0x4000 }, - { 0x8700, 0x0e01, 0x3000 }, - { 0x8a00, 0x0df3, 0x2000 }, - { 0x0a00, 0x0df2, 0x0000 }, - { 0x1500, 0x0df4, 0x0000 }, - { 0x8700, 0x0e03, 0x2000 }, - { 0x0700, 0x0e02, 0x0000 }, - { 0x0700, 0x0e04, 0x0000 }, - { 0x8700, 0x0e09, 0x3000 }, - { 0x8700, 0x0e07, 0x2000 }, - { 0x0700, 0x0e06, 0x0000 }, - { 0x0700, 0x0e08, 0x0000 }, - { 0x8700, 0x0e0b, 0x2000 }, - { 0x0700, 0x0e0a, 0x0000 }, - { 0x0700, 0x0e0c, 0x0000 }, - { 0x8700, 0x0e1d, 0x5000 }, - { 0x8700, 0x0e15, 0x4000 }, - { 0x8700, 0x0e11, 0x3000 }, - { 0x8700, 0x0e0f, 0x2000 }, - { 0x0700, 0x0e0e, 0x0000 }, - { 0x0700, 0x0e10, 0x0000 }, - { 0x8700, 0x0e13, 0x2000 }, - { 0x0700, 0x0e12, 0x0000 }, - { 0x0700, 0x0e14, 0x0000 }, - { 0x8700, 0x0e19, 0x3000 }, - { 0x8700, 0x0e17, 0x2000 }, - { 0x0700, 0x0e16, 0x0000 }, - { 0x0700, 0x0e18, 0x0000 }, - { 0x8700, 0x0e1b, 0x2000 }, - { 0x0700, 0x0e1a, 0x0000 }, - { 0x0700, 0x0e1c, 0x0000 }, - { 0x8700, 0x0e25, 0x4000 }, - { 0x8700, 0x0e21, 0x3000 }, - { 0x8700, 0x0e1f, 0x2000 }, - { 0x0700, 0x0e1e, 0x0000 }, - { 0x0700, 0x0e20, 0x0000 }, - { 0x8700, 0x0e23, 0x2000 }, - { 0x0700, 0x0e22, 0x0000 }, - { 0x0700, 0x0e24, 0x0000 }, - { 0x8700, 0x0e29, 0x3000 }, - { 0x8700, 0x0e27, 0x2000 }, - { 0x0700, 0x0e26, 0x0000 }, - { 0x0700, 0x0e28, 0x0000 }, - { 0x8700, 0x0e2b, 0x2000 }, - { 0x0700, 0x0e2a, 0x0000 }, - { 0x0700, 0x0e2c, 0x0000 }, - { 0x8d00, 0x0e51, 0x6000 }, - { 0x8700, 0x0e41, 0x5000 }, - { 0x8c00, 0x0e35, 0x4000 }, - { 0x8c00, 0x0e31, 0x3000 }, - { 0x8700, 0x0e2f, 0x2000 }, - { 0x0700, 0x0e2e, 0x0000 }, - { 0x0700, 0x0e30, 0x0000 }, - { 0x8700, 0x0e33, 0x2000 }, - { 0x0700, 0x0e32, 0x0000 }, - { 0x0c00, 0x0e34, 0x0000 }, - { 0x8c00, 0x0e39, 0x3000 }, - { 0x8c00, 0x0e37, 0x2000 }, - { 0x0c00, 0x0e36, 0x0000 }, - { 0x0c00, 0x0e38, 0x0000 }, - { 0x9700, 0x0e3f, 0x2000 }, - { 0x0c00, 0x0e3a, 0x0000 }, - { 0x0700, 0x0e40, 0x0000 }, - { 0x8c00, 0x0e49, 0x4000 }, - { 0x8700, 0x0e45, 0x3000 }, - { 0x8700, 0x0e43, 0x2000 }, - { 0x0700, 0x0e42, 0x0000 }, - { 0x0700, 0x0e44, 0x0000 }, - { 0x8c00, 0x0e47, 0x2000 }, - { 0x0600, 0x0e46, 0x0000 }, - { 0x0c00, 0x0e48, 0x0000 }, - { 0x8c00, 0x0e4d, 0x3000 }, - { 0x8c00, 0x0e4b, 0x2000 }, - { 0x0c00, 0x0e4a, 0x0000 }, - { 0x0c00, 0x0e4c, 0x0000 }, - { 0x9500, 0x0e4f, 0x2000 }, - { 0x0c00, 0x0e4e, 0x0000 }, - { 0x0d00, 0x0e50, 0x0000 }, - { 0x8700, 0x0e8a, 0x5000 }, - { 0x8d00, 0x0e59, 0x4000 }, - { 0x8d00, 0x0e55, 0x3000 }, - { 0x8d00, 0x0e53, 0x2000 }, - { 0x0d00, 0x0e52, 0x0000 }, - { 0x0d00, 0x0e54, 0x0000 }, - { 0x8d00, 0x0e57, 0x2000 }, - { 0x0d00, 0x0e56, 0x0000 }, - { 0x0d00, 0x0e58, 0x0000 }, - { 0x8700, 0x0e82, 0x3000 }, - { 0x9500, 0x0e5b, 0x2000 }, - { 0x1500, 0x0e5a, 0x0000 }, - { 0x0700, 0x0e81, 0x0000 }, - { 0x8700, 0x0e87, 0x2000 }, - { 0x0700, 0x0e84, 0x0000 }, - { 0x0700, 0x0e88, 0x0000 }, - { 0x8700, 0x0e9b, 0x4000 }, - { 0x8700, 0x0e96, 0x3000 }, - { 0x8700, 0x0e94, 0x2000 }, - { 0x0700, 0x0e8d, 0x0000 }, - { 0x0700, 0x0e95, 0x0000 }, - { 0x8700, 0x0e99, 0x2000 }, - { 0x0700, 0x0e97, 0x0000 }, - { 0x0700, 0x0e9a, 0x0000 }, - { 0x8700, 0x0e9f, 0x3000 }, - { 0x8700, 0x0e9d, 0x2000 }, - { 0x0700, 0x0e9c, 0x0000 }, - { 0x0700, 0x0e9e, 0x0000 }, - { 0x8700, 0x0ea2, 0x2000 }, - { 0x0700, 0x0ea1, 0x0000 }, - { 0x0700, 0x0ea3, 0x0000 }, - { 0x9a00, 0x0f14, 0x7000 }, - { 0x8d00, 0x0ed0, 0x6000 }, - { 0x8c00, 0x0eb9, 0x5000 }, - { 0x8c00, 0x0eb1, 0x4000 }, - { 0x8700, 0x0ead, 0x3000 }, - { 0x8700, 0x0eaa, 0x2000 }, - { 0x0700, 0x0ea7, 0x0000 }, - { 0x0700, 0x0eab, 0x0000 }, - { 0x8700, 0x0eaf, 0x2000 }, - { 0x0700, 0x0eae, 0x0000 }, - { 0x0700, 0x0eb0, 0x0000 }, - { 0x8c00, 0x0eb5, 0x3000 }, - { 0x8700, 0x0eb3, 0x2000 }, - { 0x0700, 0x0eb2, 0x0000 }, - { 0x0c00, 0x0eb4, 0x0000 }, - { 0x8c00, 0x0eb7, 0x2000 }, - { 0x0c00, 0x0eb6, 0x0000 }, - { 0x0c00, 0x0eb8, 0x0000 }, - { 0x8700, 0x0ec4, 0x4000 }, - { 0x8700, 0x0ec0, 0x3000 }, - { 0x8c00, 0x0ebc, 0x2000 }, - { 0x0c00, 0x0ebb, 0x0000 }, - { 0x0700, 0x0ebd, 0x0000 }, - { 0x8700, 0x0ec2, 0x2000 }, - { 0x0700, 0x0ec1, 0x0000 }, - { 0x0700, 0x0ec3, 0x0000 }, - { 0x8c00, 0x0eca, 0x3000 }, - { 0x8c00, 0x0ec8, 0x2000 }, - { 0x0600, 0x0ec6, 0x0000 }, - { 0x0c00, 0x0ec9, 0x0000 }, - { 0x8c00, 0x0ecc, 0x2000 }, - { 0x0c00, 0x0ecb, 0x0000 }, - { 0x0c00, 0x0ecd, 0x0000 }, - { 0x9500, 0x0f04, 0x5000 }, - { 0x8d00, 0x0ed8, 0x4000 }, - { 0x8d00, 0x0ed4, 0x3000 }, - { 0x8d00, 0x0ed2, 0x2000 }, - { 0x0d00, 0x0ed1, 0x0000 }, - { 0x0d00, 0x0ed3, 0x0000 }, - { 0x8d00, 0x0ed6, 0x2000 }, - { 0x0d00, 0x0ed5, 0x0000 }, - { 0x0d00, 0x0ed7, 0x0000 }, - { 0x8700, 0x0f00, 0x3000 }, - { 0x8700, 0x0edc, 0x2000 }, - { 0x0d00, 0x0ed9, 0x0000 }, - { 0x0700, 0x0edd, 0x0000 }, - { 0x9a00, 0x0f02, 0x2000 }, - { 0x1a00, 0x0f01, 0x0000 }, - { 0x1a00, 0x0f03, 0x0000 }, - { 0x9500, 0x0f0c, 0x4000 }, - { 0x9500, 0x0f08, 0x3000 }, - { 0x9500, 0x0f06, 0x2000 }, - { 0x1500, 0x0f05, 0x0000 }, - { 0x1500, 0x0f07, 0x0000 }, - { 0x9500, 0x0f0a, 0x2000 }, - { 0x1500, 0x0f09, 0x0000 }, - { 0x1500, 0x0f0b, 0x0000 }, - { 0x9500, 0x0f10, 0x3000 }, - { 0x9500, 0x0f0e, 0x2000 }, - { 0x1500, 0x0f0d, 0x0000 }, - { 0x1500, 0x0f0f, 0x0000 }, - { 0x9500, 0x0f12, 0x2000 }, - { 0x1500, 0x0f11, 0x0000 }, - { 0x1a00, 0x0f13, 0x0000 }, - { 0x9a00, 0x0f34, 0x6000 }, - { 0x8d00, 0x0f24, 0x5000 }, - { 0x9a00, 0x0f1c, 0x4000 }, - { 0x8c00, 0x0f18, 0x3000 }, - { 0x9a00, 0x0f16, 0x2000 }, - { 0x1a00, 0x0f15, 0x0000 }, - { 0x1a00, 0x0f17, 0x0000 }, - { 0x9a00, 0x0f1a, 0x2000 }, - { 0x0c00, 0x0f19, 0x0000 }, - { 0x1a00, 0x0f1b, 0x0000 }, - { 0x8d00, 0x0f20, 0x3000 }, - { 0x9a00, 0x0f1e, 0x2000 }, - { 0x1a00, 0x0f1d, 0x0000 }, - { 0x1a00, 0x0f1f, 0x0000 }, - { 0x8d00, 0x0f22, 0x2000 }, - { 0x0d00, 0x0f21, 0x0000 }, - { 0x0d00, 0x0f23, 0x0000 }, - { 0x8f00, 0x0f2c, 0x4000 }, - { 0x8d00, 0x0f28, 0x3000 }, - { 0x8d00, 0x0f26, 0x2000 }, - { 0x0d00, 0x0f25, 0x0000 }, - { 0x0d00, 0x0f27, 0x0000 }, - { 0x8f00, 0x0f2a, 0x2000 }, - { 0x0d00, 0x0f29, 0x0000 }, - { 0x0f00, 0x0f2b, 0x0000 }, - { 0x8f00, 0x0f30, 0x3000 }, - { 0x8f00, 0x0f2e, 0x2000 }, - { 0x0f00, 0x0f2d, 0x0000 }, - { 0x0f00, 0x0f2f, 0x0000 }, - { 0x8f00, 0x0f32, 0x2000 }, - { 0x0f00, 0x0f31, 0x0000 }, - { 0x0f00, 0x0f33, 0x0000 }, - { 0x8700, 0x0f44, 0x5000 }, - { 0x9600, 0x0f3c, 0x4000 }, - { 0x9a00, 0x0f38, 0x3000 }, - { 0x9a00, 0x0f36, 0x2000 }, - { 0x0c00, 0x0f35, 0x0000 }, - { 0x0c00, 0x0f37, 0x0000 }, - { 0x9600, 0x0f3a, 0x2000 }, - { 0x0c00, 0x0f39, 0x0000 }, - { 0x1200, 0x0f3b, 0x0000 }, - { 0x8700, 0x0f40, 0x3000 }, - { 0x8a00, 0x0f3e, 0x2000 }, - { 0x1200, 0x0f3d, 0x0000 }, - { 0x0a00, 0x0f3f, 0x0000 }, - { 0x8700, 0x0f42, 0x2000 }, - { 0x0700, 0x0f41, 0x0000 }, - { 0x0700, 0x0f43, 0x0000 }, - { 0x8700, 0x0f4d, 0x4000 }, - { 0x8700, 0x0f49, 0x3000 }, - { 0x8700, 0x0f46, 0x2000 }, - { 0x0700, 0x0f45, 0x0000 }, - { 0x0700, 0x0f47, 0x0000 }, - { 0x8700, 0x0f4b, 0x2000 }, - { 0x0700, 0x0f4a, 0x0000 }, - { 0x0700, 0x0f4c, 0x0000 }, - { 0x8700, 0x0f51, 0x3000 }, - { 0x8700, 0x0f4f, 0x2000 }, - { 0x0700, 0x0f4e, 0x0000 }, - { 0x0700, 0x0f50, 0x0000 }, - { 0x8700, 0x0f53, 0x2000 }, - { 0x0700, 0x0f52, 0x0000 }, - { 0x0700, 0x0f54, 0x0000 }, - { 0x8700, 0x1013, 0x8000 }, - { 0x8c00, 0x0fa0, 0x7000 }, - { 0x8c00, 0x0f7b, 0x6000 }, - { 0x8700, 0x0f65, 0x5000 }, - { 0x8700, 0x0f5d, 0x4000 }, - { 0x8700, 0x0f59, 0x3000 }, - { 0x8700, 0x0f57, 0x2000 }, - { 0x0700, 0x0f56, 0x0000 }, - { 0x0700, 0x0f58, 0x0000 }, - { 0x8700, 0x0f5b, 0x2000 }, - { 0x0700, 0x0f5a, 0x0000 }, - { 0x0700, 0x0f5c, 0x0000 }, - { 0x8700, 0x0f61, 0x3000 }, - { 0x8700, 0x0f5f, 0x2000 }, - { 0x0700, 0x0f5e, 0x0000 }, - { 0x0700, 0x0f60, 0x0000 }, - { 0x8700, 0x0f63, 0x2000 }, - { 0x0700, 0x0f62, 0x0000 }, - { 0x0700, 0x0f64, 0x0000 }, - { 0x8c00, 0x0f73, 0x4000 }, - { 0x8700, 0x0f69, 0x3000 }, - { 0x8700, 0x0f67, 0x2000 }, - { 0x0700, 0x0f66, 0x0000 }, - { 0x0700, 0x0f68, 0x0000 }, - { 0x8c00, 0x0f71, 0x2000 }, - { 0x0700, 0x0f6a, 0x0000 }, - { 0x0c00, 0x0f72, 0x0000 }, - { 0x8c00, 0x0f77, 0x3000 }, - { 0x8c00, 0x0f75, 0x2000 }, - { 0x0c00, 0x0f74, 0x0000 }, - { 0x0c00, 0x0f76, 0x0000 }, - { 0x8c00, 0x0f79, 0x2000 }, - { 0x0c00, 0x0f78, 0x0000 }, - { 0x0c00, 0x0f7a, 0x0000 }, - { 0x8700, 0x0f8b, 0x5000 }, - { 0x8c00, 0x0f83, 0x4000 }, - { 0x8a00, 0x0f7f, 0x3000 }, - { 0x8c00, 0x0f7d, 0x2000 }, - { 0x0c00, 0x0f7c, 0x0000 }, - { 0x0c00, 0x0f7e, 0x0000 }, - { 0x8c00, 0x0f81, 0x2000 }, - { 0x0c00, 0x0f80, 0x0000 }, - { 0x0c00, 0x0f82, 0x0000 }, - { 0x8c00, 0x0f87, 0x3000 }, - { 0x9500, 0x0f85, 0x2000 }, - { 0x0c00, 0x0f84, 0x0000 }, - { 0x0c00, 0x0f86, 0x0000 }, - { 0x8700, 0x0f89, 0x2000 }, - { 0x0700, 0x0f88, 0x0000 }, - { 0x0700, 0x0f8a, 0x0000 }, - { 0x8c00, 0x0f97, 0x4000 }, - { 0x8c00, 0x0f93, 0x3000 }, - { 0x8c00, 0x0f91, 0x2000 }, - { 0x0c00, 0x0f90, 0x0000 }, - { 0x0c00, 0x0f92, 0x0000 }, - { 0x8c00, 0x0f95, 0x2000 }, - { 0x0c00, 0x0f94, 0x0000 }, - { 0x0c00, 0x0f96, 0x0000 }, - { 0x8c00, 0x0f9c, 0x3000 }, - { 0x8c00, 0x0f9a, 0x2000 }, - { 0x0c00, 0x0f99, 0x0000 }, - { 0x0c00, 0x0f9b, 0x0000 }, - { 0x8c00, 0x0f9e, 0x2000 }, - { 0x0c00, 0x0f9d, 0x0000 }, - { 0x0c00, 0x0f9f, 0x0000 }, - { 0x9a00, 0x0fc1, 0x6000 }, - { 0x8c00, 0x0fb0, 0x5000 }, - { 0x8c00, 0x0fa8, 0x4000 }, - { 0x8c00, 0x0fa4, 0x3000 }, - { 0x8c00, 0x0fa2, 0x2000 }, - { 0x0c00, 0x0fa1, 0x0000 }, - { 0x0c00, 0x0fa3, 0x0000 }, - { 0x8c00, 0x0fa6, 0x2000 }, - { 0x0c00, 0x0fa5, 0x0000 }, - { 0x0c00, 0x0fa7, 0x0000 }, - { 0x8c00, 0x0fac, 0x3000 }, - { 0x8c00, 0x0faa, 0x2000 }, - { 0x0c00, 0x0fa9, 0x0000 }, - { 0x0c00, 0x0fab, 0x0000 }, - { 0x8c00, 0x0fae, 0x2000 }, - { 0x0c00, 0x0fad, 0x0000 }, - { 0x0c00, 0x0faf, 0x0000 }, - { 0x8c00, 0x0fb8, 0x4000 }, - { 0x8c00, 0x0fb4, 0x3000 }, - { 0x8c00, 0x0fb2, 0x2000 }, - { 0x0c00, 0x0fb1, 0x0000 }, - { 0x0c00, 0x0fb3, 0x0000 }, - { 0x8c00, 0x0fb6, 0x2000 }, - { 0x0c00, 0x0fb5, 0x0000 }, - { 0x0c00, 0x0fb7, 0x0000 }, - { 0x8c00, 0x0fbc, 0x3000 }, - { 0x8c00, 0x0fba, 0x2000 }, - { 0x0c00, 0x0fb9, 0x0000 }, - { 0x0c00, 0x0fbb, 0x0000 }, - { 0x9a00, 0x0fbf, 0x2000 }, - { 0x1a00, 0x0fbe, 0x0000 }, - { 0x1a00, 0x0fc0, 0x0000 }, - { 0x8700, 0x1003, 0x5000 }, - { 0x9a00, 0x0fc9, 0x4000 }, - { 0x9a00, 0x0fc5, 0x3000 }, - { 0x9a00, 0x0fc3, 0x2000 }, - { 0x1a00, 0x0fc2, 0x0000 }, - { 0x1a00, 0x0fc4, 0x0000 }, - { 0x9a00, 0x0fc7, 0x2000 }, - { 0x0c00, 0x0fc6, 0x0000 }, - { 0x1a00, 0x0fc8, 0x0000 }, - { 0x9a00, 0x0fcf, 0x3000 }, - { 0x9a00, 0x0fcb, 0x2000 }, - { 0x1a00, 0x0fca, 0x0000 }, - { 0x1a00, 0x0fcc, 0x0000 }, - { 0x8700, 0x1001, 0x2000 }, - { 0x0700, 0x1000, 0x0000 }, - { 0x0700, 0x1002, 0x0000 }, - { 0x8700, 0x100b, 0x4000 }, - { 0x8700, 0x1007, 0x3000 }, - { 0x8700, 0x1005, 0x2000 }, - { 0x0700, 0x1004, 0x0000 }, - { 0x0700, 0x1006, 0x0000 }, - { 0x8700, 0x1009, 0x2000 }, - { 0x0700, 0x1008, 0x0000 }, - { 0x0700, 0x100a, 0x0000 }, - { 0x8700, 0x100f, 0x3000 }, - { 0x8700, 0x100d, 0x2000 }, - { 0x0700, 0x100c, 0x0000 }, - { 0x0700, 0x100e, 0x0000 }, - { 0x8700, 0x1011, 0x2000 }, - { 0x0700, 0x1010, 0x0000 }, - { 0x0700, 0x1012, 0x0000 }, - { 0x8900, 0x10a5, 0x7000 }, - { 0x8c00, 0x1039, 0x6000 }, - { 0x8700, 0x1024, 0x5000 }, - { 0x8700, 0x101b, 0x4000 }, - { 0x8700, 0x1017, 0x3000 }, - { 0x8700, 0x1015, 0x2000 }, - { 0x0700, 0x1014, 0x0000 }, - { 0x0700, 0x1016, 0x0000 }, - { 0x8700, 0x1019, 0x2000 }, - { 0x0700, 0x1018, 0x0000 }, - { 0x0700, 0x101a, 0x0000 }, - { 0x8700, 0x101f, 0x3000 }, - { 0x8700, 0x101d, 0x2000 }, - { 0x0700, 0x101c, 0x0000 }, - { 0x0700, 0x101e, 0x0000 }, - { 0x8700, 0x1021, 0x2000 }, - { 0x0700, 0x1020, 0x0000 }, - { 0x0700, 0x1023, 0x0000 }, - { 0x8c00, 0x102e, 0x4000 }, - { 0x8700, 0x1029, 0x3000 }, - { 0x8700, 0x1026, 0x2000 }, - { 0x0700, 0x1025, 0x0000 }, - { 0x0700, 0x1027, 0x0000 }, - { 0x8a00, 0x102c, 0x2000 }, - { 0x0700, 0x102a, 0x0000 }, - { 0x0c00, 0x102d, 0x0000 }, - { 0x8c00, 0x1032, 0x3000 }, - { 0x8c00, 0x1030, 0x2000 }, - { 0x0c00, 0x102f, 0x0000 }, - { 0x0a00, 0x1031, 0x0000 }, - { 0x8c00, 0x1037, 0x2000 }, - { 0x0c00, 0x1036, 0x0000 }, - { 0x0a00, 0x1038, 0x0000 }, - { 0x9500, 0x104f, 0x5000 }, - { 0x8d00, 0x1047, 0x4000 }, - { 0x8d00, 0x1043, 0x3000 }, - { 0x8d00, 0x1041, 0x2000 }, - { 0x0d00, 0x1040, 0x0000 }, - { 0x0d00, 0x1042, 0x0000 }, - { 0x8d00, 0x1045, 0x2000 }, - { 0x0d00, 0x1044, 0x0000 }, - { 0x0d00, 0x1046, 0x0000 }, - { 0x9500, 0x104b, 0x3000 }, - { 0x8d00, 0x1049, 0x2000 }, - { 0x0d00, 0x1048, 0x0000 }, - { 0x1500, 0x104a, 0x0000 }, - { 0x9500, 0x104d, 0x2000 }, - { 0x1500, 0x104c, 0x0000 }, - { 0x1500, 0x104e, 0x0000 }, - { 0x8a00, 0x1057, 0x4000 }, - { 0x8700, 0x1053, 0x3000 }, - { 0x8700, 0x1051, 0x2000 }, - { 0x0700, 0x1050, 0x0000 }, - { 0x0700, 0x1052, 0x0000 }, - { 0x8700, 0x1055, 0x2000 }, - { 0x0700, 0x1054, 0x0000 }, - { 0x0a00, 0x1056, 0x0000 }, - { 0x8900, 0x10a1, 0x3000 }, - { 0x8c00, 0x1059, 0x2000 }, - { 0x0c00, 0x1058, 0x0000 }, - { 0x0900, 0x10a0, 0x0000 }, - { 0x8900, 0x10a3, 0x2000 }, - { 0x0900, 0x10a2, 0x0000 }, - { 0x0900, 0x10a4, 0x0000 }, - { 0x8900, 0x10c5, 0x6000 }, - { 0x8900, 0x10b5, 0x5000 }, - { 0x8900, 0x10ad, 0x4000 }, - { 0x8900, 0x10a9, 0x3000 }, - { 0x8900, 0x10a7, 0x2000 }, - { 0x0900, 0x10a6, 0x0000 }, - { 0x0900, 0x10a8, 0x0000 }, - { 0x8900, 0x10ab, 0x2000 }, - { 0x0900, 0x10aa, 0x0000 }, - { 0x0900, 0x10ac, 0x0000 }, - { 0x8900, 0x10b1, 0x3000 }, - { 0x8900, 0x10af, 0x2000 }, - { 0x0900, 0x10ae, 0x0000 }, - { 0x0900, 0x10b0, 0x0000 }, - { 0x8900, 0x10b3, 0x2000 }, - { 0x0900, 0x10b2, 0x0000 }, - { 0x0900, 0x10b4, 0x0000 }, - { 0x8900, 0x10bd, 0x4000 }, - { 0x8900, 0x10b9, 0x3000 }, - { 0x8900, 0x10b7, 0x2000 }, - { 0x0900, 0x10b6, 0x0000 }, - { 0x0900, 0x10b8, 0x0000 }, - { 0x8900, 0x10bb, 0x2000 }, - { 0x0900, 0x10ba, 0x0000 }, - { 0x0900, 0x10bc, 0x0000 }, - { 0x8900, 0x10c1, 0x3000 }, - { 0x8900, 0x10bf, 0x2000 }, - { 0x0900, 0x10be, 0x0000 }, - { 0x0900, 0x10c0, 0x0000 }, - { 0x8900, 0x10c3, 0x2000 }, - { 0x0900, 0x10c2, 0x0000 }, - { 0x0900, 0x10c4, 0x0000 }, - { 0x8700, 0x10df, 0x5000 }, - { 0x8700, 0x10d7, 0x4000 }, - { 0x8700, 0x10d3, 0x3000 }, - { 0x8700, 0x10d1, 0x2000 }, - { 0x0700, 0x10d0, 0x0000 }, - { 0x0700, 0x10d2, 0x0000 }, - { 0x8700, 0x10d5, 0x2000 }, - { 0x0700, 0x10d4, 0x0000 }, - { 0x0700, 0x10d6, 0x0000 }, - { 0x8700, 0x10db, 0x3000 }, - { 0x8700, 0x10d9, 0x2000 }, - { 0x0700, 0x10d8, 0x0000 }, - { 0x0700, 0x10da, 0x0000 }, - { 0x8700, 0x10dd, 0x2000 }, - { 0x0700, 0x10dc, 0x0000 }, - { 0x0700, 0x10de, 0x0000 }, - { 0x8700, 0x10e7, 0x4000 }, - { 0x8700, 0x10e3, 0x3000 }, - { 0x8700, 0x10e1, 0x2000 }, - { 0x0700, 0x10e0, 0x0000 }, - { 0x0700, 0x10e2, 0x0000 }, - { 0x8700, 0x10e5, 0x2000 }, - { 0x0700, 0x10e4, 0x0000 }, - { 0x0700, 0x10e6, 0x0000 }, - { 0x8700, 0x10eb, 0x3000 }, - { 0x8700, 0x10e9, 0x2000 }, - { 0x0700, 0x10e8, 0x0000 }, - { 0x0700, 0x10ea, 0x0000 }, - { 0x8700, 0x10ed, 0x2000 }, - { 0x0700, 0x10ec, 0x0000 }, - { 0x0700, 0x10ee, 0x0000 }, - { 0x8700, 0x1322, 0xa000 }, - { 0x8700, 0x1205, 0x9000 }, - { 0x8700, 0x117a, 0x8000 }, - { 0x8700, 0x1135, 0x7000 }, - { 0x8700, 0x1115, 0x6000 }, - { 0x8700, 0x1105, 0x5000 }, - { 0x8700, 0x10f7, 0x4000 }, - { 0x8700, 0x10f3, 0x3000 }, - { 0x8700, 0x10f1, 0x2000 }, - { 0x0700, 0x10f0, 0x0000 }, - { 0x0700, 0x10f2, 0x0000 }, - { 0x8700, 0x10f5, 0x2000 }, - { 0x0700, 0x10f4, 0x0000 }, - { 0x0700, 0x10f6, 0x0000 }, - { 0x8700, 0x1101, 0x3000 }, - { 0x9500, 0x10fb, 0x2000 }, - { 0x0700, 0x10f8, 0x0000 }, - { 0x0700, 0x1100, 0x0000 }, - { 0x8700, 0x1103, 0x2000 }, - { 0x0700, 0x1102, 0x0000 }, - { 0x0700, 0x1104, 0x0000 }, - { 0x8700, 0x110d, 0x4000 }, - { 0x8700, 0x1109, 0x3000 }, - { 0x8700, 0x1107, 0x2000 }, - { 0x0700, 0x1106, 0x0000 }, - { 0x0700, 0x1108, 0x0000 }, - { 0x8700, 0x110b, 0x2000 }, - { 0x0700, 0x110a, 0x0000 }, - { 0x0700, 0x110c, 0x0000 }, - { 0x8700, 0x1111, 0x3000 }, - { 0x8700, 0x110f, 0x2000 }, - { 0x0700, 0x110e, 0x0000 }, - { 0x0700, 0x1110, 0x0000 }, - { 0x8700, 0x1113, 0x2000 }, - { 0x0700, 0x1112, 0x0000 }, - { 0x0700, 0x1114, 0x0000 }, - { 0x8700, 0x1125, 0x5000 }, - { 0x8700, 0x111d, 0x4000 }, - { 0x8700, 0x1119, 0x3000 }, - { 0x8700, 0x1117, 0x2000 }, - { 0x0700, 0x1116, 0x0000 }, - { 0x0700, 0x1118, 0x0000 }, - { 0x8700, 0x111b, 0x2000 }, - { 0x0700, 0x111a, 0x0000 }, - { 0x0700, 0x111c, 0x0000 }, - { 0x8700, 0x1121, 0x3000 }, - { 0x8700, 0x111f, 0x2000 }, - { 0x0700, 0x111e, 0x0000 }, - { 0x0700, 0x1120, 0x0000 }, - { 0x8700, 0x1123, 0x2000 }, - { 0x0700, 0x1122, 0x0000 }, - { 0x0700, 0x1124, 0x0000 }, - { 0x8700, 0x112d, 0x4000 }, - { 0x8700, 0x1129, 0x3000 }, - { 0x8700, 0x1127, 0x2000 }, - { 0x0700, 0x1126, 0x0000 }, - { 0x0700, 0x1128, 0x0000 }, - { 0x8700, 0x112b, 0x2000 }, - { 0x0700, 0x112a, 0x0000 }, - { 0x0700, 0x112c, 0x0000 }, - { 0x8700, 0x1131, 0x3000 }, - { 0x8700, 0x112f, 0x2000 }, - { 0x0700, 0x112e, 0x0000 }, - { 0x0700, 0x1130, 0x0000 }, - { 0x8700, 0x1133, 0x2000 }, - { 0x0700, 0x1132, 0x0000 }, - { 0x0700, 0x1134, 0x0000 }, - { 0x8700, 0x1155, 0x6000 }, - { 0x8700, 0x1145, 0x5000 }, - { 0x8700, 0x113d, 0x4000 }, - { 0x8700, 0x1139, 0x3000 }, - { 0x8700, 0x1137, 0x2000 }, - { 0x0700, 0x1136, 0x0000 }, - { 0x0700, 0x1138, 0x0000 }, - { 0x8700, 0x113b, 0x2000 }, - { 0x0700, 0x113a, 0x0000 }, - { 0x0700, 0x113c, 0x0000 }, - { 0x8700, 0x1141, 0x3000 }, - { 0x8700, 0x113f, 0x2000 }, - { 0x0700, 0x113e, 0x0000 }, - { 0x0700, 0x1140, 0x0000 }, - { 0x8700, 0x1143, 0x2000 }, - { 0x0700, 0x1142, 0x0000 }, - { 0x0700, 0x1144, 0x0000 }, - { 0x8700, 0x114d, 0x4000 }, - { 0x8700, 0x1149, 0x3000 }, - { 0x8700, 0x1147, 0x2000 }, - { 0x0700, 0x1146, 0x0000 }, - { 0x0700, 0x1148, 0x0000 }, - { 0x8700, 0x114b, 0x2000 }, - { 0x0700, 0x114a, 0x0000 }, - { 0x0700, 0x114c, 0x0000 }, - { 0x8700, 0x1151, 0x3000 }, - { 0x8700, 0x114f, 0x2000 }, - { 0x0700, 0x114e, 0x0000 }, - { 0x0700, 0x1150, 0x0000 }, - { 0x8700, 0x1153, 0x2000 }, - { 0x0700, 0x1152, 0x0000 }, - { 0x0700, 0x1154, 0x0000 }, - { 0x8700, 0x116a, 0x5000 }, - { 0x8700, 0x1162, 0x4000 }, - { 0x8700, 0x1159, 0x3000 }, - { 0x8700, 0x1157, 0x2000 }, - { 0x0700, 0x1156, 0x0000 }, - { 0x0700, 0x1158, 0x0000 }, - { 0x8700, 0x1160, 0x2000 }, - { 0x0700, 0x115f, 0x0000 }, - { 0x0700, 0x1161, 0x0000 }, - { 0x8700, 0x1166, 0x3000 }, - { 0x8700, 0x1164, 0x2000 }, - { 0x0700, 0x1163, 0x0000 }, - { 0x0700, 0x1165, 0x0000 }, - { 0x8700, 0x1168, 0x2000 }, - { 0x0700, 0x1167, 0x0000 }, - { 0x0700, 0x1169, 0x0000 }, - { 0x8700, 0x1172, 0x4000 }, - { 0x8700, 0x116e, 0x3000 }, - { 0x8700, 0x116c, 0x2000 }, - { 0x0700, 0x116b, 0x0000 }, - { 0x0700, 0x116d, 0x0000 }, - { 0x8700, 0x1170, 0x2000 }, - { 0x0700, 0x116f, 0x0000 }, - { 0x0700, 0x1171, 0x0000 }, - { 0x8700, 0x1176, 0x3000 }, - { 0x8700, 0x1174, 0x2000 }, - { 0x0700, 0x1173, 0x0000 }, - { 0x0700, 0x1175, 0x0000 }, - { 0x8700, 0x1178, 0x2000 }, - { 0x0700, 0x1177, 0x0000 }, - { 0x0700, 0x1179, 0x0000 }, - { 0x8700, 0x11bf, 0x7000 }, - { 0x8700, 0x119a, 0x6000 }, - { 0x8700, 0x118a, 0x5000 }, - { 0x8700, 0x1182, 0x4000 }, - { 0x8700, 0x117e, 0x3000 }, - { 0x8700, 0x117c, 0x2000 }, - { 0x0700, 0x117b, 0x0000 }, - { 0x0700, 0x117d, 0x0000 }, - { 0x8700, 0x1180, 0x2000 }, - { 0x0700, 0x117f, 0x0000 }, - { 0x0700, 0x1181, 0x0000 }, - { 0x8700, 0x1186, 0x3000 }, - { 0x8700, 0x1184, 0x2000 }, - { 0x0700, 0x1183, 0x0000 }, - { 0x0700, 0x1185, 0x0000 }, - { 0x8700, 0x1188, 0x2000 }, - { 0x0700, 0x1187, 0x0000 }, - { 0x0700, 0x1189, 0x0000 }, - { 0x8700, 0x1192, 0x4000 }, - { 0x8700, 0x118e, 0x3000 }, - { 0x8700, 0x118c, 0x2000 }, - { 0x0700, 0x118b, 0x0000 }, - { 0x0700, 0x118d, 0x0000 }, - { 0x8700, 0x1190, 0x2000 }, - { 0x0700, 0x118f, 0x0000 }, - { 0x0700, 0x1191, 0x0000 }, - { 0x8700, 0x1196, 0x3000 }, - { 0x8700, 0x1194, 0x2000 }, - { 0x0700, 0x1193, 0x0000 }, - { 0x0700, 0x1195, 0x0000 }, - { 0x8700, 0x1198, 0x2000 }, - { 0x0700, 0x1197, 0x0000 }, - { 0x0700, 0x1199, 0x0000 }, - { 0x8700, 0x11af, 0x5000 }, - { 0x8700, 0x11a2, 0x4000 }, - { 0x8700, 0x119e, 0x3000 }, - { 0x8700, 0x119c, 0x2000 }, - { 0x0700, 0x119b, 0x0000 }, - { 0x0700, 0x119d, 0x0000 }, - { 0x8700, 0x11a0, 0x2000 }, - { 0x0700, 0x119f, 0x0000 }, - { 0x0700, 0x11a1, 0x0000 }, - { 0x8700, 0x11ab, 0x3000 }, - { 0x8700, 0x11a9, 0x2000 }, - { 0x0700, 0x11a8, 0x0000 }, - { 0x0700, 0x11aa, 0x0000 }, - { 0x8700, 0x11ad, 0x2000 }, - { 0x0700, 0x11ac, 0x0000 }, - { 0x0700, 0x11ae, 0x0000 }, - { 0x8700, 0x11b7, 0x4000 }, - { 0x8700, 0x11b3, 0x3000 }, - { 0x8700, 0x11b1, 0x2000 }, - { 0x0700, 0x11b0, 0x0000 }, - { 0x0700, 0x11b2, 0x0000 }, - { 0x8700, 0x11b5, 0x2000 }, - { 0x0700, 0x11b4, 0x0000 }, - { 0x0700, 0x11b6, 0x0000 }, - { 0x8700, 0x11bb, 0x3000 }, - { 0x8700, 0x11b9, 0x2000 }, - { 0x0700, 0x11b8, 0x0000 }, - { 0x0700, 0x11ba, 0x0000 }, - { 0x8700, 0x11bd, 0x2000 }, - { 0x0700, 0x11bc, 0x0000 }, - { 0x0700, 0x11be, 0x0000 }, - { 0x8700, 0x11df, 0x6000 }, - { 0x8700, 0x11cf, 0x5000 }, - { 0x8700, 0x11c7, 0x4000 }, - { 0x8700, 0x11c3, 0x3000 }, - { 0x8700, 0x11c1, 0x2000 }, - { 0x0700, 0x11c0, 0x0000 }, - { 0x0700, 0x11c2, 0x0000 }, - { 0x8700, 0x11c5, 0x2000 }, - { 0x0700, 0x11c4, 0x0000 }, - { 0x0700, 0x11c6, 0x0000 }, - { 0x8700, 0x11cb, 0x3000 }, - { 0x8700, 0x11c9, 0x2000 }, - { 0x0700, 0x11c8, 0x0000 }, - { 0x0700, 0x11ca, 0x0000 }, - { 0x8700, 0x11cd, 0x2000 }, - { 0x0700, 0x11cc, 0x0000 }, - { 0x0700, 0x11ce, 0x0000 }, - { 0x8700, 0x11d7, 0x4000 }, - { 0x8700, 0x11d3, 0x3000 }, - { 0x8700, 0x11d1, 0x2000 }, - { 0x0700, 0x11d0, 0x0000 }, - { 0x0700, 0x11d2, 0x0000 }, - { 0x8700, 0x11d5, 0x2000 }, - { 0x0700, 0x11d4, 0x0000 }, - { 0x0700, 0x11d6, 0x0000 }, - { 0x8700, 0x11db, 0x3000 }, - { 0x8700, 0x11d9, 0x2000 }, - { 0x0700, 0x11d8, 0x0000 }, - { 0x0700, 0x11da, 0x0000 }, - { 0x8700, 0x11dd, 0x2000 }, - { 0x0700, 0x11dc, 0x0000 }, - { 0x0700, 0x11de, 0x0000 }, - { 0x8700, 0x11ef, 0x5000 }, - { 0x8700, 0x11e7, 0x4000 }, - { 0x8700, 0x11e3, 0x3000 }, - { 0x8700, 0x11e1, 0x2000 }, - { 0x0700, 0x11e0, 0x0000 }, - { 0x0700, 0x11e2, 0x0000 }, - { 0x8700, 0x11e5, 0x2000 }, - { 0x0700, 0x11e4, 0x0000 }, - { 0x0700, 0x11e6, 0x0000 }, - { 0x8700, 0x11eb, 0x3000 }, - { 0x8700, 0x11e9, 0x2000 }, - { 0x0700, 0x11e8, 0x0000 }, - { 0x0700, 0x11ea, 0x0000 }, - { 0x8700, 0x11ed, 0x2000 }, - { 0x0700, 0x11ec, 0x0000 }, - { 0x0700, 0x11ee, 0x0000 }, - { 0x8700, 0x11f7, 0x4000 }, - { 0x8700, 0x11f3, 0x3000 }, - { 0x8700, 0x11f1, 0x2000 }, - { 0x0700, 0x11f0, 0x0000 }, - { 0x0700, 0x11f2, 0x0000 }, - { 0x8700, 0x11f5, 0x2000 }, - { 0x0700, 0x11f4, 0x0000 }, - { 0x0700, 0x11f6, 0x0000 }, - { 0x8700, 0x1201, 0x3000 }, - { 0x8700, 0x11f9, 0x2000 }, - { 0x0700, 0x11f8, 0x0000 }, - { 0x0700, 0x1200, 0x0000 }, - { 0x8700, 0x1203, 0x2000 }, - { 0x0700, 0x1202, 0x0000 }, - { 0x0700, 0x1204, 0x0000 }, - { 0x8700, 0x1292, 0x8000 }, - { 0x8700, 0x1246, 0x7000 }, - { 0x8700, 0x1226, 0x6000 }, - { 0x8700, 0x1216, 0x5000 }, - { 0x8700, 0x120e, 0x4000 }, - { 0x8700, 0x120a, 0x3000 }, - { 0x8700, 0x1208, 0x2000 }, - { 0x0700, 0x1206, 0x0000 }, - { 0x0700, 0x1209, 0x0000 }, - { 0x8700, 0x120c, 0x2000 }, - { 0x0700, 0x120b, 0x0000 }, - { 0x0700, 0x120d, 0x0000 }, - { 0x8700, 0x1212, 0x3000 }, - { 0x8700, 0x1210, 0x2000 }, - { 0x0700, 0x120f, 0x0000 }, - { 0x0700, 0x1211, 0x0000 }, - { 0x8700, 0x1214, 0x2000 }, - { 0x0700, 0x1213, 0x0000 }, - { 0x0700, 0x1215, 0x0000 }, - { 0x8700, 0x121e, 0x4000 }, - { 0x8700, 0x121a, 0x3000 }, - { 0x8700, 0x1218, 0x2000 }, - { 0x0700, 0x1217, 0x0000 }, - { 0x0700, 0x1219, 0x0000 }, - { 0x8700, 0x121c, 0x2000 }, - { 0x0700, 0x121b, 0x0000 }, - { 0x0700, 0x121d, 0x0000 }, - { 0x8700, 0x1222, 0x3000 }, - { 0x8700, 0x1220, 0x2000 }, - { 0x0700, 0x121f, 0x0000 }, - { 0x0700, 0x1221, 0x0000 }, - { 0x8700, 0x1224, 0x2000 }, - { 0x0700, 0x1223, 0x0000 }, - { 0x0700, 0x1225, 0x0000 }, - { 0x8700, 0x1236, 0x5000 }, - { 0x8700, 0x122e, 0x4000 }, - { 0x8700, 0x122a, 0x3000 }, - { 0x8700, 0x1228, 0x2000 }, - { 0x0700, 0x1227, 0x0000 }, - { 0x0700, 0x1229, 0x0000 }, - { 0x8700, 0x122c, 0x2000 }, - { 0x0700, 0x122b, 0x0000 }, - { 0x0700, 0x122d, 0x0000 }, - { 0x8700, 0x1232, 0x3000 }, - { 0x8700, 0x1230, 0x2000 }, - { 0x0700, 0x122f, 0x0000 }, - { 0x0700, 0x1231, 0x0000 }, - { 0x8700, 0x1234, 0x2000 }, - { 0x0700, 0x1233, 0x0000 }, - { 0x0700, 0x1235, 0x0000 }, - { 0x8700, 0x123e, 0x4000 }, - { 0x8700, 0x123a, 0x3000 }, - { 0x8700, 0x1238, 0x2000 }, - { 0x0700, 0x1237, 0x0000 }, - { 0x0700, 0x1239, 0x0000 }, - { 0x8700, 0x123c, 0x2000 }, - { 0x0700, 0x123b, 0x0000 }, - { 0x0700, 0x123d, 0x0000 }, - { 0x8700, 0x1242, 0x3000 }, - { 0x8700, 0x1240, 0x2000 }, - { 0x0700, 0x123f, 0x0000 }, - { 0x0700, 0x1241, 0x0000 }, - { 0x8700, 0x1244, 0x2000 }, - { 0x0700, 0x1243, 0x0000 }, - { 0x0700, 0x1245, 0x0000 }, - { 0x8700, 0x126e, 0x6000 }, - { 0x8700, 0x125c, 0x5000 }, - { 0x8700, 0x1252, 0x4000 }, - { 0x8700, 0x124c, 0x3000 }, - { 0x8700, 0x124a, 0x2000 }, - { 0x0700, 0x1248, 0x0000 }, - { 0x0700, 0x124b, 0x0000 }, - { 0x8700, 0x1250, 0x2000 }, - { 0x0700, 0x124d, 0x0000 }, - { 0x0700, 0x1251, 0x0000 }, - { 0x8700, 0x1256, 0x3000 }, - { 0x8700, 0x1254, 0x2000 }, - { 0x0700, 0x1253, 0x0000 }, - { 0x0700, 0x1255, 0x0000 }, - { 0x8700, 0x125a, 0x2000 }, - { 0x0700, 0x1258, 0x0000 }, - { 0x0700, 0x125b, 0x0000 }, - { 0x8700, 0x1266, 0x4000 }, - { 0x8700, 0x1262, 0x3000 }, - { 0x8700, 0x1260, 0x2000 }, - { 0x0700, 0x125d, 0x0000 }, - { 0x0700, 0x1261, 0x0000 }, - { 0x8700, 0x1264, 0x2000 }, - { 0x0700, 0x1263, 0x0000 }, - { 0x0700, 0x1265, 0x0000 }, - { 0x8700, 0x126a, 0x3000 }, - { 0x8700, 0x1268, 0x2000 }, - { 0x0700, 0x1267, 0x0000 }, - { 0x0700, 0x1269, 0x0000 }, - { 0x8700, 0x126c, 0x2000 }, - { 0x0700, 0x126b, 0x0000 }, - { 0x0700, 0x126d, 0x0000 }, - { 0x8700, 0x127e, 0x5000 }, - { 0x8700, 0x1276, 0x4000 }, - { 0x8700, 0x1272, 0x3000 }, - { 0x8700, 0x1270, 0x2000 }, - { 0x0700, 0x126f, 0x0000 }, - { 0x0700, 0x1271, 0x0000 }, - { 0x8700, 0x1274, 0x2000 }, - { 0x0700, 0x1273, 0x0000 }, - { 0x0700, 0x1275, 0x0000 }, - { 0x8700, 0x127a, 0x3000 }, - { 0x8700, 0x1278, 0x2000 }, - { 0x0700, 0x1277, 0x0000 }, - { 0x0700, 0x1279, 0x0000 }, - { 0x8700, 0x127c, 0x2000 }, - { 0x0700, 0x127b, 0x0000 }, - { 0x0700, 0x127d, 0x0000 }, - { 0x8700, 0x1286, 0x4000 }, - { 0x8700, 0x1282, 0x3000 }, - { 0x8700, 0x1280, 0x2000 }, - { 0x0700, 0x127f, 0x0000 }, - { 0x0700, 0x1281, 0x0000 }, - { 0x8700, 0x1284, 0x2000 }, - { 0x0700, 0x1283, 0x0000 }, - { 0x0700, 0x1285, 0x0000 }, - { 0x8700, 0x128c, 0x3000 }, - { 0x8700, 0x128a, 0x2000 }, - { 0x0700, 0x1288, 0x0000 }, - { 0x0700, 0x128b, 0x0000 }, - { 0x8700, 0x1290, 0x2000 }, - { 0x0700, 0x128d, 0x0000 }, - { 0x0700, 0x1291, 0x0000 }, - { 0x8700, 0x12dc, 0x7000 }, - { 0x8700, 0x12b4, 0x6000 }, - { 0x8700, 0x12a2, 0x5000 }, - { 0x8700, 0x129a, 0x4000 }, - { 0x8700, 0x1296, 0x3000 }, - { 0x8700, 0x1294, 0x2000 }, - { 0x0700, 0x1293, 0x0000 }, - { 0x0700, 0x1295, 0x0000 }, - { 0x8700, 0x1298, 0x2000 }, - { 0x0700, 0x1297, 0x0000 }, - { 0x0700, 0x1299, 0x0000 }, - { 0x8700, 0x129e, 0x3000 }, - { 0x8700, 0x129c, 0x2000 }, - { 0x0700, 0x129b, 0x0000 }, - { 0x0700, 0x129d, 0x0000 }, - { 0x8700, 0x12a0, 0x2000 }, - { 0x0700, 0x129f, 0x0000 }, - { 0x0700, 0x12a1, 0x0000 }, - { 0x8700, 0x12aa, 0x4000 }, - { 0x8700, 0x12a6, 0x3000 }, - { 0x8700, 0x12a4, 0x2000 }, - { 0x0700, 0x12a3, 0x0000 }, - { 0x0700, 0x12a5, 0x0000 }, - { 0x8700, 0x12a8, 0x2000 }, - { 0x0700, 0x12a7, 0x0000 }, - { 0x0700, 0x12a9, 0x0000 }, - { 0x8700, 0x12ae, 0x3000 }, - { 0x8700, 0x12ac, 0x2000 }, - { 0x0700, 0x12ab, 0x0000 }, - { 0x0700, 0x12ad, 0x0000 }, - { 0x8700, 0x12b2, 0x2000 }, - { 0x0700, 0x12b0, 0x0000 }, - { 0x0700, 0x12b3, 0x0000 }, - { 0x8700, 0x12ca, 0x5000 }, - { 0x8700, 0x12be, 0x4000 }, - { 0x8700, 0x12ba, 0x3000 }, - { 0x8700, 0x12b8, 0x2000 }, - { 0x0700, 0x12b5, 0x0000 }, - { 0x0700, 0x12b9, 0x0000 }, - { 0x8700, 0x12bc, 0x2000 }, - { 0x0700, 0x12bb, 0x0000 }, - { 0x0700, 0x12bd, 0x0000 }, - { 0x8700, 0x12c4, 0x3000 }, - { 0x8700, 0x12c2, 0x2000 }, - { 0x0700, 0x12c0, 0x0000 }, - { 0x0700, 0x12c3, 0x0000 }, - { 0x8700, 0x12c8, 0x2000 }, - { 0x0700, 0x12c5, 0x0000 }, - { 0x0700, 0x12c9, 0x0000 }, - { 0x8700, 0x12d3, 0x4000 }, - { 0x8700, 0x12ce, 0x3000 }, - { 0x8700, 0x12cc, 0x2000 }, - { 0x0700, 0x12cb, 0x0000 }, - { 0x0700, 0x12cd, 0x0000 }, - { 0x8700, 0x12d1, 0x2000 }, - { 0x0700, 0x12d0, 0x0000 }, - { 0x0700, 0x12d2, 0x0000 }, - { 0x8700, 0x12d8, 0x3000 }, - { 0x8700, 0x12d5, 0x2000 }, - { 0x0700, 0x12d4, 0x0000 }, - { 0x0700, 0x12d6, 0x0000 }, - { 0x8700, 0x12da, 0x2000 }, - { 0x0700, 0x12d9, 0x0000 }, - { 0x0700, 0x12db, 0x0000 }, - { 0x8700, 0x12fd, 0x6000 }, - { 0x8700, 0x12ec, 0x5000 }, - { 0x8700, 0x12e4, 0x4000 }, - { 0x8700, 0x12e0, 0x3000 }, - { 0x8700, 0x12de, 0x2000 }, - { 0x0700, 0x12dd, 0x0000 }, - { 0x0700, 0x12df, 0x0000 }, - { 0x8700, 0x12e2, 0x2000 }, - { 0x0700, 0x12e1, 0x0000 }, - { 0x0700, 0x12e3, 0x0000 }, - { 0x8700, 0x12e8, 0x3000 }, - { 0x8700, 0x12e6, 0x2000 }, - { 0x0700, 0x12e5, 0x0000 }, - { 0x0700, 0x12e7, 0x0000 }, - { 0x8700, 0x12ea, 0x2000 }, - { 0x0700, 0x12e9, 0x0000 }, - { 0x0700, 0x12eb, 0x0000 }, - { 0x8700, 0x12f5, 0x4000 }, - { 0x8700, 0x12f1, 0x3000 }, - { 0x8700, 0x12ee, 0x2000 }, - { 0x0700, 0x12ed, 0x0000 }, - { 0x0700, 0x12f0, 0x0000 }, - { 0x8700, 0x12f3, 0x2000 }, - { 0x0700, 0x12f2, 0x0000 }, - { 0x0700, 0x12f4, 0x0000 }, - { 0x8700, 0x12f9, 0x3000 }, - { 0x8700, 0x12f7, 0x2000 }, - { 0x0700, 0x12f6, 0x0000 }, - { 0x0700, 0x12f8, 0x0000 }, - { 0x8700, 0x12fb, 0x2000 }, - { 0x0700, 0x12fa, 0x0000 }, - { 0x0700, 0x12fc, 0x0000 }, - { 0x8700, 0x130d, 0x5000 }, - { 0x8700, 0x1305, 0x4000 }, - { 0x8700, 0x1301, 0x3000 }, - { 0x8700, 0x12ff, 0x2000 }, - { 0x0700, 0x12fe, 0x0000 }, - { 0x0700, 0x1300, 0x0000 }, - { 0x8700, 0x1303, 0x2000 }, - { 0x0700, 0x1302, 0x0000 }, - { 0x0700, 0x1304, 0x0000 }, - { 0x8700, 0x1309, 0x3000 }, - { 0x8700, 0x1307, 0x2000 }, - { 0x0700, 0x1306, 0x0000 }, - { 0x0700, 0x1308, 0x0000 }, - { 0x8700, 0x130b, 0x2000 }, - { 0x0700, 0x130a, 0x0000 }, - { 0x0700, 0x130c, 0x0000 }, - { 0x8700, 0x1319, 0x4000 }, - { 0x8700, 0x1313, 0x3000 }, - { 0x8700, 0x1310, 0x2000 }, - { 0x0700, 0x130e, 0x0000 }, - { 0x0700, 0x1312, 0x0000 }, - { 0x8700, 0x1315, 0x2000 }, - { 0x0700, 0x1314, 0x0000 }, - { 0x0700, 0x1318, 0x0000 }, - { 0x8700, 0x131d, 0x3000 }, - { 0x8700, 0x131b, 0x2000 }, - { 0x0700, 0x131a, 0x0000 }, - { 0x0700, 0x131c, 0x0000 }, - { 0x8700, 0x1320, 0x2000 }, - { 0x0700, 0x131e, 0x0000 }, - { 0x0700, 0x1321, 0x0000 }, - { 0x8700, 0x1458, 0x9000 }, - { 0x8700, 0x13cc, 0x8000 }, - { 0x8d00, 0x1369, 0x7000 }, - { 0x8700, 0x1342, 0x6000 }, - { 0x8700, 0x1332, 0x5000 }, - { 0x8700, 0x132a, 0x4000 }, - { 0x8700, 0x1326, 0x3000 }, - { 0x8700, 0x1324, 0x2000 }, - { 0x0700, 0x1323, 0x0000 }, - { 0x0700, 0x1325, 0x0000 }, - { 0x8700, 0x1328, 0x2000 }, - { 0x0700, 0x1327, 0x0000 }, - { 0x0700, 0x1329, 0x0000 }, - { 0x8700, 0x132e, 0x3000 }, - { 0x8700, 0x132c, 0x2000 }, - { 0x0700, 0x132b, 0x0000 }, - { 0x0700, 0x132d, 0x0000 }, - { 0x8700, 0x1330, 0x2000 }, - { 0x0700, 0x132f, 0x0000 }, - { 0x0700, 0x1331, 0x0000 }, - { 0x8700, 0x133a, 0x4000 }, - { 0x8700, 0x1336, 0x3000 }, - { 0x8700, 0x1334, 0x2000 }, - { 0x0700, 0x1333, 0x0000 }, - { 0x0700, 0x1335, 0x0000 }, - { 0x8700, 0x1338, 0x2000 }, - { 0x0700, 0x1337, 0x0000 }, - { 0x0700, 0x1339, 0x0000 }, - { 0x8700, 0x133e, 0x3000 }, - { 0x8700, 0x133c, 0x2000 }, - { 0x0700, 0x133b, 0x0000 }, - { 0x0700, 0x133d, 0x0000 }, - { 0x8700, 0x1340, 0x2000 }, - { 0x0700, 0x133f, 0x0000 }, - { 0x0700, 0x1341, 0x0000 }, - { 0x8700, 0x1353, 0x5000 }, - { 0x8700, 0x134b, 0x4000 }, - { 0x8700, 0x1346, 0x3000 }, - { 0x8700, 0x1344, 0x2000 }, - { 0x0700, 0x1343, 0x0000 }, - { 0x0700, 0x1345, 0x0000 }, - { 0x8700, 0x1349, 0x2000 }, - { 0x0700, 0x1348, 0x0000 }, - { 0x0700, 0x134a, 0x0000 }, - { 0x8700, 0x134f, 0x3000 }, - { 0x8700, 0x134d, 0x2000 }, - { 0x0700, 0x134c, 0x0000 }, - { 0x0700, 0x134e, 0x0000 }, - { 0x8700, 0x1351, 0x2000 }, - { 0x0700, 0x1350, 0x0000 }, - { 0x0700, 0x1352, 0x0000 }, - { 0x9500, 0x1361, 0x4000 }, - { 0x8700, 0x1357, 0x3000 }, - { 0x8700, 0x1355, 0x2000 }, - { 0x0700, 0x1354, 0x0000 }, - { 0x0700, 0x1356, 0x0000 }, - { 0x8700, 0x1359, 0x2000 }, - { 0x0700, 0x1358, 0x0000 }, - { 0x0700, 0x135a, 0x0000 }, - { 0x9500, 0x1365, 0x3000 }, - { 0x9500, 0x1363, 0x2000 }, - { 0x1500, 0x1362, 0x0000 }, - { 0x1500, 0x1364, 0x0000 }, - { 0x9500, 0x1367, 0x2000 }, - { 0x1500, 0x1366, 0x0000 }, - { 0x1500, 0x1368, 0x0000 }, - { 0x8700, 0x13ac, 0x6000 }, - { 0x8f00, 0x1379, 0x5000 }, - { 0x8d00, 0x1371, 0x4000 }, - { 0x8d00, 0x136d, 0x3000 }, - { 0x8d00, 0x136b, 0x2000 }, - { 0x0d00, 0x136a, 0x0000 }, - { 0x0d00, 0x136c, 0x0000 }, - { 0x8d00, 0x136f, 0x2000 }, - { 0x0d00, 0x136e, 0x0000 }, - { 0x0d00, 0x1370, 0x0000 }, - { 0x8f00, 0x1375, 0x3000 }, - { 0x8f00, 0x1373, 0x2000 }, - { 0x0f00, 0x1372, 0x0000 }, - { 0x0f00, 0x1374, 0x0000 }, - { 0x8f00, 0x1377, 0x2000 }, - { 0x0f00, 0x1376, 0x0000 }, - { 0x0f00, 0x1378, 0x0000 }, - { 0x8700, 0x13a4, 0x4000 }, - { 0x8700, 0x13a0, 0x3000 }, - { 0x8f00, 0x137b, 0x2000 }, - { 0x0f00, 0x137a, 0x0000 }, - { 0x0f00, 0x137c, 0x0000 }, - { 0x8700, 0x13a2, 0x2000 }, - { 0x0700, 0x13a1, 0x0000 }, - { 0x0700, 0x13a3, 0x0000 }, - { 0x8700, 0x13a8, 0x3000 }, - { 0x8700, 0x13a6, 0x2000 }, - { 0x0700, 0x13a5, 0x0000 }, - { 0x0700, 0x13a7, 0x0000 }, - { 0x8700, 0x13aa, 0x2000 }, - { 0x0700, 0x13a9, 0x0000 }, - { 0x0700, 0x13ab, 0x0000 }, - { 0x8700, 0x13bc, 0x5000 }, - { 0x8700, 0x13b4, 0x4000 }, - { 0x8700, 0x13b0, 0x3000 }, - { 0x8700, 0x13ae, 0x2000 }, - { 0x0700, 0x13ad, 0x0000 }, - { 0x0700, 0x13af, 0x0000 }, - { 0x8700, 0x13b2, 0x2000 }, - { 0x0700, 0x13b1, 0x0000 }, - { 0x0700, 0x13b3, 0x0000 }, - { 0x8700, 0x13b8, 0x3000 }, - { 0x8700, 0x13b6, 0x2000 }, - { 0x0700, 0x13b5, 0x0000 }, - { 0x0700, 0x13b7, 0x0000 }, - { 0x8700, 0x13ba, 0x2000 }, - { 0x0700, 0x13b9, 0x0000 }, - { 0x0700, 0x13bb, 0x0000 }, - { 0x8700, 0x13c4, 0x4000 }, - { 0x8700, 0x13c0, 0x3000 }, - { 0x8700, 0x13be, 0x2000 }, - { 0x0700, 0x13bd, 0x0000 }, - { 0x0700, 0x13bf, 0x0000 }, - { 0x8700, 0x13c2, 0x2000 }, - { 0x0700, 0x13c1, 0x0000 }, - { 0x0700, 0x13c3, 0x0000 }, - { 0x8700, 0x13c8, 0x3000 }, - { 0x8700, 0x13c6, 0x2000 }, - { 0x0700, 0x13c5, 0x0000 }, - { 0x0700, 0x13c7, 0x0000 }, - { 0x8700, 0x13ca, 0x2000 }, - { 0x0700, 0x13c9, 0x0000 }, - { 0x0700, 0x13cb, 0x0000 }, - { 0x8700, 0x1418, 0x7000 }, - { 0x8700, 0x13ec, 0x6000 }, - { 0x8700, 0x13dc, 0x5000 }, - { 0x8700, 0x13d4, 0x4000 }, - { 0x8700, 0x13d0, 0x3000 }, - { 0x8700, 0x13ce, 0x2000 }, - { 0x0700, 0x13cd, 0x0000 }, - { 0x0700, 0x13cf, 0x0000 }, - { 0x8700, 0x13d2, 0x2000 }, - { 0x0700, 0x13d1, 0x0000 }, - { 0x0700, 0x13d3, 0x0000 }, - { 0x8700, 0x13d8, 0x3000 }, - { 0x8700, 0x13d6, 0x2000 }, - { 0x0700, 0x13d5, 0x0000 }, - { 0x0700, 0x13d7, 0x0000 }, - { 0x8700, 0x13da, 0x2000 }, - { 0x0700, 0x13d9, 0x0000 }, - { 0x0700, 0x13db, 0x0000 }, - { 0x8700, 0x13e4, 0x4000 }, - { 0x8700, 0x13e0, 0x3000 }, - { 0x8700, 0x13de, 0x2000 }, - { 0x0700, 0x13dd, 0x0000 }, - { 0x0700, 0x13df, 0x0000 }, - { 0x8700, 0x13e2, 0x2000 }, - { 0x0700, 0x13e1, 0x0000 }, - { 0x0700, 0x13e3, 0x0000 }, - { 0x8700, 0x13e8, 0x3000 }, - { 0x8700, 0x13e6, 0x2000 }, - { 0x0700, 0x13e5, 0x0000 }, - { 0x0700, 0x13e7, 0x0000 }, - { 0x8700, 0x13ea, 0x2000 }, - { 0x0700, 0x13e9, 0x0000 }, - { 0x0700, 0x13eb, 0x0000 }, - { 0x8700, 0x1408, 0x5000 }, - { 0x8700, 0x13f4, 0x4000 }, - { 0x8700, 0x13f0, 0x3000 }, - { 0x8700, 0x13ee, 0x2000 }, - { 0x0700, 0x13ed, 0x0000 }, - { 0x0700, 0x13ef, 0x0000 }, - { 0x8700, 0x13f2, 0x2000 }, - { 0x0700, 0x13f1, 0x0000 }, - { 0x0700, 0x13f3, 0x0000 }, - { 0x8700, 0x1404, 0x3000 }, - { 0x8700, 0x1402, 0x2000 }, - { 0x0700, 0x1401, 0x0000 }, - { 0x0700, 0x1403, 0x0000 }, - { 0x8700, 0x1406, 0x2000 }, - { 0x0700, 0x1405, 0x0000 }, - { 0x0700, 0x1407, 0x0000 }, - { 0x8700, 0x1410, 0x4000 }, - { 0x8700, 0x140c, 0x3000 }, - { 0x8700, 0x140a, 0x2000 }, - { 0x0700, 0x1409, 0x0000 }, - { 0x0700, 0x140b, 0x0000 }, - { 0x8700, 0x140e, 0x2000 }, - { 0x0700, 0x140d, 0x0000 }, - { 0x0700, 0x140f, 0x0000 }, - { 0x8700, 0x1414, 0x3000 }, - { 0x8700, 0x1412, 0x2000 }, - { 0x0700, 0x1411, 0x0000 }, - { 0x0700, 0x1413, 0x0000 }, - { 0x8700, 0x1416, 0x2000 }, - { 0x0700, 0x1415, 0x0000 }, - { 0x0700, 0x1417, 0x0000 }, - { 0x8700, 0x1438, 0x6000 }, - { 0x8700, 0x1428, 0x5000 }, - { 0x8700, 0x1420, 0x4000 }, - { 0x8700, 0x141c, 0x3000 }, - { 0x8700, 0x141a, 0x2000 }, - { 0x0700, 0x1419, 0x0000 }, - { 0x0700, 0x141b, 0x0000 }, - { 0x8700, 0x141e, 0x2000 }, - { 0x0700, 0x141d, 0x0000 }, - { 0x0700, 0x141f, 0x0000 }, - { 0x8700, 0x1424, 0x3000 }, - { 0x8700, 0x1422, 0x2000 }, - { 0x0700, 0x1421, 0x0000 }, - { 0x0700, 0x1423, 0x0000 }, - { 0x8700, 0x1426, 0x2000 }, - { 0x0700, 0x1425, 0x0000 }, - { 0x0700, 0x1427, 0x0000 }, - { 0x8700, 0x1430, 0x4000 }, - { 0x8700, 0x142c, 0x3000 }, - { 0x8700, 0x142a, 0x2000 }, - { 0x0700, 0x1429, 0x0000 }, - { 0x0700, 0x142b, 0x0000 }, - { 0x8700, 0x142e, 0x2000 }, - { 0x0700, 0x142d, 0x0000 }, - { 0x0700, 0x142f, 0x0000 }, - { 0x8700, 0x1434, 0x3000 }, - { 0x8700, 0x1432, 0x2000 }, - { 0x0700, 0x1431, 0x0000 }, - { 0x0700, 0x1433, 0x0000 }, - { 0x8700, 0x1436, 0x2000 }, - { 0x0700, 0x1435, 0x0000 }, - { 0x0700, 0x1437, 0x0000 }, - { 0x8700, 0x1448, 0x5000 }, - { 0x8700, 0x1440, 0x4000 }, - { 0x8700, 0x143c, 0x3000 }, - { 0x8700, 0x143a, 0x2000 }, - { 0x0700, 0x1439, 0x0000 }, - { 0x0700, 0x143b, 0x0000 }, - { 0x8700, 0x143e, 0x2000 }, - { 0x0700, 0x143d, 0x0000 }, - { 0x0700, 0x143f, 0x0000 }, - { 0x8700, 0x1444, 0x3000 }, - { 0x8700, 0x1442, 0x2000 }, - { 0x0700, 0x1441, 0x0000 }, - { 0x0700, 0x1443, 0x0000 }, - { 0x8700, 0x1446, 0x2000 }, - { 0x0700, 0x1445, 0x0000 }, - { 0x0700, 0x1447, 0x0000 }, - { 0x8700, 0x1450, 0x4000 }, - { 0x8700, 0x144c, 0x3000 }, - { 0x8700, 0x144a, 0x2000 }, - { 0x0700, 0x1449, 0x0000 }, - { 0x0700, 0x144b, 0x0000 }, - { 0x8700, 0x144e, 0x2000 }, - { 0x0700, 0x144d, 0x0000 }, - { 0x0700, 0x144f, 0x0000 }, - { 0x8700, 0x1454, 0x3000 }, - { 0x8700, 0x1452, 0x2000 }, - { 0x0700, 0x1451, 0x0000 }, - { 0x0700, 0x1453, 0x0000 }, - { 0x8700, 0x1456, 0x2000 }, - { 0x0700, 0x1455, 0x0000 }, - { 0x0700, 0x1457, 0x0000 }, - { 0x8700, 0x14d8, 0x8000 }, - { 0x8700, 0x1498, 0x7000 }, - { 0x8700, 0x1478, 0x6000 }, - { 0x8700, 0x1468, 0x5000 }, - { 0x8700, 0x1460, 0x4000 }, - { 0x8700, 0x145c, 0x3000 }, - { 0x8700, 0x145a, 0x2000 }, - { 0x0700, 0x1459, 0x0000 }, - { 0x0700, 0x145b, 0x0000 }, - { 0x8700, 0x145e, 0x2000 }, - { 0x0700, 0x145d, 0x0000 }, - { 0x0700, 0x145f, 0x0000 }, - { 0x8700, 0x1464, 0x3000 }, - { 0x8700, 0x1462, 0x2000 }, - { 0x0700, 0x1461, 0x0000 }, - { 0x0700, 0x1463, 0x0000 }, - { 0x8700, 0x1466, 0x2000 }, - { 0x0700, 0x1465, 0x0000 }, - { 0x0700, 0x1467, 0x0000 }, - { 0x8700, 0x1470, 0x4000 }, - { 0x8700, 0x146c, 0x3000 }, - { 0x8700, 0x146a, 0x2000 }, - { 0x0700, 0x1469, 0x0000 }, - { 0x0700, 0x146b, 0x0000 }, - { 0x8700, 0x146e, 0x2000 }, - { 0x0700, 0x146d, 0x0000 }, - { 0x0700, 0x146f, 0x0000 }, - { 0x8700, 0x1474, 0x3000 }, - { 0x8700, 0x1472, 0x2000 }, - { 0x0700, 0x1471, 0x0000 }, - { 0x0700, 0x1473, 0x0000 }, - { 0x8700, 0x1476, 0x2000 }, - { 0x0700, 0x1475, 0x0000 }, - { 0x0700, 0x1477, 0x0000 }, - { 0x8700, 0x1488, 0x5000 }, - { 0x8700, 0x1480, 0x4000 }, - { 0x8700, 0x147c, 0x3000 }, - { 0x8700, 0x147a, 0x2000 }, - { 0x0700, 0x1479, 0x0000 }, - { 0x0700, 0x147b, 0x0000 }, - { 0x8700, 0x147e, 0x2000 }, - { 0x0700, 0x147d, 0x0000 }, - { 0x0700, 0x147f, 0x0000 }, - { 0x8700, 0x1484, 0x3000 }, - { 0x8700, 0x1482, 0x2000 }, - { 0x0700, 0x1481, 0x0000 }, - { 0x0700, 0x1483, 0x0000 }, - { 0x8700, 0x1486, 0x2000 }, - { 0x0700, 0x1485, 0x0000 }, - { 0x0700, 0x1487, 0x0000 }, - { 0x8700, 0x1490, 0x4000 }, - { 0x8700, 0x148c, 0x3000 }, - { 0x8700, 0x148a, 0x2000 }, - { 0x0700, 0x1489, 0x0000 }, - { 0x0700, 0x148b, 0x0000 }, - { 0x8700, 0x148e, 0x2000 }, - { 0x0700, 0x148d, 0x0000 }, - { 0x0700, 0x148f, 0x0000 }, - { 0x8700, 0x1494, 0x3000 }, - { 0x8700, 0x1492, 0x2000 }, - { 0x0700, 0x1491, 0x0000 }, - { 0x0700, 0x1493, 0x0000 }, - { 0x8700, 0x1496, 0x2000 }, - { 0x0700, 0x1495, 0x0000 }, - { 0x0700, 0x1497, 0x0000 }, - { 0x8700, 0x14b8, 0x6000 }, - { 0x8700, 0x14a8, 0x5000 }, - { 0x8700, 0x14a0, 0x4000 }, - { 0x8700, 0x149c, 0x3000 }, - { 0x8700, 0x149a, 0x2000 }, - { 0x0700, 0x1499, 0x0000 }, - { 0x0700, 0x149b, 0x0000 }, - { 0x8700, 0x149e, 0x2000 }, - { 0x0700, 0x149d, 0x0000 }, - { 0x0700, 0x149f, 0x0000 }, - { 0x8700, 0x14a4, 0x3000 }, - { 0x8700, 0x14a2, 0x2000 }, - { 0x0700, 0x14a1, 0x0000 }, - { 0x0700, 0x14a3, 0x0000 }, - { 0x8700, 0x14a6, 0x2000 }, - { 0x0700, 0x14a5, 0x0000 }, - { 0x0700, 0x14a7, 0x0000 }, - { 0x8700, 0x14b0, 0x4000 }, - { 0x8700, 0x14ac, 0x3000 }, - { 0x8700, 0x14aa, 0x2000 }, - { 0x0700, 0x14a9, 0x0000 }, - { 0x0700, 0x14ab, 0x0000 }, - { 0x8700, 0x14ae, 0x2000 }, - { 0x0700, 0x14ad, 0x0000 }, - { 0x0700, 0x14af, 0x0000 }, - { 0x8700, 0x14b4, 0x3000 }, - { 0x8700, 0x14b2, 0x2000 }, - { 0x0700, 0x14b1, 0x0000 }, - { 0x0700, 0x14b3, 0x0000 }, - { 0x8700, 0x14b6, 0x2000 }, - { 0x0700, 0x14b5, 0x0000 }, - { 0x0700, 0x14b7, 0x0000 }, - { 0x8700, 0x14c8, 0x5000 }, - { 0x8700, 0x14c0, 0x4000 }, - { 0x8700, 0x14bc, 0x3000 }, - { 0x8700, 0x14ba, 0x2000 }, - { 0x0700, 0x14b9, 0x0000 }, - { 0x0700, 0x14bb, 0x0000 }, - { 0x8700, 0x14be, 0x2000 }, - { 0x0700, 0x14bd, 0x0000 }, - { 0x0700, 0x14bf, 0x0000 }, - { 0x8700, 0x14c4, 0x3000 }, - { 0x8700, 0x14c2, 0x2000 }, - { 0x0700, 0x14c1, 0x0000 }, - { 0x0700, 0x14c3, 0x0000 }, - { 0x8700, 0x14c6, 0x2000 }, - { 0x0700, 0x14c5, 0x0000 }, - { 0x0700, 0x14c7, 0x0000 }, - { 0x8700, 0x14d0, 0x4000 }, - { 0x8700, 0x14cc, 0x3000 }, - { 0x8700, 0x14ca, 0x2000 }, - { 0x0700, 0x14c9, 0x0000 }, - { 0x0700, 0x14cb, 0x0000 }, - { 0x8700, 0x14ce, 0x2000 }, - { 0x0700, 0x14cd, 0x0000 }, - { 0x0700, 0x14cf, 0x0000 }, - { 0x8700, 0x14d4, 0x3000 }, - { 0x8700, 0x14d2, 0x2000 }, - { 0x0700, 0x14d1, 0x0000 }, - { 0x0700, 0x14d3, 0x0000 }, - { 0x8700, 0x14d6, 0x2000 }, - { 0x0700, 0x14d5, 0x0000 }, - { 0x0700, 0x14d7, 0x0000 }, - { 0x8700, 0x1518, 0x7000 }, - { 0x8700, 0x14f8, 0x6000 }, - { 0x8700, 0x14e8, 0x5000 }, - { 0x8700, 0x14e0, 0x4000 }, - { 0x8700, 0x14dc, 0x3000 }, - { 0x8700, 0x14da, 0x2000 }, - { 0x0700, 0x14d9, 0x0000 }, - { 0x0700, 0x14db, 0x0000 }, - { 0x8700, 0x14de, 0x2000 }, - { 0x0700, 0x14dd, 0x0000 }, - { 0x0700, 0x14df, 0x0000 }, - { 0x8700, 0x14e4, 0x3000 }, - { 0x8700, 0x14e2, 0x2000 }, - { 0x0700, 0x14e1, 0x0000 }, - { 0x0700, 0x14e3, 0x0000 }, - { 0x8700, 0x14e6, 0x2000 }, - { 0x0700, 0x14e5, 0x0000 }, - { 0x0700, 0x14e7, 0x0000 }, - { 0x8700, 0x14f0, 0x4000 }, - { 0x8700, 0x14ec, 0x3000 }, - { 0x8700, 0x14ea, 0x2000 }, - { 0x0700, 0x14e9, 0x0000 }, - { 0x0700, 0x14eb, 0x0000 }, - { 0x8700, 0x14ee, 0x2000 }, - { 0x0700, 0x14ed, 0x0000 }, - { 0x0700, 0x14ef, 0x0000 }, - { 0x8700, 0x14f4, 0x3000 }, - { 0x8700, 0x14f2, 0x2000 }, - { 0x0700, 0x14f1, 0x0000 }, - { 0x0700, 0x14f3, 0x0000 }, - { 0x8700, 0x14f6, 0x2000 }, - { 0x0700, 0x14f5, 0x0000 }, - { 0x0700, 0x14f7, 0x0000 }, - { 0x8700, 0x1508, 0x5000 }, - { 0x8700, 0x1500, 0x4000 }, - { 0x8700, 0x14fc, 0x3000 }, - { 0x8700, 0x14fa, 0x2000 }, - { 0x0700, 0x14f9, 0x0000 }, - { 0x0700, 0x14fb, 0x0000 }, - { 0x8700, 0x14fe, 0x2000 }, - { 0x0700, 0x14fd, 0x0000 }, - { 0x0700, 0x14ff, 0x0000 }, - { 0x8700, 0x1504, 0x3000 }, - { 0x8700, 0x1502, 0x2000 }, - { 0x0700, 0x1501, 0x0000 }, - { 0x0700, 0x1503, 0x0000 }, - { 0x8700, 0x1506, 0x2000 }, - { 0x0700, 0x1505, 0x0000 }, - { 0x0700, 0x1507, 0x0000 }, - { 0x8700, 0x1510, 0x4000 }, - { 0x8700, 0x150c, 0x3000 }, - { 0x8700, 0x150a, 0x2000 }, - { 0x0700, 0x1509, 0x0000 }, - { 0x0700, 0x150b, 0x0000 }, - { 0x8700, 0x150e, 0x2000 }, - { 0x0700, 0x150d, 0x0000 }, - { 0x0700, 0x150f, 0x0000 }, - { 0x8700, 0x1514, 0x3000 }, - { 0x8700, 0x1512, 0x2000 }, - { 0x0700, 0x1511, 0x0000 }, - { 0x0700, 0x1513, 0x0000 }, - { 0x8700, 0x1516, 0x2000 }, - { 0x0700, 0x1515, 0x0000 }, - { 0x0700, 0x1517, 0x0000 }, - { 0x8700, 0x1538, 0x6000 }, - { 0x8700, 0x1528, 0x5000 }, - { 0x8700, 0x1520, 0x4000 }, - { 0x8700, 0x151c, 0x3000 }, - { 0x8700, 0x151a, 0x2000 }, - { 0x0700, 0x1519, 0x0000 }, - { 0x0700, 0x151b, 0x0000 }, - { 0x8700, 0x151e, 0x2000 }, - { 0x0700, 0x151d, 0x0000 }, - { 0x0700, 0x151f, 0x0000 }, - { 0x8700, 0x1524, 0x3000 }, - { 0x8700, 0x1522, 0x2000 }, - { 0x0700, 0x1521, 0x0000 }, - { 0x0700, 0x1523, 0x0000 }, - { 0x8700, 0x1526, 0x2000 }, - { 0x0700, 0x1525, 0x0000 }, - { 0x0700, 0x1527, 0x0000 }, - { 0x8700, 0x1530, 0x4000 }, - { 0x8700, 0x152c, 0x3000 }, - { 0x8700, 0x152a, 0x2000 }, - { 0x0700, 0x1529, 0x0000 }, - { 0x0700, 0x152b, 0x0000 }, - { 0x8700, 0x152e, 0x2000 }, - { 0x0700, 0x152d, 0x0000 }, - { 0x0700, 0x152f, 0x0000 }, - { 0x8700, 0x1534, 0x3000 }, - { 0x8700, 0x1532, 0x2000 }, - { 0x0700, 0x1531, 0x0000 }, - { 0x0700, 0x1533, 0x0000 }, - { 0x8700, 0x1536, 0x2000 }, - { 0x0700, 0x1535, 0x0000 }, - { 0x0700, 0x1537, 0x0000 }, - { 0x8700, 0x1548, 0x5000 }, - { 0x8700, 0x1540, 0x4000 }, - { 0x8700, 0x153c, 0x3000 }, - { 0x8700, 0x153a, 0x2000 }, - { 0x0700, 0x1539, 0x0000 }, - { 0x0700, 0x153b, 0x0000 }, - { 0x8700, 0x153e, 0x2000 }, - { 0x0700, 0x153d, 0x0000 }, - { 0x0700, 0x153f, 0x0000 }, - { 0x8700, 0x1544, 0x3000 }, - { 0x8700, 0x1542, 0x2000 }, - { 0x0700, 0x1541, 0x0000 }, - { 0x0700, 0x1543, 0x0000 }, - { 0x8700, 0x1546, 0x2000 }, - { 0x0700, 0x1545, 0x0000 }, - { 0x0700, 0x1547, 0x0000 }, - { 0x8700, 0x1550, 0x4000 }, - { 0x8700, 0x154c, 0x3000 }, - { 0x8700, 0x154a, 0x2000 }, - { 0x0700, 0x1549, 0x0000 }, - { 0x0700, 0x154b, 0x0000 }, - { 0x8700, 0x154e, 0x2000 }, - { 0x0700, 0x154d, 0x0000 }, - { 0x0700, 0x154f, 0x0000 }, - { 0x8700, 0x1554, 0x3000 }, - { 0x8700, 0x1552, 0x2000 }, - { 0x0700, 0x1551, 0x0000 }, - { 0x0700, 0x1553, 0x0000 }, - { 0x8700, 0x1556, 0x2000 }, - { 0x0700, 0x1555, 0x0000 }, - { 0x0700, 0x1557, 0x0000 }, - { 0x9900, 0x22ae, 0xc000 }, - { 0x8900, 0x1e24, 0xb001 }, - { 0x8700, 0x17a2, 0xa000 }, - { 0x8700, 0x1658, 0x9000 }, - { 0x8700, 0x15d8, 0x8000 }, - { 0x8700, 0x1598, 0x7000 }, - { 0x8700, 0x1578, 0x6000 }, - { 0x8700, 0x1568, 0x5000 }, - { 0x8700, 0x1560, 0x4000 }, - { 0x8700, 0x155c, 0x3000 }, - { 0x8700, 0x155a, 0x2000 }, - { 0x0700, 0x1559, 0x0000 }, - { 0x0700, 0x155b, 0x0000 }, - { 0x8700, 0x155e, 0x2000 }, - { 0x0700, 0x155d, 0x0000 }, - { 0x0700, 0x155f, 0x0000 }, - { 0x8700, 0x1564, 0x3000 }, - { 0x8700, 0x1562, 0x2000 }, - { 0x0700, 0x1561, 0x0000 }, - { 0x0700, 0x1563, 0x0000 }, - { 0x8700, 0x1566, 0x2000 }, - { 0x0700, 0x1565, 0x0000 }, - { 0x0700, 0x1567, 0x0000 }, - { 0x8700, 0x1570, 0x4000 }, - { 0x8700, 0x156c, 0x3000 }, - { 0x8700, 0x156a, 0x2000 }, - { 0x0700, 0x1569, 0x0000 }, - { 0x0700, 0x156b, 0x0000 }, - { 0x8700, 0x156e, 0x2000 }, - { 0x0700, 0x156d, 0x0000 }, - { 0x0700, 0x156f, 0x0000 }, - { 0x8700, 0x1574, 0x3000 }, - { 0x8700, 0x1572, 0x2000 }, - { 0x0700, 0x1571, 0x0000 }, - { 0x0700, 0x1573, 0x0000 }, - { 0x8700, 0x1576, 0x2000 }, - { 0x0700, 0x1575, 0x0000 }, - { 0x0700, 0x1577, 0x0000 }, - { 0x8700, 0x1588, 0x5000 }, - { 0x8700, 0x1580, 0x4000 }, - { 0x8700, 0x157c, 0x3000 }, - { 0x8700, 0x157a, 0x2000 }, - { 0x0700, 0x1579, 0x0000 }, - { 0x0700, 0x157b, 0x0000 }, - { 0x8700, 0x157e, 0x2000 }, - { 0x0700, 0x157d, 0x0000 }, - { 0x0700, 0x157f, 0x0000 }, - { 0x8700, 0x1584, 0x3000 }, - { 0x8700, 0x1582, 0x2000 }, - { 0x0700, 0x1581, 0x0000 }, - { 0x0700, 0x1583, 0x0000 }, - { 0x8700, 0x1586, 0x2000 }, - { 0x0700, 0x1585, 0x0000 }, - { 0x0700, 0x1587, 0x0000 }, - { 0x8700, 0x1590, 0x4000 }, - { 0x8700, 0x158c, 0x3000 }, - { 0x8700, 0x158a, 0x2000 }, - { 0x0700, 0x1589, 0x0000 }, - { 0x0700, 0x158b, 0x0000 }, - { 0x8700, 0x158e, 0x2000 }, - { 0x0700, 0x158d, 0x0000 }, - { 0x0700, 0x158f, 0x0000 }, - { 0x8700, 0x1594, 0x3000 }, - { 0x8700, 0x1592, 0x2000 }, - { 0x0700, 0x1591, 0x0000 }, - { 0x0700, 0x1593, 0x0000 }, - { 0x8700, 0x1596, 0x2000 }, - { 0x0700, 0x1595, 0x0000 }, - { 0x0700, 0x1597, 0x0000 }, - { 0x8700, 0x15b8, 0x6000 }, - { 0x8700, 0x15a8, 0x5000 }, - { 0x8700, 0x15a0, 0x4000 }, - { 0x8700, 0x159c, 0x3000 }, - { 0x8700, 0x159a, 0x2000 }, - { 0x0700, 0x1599, 0x0000 }, - { 0x0700, 0x159b, 0x0000 }, - { 0x8700, 0x159e, 0x2000 }, - { 0x0700, 0x159d, 0x0000 }, - { 0x0700, 0x159f, 0x0000 }, - { 0x8700, 0x15a4, 0x3000 }, - { 0x8700, 0x15a2, 0x2000 }, - { 0x0700, 0x15a1, 0x0000 }, - { 0x0700, 0x15a3, 0x0000 }, - { 0x8700, 0x15a6, 0x2000 }, - { 0x0700, 0x15a5, 0x0000 }, - { 0x0700, 0x15a7, 0x0000 }, - { 0x8700, 0x15b0, 0x4000 }, - { 0x8700, 0x15ac, 0x3000 }, - { 0x8700, 0x15aa, 0x2000 }, - { 0x0700, 0x15a9, 0x0000 }, - { 0x0700, 0x15ab, 0x0000 }, - { 0x8700, 0x15ae, 0x2000 }, - { 0x0700, 0x15ad, 0x0000 }, - { 0x0700, 0x15af, 0x0000 }, - { 0x8700, 0x15b4, 0x3000 }, - { 0x8700, 0x15b2, 0x2000 }, - { 0x0700, 0x15b1, 0x0000 }, - { 0x0700, 0x15b3, 0x0000 }, - { 0x8700, 0x15b6, 0x2000 }, - { 0x0700, 0x15b5, 0x0000 }, - { 0x0700, 0x15b7, 0x0000 }, - { 0x8700, 0x15c8, 0x5000 }, - { 0x8700, 0x15c0, 0x4000 }, - { 0x8700, 0x15bc, 0x3000 }, - { 0x8700, 0x15ba, 0x2000 }, - { 0x0700, 0x15b9, 0x0000 }, - { 0x0700, 0x15bb, 0x0000 }, - { 0x8700, 0x15be, 0x2000 }, - { 0x0700, 0x15bd, 0x0000 }, - { 0x0700, 0x15bf, 0x0000 }, - { 0x8700, 0x15c4, 0x3000 }, - { 0x8700, 0x15c2, 0x2000 }, - { 0x0700, 0x15c1, 0x0000 }, - { 0x0700, 0x15c3, 0x0000 }, - { 0x8700, 0x15c6, 0x2000 }, - { 0x0700, 0x15c5, 0x0000 }, - { 0x0700, 0x15c7, 0x0000 }, - { 0x8700, 0x15d0, 0x4000 }, - { 0x8700, 0x15cc, 0x3000 }, - { 0x8700, 0x15ca, 0x2000 }, - { 0x0700, 0x15c9, 0x0000 }, - { 0x0700, 0x15cb, 0x0000 }, - { 0x8700, 0x15ce, 0x2000 }, - { 0x0700, 0x15cd, 0x0000 }, - { 0x0700, 0x15cf, 0x0000 }, - { 0x8700, 0x15d4, 0x3000 }, - { 0x8700, 0x15d2, 0x2000 }, - { 0x0700, 0x15d1, 0x0000 }, - { 0x0700, 0x15d3, 0x0000 }, - { 0x8700, 0x15d6, 0x2000 }, - { 0x0700, 0x15d5, 0x0000 }, - { 0x0700, 0x15d7, 0x0000 }, - { 0x8700, 0x1618, 0x7000 }, - { 0x8700, 0x15f8, 0x6000 }, - { 0x8700, 0x15e8, 0x5000 }, - { 0x8700, 0x15e0, 0x4000 }, - { 0x8700, 0x15dc, 0x3000 }, - { 0x8700, 0x15da, 0x2000 }, - { 0x0700, 0x15d9, 0x0000 }, - { 0x0700, 0x15db, 0x0000 }, - { 0x8700, 0x15de, 0x2000 }, - { 0x0700, 0x15dd, 0x0000 }, - { 0x0700, 0x15df, 0x0000 }, - { 0x8700, 0x15e4, 0x3000 }, - { 0x8700, 0x15e2, 0x2000 }, - { 0x0700, 0x15e1, 0x0000 }, - { 0x0700, 0x15e3, 0x0000 }, - { 0x8700, 0x15e6, 0x2000 }, - { 0x0700, 0x15e5, 0x0000 }, - { 0x0700, 0x15e7, 0x0000 }, - { 0x8700, 0x15f0, 0x4000 }, - { 0x8700, 0x15ec, 0x3000 }, - { 0x8700, 0x15ea, 0x2000 }, - { 0x0700, 0x15e9, 0x0000 }, - { 0x0700, 0x15eb, 0x0000 }, - { 0x8700, 0x15ee, 0x2000 }, - { 0x0700, 0x15ed, 0x0000 }, - { 0x0700, 0x15ef, 0x0000 }, - { 0x8700, 0x15f4, 0x3000 }, - { 0x8700, 0x15f2, 0x2000 }, - { 0x0700, 0x15f1, 0x0000 }, - { 0x0700, 0x15f3, 0x0000 }, - { 0x8700, 0x15f6, 0x2000 }, - { 0x0700, 0x15f5, 0x0000 }, - { 0x0700, 0x15f7, 0x0000 }, - { 0x8700, 0x1608, 0x5000 }, - { 0x8700, 0x1600, 0x4000 }, - { 0x8700, 0x15fc, 0x3000 }, - { 0x8700, 0x15fa, 0x2000 }, - { 0x0700, 0x15f9, 0x0000 }, - { 0x0700, 0x15fb, 0x0000 }, - { 0x8700, 0x15fe, 0x2000 }, - { 0x0700, 0x15fd, 0x0000 }, - { 0x0700, 0x15ff, 0x0000 }, - { 0x8700, 0x1604, 0x3000 }, - { 0x8700, 0x1602, 0x2000 }, - { 0x0700, 0x1601, 0x0000 }, - { 0x0700, 0x1603, 0x0000 }, - { 0x8700, 0x1606, 0x2000 }, - { 0x0700, 0x1605, 0x0000 }, - { 0x0700, 0x1607, 0x0000 }, - { 0x8700, 0x1610, 0x4000 }, - { 0x8700, 0x160c, 0x3000 }, - { 0x8700, 0x160a, 0x2000 }, - { 0x0700, 0x1609, 0x0000 }, - { 0x0700, 0x160b, 0x0000 }, - { 0x8700, 0x160e, 0x2000 }, - { 0x0700, 0x160d, 0x0000 }, - { 0x0700, 0x160f, 0x0000 }, - { 0x8700, 0x1614, 0x3000 }, - { 0x8700, 0x1612, 0x2000 }, - { 0x0700, 0x1611, 0x0000 }, - { 0x0700, 0x1613, 0x0000 }, - { 0x8700, 0x1616, 0x2000 }, - { 0x0700, 0x1615, 0x0000 }, - { 0x0700, 0x1617, 0x0000 }, - { 0x8700, 0x1638, 0x6000 }, - { 0x8700, 0x1628, 0x5000 }, - { 0x8700, 0x1620, 0x4000 }, - { 0x8700, 0x161c, 0x3000 }, - { 0x8700, 0x161a, 0x2000 }, - { 0x0700, 0x1619, 0x0000 }, - { 0x0700, 0x161b, 0x0000 }, - { 0x8700, 0x161e, 0x2000 }, - { 0x0700, 0x161d, 0x0000 }, - { 0x0700, 0x161f, 0x0000 }, - { 0x8700, 0x1624, 0x3000 }, - { 0x8700, 0x1622, 0x2000 }, - { 0x0700, 0x1621, 0x0000 }, - { 0x0700, 0x1623, 0x0000 }, - { 0x8700, 0x1626, 0x2000 }, - { 0x0700, 0x1625, 0x0000 }, - { 0x0700, 0x1627, 0x0000 }, - { 0x8700, 0x1630, 0x4000 }, - { 0x8700, 0x162c, 0x3000 }, - { 0x8700, 0x162a, 0x2000 }, - { 0x0700, 0x1629, 0x0000 }, - { 0x0700, 0x162b, 0x0000 }, - { 0x8700, 0x162e, 0x2000 }, - { 0x0700, 0x162d, 0x0000 }, - { 0x0700, 0x162f, 0x0000 }, - { 0x8700, 0x1634, 0x3000 }, - { 0x8700, 0x1632, 0x2000 }, - { 0x0700, 0x1631, 0x0000 }, - { 0x0700, 0x1633, 0x0000 }, - { 0x8700, 0x1636, 0x2000 }, - { 0x0700, 0x1635, 0x0000 }, - { 0x0700, 0x1637, 0x0000 }, - { 0x8700, 0x1648, 0x5000 }, - { 0x8700, 0x1640, 0x4000 }, - { 0x8700, 0x163c, 0x3000 }, - { 0x8700, 0x163a, 0x2000 }, - { 0x0700, 0x1639, 0x0000 }, - { 0x0700, 0x163b, 0x0000 }, - { 0x8700, 0x163e, 0x2000 }, - { 0x0700, 0x163d, 0x0000 }, - { 0x0700, 0x163f, 0x0000 }, - { 0x8700, 0x1644, 0x3000 }, - { 0x8700, 0x1642, 0x2000 }, - { 0x0700, 0x1641, 0x0000 }, - { 0x0700, 0x1643, 0x0000 }, - { 0x8700, 0x1646, 0x2000 }, - { 0x0700, 0x1645, 0x0000 }, - { 0x0700, 0x1647, 0x0000 }, - { 0x8700, 0x1650, 0x4000 }, - { 0x8700, 0x164c, 0x3000 }, - { 0x8700, 0x164a, 0x2000 }, - { 0x0700, 0x1649, 0x0000 }, - { 0x0700, 0x164b, 0x0000 }, - { 0x8700, 0x164e, 0x2000 }, - { 0x0700, 0x164d, 0x0000 }, - { 0x0700, 0x164f, 0x0000 }, - { 0x8700, 0x1654, 0x3000 }, - { 0x8700, 0x1652, 0x2000 }, - { 0x0700, 0x1651, 0x0000 }, - { 0x0700, 0x1653, 0x0000 }, - { 0x8700, 0x1656, 0x2000 }, - { 0x0700, 0x1655, 0x0000 }, - { 0x0700, 0x1657, 0x0000 }, - { 0x8700, 0x16e4, 0x8000 }, - { 0x8700, 0x16a4, 0x7000 }, - { 0x8700, 0x1681, 0x6000 }, - { 0x8700, 0x1668, 0x5000 }, - { 0x8700, 0x1660, 0x4000 }, - { 0x8700, 0x165c, 0x3000 }, - { 0x8700, 0x165a, 0x2000 }, - { 0x0700, 0x1659, 0x0000 }, - { 0x0700, 0x165b, 0x0000 }, - { 0x8700, 0x165e, 0x2000 }, - { 0x0700, 0x165d, 0x0000 }, - { 0x0700, 0x165f, 0x0000 }, - { 0x8700, 0x1664, 0x3000 }, - { 0x8700, 0x1662, 0x2000 }, - { 0x0700, 0x1661, 0x0000 }, - { 0x0700, 0x1663, 0x0000 }, - { 0x8700, 0x1666, 0x2000 }, - { 0x0700, 0x1665, 0x0000 }, - { 0x0700, 0x1667, 0x0000 }, - { 0x8700, 0x1670, 0x4000 }, - { 0x8700, 0x166c, 0x3000 }, - { 0x8700, 0x166a, 0x2000 }, - { 0x0700, 0x1669, 0x0000 }, - { 0x0700, 0x166b, 0x0000 }, - { 0x9500, 0x166e, 0x2000 }, - { 0x1500, 0x166d, 0x0000 }, - { 0x0700, 0x166f, 0x0000 }, - { 0x8700, 0x1674, 0x3000 }, - { 0x8700, 0x1672, 0x2000 }, - { 0x0700, 0x1671, 0x0000 }, - { 0x0700, 0x1673, 0x0000 }, - { 0x8700, 0x1676, 0x2000 }, - { 0x0700, 0x1675, 0x0000 }, - { 0x1d00, 0x1680, 0x0000 }, - { 0x8700, 0x1691, 0x5000 }, - { 0x8700, 0x1689, 0x4000 }, - { 0x8700, 0x1685, 0x3000 }, - { 0x8700, 0x1683, 0x2000 }, - { 0x0700, 0x1682, 0x0000 }, - { 0x0700, 0x1684, 0x0000 }, - { 0x8700, 0x1687, 0x2000 }, - { 0x0700, 0x1686, 0x0000 }, - { 0x0700, 0x1688, 0x0000 }, - { 0x8700, 0x168d, 0x3000 }, - { 0x8700, 0x168b, 0x2000 }, - { 0x0700, 0x168a, 0x0000 }, - { 0x0700, 0x168c, 0x0000 }, - { 0x8700, 0x168f, 0x2000 }, - { 0x0700, 0x168e, 0x0000 }, - { 0x0700, 0x1690, 0x0000 }, - { 0x8700, 0x1699, 0x4000 }, - { 0x8700, 0x1695, 0x3000 }, - { 0x8700, 0x1693, 0x2000 }, - { 0x0700, 0x1692, 0x0000 }, - { 0x0700, 0x1694, 0x0000 }, - { 0x8700, 0x1697, 0x2000 }, - { 0x0700, 0x1696, 0x0000 }, - { 0x0700, 0x1698, 0x0000 }, - { 0x8700, 0x16a0, 0x3000 }, - { 0x9600, 0x169b, 0x2000 }, - { 0x0700, 0x169a, 0x0000 }, - { 0x1200, 0x169c, 0x0000 }, - { 0x8700, 0x16a2, 0x2000 }, - { 0x0700, 0x16a1, 0x0000 }, - { 0x0700, 0x16a3, 0x0000 }, - { 0x8700, 0x16c4, 0x6000 }, - { 0x8700, 0x16b4, 0x5000 }, - { 0x8700, 0x16ac, 0x4000 }, - { 0x8700, 0x16a8, 0x3000 }, - { 0x8700, 0x16a6, 0x2000 }, - { 0x0700, 0x16a5, 0x0000 }, - { 0x0700, 0x16a7, 0x0000 }, - { 0x8700, 0x16aa, 0x2000 }, - { 0x0700, 0x16a9, 0x0000 }, - { 0x0700, 0x16ab, 0x0000 }, - { 0x8700, 0x16b0, 0x3000 }, - { 0x8700, 0x16ae, 0x2000 }, - { 0x0700, 0x16ad, 0x0000 }, - { 0x0700, 0x16af, 0x0000 }, - { 0x8700, 0x16b2, 0x2000 }, - { 0x0700, 0x16b1, 0x0000 }, - { 0x0700, 0x16b3, 0x0000 }, - { 0x8700, 0x16bc, 0x4000 }, - { 0x8700, 0x16b8, 0x3000 }, - { 0x8700, 0x16b6, 0x2000 }, - { 0x0700, 0x16b5, 0x0000 }, - { 0x0700, 0x16b7, 0x0000 }, - { 0x8700, 0x16ba, 0x2000 }, - { 0x0700, 0x16b9, 0x0000 }, - { 0x0700, 0x16bb, 0x0000 }, - { 0x8700, 0x16c0, 0x3000 }, - { 0x8700, 0x16be, 0x2000 }, - { 0x0700, 0x16bd, 0x0000 }, - { 0x0700, 0x16bf, 0x0000 }, - { 0x8700, 0x16c2, 0x2000 }, - { 0x0700, 0x16c1, 0x0000 }, - { 0x0700, 0x16c3, 0x0000 }, - { 0x8700, 0x16d4, 0x5000 }, - { 0x8700, 0x16cc, 0x4000 }, - { 0x8700, 0x16c8, 0x3000 }, - { 0x8700, 0x16c6, 0x2000 }, - { 0x0700, 0x16c5, 0x0000 }, - { 0x0700, 0x16c7, 0x0000 }, - { 0x8700, 0x16ca, 0x2000 }, - { 0x0700, 0x16c9, 0x0000 }, - { 0x0700, 0x16cb, 0x0000 }, - { 0x8700, 0x16d0, 0x3000 }, - { 0x8700, 0x16ce, 0x2000 }, - { 0x0700, 0x16cd, 0x0000 }, - { 0x0700, 0x16cf, 0x0000 }, - { 0x8700, 0x16d2, 0x2000 }, - { 0x0700, 0x16d1, 0x0000 }, - { 0x0700, 0x16d3, 0x0000 }, - { 0x8700, 0x16dc, 0x4000 }, - { 0x8700, 0x16d8, 0x3000 }, - { 0x8700, 0x16d6, 0x2000 }, - { 0x0700, 0x16d5, 0x0000 }, - { 0x0700, 0x16d7, 0x0000 }, - { 0x8700, 0x16da, 0x2000 }, - { 0x0700, 0x16d9, 0x0000 }, - { 0x0700, 0x16db, 0x0000 }, - { 0x8700, 0x16e0, 0x3000 }, - { 0x8700, 0x16de, 0x2000 }, - { 0x0700, 0x16dd, 0x0000 }, - { 0x0700, 0x16df, 0x0000 }, - { 0x8700, 0x16e2, 0x2000 }, - { 0x0700, 0x16e1, 0x0000 }, - { 0x0700, 0x16e3, 0x0000 }, - { 0x8700, 0x1748, 0x7000 }, - { 0x8c00, 0x1714, 0x6000 }, - { 0x8700, 0x1703, 0x5000 }, - { 0x9500, 0x16ec, 0x4000 }, - { 0x8700, 0x16e8, 0x3000 }, - { 0x8700, 0x16e6, 0x2000 }, - { 0x0700, 0x16e5, 0x0000 }, - { 0x0700, 0x16e7, 0x0000 }, - { 0x8700, 0x16ea, 0x2000 }, - { 0x0700, 0x16e9, 0x0000 }, - { 0x1500, 0x16eb, 0x0000 }, - { 0x8e00, 0x16f0, 0x3000 }, - { 0x8e00, 0x16ee, 0x2000 }, - { 0x1500, 0x16ed, 0x0000 }, - { 0x0e00, 0x16ef, 0x0000 }, - { 0x8700, 0x1701, 0x2000 }, - { 0x0700, 0x1700, 0x0000 }, - { 0x0700, 0x1702, 0x0000 }, - { 0x8700, 0x170b, 0x4000 }, - { 0x8700, 0x1707, 0x3000 }, - { 0x8700, 0x1705, 0x2000 }, - { 0x0700, 0x1704, 0x0000 }, - { 0x0700, 0x1706, 0x0000 }, - { 0x8700, 0x1709, 0x2000 }, - { 0x0700, 0x1708, 0x0000 }, - { 0x0700, 0x170a, 0x0000 }, - { 0x8700, 0x1710, 0x3000 }, - { 0x8700, 0x170e, 0x2000 }, - { 0x0700, 0x170c, 0x0000 }, - { 0x0700, 0x170f, 0x0000 }, - { 0x8c00, 0x1712, 0x2000 }, - { 0x0700, 0x1711, 0x0000 }, - { 0x0c00, 0x1713, 0x0000 }, - { 0x8700, 0x172f, 0x5000 }, - { 0x8700, 0x1727, 0x4000 }, - { 0x8700, 0x1723, 0x3000 }, - { 0x8700, 0x1721, 0x2000 }, - { 0x0700, 0x1720, 0x0000 }, - { 0x0700, 0x1722, 0x0000 }, - { 0x8700, 0x1725, 0x2000 }, - { 0x0700, 0x1724, 0x0000 }, - { 0x0700, 0x1726, 0x0000 }, - { 0x8700, 0x172b, 0x3000 }, - { 0x8700, 0x1729, 0x2000 }, - { 0x0700, 0x1728, 0x0000 }, - { 0x0700, 0x172a, 0x0000 }, - { 0x8700, 0x172d, 0x2000 }, - { 0x0700, 0x172c, 0x0000 }, - { 0x0700, 0x172e, 0x0000 }, - { 0x8700, 0x1740, 0x4000 }, - { 0x8c00, 0x1733, 0x3000 }, - { 0x8700, 0x1731, 0x2000 }, - { 0x0700, 0x1730, 0x0000 }, - { 0x0c00, 0x1732, 0x0000 }, - { 0x9500, 0x1735, 0x2000 }, - { 0x0c00, 0x1734, 0x0000 }, - { 0x1500, 0x1736, 0x0000 }, - { 0x8700, 0x1744, 0x3000 }, - { 0x8700, 0x1742, 0x2000 }, - { 0x0700, 0x1741, 0x0000 }, - { 0x0700, 0x1743, 0x0000 }, - { 0x8700, 0x1746, 0x2000 }, - { 0x0700, 0x1745, 0x0000 }, - { 0x0700, 0x1747, 0x0000 }, - { 0x8700, 0x1782, 0x6000 }, - { 0x8700, 0x1764, 0x5000 }, - { 0x8700, 0x1750, 0x4000 }, - { 0x8700, 0x174c, 0x3000 }, - { 0x8700, 0x174a, 0x2000 }, - { 0x0700, 0x1749, 0x0000 }, - { 0x0700, 0x174b, 0x0000 }, - { 0x8700, 0x174e, 0x2000 }, - { 0x0700, 0x174d, 0x0000 }, - { 0x0700, 0x174f, 0x0000 }, - { 0x8700, 0x1760, 0x3000 }, - { 0x8c00, 0x1752, 0x2000 }, - { 0x0700, 0x1751, 0x0000 }, - { 0x0c00, 0x1753, 0x0000 }, - { 0x8700, 0x1762, 0x2000 }, - { 0x0700, 0x1761, 0x0000 }, - { 0x0700, 0x1763, 0x0000 }, - { 0x8700, 0x176c, 0x4000 }, - { 0x8700, 0x1768, 0x3000 }, - { 0x8700, 0x1766, 0x2000 }, - { 0x0700, 0x1765, 0x0000 }, - { 0x0700, 0x1767, 0x0000 }, - { 0x8700, 0x176a, 0x2000 }, - { 0x0700, 0x1769, 0x0000 }, - { 0x0700, 0x176b, 0x0000 }, - { 0x8c00, 0x1772, 0x3000 }, - { 0x8700, 0x176f, 0x2000 }, - { 0x0700, 0x176e, 0x0000 }, - { 0x0700, 0x1770, 0x0000 }, - { 0x8700, 0x1780, 0x2000 }, - { 0x0c00, 0x1773, 0x0000 }, - { 0x0700, 0x1781, 0x0000 }, - { 0x8700, 0x1792, 0x5000 }, - { 0x8700, 0x178a, 0x4000 }, - { 0x8700, 0x1786, 0x3000 }, - { 0x8700, 0x1784, 0x2000 }, - { 0x0700, 0x1783, 0x0000 }, - { 0x0700, 0x1785, 0x0000 }, - { 0x8700, 0x1788, 0x2000 }, - { 0x0700, 0x1787, 0x0000 }, - { 0x0700, 0x1789, 0x0000 }, - { 0x8700, 0x178e, 0x3000 }, - { 0x8700, 0x178c, 0x2000 }, - { 0x0700, 0x178b, 0x0000 }, - { 0x0700, 0x178d, 0x0000 }, - { 0x8700, 0x1790, 0x2000 }, - { 0x0700, 0x178f, 0x0000 }, - { 0x0700, 0x1791, 0x0000 }, - { 0x8700, 0x179a, 0x4000 }, - { 0x8700, 0x1796, 0x3000 }, - { 0x8700, 0x1794, 0x2000 }, - { 0x0700, 0x1793, 0x0000 }, - { 0x0700, 0x1795, 0x0000 }, - { 0x8700, 0x1798, 0x2000 }, - { 0x0700, 0x1797, 0x0000 }, - { 0x0700, 0x1799, 0x0000 }, - { 0x8700, 0x179e, 0x3000 }, - { 0x8700, 0x179c, 0x2000 }, - { 0x0700, 0x179b, 0x0000 }, - { 0x0700, 0x179d, 0x0000 }, - { 0x8700, 0x17a0, 0x2000 }, - { 0x0700, 0x179f, 0x0000 }, - { 0x0700, 0x17a1, 0x0000 }, - { 0x8700, 0x1915, 0x9000 }, - { 0x8700, 0x1837, 0x8000 }, - { 0x8d00, 0x17e4, 0x7000 }, - { 0x8a00, 0x17c2, 0x6000 }, - { 0x8700, 0x17b2, 0x5000 }, - { 0x8700, 0x17aa, 0x4000 }, - { 0x8700, 0x17a6, 0x3000 }, - { 0x8700, 0x17a4, 0x2000 }, - { 0x0700, 0x17a3, 0x0000 }, - { 0x0700, 0x17a5, 0x0000 }, - { 0x8700, 0x17a8, 0x2000 }, - { 0x0700, 0x17a7, 0x0000 }, - { 0x0700, 0x17a9, 0x0000 }, - { 0x8700, 0x17ae, 0x3000 }, - { 0x8700, 0x17ac, 0x2000 }, - { 0x0700, 0x17ab, 0x0000 }, - { 0x0700, 0x17ad, 0x0000 }, - { 0x8700, 0x17b0, 0x2000 }, - { 0x0700, 0x17af, 0x0000 }, - { 0x0700, 0x17b1, 0x0000 }, - { 0x8c00, 0x17ba, 0x4000 }, - { 0x8a00, 0x17b6, 0x3000 }, - { 0x8100, 0x17b4, 0x2000 }, - { 0x0700, 0x17b3, 0x0000 }, - { 0x0100, 0x17b5, 0x0000 }, - { 0x8c00, 0x17b8, 0x2000 }, - { 0x0c00, 0x17b7, 0x0000 }, - { 0x0c00, 0x17b9, 0x0000 }, - { 0x8a00, 0x17be, 0x3000 }, - { 0x8c00, 0x17bc, 0x2000 }, - { 0x0c00, 0x17bb, 0x0000 }, - { 0x0c00, 0x17bd, 0x0000 }, - { 0x8a00, 0x17c0, 0x2000 }, - { 0x0a00, 0x17bf, 0x0000 }, - { 0x0a00, 0x17c1, 0x0000 }, - { 0x8c00, 0x17d2, 0x5000 }, - { 0x8c00, 0x17ca, 0x4000 }, - { 0x8c00, 0x17c6, 0x3000 }, - { 0x8a00, 0x17c4, 0x2000 }, - { 0x0a00, 0x17c3, 0x0000 }, - { 0x0a00, 0x17c5, 0x0000 }, - { 0x8a00, 0x17c8, 0x2000 }, - { 0x0a00, 0x17c7, 0x0000 }, - { 0x0c00, 0x17c9, 0x0000 }, - { 0x8c00, 0x17ce, 0x3000 }, - { 0x8c00, 0x17cc, 0x2000 }, - { 0x0c00, 0x17cb, 0x0000 }, - { 0x0c00, 0x17cd, 0x0000 }, - { 0x8c00, 0x17d0, 0x2000 }, - { 0x0c00, 0x17cf, 0x0000 }, - { 0x0c00, 0x17d1, 0x0000 }, - { 0x9500, 0x17da, 0x4000 }, - { 0x9500, 0x17d6, 0x3000 }, - { 0x9500, 0x17d4, 0x2000 }, - { 0x0c00, 0x17d3, 0x0000 }, - { 0x1500, 0x17d5, 0x0000 }, - { 0x9500, 0x17d8, 0x2000 }, - { 0x0600, 0x17d7, 0x0000 }, - { 0x1500, 0x17d9, 0x0000 }, - { 0x8d00, 0x17e0, 0x3000 }, - { 0x8700, 0x17dc, 0x2000 }, - { 0x1700, 0x17db, 0x0000 }, - { 0x0c00, 0x17dd, 0x0000 }, - { 0x8d00, 0x17e2, 0x2000 }, - { 0x0d00, 0x17e1, 0x0000 }, - { 0x0d00, 0x17e3, 0x0000 }, - { 0x8d00, 0x1811, 0x6000 }, - { 0x9500, 0x1800, 0x5000 }, - { 0x8f00, 0x17f2, 0x4000 }, - { 0x8d00, 0x17e8, 0x3000 }, - { 0x8d00, 0x17e6, 0x2000 }, - { 0x0d00, 0x17e5, 0x0000 }, - { 0x0d00, 0x17e7, 0x0000 }, - { 0x8f00, 0x17f0, 0x2000 }, - { 0x0d00, 0x17e9, 0x0000 }, - { 0x0f00, 0x17f1, 0x0000 }, - { 0x8f00, 0x17f6, 0x3000 }, - { 0x8f00, 0x17f4, 0x2000 }, - { 0x0f00, 0x17f3, 0x0000 }, - { 0x0f00, 0x17f5, 0x0000 }, - { 0x8f00, 0x17f8, 0x2000 }, - { 0x0f00, 0x17f7, 0x0000 }, - { 0x0f00, 0x17f9, 0x0000 }, - { 0x9500, 0x1808, 0x4000 }, - { 0x9500, 0x1804, 0x3000 }, - { 0x9500, 0x1802, 0x2000 }, - { 0x1500, 0x1801, 0x0000 }, - { 0x1500, 0x1803, 0x0000 }, - { 0x9100, 0x1806, 0x2000 }, - { 0x1500, 0x1805, 0x0000 }, - { 0x1500, 0x1807, 0x0000 }, - { 0x8c00, 0x180c, 0x3000 }, - { 0x9500, 0x180a, 0x2000 }, - { 0x1500, 0x1809, 0x0000 }, - { 0x0c00, 0x180b, 0x0000 }, - { 0x9d00, 0x180e, 0x2000 }, - { 0x0c00, 0x180d, 0x0000 }, - { 0x0d00, 0x1810, 0x0000 }, - { 0x8700, 0x1827, 0x5000 }, - { 0x8d00, 0x1819, 0x4000 }, - { 0x8d00, 0x1815, 0x3000 }, - { 0x8d00, 0x1813, 0x2000 }, - { 0x0d00, 0x1812, 0x0000 }, - { 0x0d00, 0x1814, 0x0000 }, - { 0x8d00, 0x1817, 0x2000 }, - { 0x0d00, 0x1816, 0x0000 }, - { 0x0d00, 0x1818, 0x0000 }, - { 0x8700, 0x1823, 0x3000 }, - { 0x8700, 0x1821, 0x2000 }, - { 0x0700, 0x1820, 0x0000 }, - { 0x0700, 0x1822, 0x0000 }, - { 0x8700, 0x1825, 0x2000 }, - { 0x0700, 0x1824, 0x0000 }, - { 0x0700, 0x1826, 0x0000 }, - { 0x8700, 0x182f, 0x4000 }, - { 0x8700, 0x182b, 0x3000 }, - { 0x8700, 0x1829, 0x2000 }, - { 0x0700, 0x1828, 0x0000 }, - { 0x0700, 0x182a, 0x0000 }, - { 0x8700, 0x182d, 0x2000 }, - { 0x0700, 0x182c, 0x0000 }, - { 0x0700, 0x182e, 0x0000 }, - { 0x8700, 0x1833, 0x3000 }, - { 0x8700, 0x1831, 0x2000 }, - { 0x0700, 0x1830, 0x0000 }, - { 0x0700, 0x1832, 0x0000 }, - { 0x8700, 0x1835, 0x2000 }, - { 0x0700, 0x1834, 0x0000 }, - { 0x0700, 0x1836, 0x0000 }, - { 0x8700, 0x1877, 0x7000 }, - { 0x8700, 0x1857, 0x6000 }, - { 0x8700, 0x1847, 0x5000 }, - { 0x8700, 0x183f, 0x4000 }, - { 0x8700, 0x183b, 0x3000 }, - { 0x8700, 0x1839, 0x2000 }, - { 0x0700, 0x1838, 0x0000 }, - { 0x0700, 0x183a, 0x0000 }, - { 0x8700, 0x183d, 0x2000 }, - { 0x0700, 0x183c, 0x0000 }, - { 0x0700, 0x183e, 0x0000 }, - { 0x8600, 0x1843, 0x3000 }, - { 0x8700, 0x1841, 0x2000 }, - { 0x0700, 0x1840, 0x0000 }, - { 0x0700, 0x1842, 0x0000 }, - { 0x8700, 0x1845, 0x2000 }, - { 0x0700, 0x1844, 0x0000 }, - { 0x0700, 0x1846, 0x0000 }, - { 0x8700, 0x184f, 0x4000 }, - { 0x8700, 0x184b, 0x3000 }, - { 0x8700, 0x1849, 0x2000 }, - { 0x0700, 0x1848, 0x0000 }, - { 0x0700, 0x184a, 0x0000 }, - { 0x8700, 0x184d, 0x2000 }, - { 0x0700, 0x184c, 0x0000 }, - { 0x0700, 0x184e, 0x0000 }, - { 0x8700, 0x1853, 0x3000 }, - { 0x8700, 0x1851, 0x2000 }, - { 0x0700, 0x1850, 0x0000 }, - { 0x0700, 0x1852, 0x0000 }, - { 0x8700, 0x1855, 0x2000 }, - { 0x0700, 0x1854, 0x0000 }, - { 0x0700, 0x1856, 0x0000 }, - { 0x8700, 0x1867, 0x5000 }, - { 0x8700, 0x185f, 0x4000 }, - { 0x8700, 0x185b, 0x3000 }, - { 0x8700, 0x1859, 0x2000 }, - { 0x0700, 0x1858, 0x0000 }, - { 0x0700, 0x185a, 0x0000 }, - { 0x8700, 0x185d, 0x2000 }, - { 0x0700, 0x185c, 0x0000 }, - { 0x0700, 0x185e, 0x0000 }, - { 0x8700, 0x1863, 0x3000 }, - { 0x8700, 0x1861, 0x2000 }, - { 0x0700, 0x1860, 0x0000 }, - { 0x0700, 0x1862, 0x0000 }, - { 0x8700, 0x1865, 0x2000 }, - { 0x0700, 0x1864, 0x0000 }, - { 0x0700, 0x1866, 0x0000 }, - { 0x8700, 0x186f, 0x4000 }, - { 0x8700, 0x186b, 0x3000 }, - { 0x8700, 0x1869, 0x2000 }, - { 0x0700, 0x1868, 0x0000 }, - { 0x0700, 0x186a, 0x0000 }, - { 0x8700, 0x186d, 0x2000 }, - { 0x0700, 0x186c, 0x0000 }, - { 0x0700, 0x186e, 0x0000 }, - { 0x8700, 0x1873, 0x3000 }, - { 0x8700, 0x1871, 0x2000 }, - { 0x0700, 0x1870, 0x0000 }, - { 0x0700, 0x1872, 0x0000 }, - { 0x8700, 0x1875, 0x2000 }, - { 0x0700, 0x1874, 0x0000 }, - { 0x0700, 0x1876, 0x0000 }, - { 0x8700, 0x189f, 0x6000 }, - { 0x8700, 0x188f, 0x5000 }, - { 0x8700, 0x1887, 0x4000 }, - { 0x8700, 0x1883, 0x3000 }, - { 0x8700, 0x1881, 0x2000 }, - { 0x0700, 0x1880, 0x0000 }, - { 0x0700, 0x1882, 0x0000 }, - { 0x8700, 0x1885, 0x2000 }, - { 0x0700, 0x1884, 0x0000 }, - { 0x0700, 0x1886, 0x0000 }, - { 0x8700, 0x188b, 0x3000 }, - { 0x8700, 0x1889, 0x2000 }, - { 0x0700, 0x1888, 0x0000 }, - { 0x0700, 0x188a, 0x0000 }, - { 0x8700, 0x188d, 0x2000 }, - { 0x0700, 0x188c, 0x0000 }, - { 0x0700, 0x188e, 0x0000 }, - { 0x8700, 0x1897, 0x4000 }, - { 0x8700, 0x1893, 0x3000 }, - { 0x8700, 0x1891, 0x2000 }, - { 0x0700, 0x1890, 0x0000 }, - { 0x0700, 0x1892, 0x0000 }, - { 0x8700, 0x1895, 0x2000 }, - { 0x0700, 0x1894, 0x0000 }, - { 0x0700, 0x1896, 0x0000 }, - { 0x8700, 0x189b, 0x3000 }, - { 0x8700, 0x1899, 0x2000 }, - { 0x0700, 0x1898, 0x0000 }, - { 0x0700, 0x189a, 0x0000 }, - { 0x8700, 0x189d, 0x2000 }, - { 0x0700, 0x189c, 0x0000 }, - { 0x0700, 0x189e, 0x0000 }, - { 0x8700, 0x1905, 0x5000 }, - { 0x8700, 0x18a7, 0x4000 }, - { 0x8700, 0x18a3, 0x3000 }, - { 0x8700, 0x18a1, 0x2000 }, - { 0x0700, 0x18a0, 0x0000 }, - { 0x0700, 0x18a2, 0x0000 }, - { 0x8700, 0x18a5, 0x2000 }, - { 0x0700, 0x18a4, 0x0000 }, - { 0x0700, 0x18a6, 0x0000 }, - { 0x8700, 0x1901, 0x3000 }, - { 0x8c00, 0x18a9, 0x2000 }, - { 0x0700, 0x18a8, 0x0000 }, - { 0x0700, 0x1900, 0x0000 }, - { 0x8700, 0x1903, 0x2000 }, - { 0x0700, 0x1902, 0x0000 }, - { 0x0700, 0x1904, 0x0000 }, - { 0x8700, 0x190d, 0x4000 }, - { 0x8700, 0x1909, 0x3000 }, - { 0x8700, 0x1907, 0x2000 }, - { 0x0700, 0x1906, 0x0000 }, - { 0x0700, 0x1908, 0x0000 }, - { 0x8700, 0x190b, 0x2000 }, - { 0x0700, 0x190a, 0x0000 }, - { 0x0700, 0x190c, 0x0000 }, - { 0x8700, 0x1911, 0x3000 }, - { 0x8700, 0x190f, 0x2000 }, - { 0x0700, 0x190e, 0x0000 }, - { 0x0700, 0x1910, 0x0000 }, - { 0x8700, 0x1913, 0x2000 }, - { 0x0700, 0x1912, 0x0000 }, - { 0x0700, 0x1914, 0x0000 }, - { 0x8500, 0x1d10, 0x8000 }, - { 0x8700, 0x1963, 0x7000 }, - { 0x9a00, 0x1940, 0x6000 }, - { 0x8c00, 0x1928, 0x5000 }, - { 0x8c00, 0x1920, 0x4000 }, - { 0x8700, 0x1919, 0x3000 }, - { 0x8700, 0x1917, 0x2000 }, - { 0x0700, 0x1916, 0x0000 }, - { 0x0700, 0x1918, 0x0000 }, - { 0x8700, 0x191b, 0x2000 }, - { 0x0700, 0x191a, 0x0000 }, - { 0x0700, 0x191c, 0x0000 }, - { 0x8a00, 0x1924, 0x3000 }, - { 0x8c00, 0x1922, 0x2000 }, - { 0x0c00, 0x1921, 0x0000 }, - { 0x0a00, 0x1923, 0x0000 }, - { 0x8a00, 0x1926, 0x2000 }, - { 0x0a00, 0x1925, 0x0000 }, - { 0x0c00, 0x1927, 0x0000 }, - { 0x8a00, 0x1934, 0x4000 }, - { 0x8a00, 0x1930, 0x3000 }, - { 0x8a00, 0x192a, 0x2000 }, - { 0x0a00, 0x1929, 0x0000 }, - { 0x0a00, 0x192b, 0x0000 }, - { 0x8c00, 0x1932, 0x2000 }, - { 0x0a00, 0x1931, 0x0000 }, - { 0x0a00, 0x1933, 0x0000 }, - { 0x8a00, 0x1938, 0x3000 }, - { 0x8a00, 0x1936, 0x2000 }, - { 0x0a00, 0x1935, 0x0000 }, - { 0x0a00, 0x1937, 0x0000 }, - { 0x8c00, 0x193a, 0x2000 }, - { 0x0c00, 0x1939, 0x0000 }, - { 0x0c00, 0x193b, 0x0000 }, - { 0x8700, 0x1953, 0x5000 }, - { 0x8d00, 0x194b, 0x4000 }, - { 0x8d00, 0x1947, 0x3000 }, - { 0x9500, 0x1945, 0x2000 }, - { 0x1500, 0x1944, 0x0000 }, - { 0x0d00, 0x1946, 0x0000 }, - { 0x8d00, 0x1949, 0x2000 }, - { 0x0d00, 0x1948, 0x0000 }, - { 0x0d00, 0x194a, 0x0000 }, - { 0x8d00, 0x194f, 0x3000 }, - { 0x8d00, 0x194d, 0x2000 }, - { 0x0d00, 0x194c, 0x0000 }, - { 0x0d00, 0x194e, 0x0000 }, - { 0x8700, 0x1951, 0x2000 }, - { 0x0700, 0x1950, 0x0000 }, - { 0x0700, 0x1952, 0x0000 }, - { 0x8700, 0x195b, 0x4000 }, - { 0x8700, 0x1957, 0x3000 }, - { 0x8700, 0x1955, 0x2000 }, - { 0x0700, 0x1954, 0x0000 }, - { 0x0700, 0x1956, 0x0000 }, - { 0x8700, 0x1959, 0x2000 }, - { 0x0700, 0x1958, 0x0000 }, - { 0x0700, 0x195a, 0x0000 }, - { 0x8700, 0x195f, 0x3000 }, - { 0x8700, 0x195d, 0x2000 }, - { 0x0700, 0x195c, 0x0000 }, - { 0x0700, 0x195e, 0x0000 }, - { 0x8700, 0x1961, 0x2000 }, - { 0x0700, 0x1960, 0x0000 }, - { 0x0700, 0x1962, 0x0000 }, - { 0x9a00, 0x19f0, 0x6000 }, - { 0x9a00, 0x19e0, 0x5000 }, - { 0x8700, 0x196b, 0x4000 }, - { 0x8700, 0x1967, 0x3000 }, - { 0x8700, 0x1965, 0x2000 }, - { 0x0700, 0x1964, 0x0000 }, - { 0x0700, 0x1966, 0x0000 }, - { 0x8700, 0x1969, 0x2000 }, - { 0x0700, 0x1968, 0x0000 }, - { 0x0700, 0x196a, 0x0000 }, - { 0x8700, 0x1971, 0x3000 }, - { 0x8700, 0x196d, 0x2000 }, - { 0x0700, 0x196c, 0x0000 }, - { 0x0700, 0x1970, 0x0000 }, - { 0x8700, 0x1973, 0x2000 }, - { 0x0700, 0x1972, 0x0000 }, - { 0x0700, 0x1974, 0x0000 }, - { 0x9a00, 0x19e8, 0x4000 }, - { 0x9a00, 0x19e4, 0x3000 }, - { 0x9a00, 0x19e2, 0x2000 }, - { 0x1a00, 0x19e1, 0x0000 }, - { 0x1a00, 0x19e3, 0x0000 }, - { 0x9a00, 0x19e6, 0x2000 }, - { 0x1a00, 0x19e5, 0x0000 }, - { 0x1a00, 0x19e7, 0x0000 }, - { 0x9a00, 0x19ec, 0x3000 }, - { 0x9a00, 0x19ea, 0x2000 }, - { 0x1a00, 0x19e9, 0x0000 }, - { 0x1a00, 0x19eb, 0x0000 }, - { 0x9a00, 0x19ee, 0x2000 }, - { 0x1a00, 0x19ed, 0x0000 }, - { 0x1a00, 0x19ef, 0x0000 }, - { 0x8500, 0x1d00, 0x5000 }, - { 0x9a00, 0x19f8, 0x4000 }, - { 0x9a00, 0x19f4, 0x3000 }, - { 0x9a00, 0x19f2, 0x2000 }, - { 0x1a00, 0x19f1, 0x0000 }, - { 0x1a00, 0x19f3, 0x0000 }, - { 0x9a00, 0x19f6, 0x2000 }, - { 0x1a00, 0x19f5, 0x0000 }, - { 0x1a00, 0x19f7, 0x0000 }, - { 0x9a00, 0x19fc, 0x3000 }, - { 0x9a00, 0x19fa, 0x2000 }, - { 0x1a00, 0x19f9, 0x0000 }, - { 0x1a00, 0x19fb, 0x0000 }, - { 0x9a00, 0x19fe, 0x2000 }, - { 0x1a00, 0x19fd, 0x0000 }, - { 0x1a00, 0x19ff, 0x0000 }, - { 0x8500, 0x1d08, 0x4000 }, - { 0x8500, 0x1d04, 0x3000 }, - { 0x8500, 0x1d02, 0x2000 }, - { 0x0500, 0x1d01, 0x0000 }, - { 0x0500, 0x1d03, 0x0000 }, - { 0x8500, 0x1d06, 0x2000 }, - { 0x0500, 0x1d05, 0x0000 }, - { 0x0500, 0x1d07, 0x0000 }, - { 0x8500, 0x1d0c, 0x3000 }, - { 0x8500, 0x1d0a, 0x2000 }, - { 0x0500, 0x1d09, 0x0000 }, - { 0x0500, 0x1d0b, 0x0000 }, - { 0x8500, 0x1d0e, 0x2000 }, - { 0x0500, 0x1d0d, 0x0000 }, - { 0x0500, 0x1d0f, 0x0000 }, - { 0x8600, 0x1d50, 0x7000 }, - { 0x8600, 0x1d30, 0x6000 }, - { 0x8500, 0x1d20, 0x5000 }, - { 0x8500, 0x1d18, 0x4000 }, - { 0x8500, 0x1d14, 0x3000 }, - { 0x8500, 0x1d12, 0x2000 }, - { 0x0500, 0x1d11, 0x0000 }, - { 0x0500, 0x1d13, 0x0000 }, - { 0x8500, 0x1d16, 0x2000 }, - { 0x0500, 0x1d15, 0x0000 }, - { 0x0500, 0x1d17, 0x0000 }, - { 0x8500, 0x1d1c, 0x3000 }, - { 0x8500, 0x1d1a, 0x2000 }, - { 0x0500, 0x1d19, 0x0000 }, - { 0x0500, 0x1d1b, 0x0000 }, - { 0x8500, 0x1d1e, 0x2000 }, - { 0x0500, 0x1d1d, 0x0000 }, - { 0x0500, 0x1d1f, 0x0000 }, - { 0x8500, 0x1d28, 0x4000 }, - { 0x8500, 0x1d24, 0x3000 }, - { 0x8500, 0x1d22, 0x2000 }, - { 0x0500, 0x1d21, 0x0000 }, - { 0x0500, 0x1d23, 0x0000 }, - { 0x8500, 0x1d26, 0x2000 }, - { 0x0500, 0x1d25, 0x0000 }, - { 0x0500, 0x1d27, 0x0000 }, - { 0x8600, 0x1d2c, 0x3000 }, - { 0x8500, 0x1d2a, 0x2000 }, - { 0x0500, 0x1d29, 0x0000 }, - { 0x0500, 0x1d2b, 0x0000 }, - { 0x8600, 0x1d2e, 0x2000 }, - { 0x0600, 0x1d2d, 0x0000 }, - { 0x0600, 0x1d2f, 0x0000 }, - { 0x8600, 0x1d40, 0x5000 }, - { 0x8600, 0x1d38, 0x4000 }, - { 0x8600, 0x1d34, 0x3000 }, - { 0x8600, 0x1d32, 0x2000 }, - { 0x0600, 0x1d31, 0x0000 }, - { 0x0600, 0x1d33, 0x0000 }, - { 0x8600, 0x1d36, 0x2000 }, - { 0x0600, 0x1d35, 0x0000 }, - { 0x0600, 0x1d37, 0x0000 }, - { 0x8600, 0x1d3c, 0x3000 }, - { 0x8600, 0x1d3a, 0x2000 }, - { 0x0600, 0x1d39, 0x0000 }, - { 0x0600, 0x1d3b, 0x0000 }, - { 0x8600, 0x1d3e, 0x2000 }, - { 0x0600, 0x1d3d, 0x0000 }, - { 0x0600, 0x1d3f, 0x0000 }, - { 0x8600, 0x1d48, 0x4000 }, - { 0x8600, 0x1d44, 0x3000 }, - { 0x8600, 0x1d42, 0x2000 }, - { 0x0600, 0x1d41, 0x0000 }, - { 0x0600, 0x1d43, 0x0000 }, - { 0x8600, 0x1d46, 0x2000 }, - { 0x0600, 0x1d45, 0x0000 }, - { 0x0600, 0x1d47, 0x0000 }, - { 0x8600, 0x1d4c, 0x3000 }, - { 0x8600, 0x1d4a, 0x2000 }, - { 0x0600, 0x1d49, 0x0000 }, - { 0x0600, 0x1d4b, 0x0000 }, - { 0x8600, 0x1d4e, 0x2000 }, - { 0x0600, 0x1d4d, 0x0000 }, - { 0x0600, 0x1d4f, 0x0000 }, - { 0x8900, 0x1e04, 0x6001 }, - { 0x8600, 0x1d60, 0x5000 }, - { 0x8600, 0x1d58, 0x4000 }, - { 0x8600, 0x1d54, 0x3000 }, - { 0x8600, 0x1d52, 0x2000 }, - { 0x0600, 0x1d51, 0x0000 }, - { 0x0600, 0x1d53, 0x0000 }, - { 0x8600, 0x1d56, 0x2000 }, - { 0x0600, 0x1d55, 0x0000 }, - { 0x0600, 0x1d57, 0x0000 }, - { 0x8600, 0x1d5c, 0x3000 }, - { 0x8600, 0x1d5a, 0x2000 }, - { 0x0600, 0x1d59, 0x0000 }, - { 0x0600, 0x1d5b, 0x0000 }, - { 0x8600, 0x1d5e, 0x2000 }, - { 0x0600, 0x1d5d, 0x0000 }, - { 0x0600, 0x1d5f, 0x0000 }, - { 0x8500, 0x1d68, 0x4000 }, - { 0x8500, 0x1d64, 0x3000 }, - { 0x8500, 0x1d62, 0x2000 }, - { 0x0600, 0x1d61, 0x0000 }, - { 0x0500, 0x1d63, 0x0000 }, - { 0x8500, 0x1d66, 0x2000 }, - { 0x0500, 0x1d65, 0x0000 }, - { 0x0500, 0x1d67, 0x0000 }, - { 0x8900, 0x1e00, 0x3001 }, - { 0x8500, 0x1d6a, 0x2000 }, - { 0x0500, 0x1d69, 0x0000 }, - { 0x0500, 0x1d6b, 0x0000 }, - { 0x8900, 0x1e02, 0x2001 }, - { 0x0500, 0x1e01, 0x0fff }, - { 0x0500, 0x1e03, 0x0fff }, - { 0x8900, 0x1e14, 0x5001 }, - { 0x8900, 0x1e0c, 0x4001 }, - { 0x8900, 0x1e08, 0x3001 }, - { 0x8900, 0x1e06, 0x2001 }, - { 0x0500, 0x1e05, 0x0fff }, - { 0x0500, 0x1e07, 0x0fff }, - { 0x8900, 0x1e0a, 0x2001 }, - { 0x0500, 0x1e09, 0x0fff }, - { 0x0500, 0x1e0b, 0x0fff }, - { 0x8900, 0x1e10, 0x3001 }, - { 0x8900, 0x1e0e, 0x2001 }, - { 0x0500, 0x1e0d, 0x0fff }, - { 0x0500, 0x1e0f, 0x0fff }, - { 0x8900, 0x1e12, 0x2001 }, - { 0x0500, 0x1e11, 0x0fff }, - { 0x0500, 0x1e13, 0x0fff }, - { 0x8900, 0x1e1c, 0x4001 }, - { 0x8900, 0x1e18, 0x3001 }, - { 0x8900, 0x1e16, 0x2001 }, - { 0x0500, 0x1e15, 0x0fff }, - { 0x0500, 0x1e17, 0x0fff }, - { 0x8900, 0x1e1a, 0x2001 }, - { 0x0500, 0x1e19, 0x0fff }, - { 0x0500, 0x1e1b, 0x0fff }, - { 0x8900, 0x1e20, 0x3001 }, - { 0x8900, 0x1e1e, 0x2001 }, - { 0x0500, 0x1e1d, 0x0fff }, - { 0x0500, 0x1e1f, 0x0fff }, - { 0x8900, 0x1e22, 0x2001 }, - { 0x0500, 0x1e21, 0x0fff }, - { 0x0500, 0x1e23, 0x0fff }, - { 0x9600, 0x2045, 0xa000 }, - { 0x8500, 0x1f32, 0x9008 }, - { 0x8900, 0x1ea8, 0x8001 }, - { 0x8900, 0x1e64, 0x7001 }, - { 0x8900, 0x1e44, 0x6001 }, - { 0x8900, 0x1e34, 0x5001 }, - { 0x8900, 0x1e2c, 0x4001 }, - { 0x8900, 0x1e28, 0x3001 }, - { 0x8900, 0x1e26, 0x2001 }, - { 0x0500, 0x1e25, 0x0fff }, - { 0x0500, 0x1e27, 0x0fff }, - { 0x8900, 0x1e2a, 0x2001 }, - { 0x0500, 0x1e29, 0x0fff }, - { 0x0500, 0x1e2b, 0x0fff }, - { 0x8900, 0x1e30, 0x3001 }, - { 0x8900, 0x1e2e, 0x2001 }, - { 0x0500, 0x1e2d, 0x0fff }, - { 0x0500, 0x1e2f, 0x0fff }, - { 0x8900, 0x1e32, 0x2001 }, - { 0x0500, 0x1e31, 0x0fff }, - { 0x0500, 0x1e33, 0x0fff }, - { 0x8900, 0x1e3c, 0x4001 }, - { 0x8900, 0x1e38, 0x3001 }, - { 0x8900, 0x1e36, 0x2001 }, - { 0x0500, 0x1e35, 0x0fff }, - { 0x0500, 0x1e37, 0x0fff }, - { 0x8900, 0x1e3a, 0x2001 }, - { 0x0500, 0x1e39, 0x0fff }, - { 0x0500, 0x1e3b, 0x0fff }, - { 0x8900, 0x1e40, 0x3001 }, - { 0x8900, 0x1e3e, 0x2001 }, - { 0x0500, 0x1e3d, 0x0fff }, - { 0x0500, 0x1e3f, 0x0fff }, - { 0x8900, 0x1e42, 0x2001 }, - { 0x0500, 0x1e41, 0x0fff }, - { 0x0500, 0x1e43, 0x0fff }, - { 0x8900, 0x1e54, 0x5001 }, - { 0x8900, 0x1e4c, 0x4001 }, - { 0x8900, 0x1e48, 0x3001 }, - { 0x8900, 0x1e46, 0x2001 }, - { 0x0500, 0x1e45, 0x0fff }, - { 0x0500, 0x1e47, 0x0fff }, - { 0x8900, 0x1e4a, 0x2001 }, - { 0x0500, 0x1e49, 0x0fff }, - { 0x0500, 0x1e4b, 0x0fff }, - { 0x8900, 0x1e50, 0x3001 }, - { 0x8900, 0x1e4e, 0x2001 }, - { 0x0500, 0x1e4d, 0x0fff }, - { 0x0500, 0x1e4f, 0x0fff }, - { 0x8900, 0x1e52, 0x2001 }, - { 0x0500, 0x1e51, 0x0fff }, - { 0x0500, 0x1e53, 0x0fff }, - { 0x8900, 0x1e5c, 0x4001 }, - { 0x8900, 0x1e58, 0x3001 }, - { 0x8900, 0x1e56, 0x2001 }, - { 0x0500, 0x1e55, 0x0fff }, - { 0x0500, 0x1e57, 0x0fff }, - { 0x8900, 0x1e5a, 0x2001 }, - { 0x0500, 0x1e59, 0x0fff }, - { 0x0500, 0x1e5b, 0x0fff }, - { 0x8900, 0x1e60, 0x3001 }, - { 0x8900, 0x1e5e, 0x2001 }, - { 0x0500, 0x1e5d, 0x0fff }, - { 0x0500, 0x1e5f, 0x0fff }, - { 0x8900, 0x1e62, 0x2001 }, - { 0x0500, 0x1e61, 0x0fff }, - { 0x0500, 0x1e63, 0x0fff }, - { 0x8900, 0x1e84, 0x6001 }, - { 0x8900, 0x1e74, 0x5001 }, - { 0x8900, 0x1e6c, 0x4001 }, - { 0x8900, 0x1e68, 0x3001 }, - { 0x8900, 0x1e66, 0x2001 }, - { 0x0500, 0x1e65, 0x0fff }, - { 0x0500, 0x1e67, 0x0fff }, - { 0x8900, 0x1e6a, 0x2001 }, - { 0x0500, 0x1e69, 0x0fff }, - { 0x0500, 0x1e6b, 0x0fff }, - { 0x8900, 0x1e70, 0x3001 }, - { 0x8900, 0x1e6e, 0x2001 }, - { 0x0500, 0x1e6d, 0x0fff }, - { 0x0500, 0x1e6f, 0x0fff }, - { 0x8900, 0x1e72, 0x2001 }, - { 0x0500, 0x1e71, 0x0fff }, - { 0x0500, 0x1e73, 0x0fff }, - { 0x8900, 0x1e7c, 0x4001 }, - { 0x8900, 0x1e78, 0x3001 }, - { 0x8900, 0x1e76, 0x2001 }, - { 0x0500, 0x1e75, 0x0fff }, - { 0x0500, 0x1e77, 0x0fff }, - { 0x8900, 0x1e7a, 0x2001 }, - { 0x0500, 0x1e79, 0x0fff }, - { 0x0500, 0x1e7b, 0x0fff }, - { 0x8900, 0x1e80, 0x3001 }, - { 0x8900, 0x1e7e, 0x2001 }, - { 0x0500, 0x1e7d, 0x0fff }, - { 0x0500, 0x1e7f, 0x0fff }, - { 0x8900, 0x1e82, 0x2001 }, - { 0x0500, 0x1e81, 0x0fff }, - { 0x0500, 0x1e83, 0x0fff }, - { 0x8900, 0x1e94, 0x5001 }, - { 0x8900, 0x1e8c, 0x4001 }, - { 0x8900, 0x1e88, 0x3001 }, - { 0x8900, 0x1e86, 0x2001 }, - { 0x0500, 0x1e85, 0x0fff }, - { 0x0500, 0x1e87, 0x0fff }, - { 0x8900, 0x1e8a, 0x2001 }, - { 0x0500, 0x1e89, 0x0fff }, - { 0x0500, 0x1e8b, 0x0fff }, - { 0x8900, 0x1e90, 0x3001 }, - { 0x8900, 0x1e8e, 0x2001 }, - { 0x0500, 0x1e8d, 0x0fff }, - { 0x0500, 0x1e8f, 0x0fff }, - { 0x8900, 0x1e92, 0x2001 }, - { 0x0500, 0x1e91, 0x0fff }, - { 0x0500, 0x1e93, 0x0fff }, - { 0x8900, 0x1ea0, 0x4001 }, - { 0x8500, 0x1e98, 0x3000 }, - { 0x8500, 0x1e96, 0x2000 }, - { 0x0500, 0x1e95, 0x0fff }, - { 0x0500, 0x1e97, 0x0000 }, - { 0x8500, 0x1e9a, 0x2000 }, - { 0x0500, 0x1e99, 0x0000 }, - { 0x0500, 0x1e9b, 0x0fc5 }, - { 0x8900, 0x1ea4, 0x3001 }, - { 0x8900, 0x1ea2, 0x2001 }, - { 0x0500, 0x1ea1, 0x0fff }, - { 0x0500, 0x1ea3, 0x0fff }, - { 0x8900, 0x1ea6, 0x2001 }, - { 0x0500, 0x1ea5, 0x0fff }, - { 0x0500, 0x1ea7, 0x0fff }, - { 0x8900, 0x1ee8, 0x7001 }, - { 0x8900, 0x1ec8, 0x6001 }, - { 0x8900, 0x1eb8, 0x5001 }, - { 0x8900, 0x1eb0, 0x4001 }, - { 0x8900, 0x1eac, 0x3001 }, - { 0x8900, 0x1eaa, 0x2001 }, - { 0x0500, 0x1ea9, 0x0fff }, - { 0x0500, 0x1eab, 0x0fff }, - { 0x8900, 0x1eae, 0x2001 }, - { 0x0500, 0x1ead, 0x0fff }, - { 0x0500, 0x1eaf, 0x0fff }, - { 0x8900, 0x1eb4, 0x3001 }, - { 0x8900, 0x1eb2, 0x2001 }, - { 0x0500, 0x1eb1, 0x0fff }, - { 0x0500, 0x1eb3, 0x0fff }, - { 0x8900, 0x1eb6, 0x2001 }, - { 0x0500, 0x1eb5, 0x0fff }, - { 0x0500, 0x1eb7, 0x0fff }, - { 0x8900, 0x1ec0, 0x4001 }, - { 0x8900, 0x1ebc, 0x3001 }, - { 0x8900, 0x1eba, 0x2001 }, - { 0x0500, 0x1eb9, 0x0fff }, - { 0x0500, 0x1ebb, 0x0fff }, - { 0x8900, 0x1ebe, 0x2001 }, - { 0x0500, 0x1ebd, 0x0fff }, - { 0x0500, 0x1ebf, 0x0fff }, - { 0x8900, 0x1ec4, 0x3001 }, - { 0x8900, 0x1ec2, 0x2001 }, - { 0x0500, 0x1ec1, 0x0fff }, - { 0x0500, 0x1ec3, 0x0fff }, - { 0x8900, 0x1ec6, 0x2001 }, - { 0x0500, 0x1ec5, 0x0fff }, - { 0x0500, 0x1ec7, 0x0fff }, - { 0x8900, 0x1ed8, 0x5001 }, - { 0x8900, 0x1ed0, 0x4001 }, - { 0x8900, 0x1ecc, 0x3001 }, - { 0x8900, 0x1eca, 0x2001 }, - { 0x0500, 0x1ec9, 0x0fff }, - { 0x0500, 0x1ecb, 0x0fff }, - { 0x8900, 0x1ece, 0x2001 }, - { 0x0500, 0x1ecd, 0x0fff }, - { 0x0500, 0x1ecf, 0x0fff }, - { 0x8900, 0x1ed4, 0x3001 }, - { 0x8900, 0x1ed2, 0x2001 }, - { 0x0500, 0x1ed1, 0x0fff }, - { 0x0500, 0x1ed3, 0x0fff }, - { 0x8900, 0x1ed6, 0x2001 }, - { 0x0500, 0x1ed5, 0x0fff }, - { 0x0500, 0x1ed7, 0x0fff }, - { 0x8900, 0x1ee0, 0x4001 }, - { 0x8900, 0x1edc, 0x3001 }, - { 0x8900, 0x1eda, 0x2001 }, - { 0x0500, 0x1ed9, 0x0fff }, - { 0x0500, 0x1edb, 0x0fff }, - { 0x8900, 0x1ede, 0x2001 }, - { 0x0500, 0x1edd, 0x0fff }, - { 0x0500, 0x1edf, 0x0fff }, - { 0x8900, 0x1ee4, 0x3001 }, - { 0x8900, 0x1ee2, 0x2001 }, - { 0x0500, 0x1ee1, 0x0fff }, - { 0x0500, 0x1ee3, 0x0fff }, - { 0x8900, 0x1ee6, 0x2001 }, - { 0x0500, 0x1ee5, 0x0fff }, - { 0x0500, 0x1ee7, 0x0fff }, - { 0x8900, 0x1f0e, 0x6ff8 }, - { 0x8900, 0x1ef8, 0x5001 }, - { 0x8900, 0x1ef0, 0x4001 }, - { 0x8900, 0x1eec, 0x3001 }, - { 0x8900, 0x1eea, 0x2001 }, - { 0x0500, 0x1ee9, 0x0fff }, - { 0x0500, 0x1eeb, 0x0fff }, - { 0x8900, 0x1eee, 0x2001 }, - { 0x0500, 0x1eed, 0x0fff }, - { 0x0500, 0x1eef, 0x0fff }, - { 0x8900, 0x1ef4, 0x3001 }, - { 0x8900, 0x1ef2, 0x2001 }, - { 0x0500, 0x1ef1, 0x0fff }, - { 0x0500, 0x1ef3, 0x0fff }, - { 0x8900, 0x1ef6, 0x2001 }, - { 0x0500, 0x1ef5, 0x0fff }, - { 0x0500, 0x1ef7, 0x0fff }, - { 0x8500, 0x1f06, 0x4008 }, - { 0x8500, 0x1f02, 0x3008 }, - { 0x8500, 0x1f00, 0x2008 }, - { 0x0500, 0x1ef9, 0x0fff }, - { 0x0500, 0x1f01, 0x0008 }, - { 0x8500, 0x1f04, 0x2008 }, - { 0x0500, 0x1f03, 0x0008 }, - { 0x0500, 0x1f05, 0x0008 }, - { 0x8900, 0x1f0a, 0x3ff8 }, - { 0x8900, 0x1f08, 0x2ff8 }, - { 0x0500, 0x1f07, 0x0008 }, - { 0x0900, 0x1f09, 0x0ff8 }, - { 0x8900, 0x1f0c, 0x2ff8 }, - { 0x0900, 0x1f0b, 0x0ff8 }, - { 0x0900, 0x1f0d, 0x0ff8 }, - { 0x8500, 0x1f22, 0x5008 }, - { 0x8900, 0x1f18, 0x4ff8 }, - { 0x8500, 0x1f12, 0x3008 }, - { 0x8500, 0x1f10, 0x2008 }, - { 0x0900, 0x1f0f, 0x0ff8 }, - { 0x0500, 0x1f11, 0x0008 }, - { 0x8500, 0x1f14, 0x2008 }, - { 0x0500, 0x1f13, 0x0008 }, - { 0x0500, 0x1f15, 0x0008 }, - { 0x8900, 0x1f1c, 0x3ff8 }, - { 0x8900, 0x1f1a, 0x2ff8 }, - { 0x0900, 0x1f19, 0x0ff8 }, - { 0x0900, 0x1f1b, 0x0ff8 }, - { 0x8500, 0x1f20, 0x2008 }, - { 0x0900, 0x1f1d, 0x0ff8 }, - { 0x0500, 0x1f21, 0x0008 }, - { 0x8900, 0x1f2a, 0x4ff8 }, - { 0x8500, 0x1f26, 0x3008 }, - { 0x8500, 0x1f24, 0x2008 }, - { 0x0500, 0x1f23, 0x0008 }, - { 0x0500, 0x1f25, 0x0008 }, - { 0x8900, 0x1f28, 0x2ff8 }, - { 0x0500, 0x1f27, 0x0008 }, - { 0x0900, 0x1f29, 0x0ff8 }, - { 0x8900, 0x1f2e, 0x3ff8 }, - { 0x8900, 0x1f2c, 0x2ff8 }, - { 0x0900, 0x1f2b, 0x0ff8 }, - { 0x0900, 0x1f2d, 0x0ff8 }, - { 0x8500, 0x1f30, 0x2008 }, - { 0x0900, 0x1f2f, 0x0ff8 }, - { 0x0500, 0x1f31, 0x0008 }, - { 0x9800, 0x1fbd, 0x8000 }, - { 0x8500, 0x1f7a, 0x7070 }, - { 0x8500, 0x1f56, 0x6000 }, - { 0x8500, 0x1f42, 0x5008 }, - { 0x8900, 0x1f3a, 0x4ff8 }, - { 0x8500, 0x1f36, 0x3008 }, - { 0x8500, 0x1f34, 0x2008 }, - { 0x0500, 0x1f33, 0x0008 }, - { 0x0500, 0x1f35, 0x0008 }, - { 0x8900, 0x1f38, 0x2ff8 }, - { 0x0500, 0x1f37, 0x0008 }, - { 0x0900, 0x1f39, 0x0ff8 }, - { 0x8900, 0x1f3e, 0x3ff8 }, - { 0x8900, 0x1f3c, 0x2ff8 }, - { 0x0900, 0x1f3b, 0x0ff8 }, - { 0x0900, 0x1f3d, 0x0ff8 }, - { 0x8500, 0x1f40, 0x2008 }, - { 0x0900, 0x1f3f, 0x0ff8 }, - { 0x0500, 0x1f41, 0x0008 }, - { 0x8900, 0x1f4c, 0x4ff8 }, - { 0x8900, 0x1f48, 0x3ff8 }, - { 0x8500, 0x1f44, 0x2008 }, - { 0x0500, 0x1f43, 0x0008 }, - { 0x0500, 0x1f45, 0x0008 }, - { 0x8900, 0x1f4a, 0x2ff8 }, - { 0x0900, 0x1f49, 0x0ff8 }, - { 0x0900, 0x1f4b, 0x0ff8 }, - { 0x8500, 0x1f52, 0x3000 }, - { 0x8500, 0x1f50, 0x2000 }, - { 0x0900, 0x1f4d, 0x0ff8 }, - { 0x0500, 0x1f51, 0x0008 }, - { 0x8500, 0x1f54, 0x2000 }, - { 0x0500, 0x1f53, 0x0008 }, - { 0x0500, 0x1f55, 0x0008 }, - { 0x8900, 0x1f6a, 0x5ff8 }, - { 0x8500, 0x1f62, 0x4008 }, - { 0x8900, 0x1f5d, 0x3ff8 }, - { 0x8900, 0x1f59, 0x2ff8 }, - { 0x0500, 0x1f57, 0x0008 }, - { 0x0900, 0x1f5b, 0x0ff8 }, - { 0x8500, 0x1f60, 0x2008 }, - { 0x0900, 0x1f5f, 0x0ff8 }, - { 0x0500, 0x1f61, 0x0008 }, - { 0x8500, 0x1f66, 0x3008 }, - { 0x8500, 0x1f64, 0x2008 }, - { 0x0500, 0x1f63, 0x0008 }, - { 0x0500, 0x1f65, 0x0008 }, - { 0x8900, 0x1f68, 0x2ff8 }, - { 0x0500, 0x1f67, 0x0008 }, - { 0x0900, 0x1f69, 0x0ff8 }, - { 0x8500, 0x1f72, 0x4056 }, - { 0x8900, 0x1f6e, 0x3ff8 }, - { 0x8900, 0x1f6c, 0x2ff8 }, - { 0x0900, 0x1f6b, 0x0ff8 }, - { 0x0900, 0x1f6d, 0x0ff8 }, - { 0x8500, 0x1f70, 0x204a }, - { 0x0900, 0x1f6f, 0x0ff8 }, - { 0x0500, 0x1f71, 0x004a }, - { 0x8500, 0x1f76, 0x3064 }, - { 0x8500, 0x1f74, 0x2056 }, - { 0x0500, 0x1f73, 0x0056 }, - { 0x0500, 0x1f75, 0x0056 }, - { 0x8500, 0x1f78, 0x2080 }, - { 0x0500, 0x1f77, 0x0064 }, - { 0x0500, 0x1f79, 0x0080 }, - { 0x8800, 0x1f9c, 0x6000 }, - { 0x8800, 0x1f8c, 0x5000 }, - { 0x8500, 0x1f84, 0x4008 }, - { 0x8500, 0x1f80, 0x3008 }, - { 0x8500, 0x1f7c, 0x207e }, - { 0x0500, 0x1f7b, 0x0070 }, - { 0x0500, 0x1f7d, 0x007e }, - { 0x8500, 0x1f82, 0x2008 }, - { 0x0500, 0x1f81, 0x0008 }, - { 0x0500, 0x1f83, 0x0008 }, - { 0x8800, 0x1f88, 0x3000 }, - { 0x8500, 0x1f86, 0x2008 }, - { 0x0500, 0x1f85, 0x0008 }, - { 0x0500, 0x1f87, 0x0008 }, - { 0x8800, 0x1f8a, 0x2000 }, - { 0x0800, 0x1f89, 0x0000 }, - { 0x0800, 0x1f8b, 0x0000 }, - { 0x8500, 0x1f94, 0x4008 }, - { 0x8500, 0x1f90, 0x3008 }, - { 0x8800, 0x1f8e, 0x2000 }, - { 0x0800, 0x1f8d, 0x0000 }, - { 0x0800, 0x1f8f, 0x0000 }, - { 0x8500, 0x1f92, 0x2008 }, - { 0x0500, 0x1f91, 0x0008 }, - { 0x0500, 0x1f93, 0x0008 }, - { 0x8800, 0x1f98, 0x3000 }, - { 0x8500, 0x1f96, 0x2008 }, - { 0x0500, 0x1f95, 0x0008 }, - { 0x0500, 0x1f97, 0x0008 }, - { 0x8800, 0x1f9a, 0x2000 }, - { 0x0800, 0x1f99, 0x0000 }, - { 0x0800, 0x1f9b, 0x0000 }, - { 0x8800, 0x1fac, 0x5000 }, - { 0x8500, 0x1fa4, 0x4008 }, - { 0x8500, 0x1fa0, 0x3008 }, - { 0x8800, 0x1f9e, 0x2000 }, - { 0x0800, 0x1f9d, 0x0000 }, - { 0x0800, 0x1f9f, 0x0000 }, - { 0x8500, 0x1fa2, 0x2008 }, - { 0x0500, 0x1fa1, 0x0008 }, - { 0x0500, 0x1fa3, 0x0008 }, - { 0x8800, 0x1fa8, 0x3000 }, - { 0x8500, 0x1fa6, 0x2008 }, - { 0x0500, 0x1fa5, 0x0008 }, - { 0x0500, 0x1fa7, 0x0008 }, - { 0x8800, 0x1faa, 0x2000 }, - { 0x0800, 0x1fa9, 0x0000 }, - { 0x0800, 0x1fab, 0x0000 }, - { 0x8500, 0x1fb4, 0x4000 }, - { 0x8500, 0x1fb0, 0x3008 }, - { 0x8800, 0x1fae, 0x2000 }, - { 0x0800, 0x1fad, 0x0000 }, - { 0x0800, 0x1faf, 0x0000 }, - { 0x8500, 0x1fb2, 0x2000 }, - { 0x0500, 0x1fb1, 0x0008 }, - { 0x0500, 0x1fb3, 0x0009 }, - { 0x8900, 0x1fb9, 0x3ff8 }, - { 0x8500, 0x1fb7, 0x2000 }, - { 0x0500, 0x1fb6, 0x0000 }, - { 0x0900, 0x1fb8, 0x0ff8 }, - { 0x8900, 0x1fbb, 0x2fb6 }, - { 0x0900, 0x1fba, 0x0fb6 }, - { 0x0800, 0x1fbc, 0x0000 }, - { 0x9d00, 0x2005, 0x7000 }, - { 0x8500, 0x1fe1, 0x6008 }, - { 0x9800, 0x1fce, 0x5000 }, - { 0x8500, 0x1fc6, 0x4000 }, - { 0x9800, 0x1fc1, 0x3000 }, - { 0x9800, 0x1fbf, 0x2000 }, - { 0x0500, 0x1fbe, 0x0000 }, - { 0x1800, 0x1fc0, 0x0000 }, - { 0x8500, 0x1fc3, 0x2009 }, - { 0x0500, 0x1fc2, 0x0000 }, - { 0x0500, 0x1fc4, 0x0000 }, - { 0x8900, 0x1fca, 0x3faa }, - { 0x8900, 0x1fc8, 0x2faa }, - { 0x0500, 0x1fc7, 0x0000 }, - { 0x0900, 0x1fc9, 0x0faa }, - { 0x8800, 0x1fcc, 0x2000 }, - { 0x0900, 0x1fcb, 0x0faa }, - { 0x1800, 0x1fcd, 0x0000 }, - { 0x8900, 0x1fd8, 0x4ff8 }, - { 0x8500, 0x1fd2, 0x3000 }, - { 0x8500, 0x1fd0, 0x2008 }, - { 0x1800, 0x1fcf, 0x0000 }, - { 0x0500, 0x1fd1, 0x0008 }, - { 0x8500, 0x1fd6, 0x2000 }, - { 0x0500, 0x1fd3, 0x0000 }, - { 0x0500, 0x1fd7, 0x0000 }, - { 0x9800, 0x1fdd, 0x3000 }, - { 0x8900, 0x1fda, 0x2f9c }, - { 0x0900, 0x1fd9, 0x0ff8 }, - { 0x0900, 0x1fdb, 0x0f9c }, - { 0x9800, 0x1fdf, 0x2000 }, - { 0x1800, 0x1fde, 0x0000 }, - { 0x0500, 0x1fe0, 0x0008 }, - { 0x8500, 0x1ff3, 0x5009 }, - { 0x8900, 0x1fe9, 0x4ff8 }, - { 0x8500, 0x1fe5, 0x3007 }, - { 0x8500, 0x1fe3, 0x2000 }, - { 0x0500, 0x1fe2, 0x0000 }, - { 0x0500, 0x1fe4, 0x0000 }, - { 0x8500, 0x1fe7, 0x2000 }, - { 0x0500, 0x1fe6, 0x0000 }, - { 0x0900, 0x1fe8, 0x0ff8 }, - { 0x9800, 0x1fed, 0x3000 }, - { 0x8900, 0x1feb, 0x2f90 }, - { 0x0900, 0x1fea, 0x0f90 }, - { 0x0900, 0x1fec, 0x0ff9 }, - { 0x9800, 0x1fef, 0x2000 }, - { 0x1800, 0x1fee, 0x0000 }, - { 0x0500, 0x1ff2, 0x0000 }, - { 0x8800, 0x1ffc, 0x4000 }, - { 0x8900, 0x1ff8, 0x3f80 }, - { 0x8500, 0x1ff6, 0x2000 }, - { 0x0500, 0x1ff4, 0x0000 }, - { 0x0500, 0x1ff7, 0x0000 }, - { 0x8900, 0x1ffa, 0x2f82 }, - { 0x0900, 0x1ff9, 0x0f80 }, - { 0x0900, 0x1ffb, 0x0f82 }, - { 0x9d00, 0x2001, 0x3000 }, - { 0x9800, 0x1ffe, 0x2000 }, - { 0x1800, 0x1ffd, 0x0000 }, - { 0x1d00, 0x2000, 0x0000 }, - { 0x9d00, 0x2003, 0x2000 }, - { 0x1d00, 0x2002, 0x0000 }, - { 0x1d00, 0x2004, 0x0000 }, - { 0x9500, 0x2025, 0x6000 }, - { 0x9100, 0x2015, 0x5000 }, - { 0x8100, 0x200d, 0x4000 }, - { 0x9d00, 0x2009, 0x3000 }, - { 0x9d00, 0x2007, 0x2000 }, - { 0x1d00, 0x2006, 0x0000 }, - { 0x1d00, 0x2008, 0x0000 }, - { 0x9d00, 0x200b, 0x2000 }, - { 0x1d00, 0x200a, 0x0000 }, - { 0x0100, 0x200c, 0x0000 }, - { 0x9100, 0x2011, 0x3000 }, - { 0x8100, 0x200f, 0x2000 }, - { 0x0100, 0x200e, 0x0000 }, - { 0x1100, 0x2010, 0x0000 }, - { 0x9100, 0x2013, 0x2000 }, - { 0x1100, 0x2012, 0x0000 }, - { 0x1100, 0x2014, 0x0000 }, - { 0x9300, 0x201d, 0x4000 }, - { 0x9300, 0x2019, 0x3000 }, - { 0x9500, 0x2017, 0x2000 }, - { 0x1500, 0x2016, 0x0000 }, - { 0x1400, 0x2018, 0x0000 }, - { 0x9400, 0x201b, 0x2000 }, - { 0x1600, 0x201a, 0x0000 }, - { 0x1400, 0x201c, 0x0000 }, - { 0x9500, 0x2021, 0x3000 }, - { 0x9400, 0x201f, 0x2000 }, - { 0x1600, 0x201e, 0x0000 }, - { 0x1500, 0x2020, 0x0000 }, - { 0x9500, 0x2023, 0x2000 }, - { 0x1500, 0x2022, 0x0000 }, - { 0x1500, 0x2024, 0x0000 }, - { 0x9500, 0x2035, 0x5000 }, - { 0x8100, 0x202d, 0x4000 }, - { 0x9c00, 0x2029, 0x3000 }, - { 0x9500, 0x2027, 0x2000 }, - { 0x1500, 0x2026, 0x0000 }, - { 0x1b00, 0x2028, 0x0000 }, - { 0x8100, 0x202b, 0x2000 }, - { 0x0100, 0x202a, 0x0000 }, - { 0x0100, 0x202c, 0x0000 }, - { 0x9500, 0x2031, 0x3000 }, - { 0x9d00, 0x202f, 0x2000 }, - { 0x0100, 0x202e, 0x0000 }, - { 0x1500, 0x2030, 0x0000 }, - { 0x9500, 0x2033, 0x2000 }, - { 0x1500, 0x2032, 0x0000 }, - { 0x1500, 0x2034, 0x0000 }, - { 0x9500, 0x203d, 0x4000 }, - { 0x9400, 0x2039, 0x3000 }, - { 0x9500, 0x2037, 0x2000 }, - { 0x1500, 0x2036, 0x0000 }, - { 0x1500, 0x2038, 0x0000 }, - { 0x9500, 0x203b, 0x2000 }, - { 0x1300, 0x203a, 0x0000 }, - { 0x1500, 0x203c, 0x0000 }, - { 0x9500, 0x2041, 0x3000 }, - { 0x9000, 0x203f, 0x2000 }, - { 0x1500, 0x203e, 0x0000 }, - { 0x1000, 0x2040, 0x0000 }, - { 0x9500, 0x2043, 0x2000 }, - { 0x1500, 0x2042, 0x0000 }, - { 0x1900, 0x2044, 0x0000 }, - { 0x9900, 0x21ae, 0x9000 }, - { 0x8900, 0x211a, 0x8000 }, - { 0x9700, 0x20a7, 0x7000 }, - { 0x8f00, 0x2076, 0x6000 }, - { 0x9500, 0x2057, 0x5000 }, - { 0x9500, 0x204d, 0x4000 }, - { 0x9500, 0x2049, 0x3000 }, - { 0x9500, 0x2047, 0x2000 }, - { 0x1200, 0x2046, 0x0000 }, - { 0x1500, 0x2048, 0x0000 }, - { 0x9500, 0x204b, 0x2000 }, - { 0x1500, 0x204a, 0x0000 }, - { 0x1500, 0x204c, 0x0000 }, - { 0x9500, 0x2051, 0x3000 }, - { 0x9500, 0x204f, 0x2000 }, - { 0x1500, 0x204e, 0x0000 }, - { 0x1500, 0x2050, 0x0000 }, - { 0x9500, 0x2053, 0x2000 }, - { 0x1900, 0x2052, 0x0000 }, - { 0x1000, 0x2054, 0x0000 }, - { 0x8100, 0x206c, 0x4000 }, - { 0x8100, 0x2062, 0x3000 }, - { 0x8100, 0x2060, 0x2000 }, - { 0x1d00, 0x205f, 0x0000 }, - { 0x0100, 0x2061, 0x0000 }, - { 0x8100, 0x206a, 0x2000 }, - { 0x0100, 0x2063, 0x0000 }, - { 0x0100, 0x206b, 0x0000 }, - { 0x8f00, 0x2070, 0x3000 }, - { 0x8100, 0x206e, 0x2000 }, - { 0x0100, 0x206d, 0x0000 }, - { 0x0100, 0x206f, 0x0000 }, - { 0x8f00, 0x2074, 0x2000 }, - { 0x0500, 0x2071, 0x0000 }, - { 0x0f00, 0x2075, 0x0000 }, - { 0x8f00, 0x2086, 0x5000 }, - { 0x9200, 0x207e, 0x4000 }, - { 0x9900, 0x207a, 0x3000 }, - { 0x8f00, 0x2078, 0x2000 }, - { 0x0f00, 0x2077, 0x0000 }, - { 0x0f00, 0x2079, 0x0000 }, - { 0x9900, 0x207c, 0x2000 }, - { 0x1900, 0x207b, 0x0000 }, - { 0x1600, 0x207d, 0x0000 }, - { 0x8f00, 0x2082, 0x3000 }, - { 0x8f00, 0x2080, 0x2000 }, - { 0x0500, 0x207f, 0x0000 }, - { 0x0f00, 0x2081, 0x0000 }, - { 0x8f00, 0x2084, 0x2000 }, - { 0x0f00, 0x2083, 0x0000 }, - { 0x0f00, 0x2085, 0x0000 }, - { 0x9200, 0x208e, 0x4000 }, - { 0x9900, 0x208a, 0x3000 }, - { 0x8f00, 0x2088, 0x2000 }, - { 0x0f00, 0x2087, 0x0000 }, - { 0x0f00, 0x2089, 0x0000 }, - { 0x9900, 0x208c, 0x2000 }, - { 0x1900, 0x208b, 0x0000 }, - { 0x1600, 0x208d, 0x0000 }, - { 0x9700, 0x20a3, 0x3000 }, - { 0x9700, 0x20a1, 0x2000 }, - { 0x1700, 0x20a0, 0x0000 }, - { 0x1700, 0x20a2, 0x0000 }, - { 0x9700, 0x20a5, 0x2000 }, - { 0x1700, 0x20a4, 0x0000 }, - { 0x1700, 0x20a6, 0x0000 }, - { 0x8c00, 0x20e5, 0x6000 }, - { 0x8c00, 0x20d5, 0x5000 }, - { 0x9700, 0x20af, 0x4000 }, - { 0x9700, 0x20ab, 0x3000 }, - { 0x9700, 0x20a9, 0x2000 }, - { 0x1700, 0x20a8, 0x0000 }, - { 0x1700, 0x20aa, 0x0000 }, - { 0x9700, 0x20ad, 0x2000 }, - { 0x1700, 0x20ac, 0x0000 }, - { 0x1700, 0x20ae, 0x0000 }, - { 0x8c00, 0x20d1, 0x3000 }, - { 0x9700, 0x20b1, 0x2000 }, - { 0x1700, 0x20b0, 0x0000 }, - { 0x0c00, 0x20d0, 0x0000 }, - { 0x8c00, 0x20d3, 0x2000 }, - { 0x0c00, 0x20d2, 0x0000 }, - { 0x0c00, 0x20d4, 0x0000 }, - { 0x8b00, 0x20dd, 0x4000 }, - { 0x8c00, 0x20d9, 0x3000 }, - { 0x8c00, 0x20d7, 0x2000 }, - { 0x0c00, 0x20d6, 0x0000 }, - { 0x0c00, 0x20d8, 0x0000 }, - { 0x8c00, 0x20db, 0x2000 }, - { 0x0c00, 0x20da, 0x0000 }, - { 0x0c00, 0x20dc, 0x0000 }, - { 0x8c00, 0x20e1, 0x3000 }, - { 0x8b00, 0x20df, 0x2000 }, - { 0x0b00, 0x20de, 0x0000 }, - { 0x0b00, 0x20e0, 0x0000 }, - { 0x8b00, 0x20e3, 0x2000 }, - { 0x0b00, 0x20e2, 0x0000 }, - { 0x0b00, 0x20e4, 0x0000 }, - { 0x8500, 0x210a, 0x5000 }, - { 0x8900, 0x2102, 0x4000 }, - { 0x8c00, 0x20e9, 0x3000 }, - { 0x8c00, 0x20e7, 0x2000 }, - { 0x0c00, 0x20e6, 0x0000 }, - { 0x0c00, 0x20e8, 0x0000 }, - { 0x9a00, 0x2100, 0x2000 }, - { 0x0c00, 0x20ea, 0x0000 }, - { 0x1a00, 0x2101, 0x0000 }, - { 0x9a00, 0x2106, 0x3000 }, - { 0x9a00, 0x2104, 0x2000 }, - { 0x1a00, 0x2103, 0x0000 }, - { 0x1a00, 0x2105, 0x0000 }, - { 0x9a00, 0x2108, 0x2000 }, - { 0x0900, 0x2107, 0x0000 }, - { 0x1a00, 0x2109, 0x0000 }, - { 0x8900, 0x2112, 0x4000 }, - { 0x8500, 0x210e, 0x3000 }, - { 0x8900, 0x210c, 0x2000 }, - { 0x0900, 0x210b, 0x0000 }, - { 0x0900, 0x210d, 0x0000 }, - { 0x8900, 0x2110, 0x2000 }, - { 0x0500, 0x210f, 0x0000 }, - { 0x0900, 0x2111, 0x0000 }, - { 0x9a00, 0x2116, 0x3000 }, - { 0x9a00, 0x2114, 0x2000 }, - { 0x0500, 0x2113, 0x0000 }, - { 0x0900, 0x2115, 0x0000 }, - { 0x9a00, 0x2118, 0x2000 }, - { 0x1a00, 0x2117, 0x0000 }, - { 0x0900, 0x2119, 0x0000 }, - { 0x8e00, 0x2162, 0x7000 }, - { 0x9a00, 0x213a, 0x6000 }, - { 0x8900, 0x212a, 0x5000 }, - { 0x9a00, 0x2122, 0x4000 }, - { 0x9a00, 0x211e, 0x3000 }, - { 0x8900, 0x211c, 0x2000 }, - { 0x0900, 0x211b, 0x0000 }, - { 0x0900, 0x211d, 0x0000 }, - { 0x9a00, 0x2120, 0x2000 }, - { 0x1a00, 0x211f, 0x0000 }, - { 0x1a00, 0x2121, 0x0000 }, - { 0x8900, 0x2126, 0x3000 }, - { 0x8900, 0x2124, 0x2000 }, - { 0x1a00, 0x2123, 0x0000 }, - { 0x1a00, 0x2125, 0x0000 }, - { 0x8900, 0x2128, 0x2000 }, - { 0x1a00, 0x2127, 0x0000 }, - { 0x1a00, 0x2129, 0x0000 }, - { 0x9a00, 0x2132, 0x4000 }, - { 0x9a00, 0x212e, 0x3000 }, - { 0x8900, 0x212c, 0x2000 }, - { 0x0900, 0x212b, 0x0000 }, - { 0x0900, 0x212d, 0x0000 }, - { 0x8900, 0x2130, 0x2000 }, - { 0x0500, 0x212f, 0x0000 }, - { 0x0900, 0x2131, 0x0000 }, - { 0x8700, 0x2136, 0x3000 }, - { 0x8500, 0x2134, 0x2000 }, - { 0x0900, 0x2133, 0x0000 }, - { 0x0700, 0x2135, 0x0000 }, - { 0x8700, 0x2138, 0x2000 }, - { 0x0700, 0x2137, 0x0000 }, - { 0x0500, 0x2139, 0x0000 }, - { 0x9900, 0x214b, 0x5000 }, - { 0x9900, 0x2143, 0x4000 }, - { 0x8900, 0x213f, 0x3000 }, - { 0x8500, 0x213d, 0x2000 }, - { 0x1a00, 0x213b, 0x0000 }, - { 0x0900, 0x213e, 0x0000 }, - { 0x9900, 0x2141, 0x2000 }, - { 0x1900, 0x2140, 0x0000 }, - { 0x1900, 0x2142, 0x0000 }, - { 0x8500, 0x2147, 0x3000 }, - { 0x8900, 0x2145, 0x2000 }, - { 0x1900, 0x2144, 0x0000 }, - { 0x0500, 0x2146, 0x0000 }, - { 0x8500, 0x2149, 0x2000 }, - { 0x0500, 0x2148, 0x0000 }, - { 0x1a00, 0x214a, 0x0000 }, - { 0x8f00, 0x215a, 0x4000 }, - { 0x8f00, 0x2156, 0x3000 }, - { 0x8f00, 0x2154, 0x2000 }, - { 0x0f00, 0x2153, 0x0000 }, - { 0x0f00, 0x2155, 0x0000 }, - { 0x8f00, 0x2158, 0x2000 }, - { 0x0f00, 0x2157, 0x0000 }, - { 0x0f00, 0x2159, 0x0000 }, - { 0x8f00, 0x215e, 0x3000 }, - { 0x8f00, 0x215c, 0x2000 }, - { 0x0f00, 0x215b, 0x0000 }, - { 0x0f00, 0x215d, 0x0000 }, - { 0x8e00, 0x2160, 0x2000 }, - { 0x0f00, 0x215f, 0x0000 }, - { 0x0e00, 0x2161, 0x0000 }, - { 0x8e00, 0x2182, 0x6000 }, - { 0x8e00, 0x2172, 0x5000 }, - { 0x8e00, 0x216a, 0x4000 }, - { 0x8e00, 0x2166, 0x3000 }, - { 0x8e00, 0x2164, 0x2000 }, - { 0x0e00, 0x2163, 0x0000 }, - { 0x0e00, 0x2165, 0x0000 }, - { 0x8e00, 0x2168, 0x2000 }, - { 0x0e00, 0x2167, 0x0000 }, - { 0x0e00, 0x2169, 0x0000 }, - { 0x8e00, 0x216e, 0x3000 }, - { 0x8e00, 0x216c, 0x2000 }, - { 0x0e00, 0x216b, 0x0000 }, - { 0x0e00, 0x216d, 0x0000 }, - { 0x8e00, 0x2170, 0x2000 }, - { 0x0e00, 0x216f, 0x0000 }, - { 0x0e00, 0x2171, 0x0000 }, - { 0x8e00, 0x217a, 0x4000 }, - { 0x8e00, 0x2176, 0x3000 }, - { 0x8e00, 0x2174, 0x2000 }, - { 0x0e00, 0x2173, 0x0000 }, - { 0x0e00, 0x2175, 0x0000 }, - { 0x8e00, 0x2178, 0x2000 }, - { 0x0e00, 0x2177, 0x0000 }, - { 0x0e00, 0x2179, 0x0000 }, - { 0x8e00, 0x217e, 0x3000 }, - { 0x8e00, 0x217c, 0x2000 }, - { 0x0e00, 0x217b, 0x0000 }, - { 0x0e00, 0x217d, 0x0000 }, - { 0x8e00, 0x2180, 0x2000 }, - { 0x0e00, 0x217f, 0x0000 }, - { 0x0e00, 0x2181, 0x0000 }, - { 0x9a00, 0x219e, 0x5000 }, - { 0x9a00, 0x2196, 0x4000 }, - { 0x9900, 0x2192, 0x3000 }, - { 0x9900, 0x2190, 0x2000 }, - { 0x0e00, 0x2183, 0x0000 }, - { 0x1900, 0x2191, 0x0000 }, - { 0x9900, 0x2194, 0x2000 }, - { 0x1900, 0x2193, 0x0000 }, - { 0x1a00, 0x2195, 0x0000 }, - { 0x9900, 0x219a, 0x3000 }, - { 0x9a00, 0x2198, 0x2000 }, - { 0x1a00, 0x2197, 0x0000 }, - { 0x1a00, 0x2199, 0x0000 }, - { 0x9a00, 0x219c, 0x2000 }, - { 0x1900, 0x219b, 0x0000 }, - { 0x1a00, 0x219d, 0x0000 }, - { 0x9900, 0x21a6, 0x4000 }, - { 0x9a00, 0x21a2, 0x3000 }, - { 0x9900, 0x21a0, 0x2000 }, - { 0x1a00, 0x219f, 0x0000 }, - { 0x1a00, 0x21a1, 0x0000 }, - { 0x9a00, 0x21a4, 0x2000 }, - { 0x1900, 0x21a3, 0x0000 }, - { 0x1a00, 0x21a5, 0x0000 }, - { 0x9a00, 0x21aa, 0x3000 }, - { 0x9a00, 0x21a8, 0x2000 }, - { 0x1a00, 0x21a7, 0x0000 }, - { 0x1a00, 0x21a9, 0x0000 }, - { 0x9a00, 0x21ac, 0x2000 }, - { 0x1a00, 0x21ab, 0x0000 }, - { 0x1a00, 0x21ad, 0x0000 }, - { 0x9900, 0x222e, 0x8000 }, - { 0x9a00, 0x21ee, 0x7000 }, - { 0x9900, 0x21ce, 0x6000 }, - { 0x9a00, 0x21be, 0x5000 }, - { 0x9a00, 0x21b6, 0x4000 }, - { 0x9a00, 0x21b2, 0x3000 }, - { 0x9a00, 0x21b0, 0x2000 }, - { 0x1a00, 0x21af, 0x0000 }, - { 0x1a00, 0x21b1, 0x0000 }, - { 0x9a00, 0x21b4, 0x2000 }, - { 0x1a00, 0x21b3, 0x0000 }, - { 0x1a00, 0x21b5, 0x0000 }, - { 0x9a00, 0x21ba, 0x3000 }, - { 0x9a00, 0x21b8, 0x2000 }, - { 0x1a00, 0x21b7, 0x0000 }, - { 0x1a00, 0x21b9, 0x0000 }, - { 0x9a00, 0x21bc, 0x2000 }, - { 0x1a00, 0x21bb, 0x0000 }, - { 0x1a00, 0x21bd, 0x0000 }, - { 0x9a00, 0x21c6, 0x4000 }, - { 0x9a00, 0x21c2, 0x3000 }, - { 0x9a00, 0x21c0, 0x2000 }, - { 0x1a00, 0x21bf, 0x0000 }, - { 0x1a00, 0x21c1, 0x0000 }, - { 0x9a00, 0x21c4, 0x2000 }, - { 0x1a00, 0x21c3, 0x0000 }, - { 0x1a00, 0x21c5, 0x0000 }, - { 0x9a00, 0x21ca, 0x3000 }, - { 0x9a00, 0x21c8, 0x2000 }, - { 0x1a00, 0x21c7, 0x0000 }, - { 0x1a00, 0x21c9, 0x0000 }, - { 0x9a00, 0x21cc, 0x2000 }, - { 0x1a00, 0x21cb, 0x0000 }, - { 0x1a00, 0x21cd, 0x0000 }, - { 0x9a00, 0x21de, 0x5000 }, - { 0x9a00, 0x21d6, 0x4000 }, - { 0x9900, 0x21d2, 0x3000 }, - { 0x9a00, 0x21d0, 0x2000 }, - { 0x1900, 0x21cf, 0x0000 }, - { 0x1a00, 0x21d1, 0x0000 }, - { 0x9900, 0x21d4, 0x2000 }, - { 0x1a00, 0x21d3, 0x0000 }, - { 0x1a00, 0x21d5, 0x0000 }, - { 0x9a00, 0x21da, 0x3000 }, - { 0x9a00, 0x21d8, 0x2000 }, - { 0x1a00, 0x21d7, 0x0000 }, - { 0x1a00, 0x21d9, 0x0000 }, - { 0x9a00, 0x21dc, 0x2000 }, - { 0x1a00, 0x21db, 0x0000 }, - { 0x1a00, 0x21dd, 0x0000 }, - { 0x9a00, 0x21e6, 0x4000 }, - { 0x9a00, 0x21e2, 0x3000 }, - { 0x9a00, 0x21e0, 0x2000 }, - { 0x1a00, 0x21df, 0x0000 }, - { 0x1a00, 0x21e1, 0x0000 }, - { 0x9a00, 0x21e4, 0x2000 }, - { 0x1a00, 0x21e3, 0x0000 }, - { 0x1a00, 0x21e5, 0x0000 }, - { 0x9a00, 0x21ea, 0x3000 }, - { 0x9a00, 0x21e8, 0x2000 }, - { 0x1a00, 0x21e7, 0x0000 }, - { 0x1a00, 0x21e9, 0x0000 }, - { 0x9a00, 0x21ec, 0x2000 }, - { 0x1a00, 0x21eb, 0x0000 }, - { 0x1a00, 0x21ed, 0x0000 }, - { 0x9900, 0x220e, 0x6000 }, - { 0x9900, 0x21fe, 0x5000 }, - { 0x9900, 0x21f6, 0x4000 }, - { 0x9a00, 0x21f2, 0x3000 }, - { 0x9a00, 0x21f0, 0x2000 }, - { 0x1a00, 0x21ef, 0x0000 }, - { 0x1a00, 0x21f1, 0x0000 }, - { 0x9900, 0x21f4, 0x2000 }, - { 0x1a00, 0x21f3, 0x0000 }, - { 0x1900, 0x21f5, 0x0000 }, - { 0x9900, 0x21fa, 0x3000 }, - { 0x9900, 0x21f8, 0x2000 }, - { 0x1900, 0x21f7, 0x0000 }, - { 0x1900, 0x21f9, 0x0000 }, - { 0x9900, 0x21fc, 0x2000 }, - { 0x1900, 0x21fb, 0x0000 }, - { 0x1900, 0x21fd, 0x0000 }, - { 0x9900, 0x2206, 0x4000 }, - { 0x9900, 0x2202, 0x3000 }, - { 0x9900, 0x2200, 0x2000 }, - { 0x1900, 0x21ff, 0x0000 }, - { 0x1900, 0x2201, 0x0000 }, - { 0x9900, 0x2204, 0x2000 }, - { 0x1900, 0x2203, 0x0000 }, - { 0x1900, 0x2205, 0x0000 }, - { 0x9900, 0x220a, 0x3000 }, - { 0x9900, 0x2208, 0x2000 }, - { 0x1900, 0x2207, 0x0000 }, - { 0x1900, 0x2209, 0x0000 }, - { 0x9900, 0x220c, 0x2000 }, - { 0x1900, 0x220b, 0x0000 }, - { 0x1900, 0x220d, 0x0000 }, - { 0x9900, 0x221e, 0x5000 }, - { 0x9900, 0x2216, 0x4000 }, - { 0x9900, 0x2212, 0x3000 }, - { 0x9900, 0x2210, 0x2000 }, - { 0x1900, 0x220f, 0x0000 }, - { 0x1900, 0x2211, 0x0000 }, - { 0x9900, 0x2214, 0x2000 }, - { 0x1900, 0x2213, 0x0000 }, - { 0x1900, 0x2215, 0x0000 }, - { 0x9900, 0x221a, 0x3000 }, - { 0x9900, 0x2218, 0x2000 }, - { 0x1900, 0x2217, 0x0000 }, - { 0x1900, 0x2219, 0x0000 }, - { 0x9900, 0x221c, 0x2000 }, - { 0x1900, 0x221b, 0x0000 }, - { 0x1900, 0x221d, 0x0000 }, - { 0x9900, 0x2226, 0x4000 }, - { 0x9900, 0x2222, 0x3000 }, - { 0x9900, 0x2220, 0x2000 }, - { 0x1900, 0x221f, 0x0000 }, - { 0x1900, 0x2221, 0x0000 }, - { 0x9900, 0x2224, 0x2000 }, - { 0x1900, 0x2223, 0x0000 }, - { 0x1900, 0x2225, 0x0000 }, - { 0x9900, 0x222a, 0x3000 }, - { 0x9900, 0x2228, 0x2000 }, - { 0x1900, 0x2227, 0x0000 }, - { 0x1900, 0x2229, 0x0000 }, - { 0x9900, 0x222c, 0x2000 }, - { 0x1900, 0x222b, 0x0000 }, - { 0x1900, 0x222d, 0x0000 }, - { 0x9900, 0x226e, 0x7000 }, - { 0x9900, 0x224e, 0x6000 }, - { 0x9900, 0x223e, 0x5000 }, - { 0x9900, 0x2236, 0x4000 }, - { 0x9900, 0x2232, 0x3000 }, - { 0x9900, 0x2230, 0x2000 }, - { 0x1900, 0x222f, 0x0000 }, - { 0x1900, 0x2231, 0x0000 }, - { 0x9900, 0x2234, 0x2000 }, - { 0x1900, 0x2233, 0x0000 }, - { 0x1900, 0x2235, 0x0000 }, - { 0x9900, 0x223a, 0x3000 }, - { 0x9900, 0x2238, 0x2000 }, - { 0x1900, 0x2237, 0x0000 }, - { 0x1900, 0x2239, 0x0000 }, - { 0x9900, 0x223c, 0x2000 }, - { 0x1900, 0x223b, 0x0000 }, - { 0x1900, 0x223d, 0x0000 }, - { 0x9900, 0x2246, 0x4000 }, - { 0x9900, 0x2242, 0x3000 }, - { 0x9900, 0x2240, 0x2000 }, - { 0x1900, 0x223f, 0x0000 }, - { 0x1900, 0x2241, 0x0000 }, - { 0x9900, 0x2244, 0x2000 }, - { 0x1900, 0x2243, 0x0000 }, - { 0x1900, 0x2245, 0x0000 }, - { 0x9900, 0x224a, 0x3000 }, - { 0x9900, 0x2248, 0x2000 }, - { 0x1900, 0x2247, 0x0000 }, - { 0x1900, 0x2249, 0x0000 }, - { 0x9900, 0x224c, 0x2000 }, - { 0x1900, 0x224b, 0x0000 }, - { 0x1900, 0x224d, 0x0000 }, - { 0x9900, 0x225e, 0x5000 }, - { 0x9900, 0x2256, 0x4000 }, - { 0x9900, 0x2252, 0x3000 }, - { 0x9900, 0x2250, 0x2000 }, - { 0x1900, 0x224f, 0x0000 }, - { 0x1900, 0x2251, 0x0000 }, - { 0x9900, 0x2254, 0x2000 }, - { 0x1900, 0x2253, 0x0000 }, - { 0x1900, 0x2255, 0x0000 }, - { 0x9900, 0x225a, 0x3000 }, - { 0x9900, 0x2258, 0x2000 }, - { 0x1900, 0x2257, 0x0000 }, - { 0x1900, 0x2259, 0x0000 }, - { 0x9900, 0x225c, 0x2000 }, - { 0x1900, 0x225b, 0x0000 }, - { 0x1900, 0x225d, 0x0000 }, - { 0x9900, 0x2266, 0x4000 }, - { 0x9900, 0x2262, 0x3000 }, - { 0x9900, 0x2260, 0x2000 }, - { 0x1900, 0x225f, 0x0000 }, - { 0x1900, 0x2261, 0x0000 }, - { 0x9900, 0x2264, 0x2000 }, - { 0x1900, 0x2263, 0x0000 }, - { 0x1900, 0x2265, 0x0000 }, - { 0x9900, 0x226a, 0x3000 }, - { 0x9900, 0x2268, 0x2000 }, - { 0x1900, 0x2267, 0x0000 }, - { 0x1900, 0x2269, 0x0000 }, - { 0x9900, 0x226c, 0x2000 }, - { 0x1900, 0x226b, 0x0000 }, - { 0x1900, 0x226d, 0x0000 }, - { 0x9900, 0x228e, 0x6000 }, - { 0x9900, 0x227e, 0x5000 }, - { 0x9900, 0x2276, 0x4000 }, - { 0x9900, 0x2272, 0x3000 }, - { 0x9900, 0x2270, 0x2000 }, - { 0x1900, 0x226f, 0x0000 }, - { 0x1900, 0x2271, 0x0000 }, - { 0x9900, 0x2274, 0x2000 }, - { 0x1900, 0x2273, 0x0000 }, - { 0x1900, 0x2275, 0x0000 }, - { 0x9900, 0x227a, 0x3000 }, - { 0x9900, 0x2278, 0x2000 }, - { 0x1900, 0x2277, 0x0000 }, - { 0x1900, 0x2279, 0x0000 }, - { 0x9900, 0x227c, 0x2000 }, - { 0x1900, 0x227b, 0x0000 }, - { 0x1900, 0x227d, 0x0000 }, - { 0x9900, 0x2286, 0x4000 }, - { 0x9900, 0x2282, 0x3000 }, - { 0x9900, 0x2280, 0x2000 }, - { 0x1900, 0x227f, 0x0000 }, - { 0x1900, 0x2281, 0x0000 }, - { 0x9900, 0x2284, 0x2000 }, - { 0x1900, 0x2283, 0x0000 }, - { 0x1900, 0x2285, 0x0000 }, - { 0x9900, 0x228a, 0x3000 }, - { 0x9900, 0x2288, 0x2000 }, - { 0x1900, 0x2287, 0x0000 }, - { 0x1900, 0x2289, 0x0000 }, - { 0x9900, 0x228c, 0x2000 }, - { 0x1900, 0x228b, 0x0000 }, - { 0x1900, 0x228d, 0x0000 }, - { 0x9900, 0x229e, 0x5000 }, - { 0x9900, 0x2296, 0x4000 }, - { 0x9900, 0x2292, 0x3000 }, - { 0x9900, 0x2290, 0x2000 }, - { 0x1900, 0x228f, 0x0000 }, - { 0x1900, 0x2291, 0x0000 }, - { 0x9900, 0x2294, 0x2000 }, - { 0x1900, 0x2293, 0x0000 }, - { 0x1900, 0x2295, 0x0000 }, - { 0x9900, 0x229a, 0x3000 }, - { 0x9900, 0x2298, 0x2000 }, - { 0x1900, 0x2297, 0x0000 }, - { 0x1900, 0x2299, 0x0000 }, - { 0x9900, 0x229c, 0x2000 }, - { 0x1900, 0x229b, 0x0000 }, - { 0x1900, 0x229d, 0x0000 }, - { 0x9900, 0x22a6, 0x4000 }, - { 0x9900, 0x22a2, 0x3000 }, - { 0x9900, 0x22a0, 0x2000 }, - { 0x1900, 0x229f, 0x0000 }, - { 0x1900, 0x22a1, 0x0000 }, - { 0x9900, 0x22a4, 0x2000 }, - { 0x1900, 0x22a3, 0x0000 }, - { 0x1900, 0x22a5, 0x0000 }, - { 0x9900, 0x22aa, 0x3000 }, - { 0x9900, 0x22a8, 0x2000 }, - { 0x1900, 0x22a7, 0x0000 }, - { 0x1900, 0x22a9, 0x0000 }, - { 0x9900, 0x22ac, 0x2000 }, - { 0x1900, 0x22ab, 0x0000 }, - { 0x1900, 0x22ad, 0x0000 }, - { 0x8f00, 0x2787, 0xb000 }, - { 0x9a00, 0x250b, 0xa000 }, - { 0x9900, 0x23ae, 0x9000 }, - { 0x9a00, 0x232e, 0x8000 }, - { 0x9900, 0x22ee, 0x7000 }, - { 0x9900, 0x22ce, 0x6000 }, - { 0x9900, 0x22be, 0x5000 }, - { 0x9900, 0x22b6, 0x4000 }, - { 0x9900, 0x22b2, 0x3000 }, - { 0x9900, 0x22b0, 0x2000 }, - { 0x1900, 0x22af, 0x0000 }, - { 0x1900, 0x22b1, 0x0000 }, - { 0x9900, 0x22b4, 0x2000 }, - { 0x1900, 0x22b3, 0x0000 }, - { 0x1900, 0x22b5, 0x0000 }, - { 0x9900, 0x22ba, 0x3000 }, - { 0x9900, 0x22b8, 0x2000 }, - { 0x1900, 0x22b7, 0x0000 }, - { 0x1900, 0x22b9, 0x0000 }, - { 0x9900, 0x22bc, 0x2000 }, - { 0x1900, 0x22bb, 0x0000 }, - { 0x1900, 0x22bd, 0x0000 }, - { 0x9900, 0x22c6, 0x4000 }, - { 0x9900, 0x22c2, 0x3000 }, - { 0x9900, 0x22c0, 0x2000 }, - { 0x1900, 0x22bf, 0x0000 }, - { 0x1900, 0x22c1, 0x0000 }, - { 0x9900, 0x22c4, 0x2000 }, - { 0x1900, 0x22c3, 0x0000 }, - { 0x1900, 0x22c5, 0x0000 }, - { 0x9900, 0x22ca, 0x3000 }, - { 0x9900, 0x22c8, 0x2000 }, - { 0x1900, 0x22c7, 0x0000 }, - { 0x1900, 0x22c9, 0x0000 }, - { 0x9900, 0x22cc, 0x2000 }, - { 0x1900, 0x22cb, 0x0000 }, - { 0x1900, 0x22cd, 0x0000 }, - { 0x9900, 0x22de, 0x5000 }, - { 0x9900, 0x22d6, 0x4000 }, - { 0x9900, 0x22d2, 0x3000 }, - { 0x9900, 0x22d0, 0x2000 }, - { 0x1900, 0x22cf, 0x0000 }, - { 0x1900, 0x22d1, 0x0000 }, - { 0x9900, 0x22d4, 0x2000 }, - { 0x1900, 0x22d3, 0x0000 }, - { 0x1900, 0x22d5, 0x0000 }, - { 0x9900, 0x22da, 0x3000 }, - { 0x9900, 0x22d8, 0x2000 }, - { 0x1900, 0x22d7, 0x0000 }, - { 0x1900, 0x22d9, 0x0000 }, - { 0x9900, 0x22dc, 0x2000 }, - { 0x1900, 0x22db, 0x0000 }, - { 0x1900, 0x22dd, 0x0000 }, - { 0x9900, 0x22e6, 0x4000 }, - { 0x9900, 0x22e2, 0x3000 }, - { 0x9900, 0x22e0, 0x2000 }, - { 0x1900, 0x22df, 0x0000 }, - { 0x1900, 0x22e1, 0x0000 }, - { 0x9900, 0x22e4, 0x2000 }, - { 0x1900, 0x22e3, 0x0000 }, - { 0x1900, 0x22e5, 0x0000 }, - { 0x9900, 0x22ea, 0x3000 }, - { 0x9900, 0x22e8, 0x2000 }, - { 0x1900, 0x22e7, 0x0000 }, - { 0x1900, 0x22e9, 0x0000 }, - { 0x9900, 0x22ec, 0x2000 }, - { 0x1900, 0x22eb, 0x0000 }, - { 0x1900, 0x22ed, 0x0000 }, - { 0x9a00, 0x230e, 0x6000 }, - { 0x9900, 0x22fe, 0x5000 }, - { 0x9900, 0x22f6, 0x4000 }, - { 0x9900, 0x22f2, 0x3000 }, - { 0x9900, 0x22f0, 0x2000 }, - { 0x1900, 0x22ef, 0x0000 }, - { 0x1900, 0x22f1, 0x0000 }, - { 0x9900, 0x22f4, 0x2000 }, - { 0x1900, 0x22f3, 0x0000 }, - { 0x1900, 0x22f5, 0x0000 }, - { 0x9900, 0x22fa, 0x3000 }, - { 0x9900, 0x22f8, 0x2000 }, - { 0x1900, 0x22f7, 0x0000 }, - { 0x1900, 0x22f9, 0x0000 }, - { 0x9900, 0x22fc, 0x2000 }, - { 0x1900, 0x22fb, 0x0000 }, - { 0x1900, 0x22fd, 0x0000 }, - { 0x9a00, 0x2306, 0x4000 }, - { 0x9a00, 0x2302, 0x3000 }, - { 0x9a00, 0x2300, 0x2000 }, - { 0x1900, 0x22ff, 0x0000 }, - { 0x1a00, 0x2301, 0x0000 }, - { 0x9a00, 0x2304, 0x2000 }, - { 0x1a00, 0x2303, 0x0000 }, - { 0x1a00, 0x2305, 0x0000 }, - { 0x9900, 0x230a, 0x3000 }, - { 0x9900, 0x2308, 0x2000 }, - { 0x1a00, 0x2307, 0x0000 }, - { 0x1900, 0x2309, 0x0000 }, - { 0x9a00, 0x230c, 0x2000 }, - { 0x1900, 0x230b, 0x0000 }, - { 0x1a00, 0x230d, 0x0000 }, - { 0x9a00, 0x231e, 0x5000 }, - { 0x9a00, 0x2316, 0x4000 }, - { 0x9a00, 0x2312, 0x3000 }, - { 0x9a00, 0x2310, 0x2000 }, - { 0x1a00, 0x230f, 0x0000 }, - { 0x1a00, 0x2311, 0x0000 }, - { 0x9a00, 0x2314, 0x2000 }, - { 0x1a00, 0x2313, 0x0000 }, - { 0x1a00, 0x2315, 0x0000 }, - { 0x9a00, 0x231a, 0x3000 }, - { 0x9a00, 0x2318, 0x2000 }, - { 0x1a00, 0x2317, 0x0000 }, - { 0x1a00, 0x2319, 0x0000 }, - { 0x9a00, 0x231c, 0x2000 }, - { 0x1a00, 0x231b, 0x0000 }, - { 0x1a00, 0x231d, 0x0000 }, - { 0x9a00, 0x2326, 0x4000 }, - { 0x9a00, 0x2322, 0x3000 }, - { 0x9900, 0x2320, 0x2000 }, - { 0x1a00, 0x231f, 0x0000 }, - { 0x1900, 0x2321, 0x0000 }, - { 0x9a00, 0x2324, 0x2000 }, - { 0x1a00, 0x2323, 0x0000 }, - { 0x1a00, 0x2325, 0x0000 }, - { 0x9200, 0x232a, 0x3000 }, - { 0x9a00, 0x2328, 0x2000 }, - { 0x1a00, 0x2327, 0x0000 }, - { 0x1600, 0x2329, 0x0000 }, - { 0x9a00, 0x232c, 0x2000 }, - { 0x1a00, 0x232b, 0x0000 }, - { 0x1a00, 0x232d, 0x0000 }, - { 0x9a00, 0x236e, 0x7000 }, - { 0x9a00, 0x234e, 0x6000 }, - { 0x9a00, 0x233e, 0x5000 }, - { 0x9a00, 0x2336, 0x4000 }, - { 0x9a00, 0x2332, 0x3000 }, - { 0x9a00, 0x2330, 0x2000 }, - { 0x1a00, 0x232f, 0x0000 }, - { 0x1a00, 0x2331, 0x0000 }, - { 0x9a00, 0x2334, 0x2000 }, - { 0x1a00, 0x2333, 0x0000 }, - { 0x1a00, 0x2335, 0x0000 }, - { 0x9a00, 0x233a, 0x3000 }, - { 0x9a00, 0x2338, 0x2000 }, - { 0x1a00, 0x2337, 0x0000 }, - { 0x1a00, 0x2339, 0x0000 }, - { 0x9a00, 0x233c, 0x2000 }, - { 0x1a00, 0x233b, 0x0000 }, - { 0x1a00, 0x233d, 0x0000 }, - { 0x9a00, 0x2346, 0x4000 }, - { 0x9a00, 0x2342, 0x3000 }, - { 0x9a00, 0x2340, 0x2000 }, - { 0x1a00, 0x233f, 0x0000 }, - { 0x1a00, 0x2341, 0x0000 }, - { 0x9a00, 0x2344, 0x2000 }, - { 0x1a00, 0x2343, 0x0000 }, - { 0x1a00, 0x2345, 0x0000 }, - { 0x9a00, 0x234a, 0x3000 }, - { 0x9a00, 0x2348, 0x2000 }, - { 0x1a00, 0x2347, 0x0000 }, - { 0x1a00, 0x2349, 0x0000 }, - { 0x9a00, 0x234c, 0x2000 }, - { 0x1a00, 0x234b, 0x0000 }, - { 0x1a00, 0x234d, 0x0000 }, - { 0x9a00, 0x235e, 0x5000 }, - { 0x9a00, 0x2356, 0x4000 }, - { 0x9a00, 0x2352, 0x3000 }, - { 0x9a00, 0x2350, 0x2000 }, - { 0x1a00, 0x234f, 0x0000 }, - { 0x1a00, 0x2351, 0x0000 }, - { 0x9a00, 0x2354, 0x2000 }, - { 0x1a00, 0x2353, 0x0000 }, - { 0x1a00, 0x2355, 0x0000 }, - { 0x9a00, 0x235a, 0x3000 }, - { 0x9a00, 0x2358, 0x2000 }, - { 0x1a00, 0x2357, 0x0000 }, - { 0x1a00, 0x2359, 0x0000 }, - { 0x9a00, 0x235c, 0x2000 }, - { 0x1a00, 0x235b, 0x0000 }, - { 0x1a00, 0x235d, 0x0000 }, - { 0x9a00, 0x2366, 0x4000 }, - { 0x9a00, 0x2362, 0x3000 }, - { 0x9a00, 0x2360, 0x2000 }, - { 0x1a00, 0x235f, 0x0000 }, - { 0x1a00, 0x2361, 0x0000 }, - { 0x9a00, 0x2364, 0x2000 }, - { 0x1a00, 0x2363, 0x0000 }, - { 0x1a00, 0x2365, 0x0000 }, - { 0x9a00, 0x236a, 0x3000 }, - { 0x9a00, 0x2368, 0x2000 }, - { 0x1a00, 0x2367, 0x0000 }, - { 0x1a00, 0x2369, 0x0000 }, - { 0x9a00, 0x236c, 0x2000 }, - { 0x1a00, 0x236b, 0x0000 }, - { 0x1a00, 0x236d, 0x0000 }, - { 0x9a00, 0x238e, 0x6000 }, - { 0x9a00, 0x237e, 0x5000 }, - { 0x9a00, 0x2376, 0x4000 }, - { 0x9a00, 0x2372, 0x3000 }, - { 0x9a00, 0x2370, 0x2000 }, - { 0x1a00, 0x236f, 0x0000 }, - { 0x1a00, 0x2371, 0x0000 }, - { 0x9a00, 0x2374, 0x2000 }, - { 0x1a00, 0x2373, 0x0000 }, - { 0x1a00, 0x2375, 0x0000 }, - { 0x9a00, 0x237a, 0x3000 }, - { 0x9a00, 0x2378, 0x2000 }, - { 0x1a00, 0x2377, 0x0000 }, - { 0x1a00, 0x2379, 0x0000 }, - { 0x9900, 0x237c, 0x2000 }, - { 0x1a00, 0x237b, 0x0000 }, - { 0x1a00, 0x237d, 0x0000 }, - { 0x9a00, 0x2386, 0x4000 }, - { 0x9a00, 0x2382, 0x3000 }, - { 0x9a00, 0x2380, 0x2000 }, - { 0x1a00, 0x237f, 0x0000 }, - { 0x1a00, 0x2381, 0x0000 }, - { 0x9a00, 0x2384, 0x2000 }, - { 0x1a00, 0x2383, 0x0000 }, - { 0x1a00, 0x2385, 0x0000 }, - { 0x9a00, 0x238a, 0x3000 }, - { 0x9a00, 0x2388, 0x2000 }, - { 0x1a00, 0x2387, 0x0000 }, - { 0x1a00, 0x2389, 0x0000 }, - { 0x9a00, 0x238c, 0x2000 }, - { 0x1a00, 0x238b, 0x0000 }, - { 0x1a00, 0x238d, 0x0000 }, - { 0x9900, 0x239e, 0x5000 }, - { 0x9a00, 0x2396, 0x4000 }, - { 0x9a00, 0x2392, 0x3000 }, - { 0x9a00, 0x2390, 0x2000 }, - { 0x1a00, 0x238f, 0x0000 }, - { 0x1a00, 0x2391, 0x0000 }, - { 0x9a00, 0x2394, 0x2000 }, - { 0x1a00, 0x2393, 0x0000 }, - { 0x1a00, 0x2395, 0x0000 }, - { 0x9a00, 0x239a, 0x3000 }, - { 0x9a00, 0x2398, 0x2000 }, - { 0x1a00, 0x2397, 0x0000 }, - { 0x1a00, 0x2399, 0x0000 }, - { 0x9900, 0x239c, 0x2000 }, - { 0x1900, 0x239b, 0x0000 }, - { 0x1900, 0x239d, 0x0000 }, - { 0x9900, 0x23a6, 0x4000 }, - { 0x9900, 0x23a2, 0x3000 }, - { 0x9900, 0x23a0, 0x2000 }, - { 0x1900, 0x239f, 0x0000 }, - { 0x1900, 0x23a1, 0x0000 }, - { 0x9900, 0x23a4, 0x2000 }, - { 0x1900, 0x23a3, 0x0000 }, - { 0x1900, 0x23a5, 0x0000 }, - { 0x9900, 0x23aa, 0x3000 }, - { 0x9900, 0x23a8, 0x2000 }, - { 0x1900, 0x23a7, 0x0000 }, - { 0x1900, 0x23a9, 0x0000 }, - { 0x9900, 0x23ac, 0x2000 }, - { 0x1900, 0x23ab, 0x0000 }, - { 0x1900, 0x23ad, 0x0000 }, - { 0x8f00, 0x248b, 0x8000 }, - { 0x9a00, 0x241d, 0x7000 }, - { 0x9a00, 0x23ce, 0x6000 }, - { 0x9a00, 0x23be, 0x5000 }, - { 0x9500, 0x23b6, 0x4000 }, - { 0x9900, 0x23b2, 0x3000 }, - { 0x9900, 0x23b0, 0x2000 }, - { 0x1900, 0x23af, 0x0000 }, - { 0x1900, 0x23b1, 0x0000 }, - { 0x9600, 0x23b4, 0x2000 }, - { 0x1900, 0x23b3, 0x0000 }, - { 0x1200, 0x23b5, 0x0000 }, - { 0x9a00, 0x23ba, 0x3000 }, - { 0x9a00, 0x23b8, 0x2000 }, - { 0x1a00, 0x23b7, 0x0000 }, - { 0x1a00, 0x23b9, 0x0000 }, - { 0x9a00, 0x23bc, 0x2000 }, - { 0x1a00, 0x23bb, 0x0000 }, - { 0x1a00, 0x23bd, 0x0000 }, - { 0x9a00, 0x23c6, 0x4000 }, - { 0x9a00, 0x23c2, 0x3000 }, - { 0x9a00, 0x23c0, 0x2000 }, - { 0x1a00, 0x23bf, 0x0000 }, - { 0x1a00, 0x23c1, 0x0000 }, - { 0x9a00, 0x23c4, 0x2000 }, - { 0x1a00, 0x23c3, 0x0000 }, - { 0x1a00, 0x23c5, 0x0000 }, - { 0x9a00, 0x23ca, 0x3000 }, - { 0x9a00, 0x23c8, 0x2000 }, - { 0x1a00, 0x23c7, 0x0000 }, - { 0x1a00, 0x23c9, 0x0000 }, - { 0x9a00, 0x23cc, 0x2000 }, - { 0x1a00, 0x23cb, 0x0000 }, - { 0x1a00, 0x23cd, 0x0000 }, - { 0x9a00, 0x240d, 0x5000 }, - { 0x9a00, 0x2405, 0x4000 }, - { 0x9a00, 0x2401, 0x3000 }, - { 0x9a00, 0x23d0, 0x2000 }, - { 0x1a00, 0x23cf, 0x0000 }, - { 0x1a00, 0x2400, 0x0000 }, - { 0x9a00, 0x2403, 0x2000 }, - { 0x1a00, 0x2402, 0x0000 }, - { 0x1a00, 0x2404, 0x0000 }, - { 0x9a00, 0x2409, 0x3000 }, - { 0x9a00, 0x2407, 0x2000 }, - { 0x1a00, 0x2406, 0x0000 }, - { 0x1a00, 0x2408, 0x0000 }, - { 0x9a00, 0x240b, 0x2000 }, - { 0x1a00, 0x240a, 0x0000 }, - { 0x1a00, 0x240c, 0x0000 }, - { 0x9a00, 0x2415, 0x4000 }, - { 0x9a00, 0x2411, 0x3000 }, - { 0x9a00, 0x240f, 0x2000 }, - { 0x1a00, 0x240e, 0x0000 }, - { 0x1a00, 0x2410, 0x0000 }, - { 0x9a00, 0x2413, 0x2000 }, - { 0x1a00, 0x2412, 0x0000 }, - { 0x1a00, 0x2414, 0x0000 }, - { 0x9a00, 0x2419, 0x3000 }, - { 0x9a00, 0x2417, 0x2000 }, - { 0x1a00, 0x2416, 0x0000 }, - { 0x1a00, 0x2418, 0x0000 }, - { 0x9a00, 0x241b, 0x2000 }, - { 0x1a00, 0x241a, 0x0000 }, - { 0x1a00, 0x241c, 0x0000 }, - { 0x8f00, 0x246b, 0x6000 }, - { 0x9a00, 0x2446, 0x5000 }, - { 0x9a00, 0x2425, 0x4000 }, - { 0x9a00, 0x2421, 0x3000 }, - { 0x9a00, 0x241f, 0x2000 }, - { 0x1a00, 0x241e, 0x0000 }, - { 0x1a00, 0x2420, 0x0000 }, - { 0x9a00, 0x2423, 0x2000 }, - { 0x1a00, 0x2422, 0x0000 }, - { 0x1a00, 0x2424, 0x0000 }, - { 0x9a00, 0x2442, 0x3000 }, - { 0x9a00, 0x2440, 0x2000 }, - { 0x1a00, 0x2426, 0x0000 }, - { 0x1a00, 0x2441, 0x0000 }, - { 0x9a00, 0x2444, 0x2000 }, - { 0x1a00, 0x2443, 0x0000 }, - { 0x1a00, 0x2445, 0x0000 }, - { 0x8f00, 0x2463, 0x4000 }, - { 0x9a00, 0x244a, 0x3000 }, - { 0x9a00, 0x2448, 0x2000 }, - { 0x1a00, 0x2447, 0x0000 }, - { 0x1a00, 0x2449, 0x0000 }, - { 0x8f00, 0x2461, 0x2000 }, - { 0x0f00, 0x2460, 0x0000 }, - { 0x0f00, 0x2462, 0x0000 }, - { 0x8f00, 0x2467, 0x3000 }, - { 0x8f00, 0x2465, 0x2000 }, - { 0x0f00, 0x2464, 0x0000 }, - { 0x0f00, 0x2466, 0x0000 }, - { 0x8f00, 0x2469, 0x2000 }, - { 0x0f00, 0x2468, 0x0000 }, - { 0x0f00, 0x246a, 0x0000 }, - { 0x8f00, 0x247b, 0x5000 }, - { 0x8f00, 0x2473, 0x4000 }, - { 0x8f00, 0x246f, 0x3000 }, - { 0x8f00, 0x246d, 0x2000 }, - { 0x0f00, 0x246c, 0x0000 }, - { 0x0f00, 0x246e, 0x0000 }, - { 0x8f00, 0x2471, 0x2000 }, - { 0x0f00, 0x2470, 0x0000 }, - { 0x0f00, 0x2472, 0x0000 }, - { 0x8f00, 0x2477, 0x3000 }, - { 0x8f00, 0x2475, 0x2000 }, - { 0x0f00, 0x2474, 0x0000 }, - { 0x0f00, 0x2476, 0x0000 }, - { 0x8f00, 0x2479, 0x2000 }, - { 0x0f00, 0x2478, 0x0000 }, - { 0x0f00, 0x247a, 0x0000 }, - { 0x8f00, 0x2483, 0x4000 }, - { 0x8f00, 0x247f, 0x3000 }, - { 0x8f00, 0x247d, 0x2000 }, - { 0x0f00, 0x247c, 0x0000 }, - { 0x0f00, 0x247e, 0x0000 }, - { 0x8f00, 0x2481, 0x2000 }, - { 0x0f00, 0x2480, 0x0000 }, - { 0x0f00, 0x2482, 0x0000 }, - { 0x8f00, 0x2487, 0x3000 }, - { 0x8f00, 0x2485, 0x2000 }, - { 0x0f00, 0x2484, 0x0000 }, - { 0x0f00, 0x2486, 0x0000 }, - { 0x8f00, 0x2489, 0x2000 }, - { 0x0f00, 0x2488, 0x0000 }, - { 0x0f00, 0x248a, 0x0000 }, - { 0x9a00, 0x24cb, 0x7000 }, - { 0x9a00, 0x24ab, 0x6000 }, - { 0x8f00, 0x249b, 0x5000 }, - { 0x8f00, 0x2493, 0x4000 }, - { 0x8f00, 0x248f, 0x3000 }, - { 0x8f00, 0x248d, 0x2000 }, - { 0x0f00, 0x248c, 0x0000 }, - { 0x0f00, 0x248e, 0x0000 }, - { 0x8f00, 0x2491, 0x2000 }, - { 0x0f00, 0x2490, 0x0000 }, - { 0x0f00, 0x2492, 0x0000 }, - { 0x8f00, 0x2497, 0x3000 }, - { 0x8f00, 0x2495, 0x2000 }, - { 0x0f00, 0x2494, 0x0000 }, - { 0x0f00, 0x2496, 0x0000 }, - { 0x8f00, 0x2499, 0x2000 }, - { 0x0f00, 0x2498, 0x0000 }, - { 0x0f00, 0x249a, 0x0000 }, - { 0x9a00, 0x24a3, 0x4000 }, - { 0x9a00, 0x249f, 0x3000 }, - { 0x9a00, 0x249d, 0x2000 }, - { 0x1a00, 0x249c, 0x0000 }, - { 0x1a00, 0x249e, 0x0000 }, - { 0x9a00, 0x24a1, 0x2000 }, - { 0x1a00, 0x24a0, 0x0000 }, - { 0x1a00, 0x24a2, 0x0000 }, - { 0x9a00, 0x24a7, 0x3000 }, - { 0x9a00, 0x24a5, 0x2000 }, - { 0x1a00, 0x24a4, 0x0000 }, - { 0x1a00, 0x24a6, 0x0000 }, - { 0x9a00, 0x24a9, 0x2000 }, - { 0x1a00, 0x24a8, 0x0000 }, - { 0x1a00, 0x24aa, 0x0000 }, - { 0x9a00, 0x24bb, 0x5000 }, - { 0x9a00, 0x24b3, 0x4000 }, - { 0x9a00, 0x24af, 0x3000 }, - { 0x9a00, 0x24ad, 0x2000 }, - { 0x1a00, 0x24ac, 0x0000 }, - { 0x1a00, 0x24ae, 0x0000 }, - { 0x9a00, 0x24b1, 0x2000 }, - { 0x1a00, 0x24b0, 0x0000 }, - { 0x1a00, 0x24b2, 0x0000 }, - { 0x9a00, 0x24b7, 0x3000 }, - { 0x9a00, 0x24b5, 0x2000 }, - { 0x1a00, 0x24b4, 0x0000 }, - { 0x1a00, 0x24b6, 0x0000 }, - { 0x9a00, 0x24b9, 0x2000 }, - { 0x1a00, 0x24b8, 0x0000 }, - { 0x1a00, 0x24ba, 0x0000 }, - { 0x9a00, 0x24c3, 0x4000 }, - { 0x9a00, 0x24bf, 0x3000 }, - { 0x9a00, 0x24bd, 0x2000 }, - { 0x1a00, 0x24bc, 0x0000 }, - { 0x1a00, 0x24be, 0x0000 }, - { 0x9a00, 0x24c1, 0x2000 }, - { 0x1a00, 0x24c0, 0x0000 }, - { 0x1a00, 0x24c2, 0x0000 }, - { 0x9a00, 0x24c7, 0x3000 }, - { 0x9a00, 0x24c5, 0x2000 }, - { 0x1a00, 0x24c4, 0x0000 }, - { 0x1a00, 0x24c6, 0x0000 }, - { 0x9a00, 0x24c9, 0x2000 }, - { 0x1a00, 0x24c8, 0x0000 }, - { 0x1a00, 0x24ca, 0x0000 }, - { 0x8f00, 0x24eb, 0x6000 }, - { 0x9a00, 0x24db, 0x5000 }, - { 0x9a00, 0x24d3, 0x4000 }, - { 0x9a00, 0x24cf, 0x3000 }, - { 0x9a00, 0x24cd, 0x2000 }, - { 0x1a00, 0x24cc, 0x0000 }, - { 0x1a00, 0x24ce, 0x0000 }, - { 0x9a00, 0x24d1, 0x2000 }, - { 0x1a00, 0x24d0, 0x0000 }, - { 0x1a00, 0x24d2, 0x0000 }, - { 0x9a00, 0x24d7, 0x3000 }, - { 0x9a00, 0x24d5, 0x2000 }, - { 0x1a00, 0x24d4, 0x0000 }, - { 0x1a00, 0x24d6, 0x0000 }, - { 0x9a00, 0x24d9, 0x2000 }, - { 0x1a00, 0x24d8, 0x0000 }, - { 0x1a00, 0x24da, 0x0000 }, - { 0x9a00, 0x24e3, 0x4000 }, - { 0x9a00, 0x24df, 0x3000 }, - { 0x9a00, 0x24dd, 0x2000 }, - { 0x1a00, 0x24dc, 0x0000 }, - { 0x1a00, 0x24de, 0x0000 }, - { 0x9a00, 0x24e1, 0x2000 }, - { 0x1a00, 0x24e0, 0x0000 }, - { 0x1a00, 0x24e2, 0x0000 }, - { 0x9a00, 0x24e7, 0x3000 }, - { 0x9a00, 0x24e5, 0x2000 }, - { 0x1a00, 0x24e4, 0x0000 }, - { 0x1a00, 0x24e6, 0x0000 }, - { 0x9a00, 0x24e9, 0x2000 }, - { 0x1a00, 0x24e8, 0x0000 }, - { 0x0f00, 0x24ea, 0x0000 }, - { 0x8f00, 0x24fb, 0x5000 }, - { 0x8f00, 0x24f3, 0x4000 }, - { 0x8f00, 0x24ef, 0x3000 }, - { 0x8f00, 0x24ed, 0x2000 }, - { 0x0f00, 0x24ec, 0x0000 }, - { 0x0f00, 0x24ee, 0x0000 }, - { 0x8f00, 0x24f1, 0x2000 }, - { 0x0f00, 0x24f0, 0x0000 }, - { 0x0f00, 0x24f2, 0x0000 }, - { 0x8f00, 0x24f7, 0x3000 }, - { 0x8f00, 0x24f5, 0x2000 }, - { 0x0f00, 0x24f4, 0x0000 }, - { 0x0f00, 0x24f6, 0x0000 }, - { 0x8f00, 0x24f9, 0x2000 }, - { 0x0f00, 0x24f8, 0x0000 }, - { 0x0f00, 0x24fa, 0x0000 }, - { 0x9a00, 0x2503, 0x4000 }, - { 0x8f00, 0x24ff, 0x3000 }, - { 0x8f00, 0x24fd, 0x2000 }, - { 0x0f00, 0x24fc, 0x0000 }, - { 0x0f00, 0x24fe, 0x0000 }, - { 0x9a00, 0x2501, 0x2000 }, - { 0x1a00, 0x2500, 0x0000 }, - { 0x1a00, 0x2502, 0x0000 }, - { 0x9a00, 0x2507, 0x3000 }, - { 0x9a00, 0x2505, 0x2000 }, - { 0x1a00, 0x2504, 0x0000 }, - { 0x1a00, 0x2506, 0x0000 }, - { 0x9a00, 0x2509, 0x2000 }, - { 0x1a00, 0x2508, 0x0000 }, - { 0x1a00, 0x250a, 0x0000 }, - { 0x9a00, 0x260b, 0x9000 }, - { 0x9a00, 0x258b, 0x8000 }, - { 0x9a00, 0x254b, 0x7000 }, - { 0x9a00, 0x252b, 0x6000 }, - { 0x9a00, 0x251b, 0x5000 }, - { 0x9a00, 0x2513, 0x4000 }, - { 0x9a00, 0x250f, 0x3000 }, - { 0x9a00, 0x250d, 0x2000 }, - { 0x1a00, 0x250c, 0x0000 }, - { 0x1a00, 0x250e, 0x0000 }, - { 0x9a00, 0x2511, 0x2000 }, - { 0x1a00, 0x2510, 0x0000 }, - { 0x1a00, 0x2512, 0x0000 }, - { 0x9a00, 0x2517, 0x3000 }, - { 0x9a00, 0x2515, 0x2000 }, - { 0x1a00, 0x2514, 0x0000 }, - { 0x1a00, 0x2516, 0x0000 }, - { 0x9a00, 0x2519, 0x2000 }, - { 0x1a00, 0x2518, 0x0000 }, - { 0x1a00, 0x251a, 0x0000 }, - { 0x9a00, 0x2523, 0x4000 }, - { 0x9a00, 0x251f, 0x3000 }, - { 0x9a00, 0x251d, 0x2000 }, - { 0x1a00, 0x251c, 0x0000 }, - { 0x1a00, 0x251e, 0x0000 }, - { 0x9a00, 0x2521, 0x2000 }, - { 0x1a00, 0x2520, 0x0000 }, - { 0x1a00, 0x2522, 0x0000 }, - { 0x9a00, 0x2527, 0x3000 }, - { 0x9a00, 0x2525, 0x2000 }, - { 0x1a00, 0x2524, 0x0000 }, - { 0x1a00, 0x2526, 0x0000 }, - { 0x9a00, 0x2529, 0x2000 }, - { 0x1a00, 0x2528, 0x0000 }, - { 0x1a00, 0x252a, 0x0000 }, - { 0x9a00, 0x253b, 0x5000 }, - { 0x9a00, 0x2533, 0x4000 }, - { 0x9a00, 0x252f, 0x3000 }, - { 0x9a00, 0x252d, 0x2000 }, - { 0x1a00, 0x252c, 0x0000 }, - { 0x1a00, 0x252e, 0x0000 }, - { 0x9a00, 0x2531, 0x2000 }, - { 0x1a00, 0x2530, 0x0000 }, - { 0x1a00, 0x2532, 0x0000 }, - { 0x9a00, 0x2537, 0x3000 }, - { 0x9a00, 0x2535, 0x2000 }, - { 0x1a00, 0x2534, 0x0000 }, - { 0x1a00, 0x2536, 0x0000 }, - { 0x9a00, 0x2539, 0x2000 }, - { 0x1a00, 0x2538, 0x0000 }, - { 0x1a00, 0x253a, 0x0000 }, - { 0x9a00, 0x2543, 0x4000 }, - { 0x9a00, 0x253f, 0x3000 }, - { 0x9a00, 0x253d, 0x2000 }, - { 0x1a00, 0x253c, 0x0000 }, - { 0x1a00, 0x253e, 0x0000 }, - { 0x9a00, 0x2541, 0x2000 }, - { 0x1a00, 0x2540, 0x0000 }, - { 0x1a00, 0x2542, 0x0000 }, - { 0x9a00, 0x2547, 0x3000 }, - { 0x9a00, 0x2545, 0x2000 }, - { 0x1a00, 0x2544, 0x0000 }, - { 0x1a00, 0x2546, 0x0000 }, - { 0x9a00, 0x2549, 0x2000 }, - { 0x1a00, 0x2548, 0x0000 }, - { 0x1a00, 0x254a, 0x0000 }, - { 0x9a00, 0x256b, 0x6000 }, - { 0x9a00, 0x255b, 0x5000 }, - { 0x9a00, 0x2553, 0x4000 }, - { 0x9a00, 0x254f, 0x3000 }, - { 0x9a00, 0x254d, 0x2000 }, - { 0x1a00, 0x254c, 0x0000 }, - { 0x1a00, 0x254e, 0x0000 }, - { 0x9a00, 0x2551, 0x2000 }, - { 0x1a00, 0x2550, 0x0000 }, - { 0x1a00, 0x2552, 0x0000 }, - { 0x9a00, 0x2557, 0x3000 }, - { 0x9a00, 0x2555, 0x2000 }, - { 0x1a00, 0x2554, 0x0000 }, - { 0x1a00, 0x2556, 0x0000 }, - { 0x9a00, 0x2559, 0x2000 }, - { 0x1a00, 0x2558, 0x0000 }, - { 0x1a00, 0x255a, 0x0000 }, - { 0x9a00, 0x2563, 0x4000 }, - { 0x9a00, 0x255f, 0x3000 }, - { 0x9a00, 0x255d, 0x2000 }, - { 0x1a00, 0x255c, 0x0000 }, - { 0x1a00, 0x255e, 0x0000 }, - { 0x9a00, 0x2561, 0x2000 }, - { 0x1a00, 0x2560, 0x0000 }, - { 0x1a00, 0x2562, 0x0000 }, - { 0x9a00, 0x2567, 0x3000 }, - { 0x9a00, 0x2565, 0x2000 }, - { 0x1a00, 0x2564, 0x0000 }, - { 0x1a00, 0x2566, 0x0000 }, - { 0x9a00, 0x2569, 0x2000 }, - { 0x1a00, 0x2568, 0x0000 }, - { 0x1a00, 0x256a, 0x0000 }, - { 0x9a00, 0x257b, 0x5000 }, - { 0x9a00, 0x2573, 0x4000 }, - { 0x9a00, 0x256f, 0x3000 }, - { 0x9a00, 0x256d, 0x2000 }, - { 0x1a00, 0x256c, 0x0000 }, - { 0x1a00, 0x256e, 0x0000 }, - { 0x9a00, 0x2571, 0x2000 }, - { 0x1a00, 0x2570, 0x0000 }, - { 0x1a00, 0x2572, 0x0000 }, - { 0x9a00, 0x2577, 0x3000 }, - { 0x9a00, 0x2575, 0x2000 }, - { 0x1a00, 0x2574, 0x0000 }, - { 0x1a00, 0x2576, 0x0000 }, - { 0x9a00, 0x2579, 0x2000 }, - { 0x1a00, 0x2578, 0x0000 }, - { 0x1a00, 0x257a, 0x0000 }, - { 0x9a00, 0x2583, 0x4000 }, - { 0x9a00, 0x257f, 0x3000 }, - { 0x9a00, 0x257d, 0x2000 }, - { 0x1a00, 0x257c, 0x0000 }, - { 0x1a00, 0x257e, 0x0000 }, - { 0x9a00, 0x2581, 0x2000 }, - { 0x1a00, 0x2580, 0x0000 }, - { 0x1a00, 0x2582, 0x0000 }, - { 0x9a00, 0x2587, 0x3000 }, - { 0x9a00, 0x2585, 0x2000 }, - { 0x1a00, 0x2584, 0x0000 }, - { 0x1a00, 0x2586, 0x0000 }, - { 0x9a00, 0x2589, 0x2000 }, - { 0x1a00, 0x2588, 0x0000 }, - { 0x1a00, 0x258a, 0x0000 }, - { 0x9a00, 0x25cb, 0x7000 }, - { 0x9a00, 0x25ab, 0x6000 }, - { 0x9a00, 0x259b, 0x5000 }, - { 0x9a00, 0x2593, 0x4000 }, - { 0x9a00, 0x258f, 0x3000 }, - { 0x9a00, 0x258d, 0x2000 }, - { 0x1a00, 0x258c, 0x0000 }, - { 0x1a00, 0x258e, 0x0000 }, - { 0x9a00, 0x2591, 0x2000 }, - { 0x1a00, 0x2590, 0x0000 }, - { 0x1a00, 0x2592, 0x0000 }, - { 0x9a00, 0x2597, 0x3000 }, - { 0x9a00, 0x2595, 0x2000 }, - { 0x1a00, 0x2594, 0x0000 }, - { 0x1a00, 0x2596, 0x0000 }, - { 0x9a00, 0x2599, 0x2000 }, - { 0x1a00, 0x2598, 0x0000 }, - { 0x1a00, 0x259a, 0x0000 }, - { 0x9a00, 0x25a3, 0x4000 }, - { 0x9a00, 0x259f, 0x3000 }, - { 0x9a00, 0x259d, 0x2000 }, - { 0x1a00, 0x259c, 0x0000 }, - { 0x1a00, 0x259e, 0x0000 }, - { 0x9a00, 0x25a1, 0x2000 }, - { 0x1a00, 0x25a0, 0x0000 }, - { 0x1a00, 0x25a2, 0x0000 }, - { 0x9a00, 0x25a7, 0x3000 }, - { 0x9a00, 0x25a5, 0x2000 }, - { 0x1a00, 0x25a4, 0x0000 }, - { 0x1a00, 0x25a6, 0x0000 }, - { 0x9a00, 0x25a9, 0x2000 }, - { 0x1a00, 0x25a8, 0x0000 }, - { 0x1a00, 0x25aa, 0x0000 }, - { 0x9a00, 0x25bb, 0x5000 }, - { 0x9a00, 0x25b3, 0x4000 }, - { 0x9a00, 0x25af, 0x3000 }, - { 0x9a00, 0x25ad, 0x2000 }, - { 0x1a00, 0x25ac, 0x0000 }, - { 0x1a00, 0x25ae, 0x0000 }, - { 0x9a00, 0x25b1, 0x2000 }, - { 0x1a00, 0x25b0, 0x0000 }, - { 0x1a00, 0x25b2, 0x0000 }, - { 0x9900, 0x25b7, 0x3000 }, - { 0x9a00, 0x25b5, 0x2000 }, - { 0x1a00, 0x25b4, 0x0000 }, - { 0x1a00, 0x25b6, 0x0000 }, - { 0x9a00, 0x25b9, 0x2000 }, - { 0x1a00, 0x25b8, 0x0000 }, - { 0x1a00, 0x25ba, 0x0000 }, - { 0x9a00, 0x25c3, 0x4000 }, - { 0x9a00, 0x25bf, 0x3000 }, - { 0x9a00, 0x25bd, 0x2000 }, - { 0x1a00, 0x25bc, 0x0000 }, - { 0x1a00, 0x25be, 0x0000 }, - { 0x9900, 0x25c1, 0x2000 }, - { 0x1a00, 0x25c0, 0x0000 }, - { 0x1a00, 0x25c2, 0x0000 }, - { 0x9a00, 0x25c7, 0x3000 }, - { 0x9a00, 0x25c5, 0x2000 }, - { 0x1a00, 0x25c4, 0x0000 }, - { 0x1a00, 0x25c6, 0x0000 }, - { 0x9a00, 0x25c9, 0x2000 }, - { 0x1a00, 0x25c8, 0x0000 }, - { 0x1a00, 0x25ca, 0x0000 }, - { 0x9a00, 0x25eb, 0x6000 }, - { 0x9a00, 0x25db, 0x5000 }, - { 0x9a00, 0x25d3, 0x4000 }, - { 0x9a00, 0x25cf, 0x3000 }, - { 0x9a00, 0x25cd, 0x2000 }, - { 0x1a00, 0x25cc, 0x0000 }, - { 0x1a00, 0x25ce, 0x0000 }, - { 0x9a00, 0x25d1, 0x2000 }, - { 0x1a00, 0x25d0, 0x0000 }, - { 0x1a00, 0x25d2, 0x0000 }, - { 0x9a00, 0x25d7, 0x3000 }, - { 0x9a00, 0x25d5, 0x2000 }, - { 0x1a00, 0x25d4, 0x0000 }, - { 0x1a00, 0x25d6, 0x0000 }, - { 0x9a00, 0x25d9, 0x2000 }, - { 0x1a00, 0x25d8, 0x0000 }, - { 0x1a00, 0x25da, 0x0000 }, - { 0x9a00, 0x25e3, 0x4000 }, - { 0x9a00, 0x25df, 0x3000 }, - { 0x9a00, 0x25dd, 0x2000 }, - { 0x1a00, 0x25dc, 0x0000 }, - { 0x1a00, 0x25de, 0x0000 }, - { 0x9a00, 0x25e1, 0x2000 }, - { 0x1a00, 0x25e0, 0x0000 }, - { 0x1a00, 0x25e2, 0x0000 }, - { 0x9a00, 0x25e7, 0x3000 }, - { 0x9a00, 0x25e5, 0x2000 }, - { 0x1a00, 0x25e4, 0x0000 }, - { 0x1a00, 0x25e6, 0x0000 }, - { 0x9a00, 0x25e9, 0x2000 }, - { 0x1a00, 0x25e8, 0x0000 }, - { 0x1a00, 0x25ea, 0x0000 }, - { 0x9900, 0x25fb, 0x5000 }, - { 0x9a00, 0x25f3, 0x4000 }, - { 0x9a00, 0x25ef, 0x3000 }, - { 0x9a00, 0x25ed, 0x2000 }, - { 0x1a00, 0x25ec, 0x0000 }, - { 0x1a00, 0x25ee, 0x0000 }, - { 0x9a00, 0x25f1, 0x2000 }, - { 0x1a00, 0x25f0, 0x0000 }, - { 0x1a00, 0x25f2, 0x0000 }, - { 0x9a00, 0x25f7, 0x3000 }, - { 0x9a00, 0x25f5, 0x2000 }, - { 0x1a00, 0x25f4, 0x0000 }, - { 0x1a00, 0x25f6, 0x0000 }, - { 0x9900, 0x25f9, 0x2000 }, - { 0x1900, 0x25f8, 0x0000 }, - { 0x1900, 0x25fa, 0x0000 }, - { 0x9a00, 0x2603, 0x4000 }, - { 0x9900, 0x25ff, 0x3000 }, - { 0x9900, 0x25fd, 0x2000 }, - { 0x1900, 0x25fc, 0x0000 }, - { 0x1900, 0x25fe, 0x0000 }, - { 0x9a00, 0x2601, 0x2000 }, - { 0x1a00, 0x2600, 0x0000 }, - { 0x1a00, 0x2602, 0x0000 }, - { 0x9a00, 0x2607, 0x3000 }, - { 0x9a00, 0x2605, 0x2000 }, - { 0x1a00, 0x2604, 0x0000 }, - { 0x1a00, 0x2606, 0x0000 }, - { 0x9a00, 0x2609, 0x2000 }, - { 0x1a00, 0x2608, 0x0000 }, - { 0x1a00, 0x260a, 0x0000 }, - { 0x9a00, 0x268e, 0x8000 }, - { 0x9a00, 0x264c, 0x7000 }, - { 0x9a00, 0x262c, 0x6000 }, - { 0x9a00, 0x261c, 0x5000 }, - { 0x9a00, 0x2613, 0x4000 }, - { 0x9a00, 0x260f, 0x3000 }, - { 0x9a00, 0x260d, 0x2000 }, - { 0x1a00, 0x260c, 0x0000 }, - { 0x1a00, 0x260e, 0x0000 }, - { 0x9a00, 0x2611, 0x2000 }, - { 0x1a00, 0x2610, 0x0000 }, - { 0x1a00, 0x2612, 0x0000 }, - { 0x9a00, 0x2617, 0x3000 }, - { 0x9a00, 0x2615, 0x2000 }, - { 0x1a00, 0x2614, 0x0000 }, - { 0x1a00, 0x2616, 0x0000 }, - { 0x9a00, 0x261a, 0x2000 }, - { 0x1a00, 0x2619, 0x0000 }, - { 0x1a00, 0x261b, 0x0000 }, - { 0x9a00, 0x2624, 0x4000 }, - { 0x9a00, 0x2620, 0x3000 }, - { 0x9a00, 0x261e, 0x2000 }, - { 0x1a00, 0x261d, 0x0000 }, - { 0x1a00, 0x261f, 0x0000 }, - { 0x9a00, 0x2622, 0x2000 }, - { 0x1a00, 0x2621, 0x0000 }, - { 0x1a00, 0x2623, 0x0000 }, - { 0x9a00, 0x2628, 0x3000 }, - { 0x9a00, 0x2626, 0x2000 }, - { 0x1a00, 0x2625, 0x0000 }, - { 0x1a00, 0x2627, 0x0000 }, - { 0x9a00, 0x262a, 0x2000 }, - { 0x1a00, 0x2629, 0x0000 }, - { 0x1a00, 0x262b, 0x0000 }, - { 0x9a00, 0x263c, 0x5000 }, - { 0x9a00, 0x2634, 0x4000 }, - { 0x9a00, 0x2630, 0x3000 }, - { 0x9a00, 0x262e, 0x2000 }, - { 0x1a00, 0x262d, 0x0000 }, - { 0x1a00, 0x262f, 0x0000 }, - { 0x9a00, 0x2632, 0x2000 }, - { 0x1a00, 0x2631, 0x0000 }, - { 0x1a00, 0x2633, 0x0000 }, - { 0x9a00, 0x2638, 0x3000 }, - { 0x9a00, 0x2636, 0x2000 }, - { 0x1a00, 0x2635, 0x0000 }, - { 0x1a00, 0x2637, 0x0000 }, - { 0x9a00, 0x263a, 0x2000 }, - { 0x1a00, 0x2639, 0x0000 }, - { 0x1a00, 0x263b, 0x0000 }, - { 0x9a00, 0x2644, 0x4000 }, - { 0x9a00, 0x2640, 0x3000 }, - { 0x9a00, 0x263e, 0x2000 }, - { 0x1a00, 0x263d, 0x0000 }, - { 0x1a00, 0x263f, 0x0000 }, - { 0x9a00, 0x2642, 0x2000 }, - { 0x1a00, 0x2641, 0x0000 }, - { 0x1a00, 0x2643, 0x0000 }, - { 0x9a00, 0x2648, 0x3000 }, - { 0x9a00, 0x2646, 0x2000 }, - { 0x1a00, 0x2645, 0x0000 }, - { 0x1a00, 0x2647, 0x0000 }, - { 0x9a00, 0x264a, 0x2000 }, - { 0x1a00, 0x2649, 0x0000 }, - { 0x1a00, 0x264b, 0x0000 }, - { 0x9a00, 0x266c, 0x6000 }, - { 0x9a00, 0x265c, 0x5000 }, - { 0x9a00, 0x2654, 0x4000 }, - { 0x9a00, 0x2650, 0x3000 }, - { 0x9a00, 0x264e, 0x2000 }, - { 0x1a00, 0x264d, 0x0000 }, - { 0x1a00, 0x264f, 0x0000 }, - { 0x9a00, 0x2652, 0x2000 }, - { 0x1a00, 0x2651, 0x0000 }, - { 0x1a00, 0x2653, 0x0000 }, - { 0x9a00, 0x2658, 0x3000 }, - { 0x9a00, 0x2656, 0x2000 }, - { 0x1a00, 0x2655, 0x0000 }, - { 0x1a00, 0x2657, 0x0000 }, - { 0x9a00, 0x265a, 0x2000 }, - { 0x1a00, 0x2659, 0x0000 }, - { 0x1a00, 0x265b, 0x0000 }, - { 0x9a00, 0x2664, 0x4000 }, - { 0x9a00, 0x2660, 0x3000 }, - { 0x9a00, 0x265e, 0x2000 }, - { 0x1a00, 0x265d, 0x0000 }, - { 0x1a00, 0x265f, 0x0000 }, - { 0x9a00, 0x2662, 0x2000 }, - { 0x1a00, 0x2661, 0x0000 }, - { 0x1a00, 0x2663, 0x0000 }, - { 0x9a00, 0x2668, 0x3000 }, - { 0x9a00, 0x2666, 0x2000 }, - { 0x1a00, 0x2665, 0x0000 }, - { 0x1a00, 0x2667, 0x0000 }, - { 0x9a00, 0x266a, 0x2000 }, - { 0x1a00, 0x2669, 0x0000 }, - { 0x1a00, 0x266b, 0x0000 }, - { 0x9a00, 0x267c, 0x5000 }, - { 0x9a00, 0x2674, 0x4000 }, - { 0x9a00, 0x2670, 0x3000 }, - { 0x9a00, 0x266e, 0x2000 }, - { 0x1a00, 0x266d, 0x0000 }, - { 0x1900, 0x266f, 0x0000 }, - { 0x9a00, 0x2672, 0x2000 }, - { 0x1a00, 0x2671, 0x0000 }, - { 0x1a00, 0x2673, 0x0000 }, - { 0x9a00, 0x2678, 0x3000 }, - { 0x9a00, 0x2676, 0x2000 }, - { 0x1a00, 0x2675, 0x0000 }, - { 0x1a00, 0x2677, 0x0000 }, - { 0x9a00, 0x267a, 0x2000 }, - { 0x1a00, 0x2679, 0x0000 }, - { 0x1a00, 0x267b, 0x0000 }, - { 0x9a00, 0x2686, 0x4000 }, - { 0x9a00, 0x2682, 0x3000 }, - { 0x9a00, 0x2680, 0x2000 }, - { 0x1a00, 0x267d, 0x0000 }, - { 0x1a00, 0x2681, 0x0000 }, - { 0x9a00, 0x2684, 0x2000 }, - { 0x1a00, 0x2683, 0x0000 }, - { 0x1a00, 0x2685, 0x0000 }, - { 0x9a00, 0x268a, 0x3000 }, - { 0x9a00, 0x2688, 0x2000 }, - { 0x1a00, 0x2687, 0x0000 }, - { 0x1a00, 0x2689, 0x0000 }, - { 0x9a00, 0x268c, 0x2000 }, - { 0x1a00, 0x268b, 0x0000 }, - { 0x1a00, 0x268d, 0x0000 }, - { 0x9a00, 0x273f, 0x7000 }, - { 0x9a00, 0x271e, 0x6000 }, - { 0x9a00, 0x270e, 0x5000 }, - { 0x9a00, 0x2703, 0x4000 }, - { 0x9a00, 0x26a0, 0x3000 }, - { 0x9a00, 0x2690, 0x2000 }, - { 0x1a00, 0x268f, 0x0000 }, - { 0x1a00, 0x2691, 0x0000 }, - { 0x9a00, 0x2701, 0x2000 }, - { 0x1a00, 0x26a1, 0x0000 }, - { 0x1a00, 0x2702, 0x0000 }, - { 0x9a00, 0x2708, 0x3000 }, - { 0x9a00, 0x2706, 0x2000 }, - { 0x1a00, 0x2704, 0x0000 }, - { 0x1a00, 0x2707, 0x0000 }, - { 0x9a00, 0x270c, 0x2000 }, - { 0x1a00, 0x2709, 0x0000 }, - { 0x1a00, 0x270d, 0x0000 }, - { 0x9a00, 0x2716, 0x4000 }, - { 0x9a00, 0x2712, 0x3000 }, - { 0x9a00, 0x2710, 0x2000 }, - { 0x1a00, 0x270f, 0x0000 }, - { 0x1a00, 0x2711, 0x0000 }, - { 0x9a00, 0x2714, 0x2000 }, - { 0x1a00, 0x2713, 0x0000 }, - { 0x1a00, 0x2715, 0x0000 }, - { 0x9a00, 0x271a, 0x3000 }, - { 0x9a00, 0x2718, 0x2000 }, - { 0x1a00, 0x2717, 0x0000 }, - { 0x1a00, 0x2719, 0x0000 }, - { 0x9a00, 0x271c, 0x2000 }, - { 0x1a00, 0x271b, 0x0000 }, - { 0x1a00, 0x271d, 0x0000 }, - { 0x9a00, 0x272f, 0x5000 }, - { 0x9a00, 0x2726, 0x4000 }, - { 0x9a00, 0x2722, 0x3000 }, - { 0x9a00, 0x2720, 0x2000 }, - { 0x1a00, 0x271f, 0x0000 }, - { 0x1a00, 0x2721, 0x0000 }, - { 0x9a00, 0x2724, 0x2000 }, - { 0x1a00, 0x2723, 0x0000 }, - { 0x1a00, 0x2725, 0x0000 }, - { 0x9a00, 0x272b, 0x3000 }, - { 0x9a00, 0x2729, 0x2000 }, - { 0x1a00, 0x2727, 0x0000 }, - { 0x1a00, 0x272a, 0x0000 }, - { 0x9a00, 0x272d, 0x2000 }, - { 0x1a00, 0x272c, 0x0000 }, - { 0x1a00, 0x272e, 0x0000 }, - { 0x9a00, 0x2737, 0x4000 }, - { 0x9a00, 0x2733, 0x3000 }, - { 0x9a00, 0x2731, 0x2000 }, - { 0x1a00, 0x2730, 0x0000 }, - { 0x1a00, 0x2732, 0x0000 }, - { 0x9a00, 0x2735, 0x2000 }, - { 0x1a00, 0x2734, 0x0000 }, - { 0x1a00, 0x2736, 0x0000 }, - { 0x9a00, 0x273b, 0x3000 }, - { 0x9a00, 0x2739, 0x2000 }, - { 0x1a00, 0x2738, 0x0000 }, - { 0x1a00, 0x273a, 0x0000 }, - { 0x9a00, 0x273d, 0x2000 }, - { 0x1a00, 0x273c, 0x0000 }, - { 0x1a00, 0x273e, 0x0000 }, - { 0x9a00, 0x2767, 0x6000 }, - { 0x9a00, 0x2751, 0x5000 }, - { 0x9a00, 0x2747, 0x4000 }, - { 0x9a00, 0x2743, 0x3000 }, - { 0x9a00, 0x2741, 0x2000 }, - { 0x1a00, 0x2740, 0x0000 }, - { 0x1a00, 0x2742, 0x0000 }, - { 0x9a00, 0x2745, 0x2000 }, - { 0x1a00, 0x2744, 0x0000 }, - { 0x1a00, 0x2746, 0x0000 }, - { 0x9a00, 0x274b, 0x3000 }, - { 0x9a00, 0x2749, 0x2000 }, - { 0x1a00, 0x2748, 0x0000 }, - { 0x1a00, 0x274a, 0x0000 }, - { 0x9a00, 0x274f, 0x2000 }, - { 0x1a00, 0x274d, 0x0000 }, - { 0x1a00, 0x2750, 0x0000 }, - { 0x9a00, 0x275d, 0x4000 }, - { 0x9a00, 0x2759, 0x3000 }, - { 0x9a00, 0x2756, 0x2000 }, - { 0x1a00, 0x2752, 0x0000 }, - { 0x1a00, 0x2758, 0x0000 }, - { 0x9a00, 0x275b, 0x2000 }, - { 0x1a00, 0x275a, 0x0000 }, - { 0x1a00, 0x275c, 0x0000 }, - { 0x9a00, 0x2763, 0x3000 }, - { 0x9a00, 0x2761, 0x2000 }, - { 0x1a00, 0x275e, 0x0000 }, - { 0x1a00, 0x2762, 0x0000 }, - { 0x9a00, 0x2765, 0x2000 }, - { 0x1a00, 0x2764, 0x0000 }, - { 0x1a00, 0x2766, 0x0000 }, - { 0x8f00, 0x2777, 0x5000 }, - { 0x9200, 0x276f, 0x4000 }, - { 0x9200, 0x276b, 0x3000 }, - { 0x9200, 0x2769, 0x2000 }, - { 0x1600, 0x2768, 0x0000 }, - { 0x1600, 0x276a, 0x0000 }, - { 0x9200, 0x276d, 0x2000 }, - { 0x1600, 0x276c, 0x0000 }, - { 0x1600, 0x276e, 0x0000 }, - { 0x9200, 0x2773, 0x3000 }, - { 0x9200, 0x2771, 0x2000 }, - { 0x1600, 0x2770, 0x0000 }, - { 0x1600, 0x2772, 0x0000 }, - { 0x9200, 0x2775, 0x2000 }, - { 0x1600, 0x2774, 0x0000 }, - { 0x0f00, 0x2776, 0x0000 }, - { 0x8f00, 0x277f, 0x4000 }, - { 0x8f00, 0x277b, 0x3000 }, - { 0x8f00, 0x2779, 0x2000 }, - { 0x0f00, 0x2778, 0x0000 }, - { 0x0f00, 0x277a, 0x0000 }, - { 0x8f00, 0x277d, 0x2000 }, - { 0x0f00, 0x277c, 0x0000 }, - { 0x0f00, 0x277e, 0x0000 }, - { 0x8f00, 0x2783, 0x3000 }, - { 0x8f00, 0x2781, 0x2000 }, - { 0x0f00, 0x2780, 0x0000 }, - { 0x0f00, 0x2782, 0x0000 }, - { 0x8f00, 0x2785, 0x2000 }, - { 0x0f00, 0x2784, 0x0000 }, - { 0x0f00, 0x2786, 0x0000 }, - { 0x9900, 0x29a0, 0xa000 }, - { 0x9a00, 0x28a0, 0x9000 }, - { 0x9a00, 0x2820, 0x8000 }, - { 0x9900, 0x27dc, 0x7000 }, - { 0x9a00, 0x27aa, 0x6000 }, - { 0x9a00, 0x279a, 0x5000 }, - { 0x8f00, 0x278f, 0x4000 }, - { 0x8f00, 0x278b, 0x3000 }, - { 0x8f00, 0x2789, 0x2000 }, - { 0x0f00, 0x2788, 0x0000 }, - { 0x0f00, 0x278a, 0x0000 }, - { 0x8f00, 0x278d, 0x2000 }, - { 0x0f00, 0x278c, 0x0000 }, - { 0x0f00, 0x278e, 0x0000 }, - { 0x8f00, 0x2793, 0x3000 }, - { 0x8f00, 0x2791, 0x2000 }, - { 0x0f00, 0x2790, 0x0000 }, - { 0x0f00, 0x2792, 0x0000 }, - { 0x9a00, 0x2798, 0x2000 }, - { 0x1a00, 0x2794, 0x0000 }, - { 0x1a00, 0x2799, 0x0000 }, - { 0x9a00, 0x27a2, 0x4000 }, - { 0x9a00, 0x279e, 0x3000 }, - { 0x9a00, 0x279c, 0x2000 }, - { 0x1a00, 0x279b, 0x0000 }, - { 0x1a00, 0x279d, 0x0000 }, - { 0x9a00, 0x27a0, 0x2000 }, - { 0x1a00, 0x279f, 0x0000 }, - { 0x1a00, 0x27a1, 0x0000 }, - { 0x9a00, 0x27a6, 0x3000 }, - { 0x9a00, 0x27a4, 0x2000 }, - { 0x1a00, 0x27a3, 0x0000 }, - { 0x1a00, 0x27a5, 0x0000 }, - { 0x9a00, 0x27a8, 0x2000 }, - { 0x1a00, 0x27a7, 0x0000 }, - { 0x1a00, 0x27a9, 0x0000 }, - { 0x9a00, 0x27bb, 0x5000 }, - { 0x9a00, 0x27b3, 0x4000 }, - { 0x9a00, 0x27ae, 0x3000 }, - { 0x9a00, 0x27ac, 0x2000 }, - { 0x1a00, 0x27ab, 0x0000 }, - { 0x1a00, 0x27ad, 0x0000 }, - { 0x9a00, 0x27b1, 0x2000 }, - { 0x1a00, 0x27af, 0x0000 }, - { 0x1a00, 0x27b2, 0x0000 }, - { 0x9a00, 0x27b7, 0x3000 }, - { 0x9a00, 0x27b5, 0x2000 }, - { 0x1a00, 0x27b4, 0x0000 }, - { 0x1a00, 0x27b6, 0x0000 }, - { 0x9a00, 0x27b9, 0x2000 }, - { 0x1a00, 0x27b8, 0x0000 }, - { 0x1a00, 0x27ba, 0x0000 }, - { 0x9900, 0x27d4, 0x4000 }, - { 0x9900, 0x27d0, 0x3000 }, - { 0x9a00, 0x27bd, 0x2000 }, - { 0x1a00, 0x27bc, 0x0000 }, - { 0x1a00, 0x27be, 0x0000 }, - { 0x9900, 0x27d2, 0x2000 }, - { 0x1900, 0x27d1, 0x0000 }, - { 0x1900, 0x27d3, 0x0000 }, - { 0x9900, 0x27d8, 0x3000 }, - { 0x9900, 0x27d6, 0x2000 }, - { 0x1900, 0x27d5, 0x0000 }, - { 0x1900, 0x27d7, 0x0000 }, - { 0x9900, 0x27da, 0x2000 }, - { 0x1900, 0x27d9, 0x0000 }, - { 0x1900, 0x27db, 0x0000 }, - { 0x9a00, 0x2800, 0x6000 }, - { 0x9900, 0x27f0, 0x5000 }, - { 0x9900, 0x27e4, 0x4000 }, - { 0x9900, 0x27e0, 0x3000 }, - { 0x9900, 0x27de, 0x2000 }, - { 0x1900, 0x27dd, 0x0000 }, - { 0x1900, 0x27df, 0x0000 }, - { 0x9900, 0x27e2, 0x2000 }, - { 0x1900, 0x27e1, 0x0000 }, - { 0x1900, 0x27e3, 0x0000 }, - { 0x9600, 0x27e8, 0x3000 }, - { 0x9600, 0x27e6, 0x2000 }, - { 0x1900, 0x27e5, 0x0000 }, - { 0x1200, 0x27e7, 0x0000 }, - { 0x9600, 0x27ea, 0x2000 }, - { 0x1200, 0x27e9, 0x0000 }, - { 0x1200, 0x27eb, 0x0000 }, - { 0x9900, 0x27f8, 0x4000 }, - { 0x9900, 0x27f4, 0x3000 }, - { 0x9900, 0x27f2, 0x2000 }, - { 0x1900, 0x27f1, 0x0000 }, - { 0x1900, 0x27f3, 0x0000 }, - { 0x9900, 0x27f6, 0x2000 }, - { 0x1900, 0x27f5, 0x0000 }, - { 0x1900, 0x27f7, 0x0000 }, - { 0x9900, 0x27fc, 0x3000 }, - { 0x9900, 0x27fa, 0x2000 }, - { 0x1900, 0x27f9, 0x0000 }, - { 0x1900, 0x27fb, 0x0000 }, - { 0x9900, 0x27fe, 0x2000 }, - { 0x1900, 0x27fd, 0x0000 }, - { 0x1900, 0x27ff, 0x0000 }, - { 0x9a00, 0x2810, 0x5000 }, - { 0x9a00, 0x2808, 0x4000 }, - { 0x9a00, 0x2804, 0x3000 }, - { 0x9a00, 0x2802, 0x2000 }, - { 0x1a00, 0x2801, 0x0000 }, - { 0x1a00, 0x2803, 0x0000 }, - { 0x9a00, 0x2806, 0x2000 }, - { 0x1a00, 0x2805, 0x0000 }, - { 0x1a00, 0x2807, 0x0000 }, - { 0x9a00, 0x280c, 0x3000 }, - { 0x9a00, 0x280a, 0x2000 }, - { 0x1a00, 0x2809, 0x0000 }, - { 0x1a00, 0x280b, 0x0000 }, - { 0x9a00, 0x280e, 0x2000 }, - { 0x1a00, 0x280d, 0x0000 }, - { 0x1a00, 0x280f, 0x0000 }, - { 0x9a00, 0x2818, 0x4000 }, - { 0x9a00, 0x2814, 0x3000 }, - { 0x9a00, 0x2812, 0x2000 }, - { 0x1a00, 0x2811, 0x0000 }, - { 0x1a00, 0x2813, 0x0000 }, - { 0x9a00, 0x2816, 0x2000 }, - { 0x1a00, 0x2815, 0x0000 }, - { 0x1a00, 0x2817, 0x0000 }, - { 0x9a00, 0x281c, 0x3000 }, - { 0x9a00, 0x281a, 0x2000 }, - { 0x1a00, 0x2819, 0x0000 }, - { 0x1a00, 0x281b, 0x0000 }, - { 0x9a00, 0x281e, 0x2000 }, - { 0x1a00, 0x281d, 0x0000 }, - { 0x1a00, 0x281f, 0x0000 }, - { 0x9a00, 0x2860, 0x7000 }, - { 0x9a00, 0x2840, 0x6000 }, - { 0x9a00, 0x2830, 0x5000 }, - { 0x9a00, 0x2828, 0x4000 }, - { 0x9a00, 0x2824, 0x3000 }, - { 0x9a00, 0x2822, 0x2000 }, - { 0x1a00, 0x2821, 0x0000 }, - { 0x1a00, 0x2823, 0x0000 }, - { 0x9a00, 0x2826, 0x2000 }, - { 0x1a00, 0x2825, 0x0000 }, - { 0x1a00, 0x2827, 0x0000 }, - { 0x9a00, 0x282c, 0x3000 }, - { 0x9a00, 0x282a, 0x2000 }, - { 0x1a00, 0x2829, 0x0000 }, - { 0x1a00, 0x282b, 0x0000 }, - { 0x9a00, 0x282e, 0x2000 }, - { 0x1a00, 0x282d, 0x0000 }, - { 0x1a00, 0x282f, 0x0000 }, - { 0x9a00, 0x2838, 0x4000 }, - { 0x9a00, 0x2834, 0x3000 }, - { 0x9a00, 0x2832, 0x2000 }, - { 0x1a00, 0x2831, 0x0000 }, - { 0x1a00, 0x2833, 0x0000 }, - { 0x9a00, 0x2836, 0x2000 }, - { 0x1a00, 0x2835, 0x0000 }, - { 0x1a00, 0x2837, 0x0000 }, - { 0x9a00, 0x283c, 0x3000 }, - { 0x9a00, 0x283a, 0x2000 }, - { 0x1a00, 0x2839, 0x0000 }, - { 0x1a00, 0x283b, 0x0000 }, - { 0x9a00, 0x283e, 0x2000 }, - { 0x1a00, 0x283d, 0x0000 }, - { 0x1a00, 0x283f, 0x0000 }, - { 0x9a00, 0x2850, 0x5000 }, - { 0x9a00, 0x2848, 0x4000 }, - { 0x9a00, 0x2844, 0x3000 }, - { 0x9a00, 0x2842, 0x2000 }, - { 0x1a00, 0x2841, 0x0000 }, - { 0x1a00, 0x2843, 0x0000 }, - { 0x9a00, 0x2846, 0x2000 }, - { 0x1a00, 0x2845, 0x0000 }, - { 0x1a00, 0x2847, 0x0000 }, - { 0x9a00, 0x284c, 0x3000 }, - { 0x9a00, 0x284a, 0x2000 }, - { 0x1a00, 0x2849, 0x0000 }, - { 0x1a00, 0x284b, 0x0000 }, - { 0x9a00, 0x284e, 0x2000 }, - { 0x1a00, 0x284d, 0x0000 }, - { 0x1a00, 0x284f, 0x0000 }, - { 0x9a00, 0x2858, 0x4000 }, - { 0x9a00, 0x2854, 0x3000 }, - { 0x9a00, 0x2852, 0x2000 }, - { 0x1a00, 0x2851, 0x0000 }, - { 0x1a00, 0x2853, 0x0000 }, - { 0x9a00, 0x2856, 0x2000 }, - { 0x1a00, 0x2855, 0x0000 }, - { 0x1a00, 0x2857, 0x0000 }, - { 0x9a00, 0x285c, 0x3000 }, - { 0x9a00, 0x285a, 0x2000 }, - { 0x1a00, 0x2859, 0x0000 }, - { 0x1a00, 0x285b, 0x0000 }, - { 0x9a00, 0x285e, 0x2000 }, - { 0x1a00, 0x285d, 0x0000 }, - { 0x1a00, 0x285f, 0x0000 }, - { 0x9a00, 0x2880, 0x6000 }, - { 0x9a00, 0x2870, 0x5000 }, - { 0x9a00, 0x2868, 0x4000 }, - { 0x9a00, 0x2864, 0x3000 }, - { 0x9a00, 0x2862, 0x2000 }, - { 0x1a00, 0x2861, 0x0000 }, - { 0x1a00, 0x2863, 0x0000 }, - { 0x9a00, 0x2866, 0x2000 }, - { 0x1a00, 0x2865, 0x0000 }, - { 0x1a00, 0x2867, 0x0000 }, - { 0x9a00, 0x286c, 0x3000 }, - { 0x9a00, 0x286a, 0x2000 }, - { 0x1a00, 0x2869, 0x0000 }, - { 0x1a00, 0x286b, 0x0000 }, - { 0x9a00, 0x286e, 0x2000 }, - { 0x1a00, 0x286d, 0x0000 }, - { 0x1a00, 0x286f, 0x0000 }, - { 0x9a00, 0x2878, 0x4000 }, - { 0x9a00, 0x2874, 0x3000 }, - { 0x9a00, 0x2872, 0x2000 }, - { 0x1a00, 0x2871, 0x0000 }, - { 0x1a00, 0x2873, 0x0000 }, - { 0x9a00, 0x2876, 0x2000 }, - { 0x1a00, 0x2875, 0x0000 }, - { 0x1a00, 0x2877, 0x0000 }, - { 0x9a00, 0x287c, 0x3000 }, - { 0x9a00, 0x287a, 0x2000 }, - { 0x1a00, 0x2879, 0x0000 }, - { 0x1a00, 0x287b, 0x0000 }, - { 0x9a00, 0x287e, 0x2000 }, - { 0x1a00, 0x287d, 0x0000 }, - { 0x1a00, 0x287f, 0x0000 }, - { 0x9a00, 0x2890, 0x5000 }, - { 0x9a00, 0x2888, 0x4000 }, - { 0x9a00, 0x2884, 0x3000 }, - { 0x9a00, 0x2882, 0x2000 }, - { 0x1a00, 0x2881, 0x0000 }, - { 0x1a00, 0x2883, 0x0000 }, - { 0x9a00, 0x2886, 0x2000 }, - { 0x1a00, 0x2885, 0x0000 }, - { 0x1a00, 0x2887, 0x0000 }, - { 0x9a00, 0x288c, 0x3000 }, - { 0x9a00, 0x288a, 0x2000 }, - { 0x1a00, 0x2889, 0x0000 }, - { 0x1a00, 0x288b, 0x0000 }, - { 0x9a00, 0x288e, 0x2000 }, - { 0x1a00, 0x288d, 0x0000 }, - { 0x1a00, 0x288f, 0x0000 }, - { 0x9a00, 0x2898, 0x4000 }, - { 0x9a00, 0x2894, 0x3000 }, - { 0x9a00, 0x2892, 0x2000 }, - { 0x1a00, 0x2891, 0x0000 }, - { 0x1a00, 0x2893, 0x0000 }, - { 0x9a00, 0x2896, 0x2000 }, - { 0x1a00, 0x2895, 0x0000 }, - { 0x1a00, 0x2897, 0x0000 }, - { 0x9a00, 0x289c, 0x3000 }, - { 0x9a00, 0x289a, 0x2000 }, - { 0x1a00, 0x2899, 0x0000 }, - { 0x1a00, 0x289b, 0x0000 }, - { 0x9a00, 0x289e, 0x2000 }, - { 0x1a00, 0x289d, 0x0000 }, - { 0x1a00, 0x289f, 0x0000 }, - { 0x9900, 0x2920, 0x8000 }, - { 0x9a00, 0x28e0, 0x7000 }, - { 0x9a00, 0x28c0, 0x6000 }, - { 0x9a00, 0x28b0, 0x5000 }, - { 0x9a00, 0x28a8, 0x4000 }, - { 0x9a00, 0x28a4, 0x3000 }, - { 0x9a00, 0x28a2, 0x2000 }, - { 0x1a00, 0x28a1, 0x0000 }, - { 0x1a00, 0x28a3, 0x0000 }, - { 0x9a00, 0x28a6, 0x2000 }, - { 0x1a00, 0x28a5, 0x0000 }, - { 0x1a00, 0x28a7, 0x0000 }, - { 0x9a00, 0x28ac, 0x3000 }, - { 0x9a00, 0x28aa, 0x2000 }, - { 0x1a00, 0x28a9, 0x0000 }, - { 0x1a00, 0x28ab, 0x0000 }, - { 0x9a00, 0x28ae, 0x2000 }, - { 0x1a00, 0x28ad, 0x0000 }, - { 0x1a00, 0x28af, 0x0000 }, - { 0x9a00, 0x28b8, 0x4000 }, - { 0x9a00, 0x28b4, 0x3000 }, - { 0x9a00, 0x28b2, 0x2000 }, - { 0x1a00, 0x28b1, 0x0000 }, - { 0x1a00, 0x28b3, 0x0000 }, - { 0x9a00, 0x28b6, 0x2000 }, - { 0x1a00, 0x28b5, 0x0000 }, - { 0x1a00, 0x28b7, 0x0000 }, - { 0x9a00, 0x28bc, 0x3000 }, - { 0x9a00, 0x28ba, 0x2000 }, - { 0x1a00, 0x28b9, 0x0000 }, - { 0x1a00, 0x28bb, 0x0000 }, - { 0x9a00, 0x28be, 0x2000 }, - { 0x1a00, 0x28bd, 0x0000 }, - { 0x1a00, 0x28bf, 0x0000 }, - { 0x9a00, 0x28d0, 0x5000 }, - { 0x9a00, 0x28c8, 0x4000 }, - { 0x9a00, 0x28c4, 0x3000 }, - { 0x9a00, 0x28c2, 0x2000 }, - { 0x1a00, 0x28c1, 0x0000 }, - { 0x1a00, 0x28c3, 0x0000 }, - { 0x9a00, 0x28c6, 0x2000 }, - { 0x1a00, 0x28c5, 0x0000 }, - { 0x1a00, 0x28c7, 0x0000 }, - { 0x9a00, 0x28cc, 0x3000 }, - { 0x9a00, 0x28ca, 0x2000 }, - { 0x1a00, 0x28c9, 0x0000 }, - { 0x1a00, 0x28cb, 0x0000 }, - { 0x9a00, 0x28ce, 0x2000 }, - { 0x1a00, 0x28cd, 0x0000 }, - { 0x1a00, 0x28cf, 0x0000 }, - { 0x9a00, 0x28d8, 0x4000 }, - { 0x9a00, 0x28d4, 0x3000 }, - { 0x9a00, 0x28d2, 0x2000 }, - { 0x1a00, 0x28d1, 0x0000 }, - { 0x1a00, 0x28d3, 0x0000 }, - { 0x9a00, 0x28d6, 0x2000 }, - { 0x1a00, 0x28d5, 0x0000 }, - { 0x1a00, 0x28d7, 0x0000 }, - { 0x9a00, 0x28dc, 0x3000 }, - { 0x9a00, 0x28da, 0x2000 }, - { 0x1a00, 0x28d9, 0x0000 }, - { 0x1a00, 0x28db, 0x0000 }, - { 0x9a00, 0x28de, 0x2000 }, - { 0x1a00, 0x28dd, 0x0000 }, - { 0x1a00, 0x28df, 0x0000 }, - { 0x9900, 0x2900, 0x6000 }, - { 0x9a00, 0x28f0, 0x5000 }, - { 0x9a00, 0x28e8, 0x4000 }, - { 0x9a00, 0x28e4, 0x3000 }, - { 0x9a00, 0x28e2, 0x2000 }, - { 0x1a00, 0x28e1, 0x0000 }, - { 0x1a00, 0x28e3, 0x0000 }, - { 0x9a00, 0x28e6, 0x2000 }, - { 0x1a00, 0x28e5, 0x0000 }, - { 0x1a00, 0x28e7, 0x0000 }, - { 0x9a00, 0x28ec, 0x3000 }, - { 0x9a00, 0x28ea, 0x2000 }, - { 0x1a00, 0x28e9, 0x0000 }, - { 0x1a00, 0x28eb, 0x0000 }, - { 0x9a00, 0x28ee, 0x2000 }, - { 0x1a00, 0x28ed, 0x0000 }, - { 0x1a00, 0x28ef, 0x0000 }, - { 0x9a00, 0x28f8, 0x4000 }, - { 0x9a00, 0x28f4, 0x3000 }, - { 0x9a00, 0x28f2, 0x2000 }, - { 0x1a00, 0x28f1, 0x0000 }, - { 0x1a00, 0x28f3, 0x0000 }, - { 0x9a00, 0x28f6, 0x2000 }, - { 0x1a00, 0x28f5, 0x0000 }, - { 0x1a00, 0x28f7, 0x0000 }, - { 0x9a00, 0x28fc, 0x3000 }, - { 0x9a00, 0x28fa, 0x2000 }, - { 0x1a00, 0x28f9, 0x0000 }, - { 0x1a00, 0x28fb, 0x0000 }, - { 0x9a00, 0x28fe, 0x2000 }, - { 0x1a00, 0x28fd, 0x0000 }, - { 0x1a00, 0x28ff, 0x0000 }, - { 0x9900, 0x2910, 0x5000 }, - { 0x9900, 0x2908, 0x4000 }, - { 0x9900, 0x2904, 0x3000 }, - { 0x9900, 0x2902, 0x2000 }, - { 0x1900, 0x2901, 0x0000 }, - { 0x1900, 0x2903, 0x0000 }, - { 0x9900, 0x2906, 0x2000 }, - { 0x1900, 0x2905, 0x0000 }, - { 0x1900, 0x2907, 0x0000 }, - { 0x9900, 0x290c, 0x3000 }, - { 0x9900, 0x290a, 0x2000 }, - { 0x1900, 0x2909, 0x0000 }, - { 0x1900, 0x290b, 0x0000 }, - { 0x9900, 0x290e, 0x2000 }, - { 0x1900, 0x290d, 0x0000 }, - { 0x1900, 0x290f, 0x0000 }, - { 0x9900, 0x2918, 0x4000 }, - { 0x9900, 0x2914, 0x3000 }, - { 0x9900, 0x2912, 0x2000 }, - { 0x1900, 0x2911, 0x0000 }, - { 0x1900, 0x2913, 0x0000 }, - { 0x9900, 0x2916, 0x2000 }, - { 0x1900, 0x2915, 0x0000 }, - { 0x1900, 0x2917, 0x0000 }, - { 0x9900, 0x291c, 0x3000 }, - { 0x9900, 0x291a, 0x2000 }, - { 0x1900, 0x2919, 0x0000 }, - { 0x1900, 0x291b, 0x0000 }, - { 0x9900, 0x291e, 0x2000 }, - { 0x1900, 0x291d, 0x0000 }, - { 0x1900, 0x291f, 0x0000 }, - { 0x9900, 0x2960, 0x7000 }, - { 0x9900, 0x2940, 0x6000 }, - { 0x9900, 0x2930, 0x5000 }, - { 0x9900, 0x2928, 0x4000 }, - { 0x9900, 0x2924, 0x3000 }, - { 0x9900, 0x2922, 0x2000 }, - { 0x1900, 0x2921, 0x0000 }, - { 0x1900, 0x2923, 0x0000 }, - { 0x9900, 0x2926, 0x2000 }, - { 0x1900, 0x2925, 0x0000 }, - { 0x1900, 0x2927, 0x0000 }, - { 0x9900, 0x292c, 0x3000 }, - { 0x9900, 0x292a, 0x2000 }, - { 0x1900, 0x2929, 0x0000 }, - { 0x1900, 0x292b, 0x0000 }, - { 0x9900, 0x292e, 0x2000 }, - { 0x1900, 0x292d, 0x0000 }, - { 0x1900, 0x292f, 0x0000 }, - { 0x9900, 0x2938, 0x4000 }, - { 0x9900, 0x2934, 0x3000 }, - { 0x9900, 0x2932, 0x2000 }, - { 0x1900, 0x2931, 0x0000 }, - { 0x1900, 0x2933, 0x0000 }, - { 0x9900, 0x2936, 0x2000 }, - { 0x1900, 0x2935, 0x0000 }, - { 0x1900, 0x2937, 0x0000 }, - { 0x9900, 0x293c, 0x3000 }, - { 0x9900, 0x293a, 0x2000 }, - { 0x1900, 0x2939, 0x0000 }, - { 0x1900, 0x293b, 0x0000 }, - { 0x9900, 0x293e, 0x2000 }, - { 0x1900, 0x293d, 0x0000 }, - { 0x1900, 0x293f, 0x0000 }, - { 0x9900, 0x2950, 0x5000 }, - { 0x9900, 0x2948, 0x4000 }, - { 0x9900, 0x2944, 0x3000 }, - { 0x9900, 0x2942, 0x2000 }, - { 0x1900, 0x2941, 0x0000 }, - { 0x1900, 0x2943, 0x0000 }, - { 0x9900, 0x2946, 0x2000 }, - { 0x1900, 0x2945, 0x0000 }, - { 0x1900, 0x2947, 0x0000 }, - { 0x9900, 0x294c, 0x3000 }, - { 0x9900, 0x294a, 0x2000 }, - { 0x1900, 0x2949, 0x0000 }, - { 0x1900, 0x294b, 0x0000 }, - { 0x9900, 0x294e, 0x2000 }, - { 0x1900, 0x294d, 0x0000 }, - { 0x1900, 0x294f, 0x0000 }, - { 0x9900, 0x2958, 0x4000 }, - { 0x9900, 0x2954, 0x3000 }, - { 0x9900, 0x2952, 0x2000 }, - { 0x1900, 0x2951, 0x0000 }, - { 0x1900, 0x2953, 0x0000 }, - { 0x9900, 0x2956, 0x2000 }, - { 0x1900, 0x2955, 0x0000 }, - { 0x1900, 0x2957, 0x0000 }, - { 0x9900, 0x295c, 0x3000 }, - { 0x9900, 0x295a, 0x2000 }, - { 0x1900, 0x2959, 0x0000 }, - { 0x1900, 0x295b, 0x0000 }, - { 0x9900, 0x295e, 0x2000 }, - { 0x1900, 0x295d, 0x0000 }, - { 0x1900, 0x295f, 0x0000 }, - { 0x9900, 0x2980, 0x6000 }, - { 0x9900, 0x2970, 0x5000 }, - { 0x9900, 0x2968, 0x4000 }, - { 0x9900, 0x2964, 0x3000 }, - { 0x9900, 0x2962, 0x2000 }, - { 0x1900, 0x2961, 0x0000 }, - { 0x1900, 0x2963, 0x0000 }, - { 0x9900, 0x2966, 0x2000 }, - { 0x1900, 0x2965, 0x0000 }, - { 0x1900, 0x2967, 0x0000 }, - { 0x9900, 0x296c, 0x3000 }, - { 0x9900, 0x296a, 0x2000 }, - { 0x1900, 0x2969, 0x0000 }, - { 0x1900, 0x296b, 0x0000 }, - { 0x9900, 0x296e, 0x2000 }, - { 0x1900, 0x296d, 0x0000 }, - { 0x1900, 0x296f, 0x0000 }, - { 0x9900, 0x2978, 0x4000 }, - { 0x9900, 0x2974, 0x3000 }, - { 0x9900, 0x2972, 0x2000 }, - { 0x1900, 0x2971, 0x0000 }, - { 0x1900, 0x2973, 0x0000 }, - { 0x9900, 0x2976, 0x2000 }, - { 0x1900, 0x2975, 0x0000 }, - { 0x1900, 0x2977, 0x0000 }, - { 0x9900, 0x297c, 0x3000 }, - { 0x9900, 0x297a, 0x2000 }, - { 0x1900, 0x2979, 0x0000 }, - { 0x1900, 0x297b, 0x0000 }, - { 0x9900, 0x297e, 0x2000 }, - { 0x1900, 0x297d, 0x0000 }, - { 0x1900, 0x297f, 0x0000 }, - { 0x9200, 0x2990, 0x5000 }, - { 0x9200, 0x2988, 0x4000 }, - { 0x9200, 0x2984, 0x3000 }, - { 0x9900, 0x2982, 0x2000 }, - { 0x1900, 0x2981, 0x0000 }, - { 0x1600, 0x2983, 0x0000 }, - { 0x9200, 0x2986, 0x2000 }, - { 0x1600, 0x2985, 0x0000 }, - { 0x1600, 0x2987, 0x0000 }, - { 0x9200, 0x298c, 0x3000 }, - { 0x9200, 0x298a, 0x2000 }, - { 0x1600, 0x2989, 0x0000 }, - { 0x1600, 0x298b, 0x0000 }, - { 0x9200, 0x298e, 0x2000 }, - { 0x1600, 0x298d, 0x0000 }, - { 0x1600, 0x298f, 0x0000 }, - { 0x9200, 0x2998, 0x4000 }, - { 0x9200, 0x2994, 0x3000 }, - { 0x9200, 0x2992, 0x2000 }, - { 0x1600, 0x2991, 0x0000 }, - { 0x1600, 0x2993, 0x0000 }, - { 0x9200, 0x2996, 0x2000 }, - { 0x1600, 0x2995, 0x0000 }, - { 0x1600, 0x2997, 0x0000 }, - { 0x9900, 0x299c, 0x3000 }, - { 0x9900, 0x299a, 0x2000 }, - { 0x1900, 0x2999, 0x0000 }, - { 0x1900, 0x299b, 0x0000 }, - { 0x9900, 0x299e, 0x2000 }, - { 0x1900, 0x299d, 0x0000 }, - { 0x1900, 0x299f, 0x0000 }, - { 0x9900, 0x2aa0, 0x9000 }, - { 0x9900, 0x2a20, 0x8000 }, - { 0x9900, 0x29e0, 0x7000 }, - { 0x9900, 0x29c0, 0x6000 }, - { 0x9900, 0x29b0, 0x5000 }, - { 0x9900, 0x29a8, 0x4000 }, - { 0x9900, 0x29a4, 0x3000 }, - { 0x9900, 0x29a2, 0x2000 }, - { 0x1900, 0x29a1, 0x0000 }, - { 0x1900, 0x29a3, 0x0000 }, - { 0x9900, 0x29a6, 0x2000 }, - { 0x1900, 0x29a5, 0x0000 }, - { 0x1900, 0x29a7, 0x0000 }, - { 0x9900, 0x29ac, 0x3000 }, - { 0x9900, 0x29aa, 0x2000 }, - { 0x1900, 0x29a9, 0x0000 }, - { 0x1900, 0x29ab, 0x0000 }, - { 0x9900, 0x29ae, 0x2000 }, - { 0x1900, 0x29ad, 0x0000 }, - { 0x1900, 0x29af, 0x0000 }, - { 0x9900, 0x29b8, 0x4000 }, - { 0x9900, 0x29b4, 0x3000 }, - { 0x9900, 0x29b2, 0x2000 }, - { 0x1900, 0x29b1, 0x0000 }, - { 0x1900, 0x29b3, 0x0000 }, - { 0x9900, 0x29b6, 0x2000 }, - { 0x1900, 0x29b5, 0x0000 }, - { 0x1900, 0x29b7, 0x0000 }, - { 0x9900, 0x29bc, 0x3000 }, - { 0x9900, 0x29ba, 0x2000 }, - { 0x1900, 0x29b9, 0x0000 }, - { 0x1900, 0x29bb, 0x0000 }, - { 0x9900, 0x29be, 0x2000 }, - { 0x1900, 0x29bd, 0x0000 }, - { 0x1900, 0x29bf, 0x0000 }, - { 0x9900, 0x29d0, 0x5000 }, - { 0x9900, 0x29c8, 0x4000 }, - { 0x9900, 0x29c4, 0x3000 }, - { 0x9900, 0x29c2, 0x2000 }, - { 0x1900, 0x29c1, 0x0000 }, - { 0x1900, 0x29c3, 0x0000 }, - { 0x9900, 0x29c6, 0x2000 }, - { 0x1900, 0x29c5, 0x0000 }, - { 0x1900, 0x29c7, 0x0000 }, - { 0x9900, 0x29cc, 0x3000 }, - { 0x9900, 0x29ca, 0x2000 }, - { 0x1900, 0x29c9, 0x0000 }, - { 0x1900, 0x29cb, 0x0000 }, - { 0x9900, 0x29ce, 0x2000 }, - { 0x1900, 0x29cd, 0x0000 }, - { 0x1900, 0x29cf, 0x0000 }, - { 0x9600, 0x29d8, 0x4000 }, - { 0x9900, 0x29d4, 0x3000 }, - { 0x9900, 0x29d2, 0x2000 }, - { 0x1900, 0x29d1, 0x0000 }, - { 0x1900, 0x29d3, 0x0000 }, - { 0x9900, 0x29d6, 0x2000 }, - { 0x1900, 0x29d5, 0x0000 }, - { 0x1900, 0x29d7, 0x0000 }, - { 0x9900, 0x29dc, 0x3000 }, - { 0x9600, 0x29da, 0x2000 }, - { 0x1200, 0x29d9, 0x0000 }, - { 0x1200, 0x29db, 0x0000 }, - { 0x9900, 0x29de, 0x2000 }, - { 0x1900, 0x29dd, 0x0000 }, - { 0x1900, 0x29df, 0x0000 }, - { 0x9900, 0x2a00, 0x6000 }, - { 0x9900, 0x29f0, 0x5000 }, - { 0x9900, 0x29e8, 0x4000 }, - { 0x9900, 0x29e4, 0x3000 }, - { 0x9900, 0x29e2, 0x2000 }, - { 0x1900, 0x29e1, 0x0000 }, - { 0x1900, 0x29e3, 0x0000 }, - { 0x9900, 0x29e6, 0x2000 }, - { 0x1900, 0x29e5, 0x0000 }, - { 0x1900, 0x29e7, 0x0000 }, - { 0x9900, 0x29ec, 0x3000 }, - { 0x9900, 0x29ea, 0x2000 }, - { 0x1900, 0x29e9, 0x0000 }, - { 0x1900, 0x29eb, 0x0000 }, - { 0x9900, 0x29ee, 0x2000 }, - { 0x1900, 0x29ed, 0x0000 }, - { 0x1900, 0x29ef, 0x0000 }, - { 0x9900, 0x29f8, 0x4000 }, - { 0x9900, 0x29f4, 0x3000 }, - { 0x9900, 0x29f2, 0x2000 }, - { 0x1900, 0x29f1, 0x0000 }, - { 0x1900, 0x29f3, 0x0000 }, - { 0x9900, 0x29f6, 0x2000 }, - { 0x1900, 0x29f5, 0x0000 }, - { 0x1900, 0x29f7, 0x0000 }, - { 0x9600, 0x29fc, 0x3000 }, - { 0x9900, 0x29fa, 0x2000 }, - { 0x1900, 0x29f9, 0x0000 }, - { 0x1900, 0x29fb, 0x0000 }, - { 0x9900, 0x29fe, 0x2000 }, - { 0x1200, 0x29fd, 0x0000 }, - { 0x1900, 0x29ff, 0x0000 }, - { 0x9900, 0x2a10, 0x5000 }, - { 0x9900, 0x2a08, 0x4000 }, - { 0x9900, 0x2a04, 0x3000 }, - { 0x9900, 0x2a02, 0x2000 }, - { 0x1900, 0x2a01, 0x0000 }, - { 0x1900, 0x2a03, 0x0000 }, - { 0x9900, 0x2a06, 0x2000 }, - { 0x1900, 0x2a05, 0x0000 }, - { 0x1900, 0x2a07, 0x0000 }, - { 0x9900, 0x2a0c, 0x3000 }, - { 0x9900, 0x2a0a, 0x2000 }, - { 0x1900, 0x2a09, 0x0000 }, - { 0x1900, 0x2a0b, 0x0000 }, - { 0x9900, 0x2a0e, 0x2000 }, - { 0x1900, 0x2a0d, 0x0000 }, - { 0x1900, 0x2a0f, 0x0000 }, - { 0x9900, 0x2a18, 0x4000 }, - { 0x9900, 0x2a14, 0x3000 }, - { 0x9900, 0x2a12, 0x2000 }, - { 0x1900, 0x2a11, 0x0000 }, - { 0x1900, 0x2a13, 0x0000 }, - { 0x9900, 0x2a16, 0x2000 }, - { 0x1900, 0x2a15, 0x0000 }, - { 0x1900, 0x2a17, 0x0000 }, - { 0x9900, 0x2a1c, 0x3000 }, - { 0x9900, 0x2a1a, 0x2000 }, - { 0x1900, 0x2a19, 0x0000 }, - { 0x1900, 0x2a1b, 0x0000 }, - { 0x9900, 0x2a1e, 0x2000 }, - { 0x1900, 0x2a1d, 0x0000 }, - { 0x1900, 0x2a1f, 0x0000 }, - { 0x9900, 0x2a60, 0x7000 }, - { 0x9900, 0x2a40, 0x6000 }, - { 0x9900, 0x2a30, 0x5000 }, - { 0x9900, 0x2a28, 0x4000 }, - { 0x9900, 0x2a24, 0x3000 }, - { 0x9900, 0x2a22, 0x2000 }, - { 0x1900, 0x2a21, 0x0000 }, - { 0x1900, 0x2a23, 0x0000 }, - { 0x9900, 0x2a26, 0x2000 }, - { 0x1900, 0x2a25, 0x0000 }, - { 0x1900, 0x2a27, 0x0000 }, - { 0x9900, 0x2a2c, 0x3000 }, - { 0x9900, 0x2a2a, 0x2000 }, - { 0x1900, 0x2a29, 0x0000 }, - { 0x1900, 0x2a2b, 0x0000 }, - { 0x9900, 0x2a2e, 0x2000 }, - { 0x1900, 0x2a2d, 0x0000 }, - { 0x1900, 0x2a2f, 0x0000 }, - { 0x9900, 0x2a38, 0x4000 }, - { 0x9900, 0x2a34, 0x3000 }, - { 0x9900, 0x2a32, 0x2000 }, - { 0x1900, 0x2a31, 0x0000 }, - { 0x1900, 0x2a33, 0x0000 }, - { 0x9900, 0x2a36, 0x2000 }, - { 0x1900, 0x2a35, 0x0000 }, - { 0x1900, 0x2a37, 0x0000 }, - { 0x9900, 0x2a3c, 0x3000 }, - { 0x9900, 0x2a3a, 0x2000 }, - { 0x1900, 0x2a39, 0x0000 }, - { 0x1900, 0x2a3b, 0x0000 }, - { 0x9900, 0x2a3e, 0x2000 }, - { 0x1900, 0x2a3d, 0x0000 }, - { 0x1900, 0x2a3f, 0x0000 }, - { 0x9900, 0x2a50, 0x5000 }, - { 0x9900, 0x2a48, 0x4000 }, - { 0x9900, 0x2a44, 0x3000 }, - { 0x9900, 0x2a42, 0x2000 }, - { 0x1900, 0x2a41, 0x0000 }, - { 0x1900, 0x2a43, 0x0000 }, - { 0x9900, 0x2a46, 0x2000 }, - { 0x1900, 0x2a45, 0x0000 }, - { 0x1900, 0x2a47, 0x0000 }, - { 0x9900, 0x2a4c, 0x3000 }, - { 0x9900, 0x2a4a, 0x2000 }, - { 0x1900, 0x2a49, 0x0000 }, - { 0x1900, 0x2a4b, 0x0000 }, - { 0x9900, 0x2a4e, 0x2000 }, - { 0x1900, 0x2a4d, 0x0000 }, - { 0x1900, 0x2a4f, 0x0000 }, - { 0x9900, 0x2a58, 0x4000 }, - { 0x9900, 0x2a54, 0x3000 }, - { 0x9900, 0x2a52, 0x2000 }, - { 0x1900, 0x2a51, 0x0000 }, - { 0x1900, 0x2a53, 0x0000 }, - { 0x9900, 0x2a56, 0x2000 }, - { 0x1900, 0x2a55, 0x0000 }, - { 0x1900, 0x2a57, 0x0000 }, - { 0x9900, 0x2a5c, 0x3000 }, - { 0x9900, 0x2a5a, 0x2000 }, - { 0x1900, 0x2a59, 0x0000 }, - { 0x1900, 0x2a5b, 0x0000 }, - { 0x9900, 0x2a5e, 0x2000 }, - { 0x1900, 0x2a5d, 0x0000 }, - { 0x1900, 0x2a5f, 0x0000 }, - { 0x9900, 0x2a80, 0x6000 }, - { 0x9900, 0x2a70, 0x5000 }, - { 0x9900, 0x2a68, 0x4000 }, - { 0x9900, 0x2a64, 0x3000 }, - { 0x9900, 0x2a62, 0x2000 }, - { 0x1900, 0x2a61, 0x0000 }, - { 0x1900, 0x2a63, 0x0000 }, - { 0x9900, 0x2a66, 0x2000 }, - { 0x1900, 0x2a65, 0x0000 }, - { 0x1900, 0x2a67, 0x0000 }, - { 0x9900, 0x2a6c, 0x3000 }, - { 0x9900, 0x2a6a, 0x2000 }, - { 0x1900, 0x2a69, 0x0000 }, - { 0x1900, 0x2a6b, 0x0000 }, - { 0x9900, 0x2a6e, 0x2000 }, - { 0x1900, 0x2a6d, 0x0000 }, - { 0x1900, 0x2a6f, 0x0000 }, - { 0x9900, 0x2a78, 0x4000 }, - { 0x9900, 0x2a74, 0x3000 }, - { 0x9900, 0x2a72, 0x2000 }, - { 0x1900, 0x2a71, 0x0000 }, - { 0x1900, 0x2a73, 0x0000 }, - { 0x9900, 0x2a76, 0x2000 }, - { 0x1900, 0x2a75, 0x0000 }, - { 0x1900, 0x2a77, 0x0000 }, - { 0x9900, 0x2a7c, 0x3000 }, - { 0x9900, 0x2a7a, 0x2000 }, - { 0x1900, 0x2a79, 0x0000 }, - { 0x1900, 0x2a7b, 0x0000 }, - { 0x9900, 0x2a7e, 0x2000 }, - { 0x1900, 0x2a7d, 0x0000 }, - { 0x1900, 0x2a7f, 0x0000 }, - { 0x9900, 0x2a90, 0x5000 }, - { 0x9900, 0x2a88, 0x4000 }, - { 0x9900, 0x2a84, 0x3000 }, - { 0x9900, 0x2a82, 0x2000 }, - { 0x1900, 0x2a81, 0x0000 }, - { 0x1900, 0x2a83, 0x0000 }, - { 0x9900, 0x2a86, 0x2000 }, - { 0x1900, 0x2a85, 0x0000 }, - { 0x1900, 0x2a87, 0x0000 }, - { 0x9900, 0x2a8c, 0x3000 }, - { 0x9900, 0x2a8a, 0x2000 }, - { 0x1900, 0x2a89, 0x0000 }, - { 0x1900, 0x2a8b, 0x0000 }, - { 0x9900, 0x2a8e, 0x2000 }, - { 0x1900, 0x2a8d, 0x0000 }, - { 0x1900, 0x2a8f, 0x0000 }, - { 0x9900, 0x2a98, 0x4000 }, - { 0x9900, 0x2a94, 0x3000 }, - { 0x9900, 0x2a92, 0x2000 }, - { 0x1900, 0x2a91, 0x0000 }, - { 0x1900, 0x2a93, 0x0000 }, - { 0x9900, 0x2a96, 0x2000 }, - { 0x1900, 0x2a95, 0x0000 }, - { 0x1900, 0x2a97, 0x0000 }, - { 0x9900, 0x2a9c, 0x3000 }, - { 0x9900, 0x2a9a, 0x2000 }, - { 0x1900, 0x2a99, 0x0000 }, - { 0x1900, 0x2a9b, 0x0000 }, - { 0x9900, 0x2a9e, 0x2000 }, - { 0x1900, 0x2a9d, 0x0000 }, - { 0x1900, 0x2a9f, 0x0000 }, - { 0x9a00, 0x2e92, 0x8000 }, - { 0x9900, 0x2ae0, 0x7000 }, - { 0x9900, 0x2ac0, 0x6000 }, - { 0x9900, 0x2ab0, 0x5000 }, - { 0x9900, 0x2aa8, 0x4000 }, - { 0x9900, 0x2aa4, 0x3000 }, - { 0x9900, 0x2aa2, 0x2000 }, - { 0x1900, 0x2aa1, 0x0000 }, - { 0x1900, 0x2aa3, 0x0000 }, - { 0x9900, 0x2aa6, 0x2000 }, - { 0x1900, 0x2aa5, 0x0000 }, - { 0x1900, 0x2aa7, 0x0000 }, - { 0x9900, 0x2aac, 0x3000 }, - { 0x9900, 0x2aaa, 0x2000 }, - { 0x1900, 0x2aa9, 0x0000 }, - { 0x1900, 0x2aab, 0x0000 }, - { 0x9900, 0x2aae, 0x2000 }, - { 0x1900, 0x2aad, 0x0000 }, - { 0x1900, 0x2aaf, 0x0000 }, - { 0x9900, 0x2ab8, 0x4000 }, - { 0x9900, 0x2ab4, 0x3000 }, - { 0x9900, 0x2ab2, 0x2000 }, - { 0x1900, 0x2ab1, 0x0000 }, - { 0x1900, 0x2ab3, 0x0000 }, - { 0x9900, 0x2ab6, 0x2000 }, - { 0x1900, 0x2ab5, 0x0000 }, - { 0x1900, 0x2ab7, 0x0000 }, - { 0x9900, 0x2abc, 0x3000 }, - { 0x9900, 0x2aba, 0x2000 }, - { 0x1900, 0x2ab9, 0x0000 }, - { 0x1900, 0x2abb, 0x0000 }, - { 0x9900, 0x2abe, 0x2000 }, - { 0x1900, 0x2abd, 0x0000 }, - { 0x1900, 0x2abf, 0x0000 }, - { 0x9900, 0x2ad0, 0x5000 }, - { 0x9900, 0x2ac8, 0x4000 }, - { 0x9900, 0x2ac4, 0x3000 }, - { 0x9900, 0x2ac2, 0x2000 }, - { 0x1900, 0x2ac1, 0x0000 }, - { 0x1900, 0x2ac3, 0x0000 }, - { 0x9900, 0x2ac6, 0x2000 }, - { 0x1900, 0x2ac5, 0x0000 }, - { 0x1900, 0x2ac7, 0x0000 }, - { 0x9900, 0x2acc, 0x3000 }, - { 0x9900, 0x2aca, 0x2000 }, - { 0x1900, 0x2ac9, 0x0000 }, - { 0x1900, 0x2acb, 0x0000 }, - { 0x9900, 0x2ace, 0x2000 }, - { 0x1900, 0x2acd, 0x0000 }, - { 0x1900, 0x2acf, 0x0000 }, - { 0x9900, 0x2ad8, 0x4000 }, - { 0x9900, 0x2ad4, 0x3000 }, - { 0x9900, 0x2ad2, 0x2000 }, - { 0x1900, 0x2ad1, 0x0000 }, - { 0x1900, 0x2ad3, 0x0000 }, - { 0x9900, 0x2ad6, 0x2000 }, - { 0x1900, 0x2ad5, 0x0000 }, - { 0x1900, 0x2ad7, 0x0000 }, - { 0x9900, 0x2adc, 0x3000 }, - { 0x9900, 0x2ada, 0x2000 }, - { 0x1900, 0x2ad9, 0x0000 }, - { 0x1900, 0x2adb, 0x0000 }, - { 0x9900, 0x2ade, 0x2000 }, - { 0x1900, 0x2add, 0x0000 }, - { 0x1900, 0x2adf, 0x0000 }, - { 0x9a00, 0x2b00, 0x6000 }, - { 0x9900, 0x2af0, 0x5000 }, - { 0x9900, 0x2ae8, 0x4000 }, - { 0x9900, 0x2ae4, 0x3000 }, - { 0x9900, 0x2ae2, 0x2000 }, - { 0x1900, 0x2ae1, 0x0000 }, - { 0x1900, 0x2ae3, 0x0000 }, - { 0x9900, 0x2ae6, 0x2000 }, - { 0x1900, 0x2ae5, 0x0000 }, - { 0x1900, 0x2ae7, 0x0000 }, - { 0x9900, 0x2aec, 0x3000 }, - { 0x9900, 0x2aea, 0x2000 }, - { 0x1900, 0x2ae9, 0x0000 }, - { 0x1900, 0x2aeb, 0x0000 }, - { 0x9900, 0x2aee, 0x2000 }, - { 0x1900, 0x2aed, 0x0000 }, - { 0x1900, 0x2aef, 0x0000 }, - { 0x9900, 0x2af8, 0x4000 }, - { 0x9900, 0x2af4, 0x3000 }, - { 0x9900, 0x2af2, 0x2000 }, - { 0x1900, 0x2af1, 0x0000 }, - { 0x1900, 0x2af3, 0x0000 }, - { 0x9900, 0x2af6, 0x2000 }, - { 0x1900, 0x2af5, 0x0000 }, - { 0x1900, 0x2af7, 0x0000 }, - { 0x9900, 0x2afc, 0x3000 }, - { 0x9900, 0x2afa, 0x2000 }, - { 0x1900, 0x2af9, 0x0000 }, - { 0x1900, 0x2afb, 0x0000 }, - { 0x9900, 0x2afe, 0x2000 }, - { 0x1900, 0x2afd, 0x0000 }, - { 0x1900, 0x2aff, 0x0000 }, - { 0x9a00, 0x2e82, 0x5000 }, - { 0x9a00, 0x2b08, 0x4000 }, - { 0x9a00, 0x2b04, 0x3000 }, - { 0x9a00, 0x2b02, 0x2000 }, - { 0x1a00, 0x2b01, 0x0000 }, - { 0x1a00, 0x2b03, 0x0000 }, - { 0x9a00, 0x2b06, 0x2000 }, - { 0x1a00, 0x2b05, 0x0000 }, - { 0x1a00, 0x2b07, 0x0000 }, - { 0x9a00, 0x2b0c, 0x3000 }, - { 0x9a00, 0x2b0a, 0x2000 }, - { 0x1a00, 0x2b09, 0x0000 }, - { 0x1a00, 0x2b0b, 0x0000 }, - { 0x9a00, 0x2e80, 0x2000 }, - { 0x1a00, 0x2b0d, 0x0000 }, - { 0x1a00, 0x2e81, 0x0000 }, - { 0x9a00, 0x2e8a, 0x4000 }, - { 0x9a00, 0x2e86, 0x3000 }, - { 0x9a00, 0x2e84, 0x2000 }, - { 0x1a00, 0x2e83, 0x0000 }, - { 0x1a00, 0x2e85, 0x0000 }, - { 0x9a00, 0x2e88, 0x2000 }, - { 0x1a00, 0x2e87, 0x0000 }, - { 0x1a00, 0x2e89, 0x0000 }, - { 0x9a00, 0x2e8e, 0x3000 }, - { 0x9a00, 0x2e8c, 0x2000 }, - { 0x1a00, 0x2e8b, 0x0000 }, - { 0x1a00, 0x2e8d, 0x0000 }, - { 0x9a00, 0x2e90, 0x2000 }, - { 0x1a00, 0x2e8f, 0x0000 }, - { 0x1a00, 0x2e91, 0x0000 }, - { 0x9a00, 0x2ed3, 0x7000 }, - { 0x9a00, 0x2eb3, 0x6000 }, - { 0x9a00, 0x2ea3, 0x5000 }, - { 0x9a00, 0x2e9b, 0x4000 }, - { 0x9a00, 0x2e96, 0x3000 }, - { 0x9a00, 0x2e94, 0x2000 }, - { 0x1a00, 0x2e93, 0x0000 }, - { 0x1a00, 0x2e95, 0x0000 }, - { 0x9a00, 0x2e98, 0x2000 }, - { 0x1a00, 0x2e97, 0x0000 }, - { 0x1a00, 0x2e99, 0x0000 }, - { 0x9a00, 0x2e9f, 0x3000 }, - { 0x9a00, 0x2e9d, 0x2000 }, - { 0x1a00, 0x2e9c, 0x0000 }, - { 0x1a00, 0x2e9e, 0x0000 }, - { 0x9a00, 0x2ea1, 0x2000 }, - { 0x1a00, 0x2ea0, 0x0000 }, - { 0x1a00, 0x2ea2, 0x0000 }, - { 0x9a00, 0x2eab, 0x4000 }, - { 0x9a00, 0x2ea7, 0x3000 }, - { 0x9a00, 0x2ea5, 0x2000 }, - { 0x1a00, 0x2ea4, 0x0000 }, - { 0x1a00, 0x2ea6, 0x0000 }, - { 0x9a00, 0x2ea9, 0x2000 }, - { 0x1a00, 0x2ea8, 0x0000 }, - { 0x1a00, 0x2eaa, 0x0000 }, - { 0x9a00, 0x2eaf, 0x3000 }, - { 0x9a00, 0x2ead, 0x2000 }, - { 0x1a00, 0x2eac, 0x0000 }, - { 0x1a00, 0x2eae, 0x0000 }, - { 0x9a00, 0x2eb1, 0x2000 }, - { 0x1a00, 0x2eb0, 0x0000 }, - { 0x1a00, 0x2eb2, 0x0000 }, - { 0x9a00, 0x2ec3, 0x5000 }, - { 0x9a00, 0x2ebb, 0x4000 }, - { 0x9a00, 0x2eb7, 0x3000 }, - { 0x9a00, 0x2eb5, 0x2000 }, - { 0x1a00, 0x2eb4, 0x0000 }, - { 0x1a00, 0x2eb6, 0x0000 }, - { 0x9a00, 0x2eb9, 0x2000 }, - { 0x1a00, 0x2eb8, 0x0000 }, - { 0x1a00, 0x2eba, 0x0000 }, - { 0x9a00, 0x2ebf, 0x3000 }, - { 0x9a00, 0x2ebd, 0x2000 }, - { 0x1a00, 0x2ebc, 0x0000 }, - { 0x1a00, 0x2ebe, 0x0000 }, - { 0x9a00, 0x2ec1, 0x2000 }, - { 0x1a00, 0x2ec0, 0x0000 }, - { 0x1a00, 0x2ec2, 0x0000 }, - { 0x9a00, 0x2ecb, 0x4000 }, - { 0x9a00, 0x2ec7, 0x3000 }, - { 0x9a00, 0x2ec5, 0x2000 }, - { 0x1a00, 0x2ec4, 0x0000 }, - { 0x1a00, 0x2ec6, 0x0000 }, - { 0x9a00, 0x2ec9, 0x2000 }, - { 0x1a00, 0x2ec8, 0x0000 }, - { 0x1a00, 0x2eca, 0x0000 }, - { 0x9a00, 0x2ecf, 0x3000 }, - { 0x9a00, 0x2ecd, 0x2000 }, - { 0x1a00, 0x2ecc, 0x0000 }, - { 0x1a00, 0x2ece, 0x0000 }, - { 0x9a00, 0x2ed1, 0x2000 }, - { 0x1a00, 0x2ed0, 0x0000 }, - { 0x1a00, 0x2ed2, 0x0000 }, - { 0x9a00, 0x2ef3, 0x6000 }, - { 0x9a00, 0x2ee3, 0x5000 }, - { 0x9a00, 0x2edb, 0x4000 }, - { 0x9a00, 0x2ed7, 0x3000 }, - { 0x9a00, 0x2ed5, 0x2000 }, - { 0x1a00, 0x2ed4, 0x0000 }, - { 0x1a00, 0x2ed6, 0x0000 }, - { 0x9a00, 0x2ed9, 0x2000 }, - { 0x1a00, 0x2ed8, 0x0000 }, - { 0x1a00, 0x2eda, 0x0000 }, - { 0x9a00, 0x2edf, 0x3000 }, - { 0x9a00, 0x2edd, 0x2000 }, - { 0x1a00, 0x2edc, 0x0000 }, - { 0x1a00, 0x2ede, 0x0000 }, - { 0x9a00, 0x2ee1, 0x2000 }, - { 0x1a00, 0x2ee0, 0x0000 }, - { 0x1a00, 0x2ee2, 0x0000 }, - { 0x9a00, 0x2eeb, 0x4000 }, - { 0x9a00, 0x2ee7, 0x3000 }, - { 0x9a00, 0x2ee5, 0x2000 }, - { 0x1a00, 0x2ee4, 0x0000 }, - { 0x1a00, 0x2ee6, 0x0000 }, - { 0x9a00, 0x2ee9, 0x2000 }, - { 0x1a00, 0x2ee8, 0x0000 }, - { 0x1a00, 0x2eea, 0x0000 }, - { 0x9a00, 0x2eef, 0x3000 }, - { 0x9a00, 0x2eed, 0x2000 }, - { 0x1a00, 0x2eec, 0x0000 }, - { 0x1a00, 0x2eee, 0x0000 }, - { 0x9a00, 0x2ef1, 0x2000 }, - { 0x1a00, 0x2ef0, 0x0000 }, - { 0x1a00, 0x2ef2, 0x0000 }, - { 0x9a00, 0x2f0f, 0x5000 }, - { 0x9a00, 0x2f07, 0x4000 }, - { 0x9a00, 0x2f03, 0x3000 }, - { 0x9a00, 0x2f01, 0x2000 }, - { 0x1a00, 0x2f00, 0x0000 }, - { 0x1a00, 0x2f02, 0x0000 }, - { 0x9a00, 0x2f05, 0x2000 }, - { 0x1a00, 0x2f04, 0x0000 }, - { 0x1a00, 0x2f06, 0x0000 }, - { 0x9a00, 0x2f0b, 0x3000 }, - { 0x9a00, 0x2f09, 0x2000 }, - { 0x1a00, 0x2f08, 0x0000 }, - { 0x1a00, 0x2f0a, 0x0000 }, - { 0x9a00, 0x2f0d, 0x2000 }, - { 0x1a00, 0x2f0c, 0x0000 }, - { 0x1a00, 0x2f0e, 0x0000 }, - { 0x9a00, 0x2f17, 0x4000 }, - { 0x9a00, 0x2f13, 0x3000 }, - { 0x9a00, 0x2f11, 0x2000 }, - { 0x1a00, 0x2f10, 0x0000 }, - { 0x1a00, 0x2f12, 0x0000 }, - { 0x9a00, 0x2f15, 0x2000 }, - { 0x1a00, 0x2f14, 0x0000 }, - { 0x1a00, 0x2f16, 0x0000 }, - { 0x9a00, 0x2f1b, 0x3000 }, - { 0x9a00, 0x2f19, 0x2000 }, - { 0x1a00, 0x2f18, 0x0000 }, - { 0x1a00, 0x2f1a, 0x0000 }, - { 0x9a00, 0x2f1d, 0x2000 }, - { 0x1a00, 0x2f1c, 0x0000 }, - { 0x1a00, 0x2f1e, 0x0000 }, - { 0x8701, 0x00f0, 0xd000 }, - { 0x8700, 0xa34d, 0xc000 }, - { 0x9a00, 0x3391, 0xb000 }, - { 0x8700, 0x3149, 0xa000 }, - { 0x9500, 0x303d, 0x9000 }, - { 0x9a00, 0x2f9f, 0x8000 }, - { 0x9a00, 0x2f5f, 0x7000 }, - { 0x9a00, 0x2f3f, 0x6000 }, - { 0x9a00, 0x2f2f, 0x5000 }, - { 0x9a00, 0x2f27, 0x4000 }, - { 0x9a00, 0x2f23, 0x3000 }, - { 0x9a00, 0x2f21, 0x2000 }, - { 0x1a00, 0x2f20, 0x0000 }, - { 0x1a00, 0x2f22, 0x0000 }, - { 0x9a00, 0x2f25, 0x2000 }, - { 0x1a00, 0x2f24, 0x0000 }, - { 0x1a00, 0x2f26, 0x0000 }, - { 0x9a00, 0x2f2b, 0x3000 }, - { 0x9a00, 0x2f29, 0x2000 }, - { 0x1a00, 0x2f28, 0x0000 }, - { 0x1a00, 0x2f2a, 0x0000 }, - { 0x9a00, 0x2f2d, 0x2000 }, - { 0x1a00, 0x2f2c, 0x0000 }, - { 0x1a00, 0x2f2e, 0x0000 }, - { 0x9a00, 0x2f37, 0x4000 }, - { 0x9a00, 0x2f33, 0x3000 }, - { 0x9a00, 0x2f31, 0x2000 }, - { 0x1a00, 0x2f30, 0x0000 }, - { 0x1a00, 0x2f32, 0x0000 }, - { 0x9a00, 0x2f35, 0x2000 }, - { 0x1a00, 0x2f34, 0x0000 }, - { 0x1a00, 0x2f36, 0x0000 }, - { 0x9a00, 0x2f3b, 0x3000 }, - { 0x9a00, 0x2f39, 0x2000 }, - { 0x1a00, 0x2f38, 0x0000 }, - { 0x1a00, 0x2f3a, 0x0000 }, - { 0x9a00, 0x2f3d, 0x2000 }, - { 0x1a00, 0x2f3c, 0x0000 }, - { 0x1a00, 0x2f3e, 0x0000 }, - { 0x9a00, 0x2f4f, 0x5000 }, - { 0x9a00, 0x2f47, 0x4000 }, - { 0x9a00, 0x2f43, 0x3000 }, - { 0x9a00, 0x2f41, 0x2000 }, - { 0x1a00, 0x2f40, 0x0000 }, - { 0x1a00, 0x2f42, 0x0000 }, - { 0x9a00, 0x2f45, 0x2000 }, - { 0x1a00, 0x2f44, 0x0000 }, - { 0x1a00, 0x2f46, 0x0000 }, - { 0x9a00, 0x2f4b, 0x3000 }, - { 0x9a00, 0x2f49, 0x2000 }, - { 0x1a00, 0x2f48, 0x0000 }, - { 0x1a00, 0x2f4a, 0x0000 }, - { 0x9a00, 0x2f4d, 0x2000 }, - { 0x1a00, 0x2f4c, 0x0000 }, - { 0x1a00, 0x2f4e, 0x0000 }, - { 0x9a00, 0x2f57, 0x4000 }, - { 0x9a00, 0x2f53, 0x3000 }, - { 0x9a00, 0x2f51, 0x2000 }, - { 0x1a00, 0x2f50, 0x0000 }, - { 0x1a00, 0x2f52, 0x0000 }, - { 0x9a00, 0x2f55, 0x2000 }, - { 0x1a00, 0x2f54, 0x0000 }, - { 0x1a00, 0x2f56, 0x0000 }, - { 0x9a00, 0x2f5b, 0x3000 }, - { 0x9a00, 0x2f59, 0x2000 }, - { 0x1a00, 0x2f58, 0x0000 }, - { 0x1a00, 0x2f5a, 0x0000 }, - { 0x9a00, 0x2f5d, 0x2000 }, - { 0x1a00, 0x2f5c, 0x0000 }, - { 0x1a00, 0x2f5e, 0x0000 }, - { 0x9a00, 0x2f7f, 0x6000 }, - { 0x9a00, 0x2f6f, 0x5000 }, - { 0x9a00, 0x2f67, 0x4000 }, - { 0x9a00, 0x2f63, 0x3000 }, - { 0x9a00, 0x2f61, 0x2000 }, - { 0x1a00, 0x2f60, 0x0000 }, - { 0x1a00, 0x2f62, 0x0000 }, - { 0x9a00, 0x2f65, 0x2000 }, - { 0x1a00, 0x2f64, 0x0000 }, - { 0x1a00, 0x2f66, 0x0000 }, - { 0x9a00, 0x2f6b, 0x3000 }, - { 0x9a00, 0x2f69, 0x2000 }, - { 0x1a00, 0x2f68, 0x0000 }, - { 0x1a00, 0x2f6a, 0x0000 }, - { 0x9a00, 0x2f6d, 0x2000 }, - { 0x1a00, 0x2f6c, 0x0000 }, - { 0x1a00, 0x2f6e, 0x0000 }, - { 0x9a00, 0x2f77, 0x4000 }, - { 0x9a00, 0x2f73, 0x3000 }, - { 0x9a00, 0x2f71, 0x2000 }, - { 0x1a00, 0x2f70, 0x0000 }, - { 0x1a00, 0x2f72, 0x0000 }, - { 0x9a00, 0x2f75, 0x2000 }, - { 0x1a00, 0x2f74, 0x0000 }, - { 0x1a00, 0x2f76, 0x0000 }, - { 0x9a00, 0x2f7b, 0x3000 }, - { 0x9a00, 0x2f79, 0x2000 }, - { 0x1a00, 0x2f78, 0x0000 }, - { 0x1a00, 0x2f7a, 0x0000 }, - { 0x9a00, 0x2f7d, 0x2000 }, - { 0x1a00, 0x2f7c, 0x0000 }, - { 0x1a00, 0x2f7e, 0x0000 }, - { 0x9a00, 0x2f8f, 0x5000 }, - { 0x9a00, 0x2f87, 0x4000 }, - { 0x9a00, 0x2f83, 0x3000 }, - { 0x9a00, 0x2f81, 0x2000 }, - { 0x1a00, 0x2f80, 0x0000 }, - { 0x1a00, 0x2f82, 0x0000 }, - { 0x9a00, 0x2f85, 0x2000 }, - { 0x1a00, 0x2f84, 0x0000 }, - { 0x1a00, 0x2f86, 0x0000 }, - { 0x9a00, 0x2f8b, 0x3000 }, - { 0x9a00, 0x2f89, 0x2000 }, - { 0x1a00, 0x2f88, 0x0000 }, - { 0x1a00, 0x2f8a, 0x0000 }, - { 0x9a00, 0x2f8d, 0x2000 }, - { 0x1a00, 0x2f8c, 0x0000 }, - { 0x1a00, 0x2f8e, 0x0000 }, - { 0x9a00, 0x2f97, 0x4000 }, - { 0x9a00, 0x2f93, 0x3000 }, - { 0x9a00, 0x2f91, 0x2000 }, - { 0x1a00, 0x2f90, 0x0000 }, - { 0x1a00, 0x2f92, 0x0000 }, - { 0x9a00, 0x2f95, 0x2000 }, - { 0x1a00, 0x2f94, 0x0000 }, - { 0x1a00, 0x2f96, 0x0000 }, - { 0x9a00, 0x2f9b, 0x3000 }, - { 0x9a00, 0x2f99, 0x2000 }, - { 0x1a00, 0x2f98, 0x0000 }, - { 0x1a00, 0x2f9a, 0x0000 }, - { 0x9a00, 0x2f9d, 0x2000 }, - { 0x1a00, 0x2f9c, 0x0000 }, - { 0x1a00, 0x2f9e, 0x0000 }, - { 0x9a00, 0x2ff9, 0x7000 }, - { 0x9a00, 0x2fbf, 0x6000 }, - { 0x9a00, 0x2faf, 0x5000 }, - { 0x9a00, 0x2fa7, 0x4000 }, - { 0x9a00, 0x2fa3, 0x3000 }, - { 0x9a00, 0x2fa1, 0x2000 }, - { 0x1a00, 0x2fa0, 0x0000 }, - { 0x1a00, 0x2fa2, 0x0000 }, - { 0x9a00, 0x2fa5, 0x2000 }, - { 0x1a00, 0x2fa4, 0x0000 }, - { 0x1a00, 0x2fa6, 0x0000 }, - { 0x9a00, 0x2fab, 0x3000 }, - { 0x9a00, 0x2fa9, 0x2000 }, - { 0x1a00, 0x2fa8, 0x0000 }, - { 0x1a00, 0x2faa, 0x0000 }, - { 0x9a00, 0x2fad, 0x2000 }, - { 0x1a00, 0x2fac, 0x0000 }, - { 0x1a00, 0x2fae, 0x0000 }, - { 0x9a00, 0x2fb7, 0x4000 }, - { 0x9a00, 0x2fb3, 0x3000 }, - { 0x9a00, 0x2fb1, 0x2000 }, - { 0x1a00, 0x2fb0, 0x0000 }, - { 0x1a00, 0x2fb2, 0x0000 }, - { 0x9a00, 0x2fb5, 0x2000 }, - { 0x1a00, 0x2fb4, 0x0000 }, - { 0x1a00, 0x2fb6, 0x0000 }, - { 0x9a00, 0x2fbb, 0x3000 }, - { 0x9a00, 0x2fb9, 0x2000 }, - { 0x1a00, 0x2fb8, 0x0000 }, - { 0x1a00, 0x2fba, 0x0000 }, - { 0x9a00, 0x2fbd, 0x2000 }, - { 0x1a00, 0x2fbc, 0x0000 }, - { 0x1a00, 0x2fbe, 0x0000 }, - { 0x9a00, 0x2fcf, 0x5000 }, - { 0x9a00, 0x2fc7, 0x4000 }, - { 0x9a00, 0x2fc3, 0x3000 }, - { 0x9a00, 0x2fc1, 0x2000 }, - { 0x1a00, 0x2fc0, 0x0000 }, - { 0x1a00, 0x2fc2, 0x0000 }, - { 0x9a00, 0x2fc5, 0x2000 }, - { 0x1a00, 0x2fc4, 0x0000 }, - { 0x1a00, 0x2fc6, 0x0000 }, - { 0x9a00, 0x2fcb, 0x3000 }, - { 0x9a00, 0x2fc9, 0x2000 }, - { 0x1a00, 0x2fc8, 0x0000 }, - { 0x1a00, 0x2fca, 0x0000 }, - { 0x9a00, 0x2fcd, 0x2000 }, - { 0x1a00, 0x2fcc, 0x0000 }, - { 0x1a00, 0x2fce, 0x0000 }, - { 0x9a00, 0x2ff1, 0x4000 }, - { 0x9a00, 0x2fd3, 0x3000 }, - { 0x9a00, 0x2fd1, 0x2000 }, - { 0x1a00, 0x2fd0, 0x0000 }, - { 0x1a00, 0x2fd2, 0x0000 }, - { 0x9a00, 0x2fd5, 0x2000 }, - { 0x1a00, 0x2fd4, 0x0000 }, - { 0x1a00, 0x2ff0, 0x0000 }, - { 0x9a00, 0x2ff5, 0x3000 }, - { 0x9a00, 0x2ff3, 0x2000 }, - { 0x1a00, 0x2ff2, 0x0000 }, - { 0x1a00, 0x2ff4, 0x0000 }, - { 0x9a00, 0x2ff7, 0x2000 }, - { 0x1a00, 0x2ff6, 0x0000 }, - { 0x1a00, 0x2ff8, 0x0000 }, - { 0x9600, 0x301d, 0x6000 }, - { 0x9200, 0x300d, 0x5000 }, - { 0x8600, 0x3005, 0x4000 }, - { 0x9500, 0x3001, 0x3000 }, - { 0x9a00, 0x2ffb, 0x2000 }, - { 0x1a00, 0x2ffa, 0x0000 }, - { 0x1d00, 0x3000, 0x0000 }, - { 0x9500, 0x3003, 0x2000 }, - { 0x1500, 0x3002, 0x0000 }, - { 0x1a00, 0x3004, 0x0000 }, - { 0x9200, 0x3009, 0x3000 }, - { 0x8e00, 0x3007, 0x2000 }, - { 0x0700, 0x3006, 0x0000 }, - { 0x1600, 0x3008, 0x0000 }, - { 0x9200, 0x300b, 0x2000 }, - { 0x1600, 0x300a, 0x0000 }, - { 0x1600, 0x300c, 0x0000 }, - { 0x9200, 0x3015, 0x4000 }, - { 0x9200, 0x3011, 0x3000 }, - { 0x9200, 0x300f, 0x2000 }, - { 0x1600, 0x300e, 0x0000 }, - { 0x1600, 0x3010, 0x0000 }, - { 0x9a00, 0x3013, 0x2000 }, - { 0x1a00, 0x3012, 0x0000 }, - { 0x1600, 0x3014, 0x0000 }, - { 0x9200, 0x3019, 0x3000 }, - { 0x9200, 0x3017, 0x2000 }, - { 0x1600, 0x3016, 0x0000 }, - { 0x1600, 0x3018, 0x0000 }, - { 0x9200, 0x301b, 0x2000 }, - { 0x1600, 0x301a, 0x0000 }, - { 0x1100, 0x301c, 0x0000 }, - { 0x8c00, 0x302d, 0x5000 }, - { 0x8e00, 0x3025, 0x4000 }, - { 0x8e00, 0x3021, 0x3000 }, - { 0x9200, 0x301f, 0x2000 }, - { 0x1200, 0x301e, 0x0000 }, - { 0x1a00, 0x3020, 0x0000 }, - { 0x8e00, 0x3023, 0x2000 }, - { 0x0e00, 0x3022, 0x0000 }, - { 0x0e00, 0x3024, 0x0000 }, - { 0x8e00, 0x3029, 0x3000 }, - { 0x8e00, 0x3027, 0x2000 }, - { 0x0e00, 0x3026, 0x0000 }, - { 0x0e00, 0x3028, 0x0000 }, - { 0x8c00, 0x302b, 0x2000 }, - { 0x0c00, 0x302a, 0x0000 }, - { 0x0c00, 0x302c, 0x0000 }, - { 0x8600, 0x3035, 0x4000 }, - { 0x8600, 0x3031, 0x3000 }, - { 0x8c00, 0x302f, 0x2000 }, - { 0x0c00, 0x302e, 0x0000 }, - { 0x1100, 0x3030, 0x0000 }, - { 0x8600, 0x3033, 0x2000 }, - { 0x0600, 0x3032, 0x0000 }, - { 0x0600, 0x3034, 0x0000 }, - { 0x8e00, 0x3039, 0x3000 }, - { 0x9a00, 0x3037, 0x2000 }, - { 0x1a00, 0x3036, 0x0000 }, - { 0x0e00, 0x3038, 0x0000 }, - { 0x8600, 0x303b, 0x2000 }, - { 0x0e00, 0x303a, 0x0000 }, - { 0x0700, 0x303c, 0x0000 }, - { 0x8700, 0x30c0, 0x8000 }, - { 0x8700, 0x307e, 0x7000 }, - { 0x8700, 0x305e, 0x6000 }, - { 0x8700, 0x304e, 0x5000 }, - { 0x8700, 0x3046, 0x4000 }, - { 0x8700, 0x3042, 0x3000 }, - { 0x9a00, 0x303f, 0x2000 }, - { 0x1a00, 0x303e, 0x0000 }, - { 0x0700, 0x3041, 0x0000 }, - { 0x8700, 0x3044, 0x2000 }, - { 0x0700, 0x3043, 0x0000 }, - { 0x0700, 0x3045, 0x0000 }, - { 0x8700, 0x304a, 0x3000 }, - { 0x8700, 0x3048, 0x2000 }, - { 0x0700, 0x3047, 0x0000 }, - { 0x0700, 0x3049, 0x0000 }, - { 0x8700, 0x304c, 0x2000 }, - { 0x0700, 0x304b, 0x0000 }, - { 0x0700, 0x304d, 0x0000 }, - { 0x8700, 0x3056, 0x4000 }, - { 0x8700, 0x3052, 0x3000 }, - { 0x8700, 0x3050, 0x2000 }, - { 0x0700, 0x304f, 0x0000 }, - { 0x0700, 0x3051, 0x0000 }, - { 0x8700, 0x3054, 0x2000 }, - { 0x0700, 0x3053, 0x0000 }, - { 0x0700, 0x3055, 0x0000 }, - { 0x8700, 0x305a, 0x3000 }, - { 0x8700, 0x3058, 0x2000 }, - { 0x0700, 0x3057, 0x0000 }, - { 0x0700, 0x3059, 0x0000 }, - { 0x8700, 0x305c, 0x2000 }, - { 0x0700, 0x305b, 0x0000 }, - { 0x0700, 0x305d, 0x0000 }, - { 0x8700, 0x306e, 0x5000 }, - { 0x8700, 0x3066, 0x4000 }, - { 0x8700, 0x3062, 0x3000 }, - { 0x8700, 0x3060, 0x2000 }, - { 0x0700, 0x305f, 0x0000 }, - { 0x0700, 0x3061, 0x0000 }, - { 0x8700, 0x3064, 0x2000 }, - { 0x0700, 0x3063, 0x0000 }, - { 0x0700, 0x3065, 0x0000 }, - { 0x8700, 0x306a, 0x3000 }, - { 0x8700, 0x3068, 0x2000 }, - { 0x0700, 0x3067, 0x0000 }, - { 0x0700, 0x3069, 0x0000 }, - { 0x8700, 0x306c, 0x2000 }, - { 0x0700, 0x306b, 0x0000 }, - { 0x0700, 0x306d, 0x0000 }, - { 0x8700, 0x3076, 0x4000 }, - { 0x8700, 0x3072, 0x3000 }, - { 0x8700, 0x3070, 0x2000 }, - { 0x0700, 0x306f, 0x0000 }, - { 0x0700, 0x3071, 0x0000 }, - { 0x8700, 0x3074, 0x2000 }, - { 0x0700, 0x3073, 0x0000 }, - { 0x0700, 0x3075, 0x0000 }, - { 0x8700, 0x307a, 0x3000 }, - { 0x8700, 0x3078, 0x2000 }, - { 0x0700, 0x3077, 0x0000 }, - { 0x0700, 0x3079, 0x0000 }, - { 0x8700, 0x307c, 0x2000 }, - { 0x0700, 0x307b, 0x0000 }, - { 0x0700, 0x307d, 0x0000 }, - { 0x9100, 0x30a0, 0x6000 }, - { 0x8700, 0x308e, 0x5000 }, - { 0x8700, 0x3086, 0x4000 }, - { 0x8700, 0x3082, 0x3000 }, - { 0x8700, 0x3080, 0x2000 }, - { 0x0700, 0x307f, 0x0000 }, - { 0x0700, 0x3081, 0x0000 }, - { 0x8700, 0x3084, 0x2000 }, - { 0x0700, 0x3083, 0x0000 }, - { 0x0700, 0x3085, 0x0000 }, - { 0x8700, 0x308a, 0x3000 }, - { 0x8700, 0x3088, 0x2000 }, - { 0x0700, 0x3087, 0x0000 }, - { 0x0700, 0x3089, 0x0000 }, - { 0x8700, 0x308c, 0x2000 }, - { 0x0700, 0x308b, 0x0000 }, - { 0x0700, 0x308d, 0x0000 }, - { 0x8700, 0x3096, 0x4000 }, - { 0x8700, 0x3092, 0x3000 }, - { 0x8700, 0x3090, 0x2000 }, - { 0x0700, 0x308f, 0x0000 }, - { 0x0700, 0x3091, 0x0000 }, - { 0x8700, 0x3094, 0x2000 }, - { 0x0700, 0x3093, 0x0000 }, - { 0x0700, 0x3095, 0x0000 }, - { 0x9800, 0x309c, 0x3000 }, - { 0x8c00, 0x309a, 0x2000 }, - { 0x0c00, 0x3099, 0x0000 }, - { 0x1800, 0x309b, 0x0000 }, - { 0x8600, 0x309e, 0x2000 }, - { 0x0600, 0x309d, 0x0000 }, - { 0x0700, 0x309f, 0x0000 }, - { 0x8700, 0x30b0, 0x5000 }, - { 0x8700, 0x30a8, 0x4000 }, - { 0x8700, 0x30a4, 0x3000 }, - { 0x8700, 0x30a2, 0x2000 }, - { 0x0700, 0x30a1, 0x0000 }, - { 0x0700, 0x30a3, 0x0000 }, - { 0x8700, 0x30a6, 0x2000 }, - { 0x0700, 0x30a5, 0x0000 }, - { 0x0700, 0x30a7, 0x0000 }, - { 0x8700, 0x30ac, 0x3000 }, - { 0x8700, 0x30aa, 0x2000 }, - { 0x0700, 0x30a9, 0x0000 }, - { 0x0700, 0x30ab, 0x0000 }, - { 0x8700, 0x30ae, 0x2000 }, - { 0x0700, 0x30ad, 0x0000 }, - { 0x0700, 0x30af, 0x0000 }, - { 0x8700, 0x30b8, 0x4000 }, - { 0x8700, 0x30b4, 0x3000 }, - { 0x8700, 0x30b2, 0x2000 }, - { 0x0700, 0x30b1, 0x0000 }, - { 0x0700, 0x30b3, 0x0000 }, - { 0x8700, 0x30b6, 0x2000 }, - { 0x0700, 0x30b5, 0x0000 }, - { 0x0700, 0x30b7, 0x0000 }, - { 0x8700, 0x30bc, 0x3000 }, - { 0x8700, 0x30ba, 0x2000 }, - { 0x0700, 0x30b9, 0x0000 }, - { 0x0700, 0x30bb, 0x0000 }, - { 0x8700, 0x30be, 0x2000 }, - { 0x0700, 0x30bd, 0x0000 }, - { 0x0700, 0x30bf, 0x0000 }, - { 0x8700, 0x3105, 0x7000 }, - { 0x8700, 0x30e0, 0x6000 }, - { 0x8700, 0x30d0, 0x5000 }, - { 0x8700, 0x30c8, 0x4000 }, - { 0x8700, 0x30c4, 0x3000 }, - { 0x8700, 0x30c2, 0x2000 }, - { 0x0700, 0x30c1, 0x0000 }, - { 0x0700, 0x30c3, 0x0000 }, - { 0x8700, 0x30c6, 0x2000 }, - { 0x0700, 0x30c5, 0x0000 }, - { 0x0700, 0x30c7, 0x0000 }, - { 0x8700, 0x30cc, 0x3000 }, - { 0x8700, 0x30ca, 0x2000 }, - { 0x0700, 0x30c9, 0x0000 }, - { 0x0700, 0x30cb, 0x0000 }, - { 0x8700, 0x30ce, 0x2000 }, - { 0x0700, 0x30cd, 0x0000 }, - { 0x0700, 0x30cf, 0x0000 }, - { 0x8700, 0x30d8, 0x4000 }, - { 0x8700, 0x30d4, 0x3000 }, - { 0x8700, 0x30d2, 0x2000 }, - { 0x0700, 0x30d1, 0x0000 }, - { 0x0700, 0x30d3, 0x0000 }, - { 0x8700, 0x30d6, 0x2000 }, - { 0x0700, 0x30d5, 0x0000 }, - { 0x0700, 0x30d7, 0x0000 }, - { 0x8700, 0x30dc, 0x3000 }, - { 0x8700, 0x30da, 0x2000 }, - { 0x0700, 0x30d9, 0x0000 }, - { 0x0700, 0x30db, 0x0000 }, - { 0x8700, 0x30de, 0x2000 }, - { 0x0700, 0x30dd, 0x0000 }, - { 0x0700, 0x30df, 0x0000 }, - { 0x8700, 0x30f0, 0x5000 }, - { 0x8700, 0x30e8, 0x4000 }, - { 0x8700, 0x30e4, 0x3000 }, - { 0x8700, 0x30e2, 0x2000 }, - { 0x0700, 0x30e1, 0x0000 }, - { 0x0700, 0x30e3, 0x0000 }, - { 0x8700, 0x30e6, 0x2000 }, - { 0x0700, 0x30e5, 0x0000 }, - { 0x0700, 0x30e7, 0x0000 }, - { 0x8700, 0x30ec, 0x3000 }, - { 0x8700, 0x30ea, 0x2000 }, - { 0x0700, 0x30e9, 0x0000 }, - { 0x0700, 0x30eb, 0x0000 }, - { 0x8700, 0x30ee, 0x2000 }, - { 0x0700, 0x30ed, 0x0000 }, - { 0x0700, 0x30ef, 0x0000 }, - { 0x8700, 0x30f8, 0x4000 }, - { 0x8700, 0x30f4, 0x3000 }, - { 0x8700, 0x30f2, 0x2000 }, - { 0x0700, 0x30f1, 0x0000 }, - { 0x0700, 0x30f3, 0x0000 }, - { 0x8700, 0x30f6, 0x2000 }, - { 0x0700, 0x30f5, 0x0000 }, - { 0x0700, 0x30f7, 0x0000 }, - { 0x8600, 0x30fc, 0x3000 }, - { 0x8700, 0x30fa, 0x2000 }, - { 0x0700, 0x30f9, 0x0000 }, - { 0x1000, 0x30fb, 0x0000 }, - { 0x8600, 0x30fe, 0x2000 }, - { 0x0600, 0x30fd, 0x0000 }, - { 0x0700, 0x30ff, 0x0000 }, - { 0x8700, 0x3125, 0x6000 }, - { 0x8700, 0x3115, 0x5000 }, - { 0x8700, 0x310d, 0x4000 }, - { 0x8700, 0x3109, 0x3000 }, - { 0x8700, 0x3107, 0x2000 }, - { 0x0700, 0x3106, 0x0000 }, - { 0x0700, 0x3108, 0x0000 }, - { 0x8700, 0x310b, 0x2000 }, - { 0x0700, 0x310a, 0x0000 }, - { 0x0700, 0x310c, 0x0000 }, - { 0x8700, 0x3111, 0x3000 }, - { 0x8700, 0x310f, 0x2000 }, - { 0x0700, 0x310e, 0x0000 }, - { 0x0700, 0x3110, 0x0000 }, - { 0x8700, 0x3113, 0x2000 }, - { 0x0700, 0x3112, 0x0000 }, - { 0x0700, 0x3114, 0x0000 }, - { 0x8700, 0x311d, 0x4000 }, - { 0x8700, 0x3119, 0x3000 }, - { 0x8700, 0x3117, 0x2000 }, - { 0x0700, 0x3116, 0x0000 }, - { 0x0700, 0x3118, 0x0000 }, - { 0x8700, 0x311b, 0x2000 }, - { 0x0700, 0x311a, 0x0000 }, - { 0x0700, 0x311c, 0x0000 }, - { 0x8700, 0x3121, 0x3000 }, - { 0x8700, 0x311f, 0x2000 }, - { 0x0700, 0x311e, 0x0000 }, - { 0x0700, 0x3120, 0x0000 }, - { 0x8700, 0x3123, 0x2000 }, - { 0x0700, 0x3122, 0x0000 }, - { 0x0700, 0x3124, 0x0000 }, - { 0x8700, 0x3139, 0x5000 }, - { 0x8700, 0x3131, 0x4000 }, - { 0x8700, 0x3129, 0x3000 }, - { 0x8700, 0x3127, 0x2000 }, - { 0x0700, 0x3126, 0x0000 }, - { 0x0700, 0x3128, 0x0000 }, - { 0x8700, 0x312b, 0x2000 }, - { 0x0700, 0x312a, 0x0000 }, - { 0x0700, 0x312c, 0x0000 }, - { 0x8700, 0x3135, 0x3000 }, - { 0x8700, 0x3133, 0x2000 }, - { 0x0700, 0x3132, 0x0000 }, - { 0x0700, 0x3134, 0x0000 }, - { 0x8700, 0x3137, 0x2000 }, - { 0x0700, 0x3136, 0x0000 }, - { 0x0700, 0x3138, 0x0000 }, - { 0x8700, 0x3141, 0x4000 }, - { 0x8700, 0x313d, 0x3000 }, - { 0x8700, 0x313b, 0x2000 }, - { 0x0700, 0x313a, 0x0000 }, - { 0x0700, 0x313c, 0x0000 }, - { 0x8700, 0x313f, 0x2000 }, - { 0x0700, 0x313e, 0x0000 }, - { 0x0700, 0x3140, 0x0000 }, - { 0x8700, 0x3145, 0x3000 }, - { 0x8700, 0x3143, 0x2000 }, - { 0x0700, 0x3142, 0x0000 }, - { 0x0700, 0x3144, 0x0000 }, - { 0x8700, 0x3147, 0x2000 }, - { 0x0700, 0x3146, 0x0000 }, - { 0x0700, 0x3148, 0x0000 }, - { 0x9a00, 0x3290, 0x9000 }, - { 0x9a00, 0x3202, 0x8000 }, - { 0x8700, 0x3189, 0x7000 }, - { 0x8700, 0x3169, 0x6000 }, - { 0x8700, 0x3159, 0x5000 }, - { 0x8700, 0x3151, 0x4000 }, - { 0x8700, 0x314d, 0x3000 }, - { 0x8700, 0x314b, 0x2000 }, - { 0x0700, 0x314a, 0x0000 }, - { 0x0700, 0x314c, 0x0000 }, - { 0x8700, 0x314f, 0x2000 }, - { 0x0700, 0x314e, 0x0000 }, - { 0x0700, 0x3150, 0x0000 }, - { 0x8700, 0x3155, 0x3000 }, - { 0x8700, 0x3153, 0x2000 }, - { 0x0700, 0x3152, 0x0000 }, - { 0x0700, 0x3154, 0x0000 }, - { 0x8700, 0x3157, 0x2000 }, - { 0x0700, 0x3156, 0x0000 }, - { 0x0700, 0x3158, 0x0000 }, - { 0x8700, 0x3161, 0x4000 }, - { 0x8700, 0x315d, 0x3000 }, - { 0x8700, 0x315b, 0x2000 }, - { 0x0700, 0x315a, 0x0000 }, - { 0x0700, 0x315c, 0x0000 }, - { 0x8700, 0x315f, 0x2000 }, - { 0x0700, 0x315e, 0x0000 }, - { 0x0700, 0x3160, 0x0000 }, - { 0x8700, 0x3165, 0x3000 }, - { 0x8700, 0x3163, 0x2000 }, - { 0x0700, 0x3162, 0x0000 }, - { 0x0700, 0x3164, 0x0000 }, - { 0x8700, 0x3167, 0x2000 }, - { 0x0700, 0x3166, 0x0000 }, - { 0x0700, 0x3168, 0x0000 }, - { 0x8700, 0x3179, 0x5000 }, - { 0x8700, 0x3171, 0x4000 }, - { 0x8700, 0x316d, 0x3000 }, - { 0x8700, 0x316b, 0x2000 }, - { 0x0700, 0x316a, 0x0000 }, - { 0x0700, 0x316c, 0x0000 }, - { 0x8700, 0x316f, 0x2000 }, - { 0x0700, 0x316e, 0x0000 }, - { 0x0700, 0x3170, 0x0000 }, - { 0x8700, 0x3175, 0x3000 }, - { 0x8700, 0x3173, 0x2000 }, - { 0x0700, 0x3172, 0x0000 }, - { 0x0700, 0x3174, 0x0000 }, - { 0x8700, 0x3177, 0x2000 }, - { 0x0700, 0x3176, 0x0000 }, - { 0x0700, 0x3178, 0x0000 }, - { 0x8700, 0x3181, 0x4000 }, - { 0x8700, 0x317d, 0x3000 }, - { 0x8700, 0x317b, 0x2000 }, - { 0x0700, 0x317a, 0x0000 }, - { 0x0700, 0x317c, 0x0000 }, - { 0x8700, 0x317f, 0x2000 }, - { 0x0700, 0x317e, 0x0000 }, - { 0x0700, 0x3180, 0x0000 }, - { 0x8700, 0x3185, 0x3000 }, - { 0x8700, 0x3183, 0x2000 }, - { 0x0700, 0x3182, 0x0000 }, - { 0x0700, 0x3184, 0x0000 }, - { 0x8700, 0x3187, 0x2000 }, - { 0x0700, 0x3186, 0x0000 }, - { 0x0700, 0x3188, 0x0000 }, - { 0x8700, 0x31aa, 0x6000 }, - { 0x9a00, 0x319a, 0x5000 }, - { 0x8f00, 0x3192, 0x4000 }, - { 0x8700, 0x318d, 0x3000 }, - { 0x8700, 0x318b, 0x2000 }, - { 0x0700, 0x318a, 0x0000 }, - { 0x0700, 0x318c, 0x0000 }, - { 0x9a00, 0x3190, 0x2000 }, - { 0x0700, 0x318e, 0x0000 }, - { 0x1a00, 0x3191, 0x0000 }, - { 0x9a00, 0x3196, 0x3000 }, - { 0x8f00, 0x3194, 0x2000 }, - { 0x0f00, 0x3193, 0x0000 }, - { 0x0f00, 0x3195, 0x0000 }, - { 0x9a00, 0x3198, 0x2000 }, - { 0x1a00, 0x3197, 0x0000 }, - { 0x1a00, 0x3199, 0x0000 }, - { 0x8700, 0x31a2, 0x4000 }, - { 0x9a00, 0x319e, 0x3000 }, - { 0x9a00, 0x319c, 0x2000 }, - { 0x1a00, 0x319b, 0x0000 }, - { 0x1a00, 0x319d, 0x0000 }, - { 0x8700, 0x31a0, 0x2000 }, - { 0x1a00, 0x319f, 0x0000 }, - { 0x0700, 0x31a1, 0x0000 }, - { 0x8700, 0x31a6, 0x3000 }, - { 0x8700, 0x31a4, 0x2000 }, - { 0x0700, 0x31a3, 0x0000 }, - { 0x0700, 0x31a5, 0x0000 }, - { 0x8700, 0x31a8, 0x2000 }, - { 0x0700, 0x31a7, 0x0000 }, - { 0x0700, 0x31a9, 0x0000 }, - { 0x8700, 0x31f2, 0x5000 }, - { 0x8700, 0x31b2, 0x4000 }, - { 0x8700, 0x31ae, 0x3000 }, - { 0x8700, 0x31ac, 0x2000 }, - { 0x0700, 0x31ab, 0x0000 }, - { 0x0700, 0x31ad, 0x0000 }, - { 0x8700, 0x31b0, 0x2000 }, - { 0x0700, 0x31af, 0x0000 }, - { 0x0700, 0x31b1, 0x0000 }, - { 0x8700, 0x31b6, 0x3000 }, - { 0x8700, 0x31b4, 0x2000 }, - { 0x0700, 0x31b3, 0x0000 }, - { 0x0700, 0x31b5, 0x0000 }, - { 0x8700, 0x31f0, 0x2000 }, - { 0x0700, 0x31b7, 0x0000 }, - { 0x0700, 0x31f1, 0x0000 }, - { 0x8700, 0x31fa, 0x4000 }, - { 0x8700, 0x31f6, 0x3000 }, - { 0x8700, 0x31f4, 0x2000 }, - { 0x0700, 0x31f3, 0x0000 }, - { 0x0700, 0x31f5, 0x0000 }, - { 0x8700, 0x31f8, 0x2000 }, - { 0x0700, 0x31f7, 0x0000 }, - { 0x0700, 0x31f9, 0x0000 }, - { 0x8700, 0x31fe, 0x3000 }, - { 0x8700, 0x31fc, 0x2000 }, - { 0x0700, 0x31fb, 0x0000 }, - { 0x0700, 0x31fd, 0x0000 }, - { 0x9a00, 0x3200, 0x2000 }, - { 0x0700, 0x31ff, 0x0000 }, - { 0x1a00, 0x3201, 0x0000 }, - { 0x9a00, 0x3243, 0x7000 }, - { 0x8f00, 0x3223, 0x6000 }, - { 0x9a00, 0x3212, 0x5000 }, - { 0x9a00, 0x320a, 0x4000 }, - { 0x9a00, 0x3206, 0x3000 }, - { 0x9a00, 0x3204, 0x2000 }, - { 0x1a00, 0x3203, 0x0000 }, - { 0x1a00, 0x3205, 0x0000 }, - { 0x9a00, 0x3208, 0x2000 }, - { 0x1a00, 0x3207, 0x0000 }, - { 0x1a00, 0x3209, 0x0000 }, - { 0x9a00, 0x320e, 0x3000 }, - { 0x9a00, 0x320c, 0x2000 }, - { 0x1a00, 0x320b, 0x0000 }, - { 0x1a00, 0x320d, 0x0000 }, - { 0x9a00, 0x3210, 0x2000 }, - { 0x1a00, 0x320f, 0x0000 }, - { 0x1a00, 0x3211, 0x0000 }, - { 0x9a00, 0x321a, 0x4000 }, - { 0x9a00, 0x3216, 0x3000 }, - { 0x9a00, 0x3214, 0x2000 }, - { 0x1a00, 0x3213, 0x0000 }, - { 0x1a00, 0x3215, 0x0000 }, - { 0x9a00, 0x3218, 0x2000 }, - { 0x1a00, 0x3217, 0x0000 }, - { 0x1a00, 0x3219, 0x0000 }, - { 0x9a00, 0x321e, 0x3000 }, - { 0x9a00, 0x321c, 0x2000 }, - { 0x1a00, 0x321b, 0x0000 }, - { 0x1a00, 0x321d, 0x0000 }, - { 0x8f00, 0x3221, 0x2000 }, - { 0x0f00, 0x3220, 0x0000 }, - { 0x0f00, 0x3222, 0x0000 }, - { 0x9a00, 0x3233, 0x5000 }, - { 0x9a00, 0x322b, 0x4000 }, - { 0x8f00, 0x3227, 0x3000 }, - { 0x8f00, 0x3225, 0x2000 }, - { 0x0f00, 0x3224, 0x0000 }, - { 0x0f00, 0x3226, 0x0000 }, - { 0x8f00, 0x3229, 0x2000 }, - { 0x0f00, 0x3228, 0x0000 }, - { 0x1a00, 0x322a, 0x0000 }, - { 0x9a00, 0x322f, 0x3000 }, - { 0x9a00, 0x322d, 0x2000 }, - { 0x1a00, 0x322c, 0x0000 }, - { 0x1a00, 0x322e, 0x0000 }, - { 0x9a00, 0x3231, 0x2000 }, - { 0x1a00, 0x3230, 0x0000 }, - { 0x1a00, 0x3232, 0x0000 }, - { 0x9a00, 0x323b, 0x4000 }, - { 0x9a00, 0x3237, 0x3000 }, - { 0x9a00, 0x3235, 0x2000 }, - { 0x1a00, 0x3234, 0x0000 }, - { 0x1a00, 0x3236, 0x0000 }, - { 0x9a00, 0x3239, 0x2000 }, - { 0x1a00, 0x3238, 0x0000 }, - { 0x1a00, 0x323a, 0x0000 }, - { 0x9a00, 0x323f, 0x3000 }, - { 0x9a00, 0x323d, 0x2000 }, - { 0x1a00, 0x323c, 0x0000 }, - { 0x1a00, 0x323e, 0x0000 }, - { 0x9a00, 0x3241, 0x2000 }, - { 0x1a00, 0x3240, 0x0000 }, - { 0x1a00, 0x3242, 0x0000 }, - { 0x9a00, 0x326f, 0x6000 }, - { 0x8f00, 0x325f, 0x5000 }, - { 0x8f00, 0x3257, 0x4000 }, - { 0x8f00, 0x3253, 0x3000 }, - { 0x8f00, 0x3251, 0x2000 }, - { 0x1a00, 0x3250, 0x0000 }, - { 0x0f00, 0x3252, 0x0000 }, - { 0x8f00, 0x3255, 0x2000 }, - { 0x0f00, 0x3254, 0x0000 }, - { 0x0f00, 0x3256, 0x0000 }, - { 0x8f00, 0x325b, 0x3000 }, - { 0x8f00, 0x3259, 0x2000 }, - { 0x0f00, 0x3258, 0x0000 }, - { 0x0f00, 0x325a, 0x0000 }, - { 0x8f00, 0x325d, 0x2000 }, - { 0x0f00, 0x325c, 0x0000 }, - { 0x0f00, 0x325e, 0x0000 }, - { 0x9a00, 0x3267, 0x4000 }, - { 0x9a00, 0x3263, 0x3000 }, - { 0x9a00, 0x3261, 0x2000 }, - { 0x1a00, 0x3260, 0x0000 }, - { 0x1a00, 0x3262, 0x0000 }, - { 0x9a00, 0x3265, 0x2000 }, - { 0x1a00, 0x3264, 0x0000 }, - { 0x1a00, 0x3266, 0x0000 }, - { 0x9a00, 0x326b, 0x3000 }, - { 0x9a00, 0x3269, 0x2000 }, - { 0x1a00, 0x3268, 0x0000 }, - { 0x1a00, 0x326a, 0x0000 }, - { 0x9a00, 0x326d, 0x2000 }, - { 0x1a00, 0x326c, 0x0000 }, - { 0x1a00, 0x326e, 0x0000 }, - { 0x8f00, 0x3280, 0x5000 }, - { 0x9a00, 0x3277, 0x4000 }, - { 0x9a00, 0x3273, 0x3000 }, - { 0x9a00, 0x3271, 0x2000 }, - { 0x1a00, 0x3270, 0x0000 }, - { 0x1a00, 0x3272, 0x0000 }, - { 0x9a00, 0x3275, 0x2000 }, - { 0x1a00, 0x3274, 0x0000 }, - { 0x1a00, 0x3276, 0x0000 }, - { 0x9a00, 0x327b, 0x3000 }, - { 0x9a00, 0x3279, 0x2000 }, - { 0x1a00, 0x3278, 0x0000 }, - { 0x1a00, 0x327a, 0x0000 }, - { 0x9a00, 0x327d, 0x2000 }, - { 0x1a00, 0x327c, 0x0000 }, - { 0x1a00, 0x327f, 0x0000 }, - { 0x8f00, 0x3288, 0x4000 }, - { 0x8f00, 0x3284, 0x3000 }, - { 0x8f00, 0x3282, 0x2000 }, - { 0x0f00, 0x3281, 0x0000 }, - { 0x0f00, 0x3283, 0x0000 }, - { 0x8f00, 0x3286, 0x2000 }, - { 0x0f00, 0x3285, 0x0000 }, - { 0x0f00, 0x3287, 0x0000 }, - { 0x9a00, 0x328c, 0x3000 }, - { 0x9a00, 0x328a, 0x2000 }, - { 0x0f00, 0x3289, 0x0000 }, - { 0x1a00, 0x328b, 0x0000 }, - { 0x9a00, 0x328e, 0x2000 }, - { 0x1a00, 0x328d, 0x0000 }, - { 0x1a00, 0x328f, 0x0000 }, - { 0x9a00, 0x3311, 0x8000 }, - { 0x9a00, 0x32d0, 0x7000 }, - { 0x9a00, 0x32b0, 0x6000 }, - { 0x9a00, 0x32a0, 0x5000 }, - { 0x9a00, 0x3298, 0x4000 }, - { 0x9a00, 0x3294, 0x3000 }, - { 0x9a00, 0x3292, 0x2000 }, - { 0x1a00, 0x3291, 0x0000 }, - { 0x1a00, 0x3293, 0x0000 }, - { 0x9a00, 0x3296, 0x2000 }, - { 0x1a00, 0x3295, 0x0000 }, - { 0x1a00, 0x3297, 0x0000 }, - { 0x9a00, 0x329c, 0x3000 }, - { 0x9a00, 0x329a, 0x2000 }, - { 0x1a00, 0x3299, 0x0000 }, - { 0x1a00, 0x329b, 0x0000 }, - { 0x9a00, 0x329e, 0x2000 }, - { 0x1a00, 0x329d, 0x0000 }, - { 0x1a00, 0x329f, 0x0000 }, - { 0x9a00, 0x32a8, 0x4000 }, - { 0x9a00, 0x32a4, 0x3000 }, - { 0x9a00, 0x32a2, 0x2000 }, - { 0x1a00, 0x32a1, 0x0000 }, - { 0x1a00, 0x32a3, 0x0000 }, - { 0x9a00, 0x32a6, 0x2000 }, - { 0x1a00, 0x32a5, 0x0000 }, - { 0x1a00, 0x32a7, 0x0000 }, - { 0x9a00, 0x32ac, 0x3000 }, - { 0x9a00, 0x32aa, 0x2000 }, - { 0x1a00, 0x32a9, 0x0000 }, - { 0x1a00, 0x32ab, 0x0000 }, - { 0x9a00, 0x32ae, 0x2000 }, - { 0x1a00, 0x32ad, 0x0000 }, - { 0x1a00, 0x32af, 0x0000 }, - { 0x9a00, 0x32c0, 0x5000 }, - { 0x8f00, 0x32b8, 0x4000 }, - { 0x8f00, 0x32b4, 0x3000 }, - { 0x8f00, 0x32b2, 0x2000 }, - { 0x0f00, 0x32b1, 0x0000 }, - { 0x0f00, 0x32b3, 0x0000 }, - { 0x8f00, 0x32b6, 0x2000 }, - { 0x0f00, 0x32b5, 0x0000 }, - { 0x0f00, 0x32b7, 0x0000 }, - { 0x8f00, 0x32bc, 0x3000 }, - { 0x8f00, 0x32ba, 0x2000 }, - { 0x0f00, 0x32b9, 0x0000 }, - { 0x0f00, 0x32bb, 0x0000 }, - { 0x8f00, 0x32be, 0x2000 }, - { 0x0f00, 0x32bd, 0x0000 }, - { 0x0f00, 0x32bf, 0x0000 }, - { 0x9a00, 0x32c8, 0x4000 }, - { 0x9a00, 0x32c4, 0x3000 }, - { 0x9a00, 0x32c2, 0x2000 }, - { 0x1a00, 0x32c1, 0x0000 }, - { 0x1a00, 0x32c3, 0x0000 }, - { 0x9a00, 0x32c6, 0x2000 }, - { 0x1a00, 0x32c5, 0x0000 }, - { 0x1a00, 0x32c7, 0x0000 }, - { 0x9a00, 0x32cc, 0x3000 }, - { 0x9a00, 0x32ca, 0x2000 }, - { 0x1a00, 0x32c9, 0x0000 }, - { 0x1a00, 0x32cb, 0x0000 }, - { 0x9a00, 0x32ce, 0x2000 }, - { 0x1a00, 0x32cd, 0x0000 }, - { 0x1a00, 0x32cf, 0x0000 }, - { 0x9a00, 0x32f0, 0x6000 }, - { 0x9a00, 0x32e0, 0x5000 }, - { 0x9a00, 0x32d8, 0x4000 }, - { 0x9a00, 0x32d4, 0x3000 }, - { 0x9a00, 0x32d2, 0x2000 }, - { 0x1a00, 0x32d1, 0x0000 }, - { 0x1a00, 0x32d3, 0x0000 }, - { 0x9a00, 0x32d6, 0x2000 }, - { 0x1a00, 0x32d5, 0x0000 }, - { 0x1a00, 0x32d7, 0x0000 }, - { 0x9a00, 0x32dc, 0x3000 }, - { 0x9a00, 0x32da, 0x2000 }, - { 0x1a00, 0x32d9, 0x0000 }, - { 0x1a00, 0x32db, 0x0000 }, - { 0x9a00, 0x32de, 0x2000 }, - { 0x1a00, 0x32dd, 0x0000 }, - { 0x1a00, 0x32df, 0x0000 }, - { 0x9a00, 0x32e8, 0x4000 }, - { 0x9a00, 0x32e4, 0x3000 }, - { 0x9a00, 0x32e2, 0x2000 }, - { 0x1a00, 0x32e1, 0x0000 }, - { 0x1a00, 0x32e3, 0x0000 }, - { 0x9a00, 0x32e6, 0x2000 }, - { 0x1a00, 0x32e5, 0x0000 }, - { 0x1a00, 0x32e7, 0x0000 }, - { 0x9a00, 0x32ec, 0x3000 }, - { 0x9a00, 0x32ea, 0x2000 }, - { 0x1a00, 0x32e9, 0x0000 }, - { 0x1a00, 0x32eb, 0x0000 }, - { 0x9a00, 0x32ee, 0x2000 }, - { 0x1a00, 0x32ed, 0x0000 }, - { 0x1a00, 0x32ef, 0x0000 }, - { 0x9a00, 0x3301, 0x5000 }, - { 0x9a00, 0x32f8, 0x4000 }, - { 0x9a00, 0x32f4, 0x3000 }, - { 0x9a00, 0x32f2, 0x2000 }, - { 0x1a00, 0x32f1, 0x0000 }, - { 0x1a00, 0x32f3, 0x0000 }, - { 0x9a00, 0x32f6, 0x2000 }, - { 0x1a00, 0x32f5, 0x0000 }, - { 0x1a00, 0x32f7, 0x0000 }, - { 0x9a00, 0x32fc, 0x3000 }, - { 0x9a00, 0x32fa, 0x2000 }, - { 0x1a00, 0x32f9, 0x0000 }, - { 0x1a00, 0x32fb, 0x0000 }, - { 0x9a00, 0x32fe, 0x2000 }, - { 0x1a00, 0x32fd, 0x0000 }, - { 0x1a00, 0x3300, 0x0000 }, - { 0x9a00, 0x3309, 0x4000 }, - { 0x9a00, 0x3305, 0x3000 }, - { 0x9a00, 0x3303, 0x2000 }, - { 0x1a00, 0x3302, 0x0000 }, - { 0x1a00, 0x3304, 0x0000 }, - { 0x9a00, 0x3307, 0x2000 }, - { 0x1a00, 0x3306, 0x0000 }, - { 0x1a00, 0x3308, 0x0000 }, - { 0x9a00, 0x330d, 0x3000 }, - { 0x9a00, 0x330b, 0x2000 }, - { 0x1a00, 0x330a, 0x0000 }, - { 0x1a00, 0x330c, 0x0000 }, - { 0x9a00, 0x330f, 0x2000 }, - { 0x1a00, 0x330e, 0x0000 }, - { 0x1a00, 0x3310, 0x0000 }, - { 0x9a00, 0x3351, 0x7000 }, - { 0x9a00, 0x3331, 0x6000 }, - { 0x9a00, 0x3321, 0x5000 }, - { 0x9a00, 0x3319, 0x4000 }, - { 0x9a00, 0x3315, 0x3000 }, - { 0x9a00, 0x3313, 0x2000 }, - { 0x1a00, 0x3312, 0x0000 }, - { 0x1a00, 0x3314, 0x0000 }, - { 0x9a00, 0x3317, 0x2000 }, - { 0x1a00, 0x3316, 0x0000 }, - { 0x1a00, 0x3318, 0x0000 }, - { 0x9a00, 0x331d, 0x3000 }, - { 0x9a00, 0x331b, 0x2000 }, - { 0x1a00, 0x331a, 0x0000 }, - { 0x1a00, 0x331c, 0x0000 }, - { 0x9a00, 0x331f, 0x2000 }, - { 0x1a00, 0x331e, 0x0000 }, - { 0x1a00, 0x3320, 0x0000 }, - { 0x9a00, 0x3329, 0x4000 }, - { 0x9a00, 0x3325, 0x3000 }, - { 0x9a00, 0x3323, 0x2000 }, - { 0x1a00, 0x3322, 0x0000 }, - { 0x1a00, 0x3324, 0x0000 }, - { 0x9a00, 0x3327, 0x2000 }, - { 0x1a00, 0x3326, 0x0000 }, - { 0x1a00, 0x3328, 0x0000 }, - { 0x9a00, 0x332d, 0x3000 }, - { 0x9a00, 0x332b, 0x2000 }, - { 0x1a00, 0x332a, 0x0000 }, - { 0x1a00, 0x332c, 0x0000 }, - { 0x9a00, 0x332f, 0x2000 }, - { 0x1a00, 0x332e, 0x0000 }, - { 0x1a00, 0x3330, 0x0000 }, - { 0x9a00, 0x3341, 0x5000 }, - { 0x9a00, 0x3339, 0x4000 }, - { 0x9a00, 0x3335, 0x3000 }, - { 0x9a00, 0x3333, 0x2000 }, - { 0x1a00, 0x3332, 0x0000 }, - { 0x1a00, 0x3334, 0x0000 }, - { 0x9a00, 0x3337, 0x2000 }, - { 0x1a00, 0x3336, 0x0000 }, - { 0x1a00, 0x3338, 0x0000 }, - { 0x9a00, 0x333d, 0x3000 }, - { 0x9a00, 0x333b, 0x2000 }, - { 0x1a00, 0x333a, 0x0000 }, - { 0x1a00, 0x333c, 0x0000 }, - { 0x9a00, 0x333f, 0x2000 }, - { 0x1a00, 0x333e, 0x0000 }, - { 0x1a00, 0x3340, 0x0000 }, - { 0x9a00, 0x3349, 0x4000 }, - { 0x9a00, 0x3345, 0x3000 }, - { 0x9a00, 0x3343, 0x2000 }, - { 0x1a00, 0x3342, 0x0000 }, - { 0x1a00, 0x3344, 0x0000 }, - { 0x9a00, 0x3347, 0x2000 }, - { 0x1a00, 0x3346, 0x0000 }, - { 0x1a00, 0x3348, 0x0000 }, - { 0x9a00, 0x334d, 0x3000 }, - { 0x9a00, 0x334b, 0x2000 }, - { 0x1a00, 0x334a, 0x0000 }, - { 0x1a00, 0x334c, 0x0000 }, - { 0x9a00, 0x334f, 0x2000 }, - { 0x1a00, 0x334e, 0x0000 }, - { 0x1a00, 0x3350, 0x0000 }, - { 0x9a00, 0x3371, 0x6000 }, - { 0x9a00, 0x3361, 0x5000 }, - { 0x9a00, 0x3359, 0x4000 }, - { 0x9a00, 0x3355, 0x3000 }, - { 0x9a00, 0x3353, 0x2000 }, - { 0x1a00, 0x3352, 0x0000 }, - { 0x1a00, 0x3354, 0x0000 }, - { 0x9a00, 0x3357, 0x2000 }, - { 0x1a00, 0x3356, 0x0000 }, - { 0x1a00, 0x3358, 0x0000 }, - { 0x9a00, 0x335d, 0x3000 }, - { 0x9a00, 0x335b, 0x2000 }, - { 0x1a00, 0x335a, 0x0000 }, - { 0x1a00, 0x335c, 0x0000 }, - { 0x9a00, 0x335f, 0x2000 }, - { 0x1a00, 0x335e, 0x0000 }, - { 0x1a00, 0x3360, 0x0000 }, - { 0x9a00, 0x3369, 0x4000 }, - { 0x9a00, 0x3365, 0x3000 }, - { 0x9a00, 0x3363, 0x2000 }, - { 0x1a00, 0x3362, 0x0000 }, - { 0x1a00, 0x3364, 0x0000 }, - { 0x9a00, 0x3367, 0x2000 }, - { 0x1a00, 0x3366, 0x0000 }, - { 0x1a00, 0x3368, 0x0000 }, - { 0x9a00, 0x336d, 0x3000 }, - { 0x9a00, 0x336b, 0x2000 }, - { 0x1a00, 0x336a, 0x0000 }, - { 0x1a00, 0x336c, 0x0000 }, - { 0x9a00, 0x336f, 0x2000 }, - { 0x1a00, 0x336e, 0x0000 }, - { 0x1a00, 0x3370, 0x0000 }, - { 0x9a00, 0x3381, 0x5000 }, - { 0x9a00, 0x3379, 0x4000 }, - { 0x9a00, 0x3375, 0x3000 }, - { 0x9a00, 0x3373, 0x2000 }, - { 0x1a00, 0x3372, 0x0000 }, - { 0x1a00, 0x3374, 0x0000 }, - { 0x9a00, 0x3377, 0x2000 }, - { 0x1a00, 0x3376, 0x0000 }, - { 0x1a00, 0x3378, 0x0000 }, - { 0x9a00, 0x337d, 0x3000 }, - { 0x9a00, 0x337b, 0x2000 }, - { 0x1a00, 0x337a, 0x0000 }, - { 0x1a00, 0x337c, 0x0000 }, - { 0x9a00, 0x337f, 0x2000 }, - { 0x1a00, 0x337e, 0x0000 }, - { 0x1a00, 0x3380, 0x0000 }, - { 0x9a00, 0x3389, 0x4000 }, - { 0x9a00, 0x3385, 0x3000 }, - { 0x9a00, 0x3383, 0x2000 }, - { 0x1a00, 0x3382, 0x0000 }, - { 0x1a00, 0x3384, 0x0000 }, - { 0x9a00, 0x3387, 0x2000 }, - { 0x1a00, 0x3386, 0x0000 }, - { 0x1a00, 0x3388, 0x0000 }, - { 0x9a00, 0x338d, 0x3000 }, - { 0x9a00, 0x338b, 0x2000 }, - { 0x1a00, 0x338a, 0x0000 }, - { 0x1a00, 0x338c, 0x0000 }, - { 0x9a00, 0x338f, 0x2000 }, - { 0x1a00, 0x338e, 0x0000 }, - { 0x1a00, 0x3390, 0x0000 }, - { 0x8700, 0xa14d, 0xa000 }, - { 0x8700, 0xa04d, 0x9000 }, - { 0x9a00, 0x4dcf, 0x8000 }, - { 0x9a00, 0x33d1, 0x7000 }, - { 0x9a00, 0x33b1, 0x6000 }, - { 0x9a00, 0x33a1, 0x5000 }, - { 0x9a00, 0x3399, 0x4000 }, - { 0x9a00, 0x3395, 0x3000 }, - { 0x9a00, 0x3393, 0x2000 }, - { 0x1a00, 0x3392, 0x0000 }, - { 0x1a00, 0x3394, 0x0000 }, - { 0x9a00, 0x3397, 0x2000 }, - { 0x1a00, 0x3396, 0x0000 }, - { 0x1a00, 0x3398, 0x0000 }, - { 0x9a00, 0x339d, 0x3000 }, - { 0x9a00, 0x339b, 0x2000 }, - { 0x1a00, 0x339a, 0x0000 }, - { 0x1a00, 0x339c, 0x0000 }, - { 0x9a00, 0x339f, 0x2000 }, - { 0x1a00, 0x339e, 0x0000 }, - { 0x1a00, 0x33a0, 0x0000 }, - { 0x9a00, 0x33a9, 0x4000 }, - { 0x9a00, 0x33a5, 0x3000 }, - { 0x9a00, 0x33a3, 0x2000 }, - { 0x1a00, 0x33a2, 0x0000 }, - { 0x1a00, 0x33a4, 0x0000 }, - { 0x9a00, 0x33a7, 0x2000 }, - { 0x1a00, 0x33a6, 0x0000 }, - { 0x1a00, 0x33a8, 0x0000 }, - { 0x9a00, 0x33ad, 0x3000 }, - { 0x9a00, 0x33ab, 0x2000 }, - { 0x1a00, 0x33aa, 0x0000 }, - { 0x1a00, 0x33ac, 0x0000 }, - { 0x9a00, 0x33af, 0x2000 }, - { 0x1a00, 0x33ae, 0x0000 }, - { 0x1a00, 0x33b0, 0x0000 }, - { 0x9a00, 0x33c1, 0x5000 }, - { 0x9a00, 0x33b9, 0x4000 }, - { 0x9a00, 0x33b5, 0x3000 }, - { 0x9a00, 0x33b3, 0x2000 }, - { 0x1a00, 0x33b2, 0x0000 }, - { 0x1a00, 0x33b4, 0x0000 }, - { 0x9a00, 0x33b7, 0x2000 }, - { 0x1a00, 0x33b6, 0x0000 }, - { 0x1a00, 0x33b8, 0x0000 }, - { 0x9a00, 0x33bd, 0x3000 }, - { 0x9a00, 0x33bb, 0x2000 }, - { 0x1a00, 0x33ba, 0x0000 }, - { 0x1a00, 0x33bc, 0x0000 }, - { 0x9a00, 0x33bf, 0x2000 }, - { 0x1a00, 0x33be, 0x0000 }, - { 0x1a00, 0x33c0, 0x0000 }, - { 0x9a00, 0x33c9, 0x4000 }, - { 0x9a00, 0x33c5, 0x3000 }, - { 0x9a00, 0x33c3, 0x2000 }, - { 0x1a00, 0x33c2, 0x0000 }, - { 0x1a00, 0x33c4, 0x0000 }, - { 0x9a00, 0x33c7, 0x2000 }, - { 0x1a00, 0x33c6, 0x0000 }, - { 0x1a00, 0x33c8, 0x0000 }, - { 0x9a00, 0x33cd, 0x3000 }, - { 0x9a00, 0x33cb, 0x2000 }, - { 0x1a00, 0x33ca, 0x0000 }, - { 0x1a00, 0x33cc, 0x0000 }, - { 0x9a00, 0x33cf, 0x2000 }, - { 0x1a00, 0x33ce, 0x0000 }, - { 0x1a00, 0x33d0, 0x0000 }, - { 0x9a00, 0x33f1, 0x6000 }, - { 0x9a00, 0x33e1, 0x5000 }, - { 0x9a00, 0x33d9, 0x4000 }, - { 0x9a00, 0x33d5, 0x3000 }, - { 0x9a00, 0x33d3, 0x2000 }, - { 0x1a00, 0x33d2, 0x0000 }, - { 0x1a00, 0x33d4, 0x0000 }, - { 0x9a00, 0x33d7, 0x2000 }, - { 0x1a00, 0x33d6, 0x0000 }, - { 0x1a00, 0x33d8, 0x0000 }, - { 0x9a00, 0x33dd, 0x3000 }, - { 0x9a00, 0x33db, 0x2000 }, - { 0x1a00, 0x33da, 0x0000 }, - { 0x1a00, 0x33dc, 0x0000 }, - { 0x9a00, 0x33df, 0x2000 }, - { 0x1a00, 0x33de, 0x0000 }, - { 0x1a00, 0x33e0, 0x0000 }, - { 0x9a00, 0x33e9, 0x4000 }, - { 0x9a00, 0x33e5, 0x3000 }, - { 0x9a00, 0x33e3, 0x2000 }, - { 0x1a00, 0x33e2, 0x0000 }, - { 0x1a00, 0x33e4, 0x0000 }, - { 0x9a00, 0x33e7, 0x2000 }, - { 0x1a00, 0x33e6, 0x0000 }, - { 0x1a00, 0x33e8, 0x0000 }, - { 0x9a00, 0x33ed, 0x3000 }, - { 0x9a00, 0x33eb, 0x2000 }, - { 0x1a00, 0x33ea, 0x0000 }, - { 0x1a00, 0x33ec, 0x0000 }, - { 0x9a00, 0x33ef, 0x2000 }, - { 0x1a00, 0x33ee, 0x0000 }, - { 0x1a00, 0x33f0, 0x0000 }, - { 0x8700, 0x4db5, 0x5000 }, - { 0x9a00, 0x33f9, 0x4000 }, - { 0x9a00, 0x33f5, 0x3000 }, - { 0x9a00, 0x33f3, 0x2000 }, - { 0x1a00, 0x33f2, 0x0000 }, - { 0x1a00, 0x33f4, 0x0000 }, - { 0x9a00, 0x33f7, 0x2000 }, - { 0x1a00, 0x33f6, 0x0000 }, - { 0x1a00, 0x33f8, 0x0000 }, - { 0x9a00, 0x33fd, 0x3000 }, - { 0x9a00, 0x33fb, 0x2000 }, - { 0x1a00, 0x33fa, 0x0000 }, - { 0x1a00, 0x33fc, 0x0000 }, - { 0x9a00, 0x33ff, 0x2000 }, - { 0x1a00, 0x33fe, 0x0000 }, - { 0x0700, 0x3400, 0x0000 }, - { 0x9a00, 0x4dc7, 0x4000 }, - { 0x9a00, 0x4dc3, 0x3000 }, - { 0x9a00, 0x4dc1, 0x2000 }, - { 0x1a00, 0x4dc0, 0x0000 }, - { 0x1a00, 0x4dc2, 0x0000 }, - { 0x9a00, 0x4dc5, 0x2000 }, - { 0x1a00, 0x4dc4, 0x0000 }, - { 0x1a00, 0x4dc6, 0x0000 }, - { 0x9a00, 0x4dcb, 0x3000 }, - { 0x9a00, 0x4dc9, 0x2000 }, - { 0x1a00, 0x4dc8, 0x0000 }, - { 0x1a00, 0x4dca, 0x0000 }, - { 0x9a00, 0x4dcd, 0x2000 }, - { 0x1a00, 0x4dcc, 0x0000 }, - { 0x1a00, 0x4dce, 0x0000 }, - { 0x8700, 0xa00d, 0x7000 }, - { 0x9a00, 0x4def, 0x6000 }, - { 0x9a00, 0x4ddf, 0x5000 }, - { 0x9a00, 0x4dd7, 0x4000 }, - { 0x9a00, 0x4dd3, 0x3000 }, - { 0x9a00, 0x4dd1, 0x2000 }, - { 0x1a00, 0x4dd0, 0x0000 }, - { 0x1a00, 0x4dd2, 0x0000 }, - { 0x9a00, 0x4dd5, 0x2000 }, - { 0x1a00, 0x4dd4, 0x0000 }, - { 0x1a00, 0x4dd6, 0x0000 }, - { 0x9a00, 0x4ddb, 0x3000 }, - { 0x9a00, 0x4dd9, 0x2000 }, - { 0x1a00, 0x4dd8, 0x0000 }, - { 0x1a00, 0x4dda, 0x0000 }, - { 0x9a00, 0x4ddd, 0x2000 }, - { 0x1a00, 0x4ddc, 0x0000 }, - { 0x1a00, 0x4dde, 0x0000 }, - { 0x9a00, 0x4de7, 0x4000 }, - { 0x9a00, 0x4de3, 0x3000 }, - { 0x9a00, 0x4de1, 0x2000 }, - { 0x1a00, 0x4de0, 0x0000 }, - { 0x1a00, 0x4de2, 0x0000 }, - { 0x9a00, 0x4de5, 0x2000 }, - { 0x1a00, 0x4de4, 0x0000 }, - { 0x1a00, 0x4de6, 0x0000 }, - { 0x9a00, 0x4deb, 0x3000 }, - { 0x9a00, 0x4de9, 0x2000 }, - { 0x1a00, 0x4de8, 0x0000 }, - { 0x1a00, 0x4dea, 0x0000 }, - { 0x9a00, 0x4ded, 0x2000 }, - { 0x1a00, 0x4dec, 0x0000 }, - { 0x1a00, 0x4dee, 0x0000 }, - { 0x9a00, 0x4dff, 0x5000 }, - { 0x9a00, 0x4df7, 0x4000 }, - { 0x9a00, 0x4df3, 0x3000 }, - { 0x9a00, 0x4df1, 0x2000 }, - { 0x1a00, 0x4df0, 0x0000 }, - { 0x1a00, 0x4df2, 0x0000 }, - { 0x9a00, 0x4df5, 0x2000 }, - { 0x1a00, 0x4df4, 0x0000 }, - { 0x1a00, 0x4df6, 0x0000 }, - { 0x9a00, 0x4dfb, 0x3000 }, - { 0x9a00, 0x4df9, 0x2000 }, - { 0x1a00, 0x4df8, 0x0000 }, - { 0x1a00, 0x4dfa, 0x0000 }, - { 0x9a00, 0x4dfd, 0x2000 }, - { 0x1a00, 0x4dfc, 0x0000 }, - { 0x1a00, 0x4dfe, 0x0000 }, - { 0x8700, 0xa005, 0x4000 }, - { 0x8700, 0xa001, 0x3000 }, - { 0x8700, 0x9fa5, 0x2000 }, - { 0x0700, 0x4e00, 0x0000 }, - { 0x0700, 0xa000, 0x0000 }, - { 0x8700, 0xa003, 0x2000 }, - { 0x0700, 0xa002, 0x0000 }, - { 0x0700, 0xa004, 0x0000 }, - { 0x8700, 0xa009, 0x3000 }, - { 0x8700, 0xa007, 0x2000 }, - { 0x0700, 0xa006, 0x0000 }, - { 0x0700, 0xa008, 0x0000 }, - { 0x8700, 0xa00b, 0x2000 }, - { 0x0700, 0xa00a, 0x0000 }, - { 0x0700, 0xa00c, 0x0000 }, - { 0x8700, 0xa02d, 0x6000 }, - { 0x8700, 0xa01d, 0x5000 }, - { 0x8700, 0xa015, 0x4000 }, - { 0x8700, 0xa011, 0x3000 }, - { 0x8700, 0xa00f, 0x2000 }, - { 0x0700, 0xa00e, 0x0000 }, - { 0x0700, 0xa010, 0x0000 }, - { 0x8700, 0xa013, 0x2000 }, - { 0x0700, 0xa012, 0x0000 }, - { 0x0700, 0xa014, 0x0000 }, - { 0x8700, 0xa019, 0x3000 }, - { 0x8700, 0xa017, 0x2000 }, - { 0x0700, 0xa016, 0x0000 }, - { 0x0700, 0xa018, 0x0000 }, - { 0x8700, 0xa01b, 0x2000 }, - { 0x0700, 0xa01a, 0x0000 }, - { 0x0700, 0xa01c, 0x0000 }, - { 0x8700, 0xa025, 0x4000 }, - { 0x8700, 0xa021, 0x3000 }, - { 0x8700, 0xa01f, 0x2000 }, - { 0x0700, 0xa01e, 0x0000 }, - { 0x0700, 0xa020, 0x0000 }, - { 0x8700, 0xa023, 0x2000 }, - { 0x0700, 0xa022, 0x0000 }, - { 0x0700, 0xa024, 0x0000 }, - { 0x8700, 0xa029, 0x3000 }, - { 0x8700, 0xa027, 0x2000 }, - { 0x0700, 0xa026, 0x0000 }, - { 0x0700, 0xa028, 0x0000 }, - { 0x8700, 0xa02b, 0x2000 }, - { 0x0700, 0xa02a, 0x0000 }, - { 0x0700, 0xa02c, 0x0000 }, - { 0x8700, 0xa03d, 0x5000 }, - { 0x8700, 0xa035, 0x4000 }, - { 0x8700, 0xa031, 0x3000 }, - { 0x8700, 0xa02f, 0x2000 }, - { 0x0700, 0xa02e, 0x0000 }, - { 0x0700, 0xa030, 0x0000 }, - { 0x8700, 0xa033, 0x2000 }, - { 0x0700, 0xa032, 0x0000 }, - { 0x0700, 0xa034, 0x0000 }, - { 0x8700, 0xa039, 0x3000 }, - { 0x8700, 0xa037, 0x2000 }, - { 0x0700, 0xa036, 0x0000 }, - { 0x0700, 0xa038, 0x0000 }, - { 0x8700, 0xa03b, 0x2000 }, - { 0x0700, 0xa03a, 0x0000 }, - { 0x0700, 0xa03c, 0x0000 }, - { 0x8700, 0xa045, 0x4000 }, - { 0x8700, 0xa041, 0x3000 }, - { 0x8700, 0xa03f, 0x2000 }, - { 0x0700, 0xa03e, 0x0000 }, - { 0x0700, 0xa040, 0x0000 }, - { 0x8700, 0xa043, 0x2000 }, - { 0x0700, 0xa042, 0x0000 }, - { 0x0700, 0xa044, 0x0000 }, - { 0x8700, 0xa049, 0x3000 }, - { 0x8700, 0xa047, 0x2000 }, - { 0x0700, 0xa046, 0x0000 }, - { 0x0700, 0xa048, 0x0000 }, - { 0x8700, 0xa04b, 0x2000 }, - { 0x0700, 0xa04a, 0x0000 }, - { 0x0700, 0xa04c, 0x0000 }, - { 0x8700, 0xa0cd, 0x8000 }, - { 0x8700, 0xa08d, 0x7000 }, - { 0x8700, 0xa06d, 0x6000 }, - { 0x8700, 0xa05d, 0x5000 }, - { 0x8700, 0xa055, 0x4000 }, - { 0x8700, 0xa051, 0x3000 }, - { 0x8700, 0xa04f, 0x2000 }, - { 0x0700, 0xa04e, 0x0000 }, - { 0x0700, 0xa050, 0x0000 }, - { 0x8700, 0xa053, 0x2000 }, - { 0x0700, 0xa052, 0x0000 }, - { 0x0700, 0xa054, 0x0000 }, - { 0x8700, 0xa059, 0x3000 }, - { 0x8700, 0xa057, 0x2000 }, - { 0x0700, 0xa056, 0x0000 }, - { 0x0700, 0xa058, 0x0000 }, - { 0x8700, 0xa05b, 0x2000 }, - { 0x0700, 0xa05a, 0x0000 }, - { 0x0700, 0xa05c, 0x0000 }, - { 0x8700, 0xa065, 0x4000 }, - { 0x8700, 0xa061, 0x3000 }, - { 0x8700, 0xa05f, 0x2000 }, - { 0x0700, 0xa05e, 0x0000 }, - { 0x0700, 0xa060, 0x0000 }, - { 0x8700, 0xa063, 0x2000 }, - { 0x0700, 0xa062, 0x0000 }, - { 0x0700, 0xa064, 0x0000 }, - { 0x8700, 0xa069, 0x3000 }, - { 0x8700, 0xa067, 0x2000 }, - { 0x0700, 0xa066, 0x0000 }, - { 0x0700, 0xa068, 0x0000 }, - { 0x8700, 0xa06b, 0x2000 }, - { 0x0700, 0xa06a, 0x0000 }, - { 0x0700, 0xa06c, 0x0000 }, - { 0x8700, 0xa07d, 0x5000 }, - { 0x8700, 0xa075, 0x4000 }, - { 0x8700, 0xa071, 0x3000 }, - { 0x8700, 0xa06f, 0x2000 }, - { 0x0700, 0xa06e, 0x0000 }, - { 0x0700, 0xa070, 0x0000 }, - { 0x8700, 0xa073, 0x2000 }, - { 0x0700, 0xa072, 0x0000 }, - { 0x0700, 0xa074, 0x0000 }, - { 0x8700, 0xa079, 0x3000 }, - { 0x8700, 0xa077, 0x2000 }, - { 0x0700, 0xa076, 0x0000 }, - { 0x0700, 0xa078, 0x0000 }, - { 0x8700, 0xa07b, 0x2000 }, - { 0x0700, 0xa07a, 0x0000 }, - { 0x0700, 0xa07c, 0x0000 }, - { 0x8700, 0xa085, 0x4000 }, - { 0x8700, 0xa081, 0x3000 }, - { 0x8700, 0xa07f, 0x2000 }, - { 0x0700, 0xa07e, 0x0000 }, - { 0x0700, 0xa080, 0x0000 }, - { 0x8700, 0xa083, 0x2000 }, - { 0x0700, 0xa082, 0x0000 }, - { 0x0700, 0xa084, 0x0000 }, - { 0x8700, 0xa089, 0x3000 }, - { 0x8700, 0xa087, 0x2000 }, - { 0x0700, 0xa086, 0x0000 }, - { 0x0700, 0xa088, 0x0000 }, - { 0x8700, 0xa08b, 0x2000 }, - { 0x0700, 0xa08a, 0x0000 }, - { 0x0700, 0xa08c, 0x0000 }, - { 0x8700, 0xa0ad, 0x6000 }, - { 0x8700, 0xa09d, 0x5000 }, - { 0x8700, 0xa095, 0x4000 }, - { 0x8700, 0xa091, 0x3000 }, - { 0x8700, 0xa08f, 0x2000 }, - { 0x0700, 0xa08e, 0x0000 }, - { 0x0700, 0xa090, 0x0000 }, - { 0x8700, 0xa093, 0x2000 }, - { 0x0700, 0xa092, 0x0000 }, - { 0x0700, 0xa094, 0x0000 }, - { 0x8700, 0xa099, 0x3000 }, - { 0x8700, 0xa097, 0x2000 }, - { 0x0700, 0xa096, 0x0000 }, - { 0x0700, 0xa098, 0x0000 }, - { 0x8700, 0xa09b, 0x2000 }, - { 0x0700, 0xa09a, 0x0000 }, - { 0x0700, 0xa09c, 0x0000 }, - { 0x8700, 0xa0a5, 0x4000 }, - { 0x8700, 0xa0a1, 0x3000 }, - { 0x8700, 0xa09f, 0x2000 }, - { 0x0700, 0xa09e, 0x0000 }, - { 0x0700, 0xa0a0, 0x0000 }, - { 0x8700, 0xa0a3, 0x2000 }, - { 0x0700, 0xa0a2, 0x0000 }, - { 0x0700, 0xa0a4, 0x0000 }, - { 0x8700, 0xa0a9, 0x3000 }, - { 0x8700, 0xa0a7, 0x2000 }, - { 0x0700, 0xa0a6, 0x0000 }, - { 0x0700, 0xa0a8, 0x0000 }, - { 0x8700, 0xa0ab, 0x2000 }, - { 0x0700, 0xa0aa, 0x0000 }, - { 0x0700, 0xa0ac, 0x0000 }, - { 0x8700, 0xa0bd, 0x5000 }, - { 0x8700, 0xa0b5, 0x4000 }, - { 0x8700, 0xa0b1, 0x3000 }, - { 0x8700, 0xa0af, 0x2000 }, - { 0x0700, 0xa0ae, 0x0000 }, - { 0x0700, 0xa0b0, 0x0000 }, - { 0x8700, 0xa0b3, 0x2000 }, - { 0x0700, 0xa0b2, 0x0000 }, - { 0x0700, 0xa0b4, 0x0000 }, - { 0x8700, 0xa0b9, 0x3000 }, - { 0x8700, 0xa0b7, 0x2000 }, - { 0x0700, 0xa0b6, 0x0000 }, - { 0x0700, 0xa0b8, 0x0000 }, - { 0x8700, 0xa0bb, 0x2000 }, - { 0x0700, 0xa0ba, 0x0000 }, - { 0x0700, 0xa0bc, 0x0000 }, - { 0x8700, 0xa0c5, 0x4000 }, - { 0x8700, 0xa0c1, 0x3000 }, - { 0x8700, 0xa0bf, 0x2000 }, - { 0x0700, 0xa0be, 0x0000 }, - { 0x0700, 0xa0c0, 0x0000 }, - { 0x8700, 0xa0c3, 0x2000 }, - { 0x0700, 0xa0c2, 0x0000 }, - { 0x0700, 0xa0c4, 0x0000 }, - { 0x8700, 0xa0c9, 0x3000 }, - { 0x8700, 0xa0c7, 0x2000 }, - { 0x0700, 0xa0c6, 0x0000 }, - { 0x0700, 0xa0c8, 0x0000 }, - { 0x8700, 0xa0cb, 0x2000 }, - { 0x0700, 0xa0ca, 0x0000 }, - { 0x0700, 0xa0cc, 0x0000 }, - { 0x8700, 0xa10d, 0x7000 }, - { 0x8700, 0xa0ed, 0x6000 }, - { 0x8700, 0xa0dd, 0x5000 }, - { 0x8700, 0xa0d5, 0x4000 }, - { 0x8700, 0xa0d1, 0x3000 }, - { 0x8700, 0xa0cf, 0x2000 }, - { 0x0700, 0xa0ce, 0x0000 }, - { 0x0700, 0xa0d0, 0x0000 }, - { 0x8700, 0xa0d3, 0x2000 }, - { 0x0700, 0xa0d2, 0x0000 }, - { 0x0700, 0xa0d4, 0x0000 }, - { 0x8700, 0xa0d9, 0x3000 }, - { 0x8700, 0xa0d7, 0x2000 }, - { 0x0700, 0xa0d6, 0x0000 }, - { 0x0700, 0xa0d8, 0x0000 }, - { 0x8700, 0xa0db, 0x2000 }, - { 0x0700, 0xa0da, 0x0000 }, - { 0x0700, 0xa0dc, 0x0000 }, - { 0x8700, 0xa0e5, 0x4000 }, - { 0x8700, 0xa0e1, 0x3000 }, - { 0x8700, 0xa0df, 0x2000 }, - { 0x0700, 0xa0de, 0x0000 }, - { 0x0700, 0xa0e0, 0x0000 }, - { 0x8700, 0xa0e3, 0x2000 }, - { 0x0700, 0xa0e2, 0x0000 }, - { 0x0700, 0xa0e4, 0x0000 }, - { 0x8700, 0xa0e9, 0x3000 }, - { 0x8700, 0xa0e7, 0x2000 }, - { 0x0700, 0xa0e6, 0x0000 }, - { 0x0700, 0xa0e8, 0x0000 }, - { 0x8700, 0xa0eb, 0x2000 }, - { 0x0700, 0xa0ea, 0x0000 }, - { 0x0700, 0xa0ec, 0x0000 }, - { 0x8700, 0xa0fd, 0x5000 }, - { 0x8700, 0xa0f5, 0x4000 }, - { 0x8700, 0xa0f1, 0x3000 }, - { 0x8700, 0xa0ef, 0x2000 }, - { 0x0700, 0xa0ee, 0x0000 }, - { 0x0700, 0xa0f0, 0x0000 }, - { 0x8700, 0xa0f3, 0x2000 }, - { 0x0700, 0xa0f2, 0x0000 }, - { 0x0700, 0xa0f4, 0x0000 }, - { 0x8700, 0xa0f9, 0x3000 }, - { 0x8700, 0xa0f7, 0x2000 }, - { 0x0700, 0xa0f6, 0x0000 }, - { 0x0700, 0xa0f8, 0x0000 }, - { 0x8700, 0xa0fb, 0x2000 }, - { 0x0700, 0xa0fa, 0x0000 }, - { 0x0700, 0xa0fc, 0x0000 }, - { 0x8700, 0xa105, 0x4000 }, - { 0x8700, 0xa101, 0x3000 }, - { 0x8700, 0xa0ff, 0x2000 }, - { 0x0700, 0xa0fe, 0x0000 }, - { 0x0700, 0xa100, 0x0000 }, - { 0x8700, 0xa103, 0x2000 }, - { 0x0700, 0xa102, 0x0000 }, - { 0x0700, 0xa104, 0x0000 }, - { 0x8700, 0xa109, 0x3000 }, - { 0x8700, 0xa107, 0x2000 }, - { 0x0700, 0xa106, 0x0000 }, - { 0x0700, 0xa108, 0x0000 }, - { 0x8700, 0xa10b, 0x2000 }, - { 0x0700, 0xa10a, 0x0000 }, - { 0x0700, 0xa10c, 0x0000 }, - { 0x8700, 0xa12d, 0x6000 }, - { 0x8700, 0xa11d, 0x5000 }, - { 0x8700, 0xa115, 0x4000 }, - { 0x8700, 0xa111, 0x3000 }, - { 0x8700, 0xa10f, 0x2000 }, - { 0x0700, 0xa10e, 0x0000 }, - { 0x0700, 0xa110, 0x0000 }, - { 0x8700, 0xa113, 0x2000 }, - { 0x0700, 0xa112, 0x0000 }, - { 0x0700, 0xa114, 0x0000 }, - { 0x8700, 0xa119, 0x3000 }, - { 0x8700, 0xa117, 0x2000 }, - { 0x0700, 0xa116, 0x0000 }, - { 0x0700, 0xa118, 0x0000 }, - { 0x8700, 0xa11b, 0x2000 }, - { 0x0700, 0xa11a, 0x0000 }, - { 0x0700, 0xa11c, 0x0000 }, - { 0x8700, 0xa125, 0x4000 }, - { 0x8700, 0xa121, 0x3000 }, - { 0x8700, 0xa11f, 0x2000 }, - { 0x0700, 0xa11e, 0x0000 }, - { 0x0700, 0xa120, 0x0000 }, - { 0x8700, 0xa123, 0x2000 }, - { 0x0700, 0xa122, 0x0000 }, - { 0x0700, 0xa124, 0x0000 }, - { 0x8700, 0xa129, 0x3000 }, - { 0x8700, 0xa127, 0x2000 }, - { 0x0700, 0xa126, 0x0000 }, - { 0x0700, 0xa128, 0x0000 }, - { 0x8700, 0xa12b, 0x2000 }, - { 0x0700, 0xa12a, 0x0000 }, - { 0x0700, 0xa12c, 0x0000 }, - { 0x8700, 0xa13d, 0x5000 }, - { 0x8700, 0xa135, 0x4000 }, - { 0x8700, 0xa131, 0x3000 }, - { 0x8700, 0xa12f, 0x2000 }, - { 0x0700, 0xa12e, 0x0000 }, - { 0x0700, 0xa130, 0x0000 }, - { 0x8700, 0xa133, 0x2000 }, - { 0x0700, 0xa132, 0x0000 }, - { 0x0700, 0xa134, 0x0000 }, - { 0x8700, 0xa139, 0x3000 }, - { 0x8700, 0xa137, 0x2000 }, - { 0x0700, 0xa136, 0x0000 }, - { 0x0700, 0xa138, 0x0000 }, - { 0x8700, 0xa13b, 0x2000 }, - { 0x0700, 0xa13a, 0x0000 }, - { 0x0700, 0xa13c, 0x0000 }, - { 0x8700, 0xa145, 0x4000 }, - { 0x8700, 0xa141, 0x3000 }, - { 0x8700, 0xa13f, 0x2000 }, - { 0x0700, 0xa13e, 0x0000 }, - { 0x0700, 0xa140, 0x0000 }, - { 0x8700, 0xa143, 0x2000 }, - { 0x0700, 0xa142, 0x0000 }, - { 0x0700, 0xa144, 0x0000 }, - { 0x8700, 0xa149, 0x3000 }, - { 0x8700, 0xa147, 0x2000 }, - { 0x0700, 0xa146, 0x0000 }, - { 0x0700, 0xa148, 0x0000 }, - { 0x8700, 0xa14b, 0x2000 }, - { 0x0700, 0xa14a, 0x0000 }, - { 0x0700, 0xa14c, 0x0000 }, - { 0x8700, 0xa24d, 0x9000 }, - { 0x8700, 0xa1cd, 0x8000 }, - { 0x8700, 0xa18d, 0x7000 }, - { 0x8700, 0xa16d, 0x6000 }, - { 0x8700, 0xa15d, 0x5000 }, - { 0x8700, 0xa155, 0x4000 }, - { 0x8700, 0xa151, 0x3000 }, - { 0x8700, 0xa14f, 0x2000 }, - { 0x0700, 0xa14e, 0x0000 }, - { 0x0700, 0xa150, 0x0000 }, - { 0x8700, 0xa153, 0x2000 }, - { 0x0700, 0xa152, 0x0000 }, - { 0x0700, 0xa154, 0x0000 }, - { 0x8700, 0xa159, 0x3000 }, - { 0x8700, 0xa157, 0x2000 }, - { 0x0700, 0xa156, 0x0000 }, - { 0x0700, 0xa158, 0x0000 }, - { 0x8700, 0xa15b, 0x2000 }, - { 0x0700, 0xa15a, 0x0000 }, - { 0x0700, 0xa15c, 0x0000 }, - { 0x8700, 0xa165, 0x4000 }, - { 0x8700, 0xa161, 0x3000 }, - { 0x8700, 0xa15f, 0x2000 }, - { 0x0700, 0xa15e, 0x0000 }, - { 0x0700, 0xa160, 0x0000 }, - { 0x8700, 0xa163, 0x2000 }, - { 0x0700, 0xa162, 0x0000 }, - { 0x0700, 0xa164, 0x0000 }, - { 0x8700, 0xa169, 0x3000 }, - { 0x8700, 0xa167, 0x2000 }, - { 0x0700, 0xa166, 0x0000 }, - { 0x0700, 0xa168, 0x0000 }, - { 0x8700, 0xa16b, 0x2000 }, - { 0x0700, 0xa16a, 0x0000 }, - { 0x0700, 0xa16c, 0x0000 }, - { 0x8700, 0xa17d, 0x5000 }, - { 0x8700, 0xa175, 0x4000 }, - { 0x8700, 0xa171, 0x3000 }, - { 0x8700, 0xa16f, 0x2000 }, - { 0x0700, 0xa16e, 0x0000 }, - { 0x0700, 0xa170, 0x0000 }, - { 0x8700, 0xa173, 0x2000 }, - { 0x0700, 0xa172, 0x0000 }, - { 0x0700, 0xa174, 0x0000 }, - { 0x8700, 0xa179, 0x3000 }, - { 0x8700, 0xa177, 0x2000 }, - { 0x0700, 0xa176, 0x0000 }, - { 0x0700, 0xa178, 0x0000 }, - { 0x8700, 0xa17b, 0x2000 }, - { 0x0700, 0xa17a, 0x0000 }, - { 0x0700, 0xa17c, 0x0000 }, - { 0x8700, 0xa185, 0x4000 }, - { 0x8700, 0xa181, 0x3000 }, - { 0x8700, 0xa17f, 0x2000 }, - { 0x0700, 0xa17e, 0x0000 }, - { 0x0700, 0xa180, 0x0000 }, - { 0x8700, 0xa183, 0x2000 }, - { 0x0700, 0xa182, 0x0000 }, - { 0x0700, 0xa184, 0x0000 }, - { 0x8700, 0xa189, 0x3000 }, - { 0x8700, 0xa187, 0x2000 }, - { 0x0700, 0xa186, 0x0000 }, - { 0x0700, 0xa188, 0x0000 }, - { 0x8700, 0xa18b, 0x2000 }, - { 0x0700, 0xa18a, 0x0000 }, - { 0x0700, 0xa18c, 0x0000 }, - { 0x8700, 0xa1ad, 0x6000 }, - { 0x8700, 0xa19d, 0x5000 }, - { 0x8700, 0xa195, 0x4000 }, - { 0x8700, 0xa191, 0x3000 }, - { 0x8700, 0xa18f, 0x2000 }, - { 0x0700, 0xa18e, 0x0000 }, - { 0x0700, 0xa190, 0x0000 }, - { 0x8700, 0xa193, 0x2000 }, - { 0x0700, 0xa192, 0x0000 }, - { 0x0700, 0xa194, 0x0000 }, - { 0x8700, 0xa199, 0x3000 }, - { 0x8700, 0xa197, 0x2000 }, - { 0x0700, 0xa196, 0x0000 }, - { 0x0700, 0xa198, 0x0000 }, - { 0x8700, 0xa19b, 0x2000 }, - { 0x0700, 0xa19a, 0x0000 }, - { 0x0700, 0xa19c, 0x0000 }, - { 0x8700, 0xa1a5, 0x4000 }, - { 0x8700, 0xa1a1, 0x3000 }, - { 0x8700, 0xa19f, 0x2000 }, - { 0x0700, 0xa19e, 0x0000 }, - { 0x0700, 0xa1a0, 0x0000 }, - { 0x8700, 0xa1a3, 0x2000 }, - { 0x0700, 0xa1a2, 0x0000 }, - { 0x0700, 0xa1a4, 0x0000 }, - { 0x8700, 0xa1a9, 0x3000 }, - { 0x8700, 0xa1a7, 0x2000 }, - { 0x0700, 0xa1a6, 0x0000 }, - { 0x0700, 0xa1a8, 0x0000 }, - { 0x8700, 0xa1ab, 0x2000 }, - { 0x0700, 0xa1aa, 0x0000 }, - { 0x0700, 0xa1ac, 0x0000 }, - { 0x8700, 0xa1bd, 0x5000 }, - { 0x8700, 0xa1b5, 0x4000 }, - { 0x8700, 0xa1b1, 0x3000 }, - { 0x8700, 0xa1af, 0x2000 }, - { 0x0700, 0xa1ae, 0x0000 }, - { 0x0700, 0xa1b0, 0x0000 }, - { 0x8700, 0xa1b3, 0x2000 }, - { 0x0700, 0xa1b2, 0x0000 }, - { 0x0700, 0xa1b4, 0x0000 }, - { 0x8700, 0xa1b9, 0x3000 }, - { 0x8700, 0xa1b7, 0x2000 }, - { 0x0700, 0xa1b6, 0x0000 }, - { 0x0700, 0xa1b8, 0x0000 }, - { 0x8700, 0xa1bb, 0x2000 }, - { 0x0700, 0xa1ba, 0x0000 }, - { 0x0700, 0xa1bc, 0x0000 }, - { 0x8700, 0xa1c5, 0x4000 }, - { 0x8700, 0xa1c1, 0x3000 }, - { 0x8700, 0xa1bf, 0x2000 }, - { 0x0700, 0xa1be, 0x0000 }, - { 0x0700, 0xa1c0, 0x0000 }, - { 0x8700, 0xa1c3, 0x2000 }, - { 0x0700, 0xa1c2, 0x0000 }, - { 0x0700, 0xa1c4, 0x0000 }, - { 0x8700, 0xa1c9, 0x3000 }, - { 0x8700, 0xa1c7, 0x2000 }, - { 0x0700, 0xa1c6, 0x0000 }, - { 0x0700, 0xa1c8, 0x0000 }, - { 0x8700, 0xa1cb, 0x2000 }, - { 0x0700, 0xa1ca, 0x0000 }, - { 0x0700, 0xa1cc, 0x0000 }, - { 0x8700, 0xa20d, 0x7000 }, - { 0x8700, 0xa1ed, 0x6000 }, - { 0x8700, 0xa1dd, 0x5000 }, - { 0x8700, 0xa1d5, 0x4000 }, - { 0x8700, 0xa1d1, 0x3000 }, - { 0x8700, 0xa1cf, 0x2000 }, - { 0x0700, 0xa1ce, 0x0000 }, - { 0x0700, 0xa1d0, 0x0000 }, - { 0x8700, 0xa1d3, 0x2000 }, - { 0x0700, 0xa1d2, 0x0000 }, - { 0x0700, 0xa1d4, 0x0000 }, - { 0x8700, 0xa1d9, 0x3000 }, - { 0x8700, 0xa1d7, 0x2000 }, - { 0x0700, 0xa1d6, 0x0000 }, - { 0x0700, 0xa1d8, 0x0000 }, - { 0x8700, 0xa1db, 0x2000 }, - { 0x0700, 0xa1da, 0x0000 }, - { 0x0700, 0xa1dc, 0x0000 }, - { 0x8700, 0xa1e5, 0x4000 }, - { 0x8700, 0xa1e1, 0x3000 }, - { 0x8700, 0xa1df, 0x2000 }, - { 0x0700, 0xa1de, 0x0000 }, - { 0x0700, 0xa1e0, 0x0000 }, - { 0x8700, 0xa1e3, 0x2000 }, - { 0x0700, 0xa1e2, 0x0000 }, - { 0x0700, 0xa1e4, 0x0000 }, - { 0x8700, 0xa1e9, 0x3000 }, - { 0x8700, 0xa1e7, 0x2000 }, - { 0x0700, 0xa1e6, 0x0000 }, - { 0x0700, 0xa1e8, 0x0000 }, - { 0x8700, 0xa1eb, 0x2000 }, - { 0x0700, 0xa1ea, 0x0000 }, - { 0x0700, 0xa1ec, 0x0000 }, - { 0x8700, 0xa1fd, 0x5000 }, - { 0x8700, 0xa1f5, 0x4000 }, - { 0x8700, 0xa1f1, 0x3000 }, - { 0x8700, 0xa1ef, 0x2000 }, - { 0x0700, 0xa1ee, 0x0000 }, - { 0x0700, 0xa1f0, 0x0000 }, - { 0x8700, 0xa1f3, 0x2000 }, - { 0x0700, 0xa1f2, 0x0000 }, - { 0x0700, 0xa1f4, 0x0000 }, - { 0x8700, 0xa1f9, 0x3000 }, - { 0x8700, 0xa1f7, 0x2000 }, - { 0x0700, 0xa1f6, 0x0000 }, - { 0x0700, 0xa1f8, 0x0000 }, - { 0x8700, 0xa1fb, 0x2000 }, - { 0x0700, 0xa1fa, 0x0000 }, - { 0x0700, 0xa1fc, 0x0000 }, - { 0x8700, 0xa205, 0x4000 }, - { 0x8700, 0xa201, 0x3000 }, - { 0x8700, 0xa1ff, 0x2000 }, - { 0x0700, 0xa1fe, 0x0000 }, - { 0x0700, 0xa200, 0x0000 }, - { 0x8700, 0xa203, 0x2000 }, - { 0x0700, 0xa202, 0x0000 }, - { 0x0700, 0xa204, 0x0000 }, - { 0x8700, 0xa209, 0x3000 }, - { 0x8700, 0xa207, 0x2000 }, - { 0x0700, 0xa206, 0x0000 }, - { 0x0700, 0xa208, 0x0000 }, - { 0x8700, 0xa20b, 0x2000 }, - { 0x0700, 0xa20a, 0x0000 }, - { 0x0700, 0xa20c, 0x0000 }, - { 0x8700, 0xa22d, 0x6000 }, - { 0x8700, 0xa21d, 0x5000 }, - { 0x8700, 0xa215, 0x4000 }, - { 0x8700, 0xa211, 0x3000 }, - { 0x8700, 0xa20f, 0x2000 }, - { 0x0700, 0xa20e, 0x0000 }, - { 0x0700, 0xa210, 0x0000 }, - { 0x8700, 0xa213, 0x2000 }, - { 0x0700, 0xa212, 0x0000 }, - { 0x0700, 0xa214, 0x0000 }, - { 0x8700, 0xa219, 0x3000 }, - { 0x8700, 0xa217, 0x2000 }, - { 0x0700, 0xa216, 0x0000 }, - { 0x0700, 0xa218, 0x0000 }, - { 0x8700, 0xa21b, 0x2000 }, - { 0x0700, 0xa21a, 0x0000 }, - { 0x0700, 0xa21c, 0x0000 }, - { 0x8700, 0xa225, 0x4000 }, - { 0x8700, 0xa221, 0x3000 }, - { 0x8700, 0xa21f, 0x2000 }, - { 0x0700, 0xa21e, 0x0000 }, - { 0x0700, 0xa220, 0x0000 }, - { 0x8700, 0xa223, 0x2000 }, - { 0x0700, 0xa222, 0x0000 }, - { 0x0700, 0xa224, 0x0000 }, - { 0x8700, 0xa229, 0x3000 }, - { 0x8700, 0xa227, 0x2000 }, - { 0x0700, 0xa226, 0x0000 }, - { 0x0700, 0xa228, 0x0000 }, - { 0x8700, 0xa22b, 0x2000 }, - { 0x0700, 0xa22a, 0x0000 }, - { 0x0700, 0xa22c, 0x0000 }, - { 0x8700, 0xa23d, 0x5000 }, - { 0x8700, 0xa235, 0x4000 }, - { 0x8700, 0xa231, 0x3000 }, - { 0x8700, 0xa22f, 0x2000 }, - { 0x0700, 0xa22e, 0x0000 }, - { 0x0700, 0xa230, 0x0000 }, - { 0x8700, 0xa233, 0x2000 }, - { 0x0700, 0xa232, 0x0000 }, - { 0x0700, 0xa234, 0x0000 }, - { 0x8700, 0xa239, 0x3000 }, - { 0x8700, 0xa237, 0x2000 }, - { 0x0700, 0xa236, 0x0000 }, - { 0x0700, 0xa238, 0x0000 }, - { 0x8700, 0xa23b, 0x2000 }, - { 0x0700, 0xa23a, 0x0000 }, - { 0x0700, 0xa23c, 0x0000 }, - { 0x8700, 0xa245, 0x4000 }, - { 0x8700, 0xa241, 0x3000 }, - { 0x8700, 0xa23f, 0x2000 }, - { 0x0700, 0xa23e, 0x0000 }, - { 0x0700, 0xa240, 0x0000 }, - { 0x8700, 0xa243, 0x2000 }, - { 0x0700, 0xa242, 0x0000 }, - { 0x0700, 0xa244, 0x0000 }, - { 0x8700, 0xa249, 0x3000 }, - { 0x8700, 0xa247, 0x2000 }, - { 0x0700, 0xa246, 0x0000 }, - { 0x0700, 0xa248, 0x0000 }, - { 0x8700, 0xa24b, 0x2000 }, - { 0x0700, 0xa24a, 0x0000 }, - { 0x0700, 0xa24c, 0x0000 }, - { 0x8700, 0xa2cd, 0x8000 }, - { 0x8700, 0xa28d, 0x7000 }, - { 0x8700, 0xa26d, 0x6000 }, - { 0x8700, 0xa25d, 0x5000 }, - { 0x8700, 0xa255, 0x4000 }, - { 0x8700, 0xa251, 0x3000 }, - { 0x8700, 0xa24f, 0x2000 }, - { 0x0700, 0xa24e, 0x0000 }, - { 0x0700, 0xa250, 0x0000 }, - { 0x8700, 0xa253, 0x2000 }, - { 0x0700, 0xa252, 0x0000 }, - { 0x0700, 0xa254, 0x0000 }, - { 0x8700, 0xa259, 0x3000 }, - { 0x8700, 0xa257, 0x2000 }, - { 0x0700, 0xa256, 0x0000 }, - { 0x0700, 0xa258, 0x0000 }, - { 0x8700, 0xa25b, 0x2000 }, - { 0x0700, 0xa25a, 0x0000 }, - { 0x0700, 0xa25c, 0x0000 }, - { 0x8700, 0xa265, 0x4000 }, - { 0x8700, 0xa261, 0x3000 }, - { 0x8700, 0xa25f, 0x2000 }, - { 0x0700, 0xa25e, 0x0000 }, - { 0x0700, 0xa260, 0x0000 }, - { 0x8700, 0xa263, 0x2000 }, - { 0x0700, 0xa262, 0x0000 }, - { 0x0700, 0xa264, 0x0000 }, - { 0x8700, 0xa269, 0x3000 }, - { 0x8700, 0xa267, 0x2000 }, - { 0x0700, 0xa266, 0x0000 }, - { 0x0700, 0xa268, 0x0000 }, - { 0x8700, 0xa26b, 0x2000 }, - { 0x0700, 0xa26a, 0x0000 }, - { 0x0700, 0xa26c, 0x0000 }, - { 0x8700, 0xa27d, 0x5000 }, - { 0x8700, 0xa275, 0x4000 }, - { 0x8700, 0xa271, 0x3000 }, - { 0x8700, 0xa26f, 0x2000 }, - { 0x0700, 0xa26e, 0x0000 }, - { 0x0700, 0xa270, 0x0000 }, - { 0x8700, 0xa273, 0x2000 }, - { 0x0700, 0xa272, 0x0000 }, - { 0x0700, 0xa274, 0x0000 }, - { 0x8700, 0xa279, 0x3000 }, - { 0x8700, 0xa277, 0x2000 }, - { 0x0700, 0xa276, 0x0000 }, - { 0x0700, 0xa278, 0x0000 }, - { 0x8700, 0xa27b, 0x2000 }, - { 0x0700, 0xa27a, 0x0000 }, - { 0x0700, 0xa27c, 0x0000 }, - { 0x8700, 0xa285, 0x4000 }, - { 0x8700, 0xa281, 0x3000 }, - { 0x8700, 0xa27f, 0x2000 }, - { 0x0700, 0xa27e, 0x0000 }, - { 0x0700, 0xa280, 0x0000 }, - { 0x8700, 0xa283, 0x2000 }, - { 0x0700, 0xa282, 0x0000 }, - { 0x0700, 0xa284, 0x0000 }, - { 0x8700, 0xa289, 0x3000 }, - { 0x8700, 0xa287, 0x2000 }, - { 0x0700, 0xa286, 0x0000 }, - { 0x0700, 0xa288, 0x0000 }, - { 0x8700, 0xa28b, 0x2000 }, - { 0x0700, 0xa28a, 0x0000 }, - { 0x0700, 0xa28c, 0x0000 }, - { 0x8700, 0xa2ad, 0x6000 }, - { 0x8700, 0xa29d, 0x5000 }, - { 0x8700, 0xa295, 0x4000 }, - { 0x8700, 0xa291, 0x3000 }, - { 0x8700, 0xa28f, 0x2000 }, - { 0x0700, 0xa28e, 0x0000 }, - { 0x0700, 0xa290, 0x0000 }, - { 0x8700, 0xa293, 0x2000 }, - { 0x0700, 0xa292, 0x0000 }, - { 0x0700, 0xa294, 0x0000 }, - { 0x8700, 0xa299, 0x3000 }, - { 0x8700, 0xa297, 0x2000 }, - { 0x0700, 0xa296, 0x0000 }, - { 0x0700, 0xa298, 0x0000 }, - { 0x8700, 0xa29b, 0x2000 }, - { 0x0700, 0xa29a, 0x0000 }, - { 0x0700, 0xa29c, 0x0000 }, - { 0x8700, 0xa2a5, 0x4000 }, - { 0x8700, 0xa2a1, 0x3000 }, - { 0x8700, 0xa29f, 0x2000 }, - { 0x0700, 0xa29e, 0x0000 }, - { 0x0700, 0xa2a0, 0x0000 }, - { 0x8700, 0xa2a3, 0x2000 }, - { 0x0700, 0xa2a2, 0x0000 }, - { 0x0700, 0xa2a4, 0x0000 }, - { 0x8700, 0xa2a9, 0x3000 }, - { 0x8700, 0xa2a7, 0x2000 }, - { 0x0700, 0xa2a6, 0x0000 }, - { 0x0700, 0xa2a8, 0x0000 }, - { 0x8700, 0xa2ab, 0x2000 }, - { 0x0700, 0xa2aa, 0x0000 }, - { 0x0700, 0xa2ac, 0x0000 }, - { 0x8700, 0xa2bd, 0x5000 }, - { 0x8700, 0xa2b5, 0x4000 }, - { 0x8700, 0xa2b1, 0x3000 }, - { 0x8700, 0xa2af, 0x2000 }, - { 0x0700, 0xa2ae, 0x0000 }, - { 0x0700, 0xa2b0, 0x0000 }, - { 0x8700, 0xa2b3, 0x2000 }, - { 0x0700, 0xa2b2, 0x0000 }, - { 0x0700, 0xa2b4, 0x0000 }, - { 0x8700, 0xa2b9, 0x3000 }, - { 0x8700, 0xa2b7, 0x2000 }, - { 0x0700, 0xa2b6, 0x0000 }, - { 0x0700, 0xa2b8, 0x0000 }, - { 0x8700, 0xa2bb, 0x2000 }, - { 0x0700, 0xa2ba, 0x0000 }, - { 0x0700, 0xa2bc, 0x0000 }, - { 0x8700, 0xa2c5, 0x4000 }, - { 0x8700, 0xa2c1, 0x3000 }, - { 0x8700, 0xa2bf, 0x2000 }, - { 0x0700, 0xa2be, 0x0000 }, - { 0x0700, 0xa2c0, 0x0000 }, - { 0x8700, 0xa2c3, 0x2000 }, - { 0x0700, 0xa2c2, 0x0000 }, - { 0x0700, 0xa2c4, 0x0000 }, - { 0x8700, 0xa2c9, 0x3000 }, - { 0x8700, 0xa2c7, 0x2000 }, - { 0x0700, 0xa2c6, 0x0000 }, - { 0x0700, 0xa2c8, 0x0000 }, - { 0x8700, 0xa2cb, 0x2000 }, - { 0x0700, 0xa2ca, 0x0000 }, - { 0x0700, 0xa2cc, 0x0000 }, - { 0x8700, 0xa30d, 0x7000 }, - { 0x8700, 0xa2ed, 0x6000 }, - { 0x8700, 0xa2dd, 0x5000 }, - { 0x8700, 0xa2d5, 0x4000 }, - { 0x8700, 0xa2d1, 0x3000 }, - { 0x8700, 0xa2cf, 0x2000 }, - { 0x0700, 0xa2ce, 0x0000 }, - { 0x0700, 0xa2d0, 0x0000 }, - { 0x8700, 0xa2d3, 0x2000 }, - { 0x0700, 0xa2d2, 0x0000 }, - { 0x0700, 0xa2d4, 0x0000 }, - { 0x8700, 0xa2d9, 0x3000 }, - { 0x8700, 0xa2d7, 0x2000 }, - { 0x0700, 0xa2d6, 0x0000 }, - { 0x0700, 0xa2d8, 0x0000 }, - { 0x8700, 0xa2db, 0x2000 }, - { 0x0700, 0xa2da, 0x0000 }, - { 0x0700, 0xa2dc, 0x0000 }, - { 0x8700, 0xa2e5, 0x4000 }, - { 0x8700, 0xa2e1, 0x3000 }, - { 0x8700, 0xa2df, 0x2000 }, - { 0x0700, 0xa2de, 0x0000 }, - { 0x0700, 0xa2e0, 0x0000 }, - { 0x8700, 0xa2e3, 0x2000 }, - { 0x0700, 0xa2e2, 0x0000 }, - { 0x0700, 0xa2e4, 0x0000 }, - { 0x8700, 0xa2e9, 0x3000 }, - { 0x8700, 0xa2e7, 0x2000 }, - { 0x0700, 0xa2e6, 0x0000 }, - { 0x0700, 0xa2e8, 0x0000 }, - { 0x8700, 0xa2eb, 0x2000 }, - { 0x0700, 0xa2ea, 0x0000 }, - { 0x0700, 0xa2ec, 0x0000 }, - { 0x8700, 0xa2fd, 0x5000 }, - { 0x8700, 0xa2f5, 0x4000 }, - { 0x8700, 0xa2f1, 0x3000 }, - { 0x8700, 0xa2ef, 0x2000 }, - { 0x0700, 0xa2ee, 0x0000 }, - { 0x0700, 0xa2f0, 0x0000 }, - { 0x8700, 0xa2f3, 0x2000 }, - { 0x0700, 0xa2f2, 0x0000 }, - { 0x0700, 0xa2f4, 0x0000 }, - { 0x8700, 0xa2f9, 0x3000 }, - { 0x8700, 0xa2f7, 0x2000 }, - { 0x0700, 0xa2f6, 0x0000 }, - { 0x0700, 0xa2f8, 0x0000 }, - { 0x8700, 0xa2fb, 0x2000 }, - { 0x0700, 0xa2fa, 0x0000 }, - { 0x0700, 0xa2fc, 0x0000 }, - { 0x8700, 0xa305, 0x4000 }, - { 0x8700, 0xa301, 0x3000 }, - { 0x8700, 0xa2ff, 0x2000 }, - { 0x0700, 0xa2fe, 0x0000 }, - { 0x0700, 0xa300, 0x0000 }, - { 0x8700, 0xa303, 0x2000 }, - { 0x0700, 0xa302, 0x0000 }, - { 0x0700, 0xa304, 0x0000 }, - { 0x8700, 0xa309, 0x3000 }, - { 0x8700, 0xa307, 0x2000 }, - { 0x0700, 0xa306, 0x0000 }, - { 0x0700, 0xa308, 0x0000 }, - { 0x8700, 0xa30b, 0x2000 }, - { 0x0700, 0xa30a, 0x0000 }, - { 0x0700, 0xa30c, 0x0000 }, - { 0x8700, 0xa32d, 0x6000 }, - { 0x8700, 0xa31d, 0x5000 }, - { 0x8700, 0xa315, 0x4000 }, - { 0x8700, 0xa311, 0x3000 }, - { 0x8700, 0xa30f, 0x2000 }, - { 0x0700, 0xa30e, 0x0000 }, - { 0x0700, 0xa310, 0x0000 }, - { 0x8700, 0xa313, 0x2000 }, - { 0x0700, 0xa312, 0x0000 }, - { 0x0700, 0xa314, 0x0000 }, - { 0x8700, 0xa319, 0x3000 }, - { 0x8700, 0xa317, 0x2000 }, - { 0x0700, 0xa316, 0x0000 }, - { 0x0700, 0xa318, 0x0000 }, - { 0x8700, 0xa31b, 0x2000 }, - { 0x0700, 0xa31a, 0x0000 }, - { 0x0700, 0xa31c, 0x0000 }, - { 0x8700, 0xa325, 0x4000 }, - { 0x8700, 0xa321, 0x3000 }, - { 0x8700, 0xa31f, 0x2000 }, - { 0x0700, 0xa31e, 0x0000 }, - { 0x0700, 0xa320, 0x0000 }, - { 0x8700, 0xa323, 0x2000 }, - { 0x0700, 0xa322, 0x0000 }, - { 0x0700, 0xa324, 0x0000 }, - { 0x8700, 0xa329, 0x3000 }, - { 0x8700, 0xa327, 0x2000 }, - { 0x0700, 0xa326, 0x0000 }, - { 0x0700, 0xa328, 0x0000 }, - { 0x8700, 0xa32b, 0x2000 }, - { 0x0700, 0xa32a, 0x0000 }, - { 0x0700, 0xa32c, 0x0000 }, - { 0x8700, 0xa33d, 0x5000 }, - { 0x8700, 0xa335, 0x4000 }, - { 0x8700, 0xa331, 0x3000 }, - { 0x8700, 0xa32f, 0x2000 }, - { 0x0700, 0xa32e, 0x0000 }, - { 0x0700, 0xa330, 0x0000 }, - { 0x8700, 0xa333, 0x2000 }, - { 0x0700, 0xa332, 0x0000 }, - { 0x0700, 0xa334, 0x0000 }, - { 0x8700, 0xa339, 0x3000 }, - { 0x8700, 0xa337, 0x2000 }, - { 0x0700, 0xa336, 0x0000 }, - { 0x0700, 0xa338, 0x0000 }, - { 0x8700, 0xa33b, 0x2000 }, - { 0x0700, 0xa33a, 0x0000 }, - { 0x0700, 0xa33c, 0x0000 }, - { 0x8700, 0xa345, 0x4000 }, - { 0x8700, 0xa341, 0x3000 }, - { 0x8700, 0xa33f, 0x2000 }, - { 0x0700, 0xa33e, 0x0000 }, - { 0x0700, 0xa340, 0x0000 }, - { 0x8700, 0xa343, 0x2000 }, - { 0x0700, 0xa342, 0x0000 }, - { 0x0700, 0xa344, 0x0000 }, - { 0x8700, 0xa349, 0x3000 }, - { 0x8700, 0xa347, 0x2000 }, - { 0x0700, 0xa346, 0x0000 }, - { 0x0700, 0xa348, 0x0000 }, - { 0x8700, 0xa34b, 0x2000 }, - { 0x0700, 0xa34a, 0x0000 }, - { 0x0700, 0xa34c, 0x0000 }, - { 0x8700, 0xfc4d, 0xb000 }, - { 0x8700, 0xf97f, 0xa000 }, - { 0x8700, 0xa44d, 0x9000 }, - { 0x8700, 0xa3cd, 0x8000 }, - { 0x8700, 0xa38d, 0x7000 }, - { 0x8700, 0xa36d, 0x6000 }, - { 0x8700, 0xa35d, 0x5000 }, - { 0x8700, 0xa355, 0x4000 }, - { 0x8700, 0xa351, 0x3000 }, - { 0x8700, 0xa34f, 0x2000 }, - { 0x0700, 0xa34e, 0x0000 }, - { 0x0700, 0xa350, 0x0000 }, - { 0x8700, 0xa353, 0x2000 }, - { 0x0700, 0xa352, 0x0000 }, - { 0x0700, 0xa354, 0x0000 }, - { 0x8700, 0xa359, 0x3000 }, - { 0x8700, 0xa357, 0x2000 }, - { 0x0700, 0xa356, 0x0000 }, - { 0x0700, 0xa358, 0x0000 }, - { 0x8700, 0xa35b, 0x2000 }, - { 0x0700, 0xa35a, 0x0000 }, - { 0x0700, 0xa35c, 0x0000 }, - { 0x8700, 0xa365, 0x4000 }, - { 0x8700, 0xa361, 0x3000 }, - { 0x8700, 0xa35f, 0x2000 }, - { 0x0700, 0xa35e, 0x0000 }, - { 0x0700, 0xa360, 0x0000 }, - { 0x8700, 0xa363, 0x2000 }, - { 0x0700, 0xa362, 0x0000 }, - { 0x0700, 0xa364, 0x0000 }, - { 0x8700, 0xa369, 0x3000 }, - { 0x8700, 0xa367, 0x2000 }, - { 0x0700, 0xa366, 0x0000 }, - { 0x0700, 0xa368, 0x0000 }, - { 0x8700, 0xa36b, 0x2000 }, - { 0x0700, 0xa36a, 0x0000 }, - { 0x0700, 0xa36c, 0x0000 }, - { 0x8700, 0xa37d, 0x5000 }, - { 0x8700, 0xa375, 0x4000 }, - { 0x8700, 0xa371, 0x3000 }, - { 0x8700, 0xa36f, 0x2000 }, - { 0x0700, 0xa36e, 0x0000 }, - { 0x0700, 0xa370, 0x0000 }, - { 0x8700, 0xa373, 0x2000 }, - { 0x0700, 0xa372, 0x0000 }, - { 0x0700, 0xa374, 0x0000 }, - { 0x8700, 0xa379, 0x3000 }, - { 0x8700, 0xa377, 0x2000 }, - { 0x0700, 0xa376, 0x0000 }, - { 0x0700, 0xa378, 0x0000 }, - { 0x8700, 0xa37b, 0x2000 }, - { 0x0700, 0xa37a, 0x0000 }, - { 0x0700, 0xa37c, 0x0000 }, - { 0x8700, 0xa385, 0x4000 }, - { 0x8700, 0xa381, 0x3000 }, - { 0x8700, 0xa37f, 0x2000 }, - { 0x0700, 0xa37e, 0x0000 }, - { 0x0700, 0xa380, 0x0000 }, - { 0x8700, 0xa383, 0x2000 }, - { 0x0700, 0xa382, 0x0000 }, - { 0x0700, 0xa384, 0x0000 }, - { 0x8700, 0xa389, 0x3000 }, - { 0x8700, 0xa387, 0x2000 }, - { 0x0700, 0xa386, 0x0000 }, - { 0x0700, 0xa388, 0x0000 }, - { 0x8700, 0xa38b, 0x2000 }, - { 0x0700, 0xa38a, 0x0000 }, - { 0x0700, 0xa38c, 0x0000 }, - { 0x8700, 0xa3ad, 0x6000 }, - { 0x8700, 0xa39d, 0x5000 }, - { 0x8700, 0xa395, 0x4000 }, - { 0x8700, 0xa391, 0x3000 }, - { 0x8700, 0xa38f, 0x2000 }, - { 0x0700, 0xa38e, 0x0000 }, - { 0x0700, 0xa390, 0x0000 }, - { 0x8700, 0xa393, 0x2000 }, - { 0x0700, 0xa392, 0x0000 }, - { 0x0700, 0xa394, 0x0000 }, - { 0x8700, 0xa399, 0x3000 }, - { 0x8700, 0xa397, 0x2000 }, - { 0x0700, 0xa396, 0x0000 }, - { 0x0700, 0xa398, 0x0000 }, - { 0x8700, 0xa39b, 0x2000 }, - { 0x0700, 0xa39a, 0x0000 }, - { 0x0700, 0xa39c, 0x0000 }, - { 0x8700, 0xa3a5, 0x4000 }, - { 0x8700, 0xa3a1, 0x3000 }, - { 0x8700, 0xa39f, 0x2000 }, - { 0x0700, 0xa39e, 0x0000 }, - { 0x0700, 0xa3a0, 0x0000 }, - { 0x8700, 0xa3a3, 0x2000 }, - { 0x0700, 0xa3a2, 0x0000 }, - { 0x0700, 0xa3a4, 0x0000 }, - { 0x8700, 0xa3a9, 0x3000 }, - { 0x8700, 0xa3a7, 0x2000 }, - { 0x0700, 0xa3a6, 0x0000 }, - { 0x0700, 0xa3a8, 0x0000 }, - { 0x8700, 0xa3ab, 0x2000 }, - { 0x0700, 0xa3aa, 0x0000 }, - { 0x0700, 0xa3ac, 0x0000 }, - { 0x8700, 0xa3bd, 0x5000 }, - { 0x8700, 0xa3b5, 0x4000 }, - { 0x8700, 0xa3b1, 0x3000 }, - { 0x8700, 0xa3af, 0x2000 }, - { 0x0700, 0xa3ae, 0x0000 }, - { 0x0700, 0xa3b0, 0x0000 }, - { 0x8700, 0xa3b3, 0x2000 }, - { 0x0700, 0xa3b2, 0x0000 }, - { 0x0700, 0xa3b4, 0x0000 }, - { 0x8700, 0xa3b9, 0x3000 }, - { 0x8700, 0xa3b7, 0x2000 }, - { 0x0700, 0xa3b6, 0x0000 }, - { 0x0700, 0xa3b8, 0x0000 }, - { 0x8700, 0xa3bb, 0x2000 }, - { 0x0700, 0xa3ba, 0x0000 }, - { 0x0700, 0xa3bc, 0x0000 }, - { 0x8700, 0xa3c5, 0x4000 }, - { 0x8700, 0xa3c1, 0x3000 }, - { 0x8700, 0xa3bf, 0x2000 }, - { 0x0700, 0xa3be, 0x0000 }, - { 0x0700, 0xa3c0, 0x0000 }, - { 0x8700, 0xa3c3, 0x2000 }, - { 0x0700, 0xa3c2, 0x0000 }, - { 0x0700, 0xa3c4, 0x0000 }, - { 0x8700, 0xa3c9, 0x3000 }, - { 0x8700, 0xa3c7, 0x2000 }, - { 0x0700, 0xa3c6, 0x0000 }, - { 0x0700, 0xa3c8, 0x0000 }, - { 0x8700, 0xa3cb, 0x2000 }, - { 0x0700, 0xa3ca, 0x0000 }, - { 0x0700, 0xa3cc, 0x0000 }, - { 0x8700, 0xa40d, 0x7000 }, - { 0x8700, 0xa3ed, 0x6000 }, - { 0x8700, 0xa3dd, 0x5000 }, - { 0x8700, 0xa3d5, 0x4000 }, - { 0x8700, 0xa3d1, 0x3000 }, - { 0x8700, 0xa3cf, 0x2000 }, - { 0x0700, 0xa3ce, 0x0000 }, - { 0x0700, 0xa3d0, 0x0000 }, - { 0x8700, 0xa3d3, 0x2000 }, - { 0x0700, 0xa3d2, 0x0000 }, - { 0x0700, 0xa3d4, 0x0000 }, - { 0x8700, 0xa3d9, 0x3000 }, - { 0x8700, 0xa3d7, 0x2000 }, - { 0x0700, 0xa3d6, 0x0000 }, - { 0x0700, 0xa3d8, 0x0000 }, - { 0x8700, 0xa3db, 0x2000 }, - { 0x0700, 0xa3da, 0x0000 }, - { 0x0700, 0xa3dc, 0x0000 }, - { 0x8700, 0xa3e5, 0x4000 }, - { 0x8700, 0xa3e1, 0x3000 }, - { 0x8700, 0xa3df, 0x2000 }, - { 0x0700, 0xa3de, 0x0000 }, - { 0x0700, 0xa3e0, 0x0000 }, - { 0x8700, 0xa3e3, 0x2000 }, - { 0x0700, 0xa3e2, 0x0000 }, - { 0x0700, 0xa3e4, 0x0000 }, - { 0x8700, 0xa3e9, 0x3000 }, - { 0x8700, 0xa3e7, 0x2000 }, - { 0x0700, 0xa3e6, 0x0000 }, - { 0x0700, 0xa3e8, 0x0000 }, - { 0x8700, 0xa3eb, 0x2000 }, - { 0x0700, 0xa3ea, 0x0000 }, - { 0x0700, 0xa3ec, 0x0000 }, - { 0x8700, 0xa3fd, 0x5000 }, - { 0x8700, 0xa3f5, 0x4000 }, - { 0x8700, 0xa3f1, 0x3000 }, - { 0x8700, 0xa3ef, 0x2000 }, - { 0x0700, 0xa3ee, 0x0000 }, - { 0x0700, 0xa3f0, 0x0000 }, - { 0x8700, 0xa3f3, 0x2000 }, - { 0x0700, 0xa3f2, 0x0000 }, - { 0x0700, 0xa3f4, 0x0000 }, - { 0x8700, 0xa3f9, 0x3000 }, - { 0x8700, 0xa3f7, 0x2000 }, - { 0x0700, 0xa3f6, 0x0000 }, - { 0x0700, 0xa3f8, 0x0000 }, - { 0x8700, 0xa3fb, 0x2000 }, - { 0x0700, 0xa3fa, 0x0000 }, - { 0x0700, 0xa3fc, 0x0000 }, - { 0x8700, 0xa405, 0x4000 }, - { 0x8700, 0xa401, 0x3000 }, - { 0x8700, 0xa3ff, 0x2000 }, - { 0x0700, 0xa3fe, 0x0000 }, - { 0x0700, 0xa400, 0x0000 }, - { 0x8700, 0xa403, 0x2000 }, - { 0x0700, 0xa402, 0x0000 }, - { 0x0700, 0xa404, 0x0000 }, - { 0x8700, 0xa409, 0x3000 }, - { 0x8700, 0xa407, 0x2000 }, - { 0x0700, 0xa406, 0x0000 }, - { 0x0700, 0xa408, 0x0000 }, - { 0x8700, 0xa40b, 0x2000 }, - { 0x0700, 0xa40a, 0x0000 }, - { 0x0700, 0xa40c, 0x0000 }, - { 0x8700, 0xa42d, 0x6000 }, - { 0x8700, 0xa41d, 0x5000 }, - { 0x8700, 0xa415, 0x4000 }, - { 0x8700, 0xa411, 0x3000 }, - { 0x8700, 0xa40f, 0x2000 }, - { 0x0700, 0xa40e, 0x0000 }, - { 0x0700, 0xa410, 0x0000 }, - { 0x8700, 0xa413, 0x2000 }, - { 0x0700, 0xa412, 0x0000 }, - { 0x0700, 0xa414, 0x0000 }, - { 0x8700, 0xa419, 0x3000 }, - { 0x8700, 0xa417, 0x2000 }, - { 0x0700, 0xa416, 0x0000 }, - { 0x0700, 0xa418, 0x0000 }, - { 0x8700, 0xa41b, 0x2000 }, - { 0x0700, 0xa41a, 0x0000 }, - { 0x0700, 0xa41c, 0x0000 }, - { 0x8700, 0xa425, 0x4000 }, - { 0x8700, 0xa421, 0x3000 }, - { 0x8700, 0xa41f, 0x2000 }, - { 0x0700, 0xa41e, 0x0000 }, - { 0x0700, 0xa420, 0x0000 }, - { 0x8700, 0xa423, 0x2000 }, - { 0x0700, 0xa422, 0x0000 }, - { 0x0700, 0xa424, 0x0000 }, - { 0x8700, 0xa429, 0x3000 }, - { 0x8700, 0xa427, 0x2000 }, - { 0x0700, 0xa426, 0x0000 }, - { 0x0700, 0xa428, 0x0000 }, - { 0x8700, 0xa42b, 0x2000 }, - { 0x0700, 0xa42a, 0x0000 }, - { 0x0700, 0xa42c, 0x0000 }, - { 0x8700, 0xa43d, 0x5000 }, - { 0x8700, 0xa435, 0x4000 }, - { 0x8700, 0xa431, 0x3000 }, - { 0x8700, 0xa42f, 0x2000 }, - { 0x0700, 0xa42e, 0x0000 }, - { 0x0700, 0xa430, 0x0000 }, - { 0x8700, 0xa433, 0x2000 }, - { 0x0700, 0xa432, 0x0000 }, - { 0x0700, 0xa434, 0x0000 }, - { 0x8700, 0xa439, 0x3000 }, - { 0x8700, 0xa437, 0x2000 }, - { 0x0700, 0xa436, 0x0000 }, - { 0x0700, 0xa438, 0x0000 }, - { 0x8700, 0xa43b, 0x2000 }, - { 0x0700, 0xa43a, 0x0000 }, - { 0x0700, 0xa43c, 0x0000 }, - { 0x8700, 0xa445, 0x4000 }, - { 0x8700, 0xa441, 0x3000 }, - { 0x8700, 0xa43f, 0x2000 }, - { 0x0700, 0xa43e, 0x0000 }, - { 0x0700, 0xa440, 0x0000 }, - { 0x8700, 0xa443, 0x2000 }, - { 0x0700, 0xa442, 0x0000 }, - { 0x0700, 0xa444, 0x0000 }, - { 0x8700, 0xa449, 0x3000 }, - { 0x8700, 0xa447, 0x2000 }, - { 0x0700, 0xa446, 0x0000 }, - { 0x0700, 0xa448, 0x0000 }, - { 0x8700, 0xa44b, 0x2000 }, - { 0x0700, 0xa44a, 0x0000 }, - { 0x0700, 0xa44c, 0x0000 }, - { 0x8300, 0xf8ff, 0x8000 }, - { 0x9a00, 0xa490, 0x7000 }, - { 0x8700, 0xa46d, 0x6000 }, - { 0x8700, 0xa45d, 0x5000 }, - { 0x8700, 0xa455, 0x4000 }, - { 0x8700, 0xa451, 0x3000 }, - { 0x8700, 0xa44f, 0x2000 }, - { 0x0700, 0xa44e, 0x0000 }, - { 0x0700, 0xa450, 0x0000 }, - { 0x8700, 0xa453, 0x2000 }, - { 0x0700, 0xa452, 0x0000 }, - { 0x0700, 0xa454, 0x0000 }, - { 0x8700, 0xa459, 0x3000 }, - { 0x8700, 0xa457, 0x2000 }, - { 0x0700, 0xa456, 0x0000 }, - { 0x0700, 0xa458, 0x0000 }, - { 0x8700, 0xa45b, 0x2000 }, - { 0x0700, 0xa45a, 0x0000 }, - { 0x0700, 0xa45c, 0x0000 }, - { 0x8700, 0xa465, 0x4000 }, - { 0x8700, 0xa461, 0x3000 }, - { 0x8700, 0xa45f, 0x2000 }, - { 0x0700, 0xa45e, 0x0000 }, - { 0x0700, 0xa460, 0x0000 }, - { 0x8700, 0xa463, 0x2000 }, - { 0x0700, 0xa462, 0x0000 }, - { 0x0700, 0xa464, 0x0000 }, - { 0x8700, 0xa469, 0x3000 }, - { 0x8700, 0xa467, 0x2000 }, - { 0x0700, 0xa466, 0x0000 }, - { 0x0700, 0xa468, 0x0000 }, - { 0x8700, 0xa46b, 0x2000 }, - { 0x0700, 0xa46a, 0x0000 }, - { 0x0700, 0xa46c, 0x0000 }, - { 0x8700, 0xa47d, 0x5000 }, - { 0x8700, 0xa475, 0x4000 }, - { 0x8700, 0xa471, 0x3000 }, - { 0x8700, 0xa46f, 0x2000 }, - { 0x0700, 0xa46e, 0x0000 }, - { 0x0700, 0xa470, 0x0000 }, - { 0x8700, 0xa473, 0x2000 }, - { 0x0700, 0xa472, 0x0000 }, - { 0x0700, 0xa474, 0x0000 }, - { 0x8700, 0xa479, 0x3000 }, - { 0x8700, 0xa477, 0x2000 }, - { 0x0700, 0xa476, 0x0000 }, - { 0x0700, 0xa478, 0x0000 }, - { 0x8700, 0xa47b, 0x2000 }, - { 0x0700, 0xa47a, 0x0000 }, - { 0x0700, 0xa47c, 0x0000 }, - { 0x8700, 0xa485, 0x4000 }, - { 0x8700, 0xa481, 0x3000 }, - { 0x8700, 0xa47f, 0x2000 }, - { 0x0700, 0xa47e, 0x0000 }, - { 0x0700, 0xa480, 0x0000 }, - { 0x8700, 0xa483, 0x2000 }, - { 0x0700, 0xa482, 0x0000 }, - { 0x0700, 0xa484, 0x0000 }, - { 0x8700, 0xa489, 0x3000 }, - { 0x8700, 0xa487, 0x2000 }, - { 0x0700, 0xa486, 0x0000 }, - { 0x0700, 0xa488, 0x0000 }, - { 0x8700, 0xa48b, 0x2000 }, - { 0x0700, 0xa48a, 0x0000 }, - { 0x0700, 0xa48c, 0x0000 }, - { 0x9a00, 0xa4b0, 0x6000 }, - { 0x9a00, 0xa4a0, 0x5000 }, - { 0x9a00, 0xa498, 0x4000 }, - { 0x9a00, 0xa494, 0x3000 }, - { 0x9a00, 0xa492, 0x2000 }, - { 0x1a00, 0xa491, 0x0000 }, - { 0x1a00, 0xa493, 0x0000 }, - { 0x9a00, 0xa496, 0x2000 }, - { 0x1a00, 0xa495, 0x0000 }, - { 0x1a00, 0xa497, 0x0000 }, - { 0x9a00, 0xa49c, 0x3000 }, - { 0x9a00, 0xa49a, 0x2000 }, - { 0x1a00, 0xa499, 0x0000 }, - { 0x1a00, 0xa49b, 0x0000 }, - { 0x9a00, 0xa49e, 0x2000 }, - { 0x1a00, 0xa49d, 0x0000 }, - { 0x1a00, 0xa49f, 0x0000 }, - { 0x9a00, 0xa4a8, 0x4000 }, - { 0x9a00, 0xa4a4, 0x3000 }, - { 0x9a00, 0xa4a2, 0x2000 }, - { 0x1a00, 0xa4a1, 0x0000 }, - { 0x1a00, 0xa4a3, 0x0000 }, - { 0x9a00, 0xa4a6, 0x2000 }, - { 0x1a00, 0xa4a5, 0x0000 }, - { 0x1a00, 0xa4a7, 0x0000 }, - { 0x9a00, 0xa4ac, 0x3000 }, - { 0x9a00, 0xa4aa, 0x2000 }, - { 0x1a00, 0xa4a9, 0x0000 }, - { 0x1a00, 0xa4ab, 0x0000 }, - { 0x9a00, 0xa4ae, 0x2000 }, - { 0x1a00, 0xa4ad, 0x0000 }, - { 0x1a00, 0xa4af, 0x0000 }, - { 0x9a00, 0xa4c0, 0x5000 }, - { 0x9a00, 0xa4b8, 0x4000 }, - { 0x9a00, 0xa4b4, 0x3000 }, - { 0x9a00, 0xa4b2, 0x2000 }, - { 0x1a00, 0xa4b1, 0x0000 }, - { 0x1a00, 0xa4b3, 0x0000 }, - { 0x9a00, 0xa4b6, 0x2000 }, - { 0x1a00, 0xa4b5, 0x0000 }, - { 0x1a00, 0xa4b7, 0x0000 }, - { 0x9a00, 0xa4bc, 0x3000 }, - { 0x9a00, 0xa4ba, 0x2000 }, - { 0x1a00, 0xa4b9, 0x0000 }, - { 0x1a00, 0xa4bb, 0x0000 }, - { 0x9a00, 0xa4be, 0x2000 }, - { 0x1a00, 0xa4bd, 0x0000 }, - { 0x1a00, 0xa4bf, 0x0000 }, - { 0x8700, 0xd7a3, 0x4000 }, - { 0x9a00, 0xa4c4, 0x3000 }, - { 0x9a00, 0xa4c2, 0x2000 }, - { 0x1a00, 0xa4c1, 0x0000 }, - { 0x1a00, 0xa4c3, 0x0000 }, - { 0x9a00, 0xa4c6, 0x2000 }, - { 0x1a00, 0xa4c5, 0x0000 }, - { 0x0700, 0xac00, 0x0000 }, - { 0x8400, 0xdbff, 0x3000 }, - { 0x8400, 0xdb7f, 0x2000 }, - { 0x0400, 0xd800, 0x0000 }, - { 0x0400, 0xdb80, 0x0000 }, - { 0x8400, 0xdfff, 0x2000 }, - { 0x0400, 0xdc00, 0x0000 }, - { 0x0300, 0xe000, 0x0000 }, - { 0x8700, 0xf93f, 0x7000 }, - { 0x8700, 0xf91f, 0x6000 }, - { 0x8700, 0xf90f, 0x5000 }, - { 0x8700, 0xf907, 0x4000 }, - { 0x8700, 0xf903, 0x3000 }, - { 0x8700, 0xf901, 0x2000 }, - { 0x0700, 0xf900, 0x0000 }, - { 0x0700, 0xf902, 0x0000 }, - { 0x8700, 0xf905, 0x2000 }, - { 0x0700, 0xf904, 0x0000 }, - { 0x0700, 0xf906, 0x0000 }, - { 0x8700, 0xf90b, 0x3000 }, - { 0x8700, 0xf909, 0x2000 }, - { 0x0700, 0xf908, 0x0000 }, - { 0x0700, 0xf90a, 0x0000 }, - { 0x8700, 0xf90d, 0x2000 }, - { 0x0700, 0xf90c, 0x0000 }, - { 0x0700, 0xf90e, 0x0000 }, - { 0x8700, 0xf917, 0x4000 }, - { 0x8700, 0xf913, 0x3000 }, - { 0x8700, 0xf911, 0x2000 }, - { 0x0700, 0xf910, 0x0000 }, - { 0x0700, 0xf912, 0x0000 }, - { 0x8700, 0xf915, 0x2000 }, - { 0x0700, 0xf914, 0x0000 }, - { 0x0700, 0xf916, 0x0000 }, - { 0x8700, 0xf91b, 0x3000 }, - { 0x8700, 0xf919, 0x2000 }, - { 0x0700, 0xf918, 0x0000 }, - { 0x0700, 0xf91a, 0x0000 }, - { 0x8700, 0xf91d, 0x2000 }, - { 0x0700, 0xf91c, 0x0000 }, - { 0x0700, 0xf91e, 0x0000 }, - { 0x8700, 0xf92f, 0x5000 }, - { 0x8700, 0xf927, 0x4000 }, - { 0x8700, 0xf923, 0x3000 }, - { 0x8700, 0xf921, 0x2000 }, - { 0x0700, 0xf920, 0x0000 }, - { 0x0700, 0xf922, 0x0000 }, - { 0x8700, 0xf925, 0x2000 }, - { 0x0700, 0xf924, 0x0000 }, - { 0x0700, 0xf926, 0x0000 }, - { 0x8700, 0xf92b, 0x3000 }, - { 0x8700, 0xf929, 0x2000 }, - { 0x0700, 0xf928, 0x0000 }, - { 0x0700, 0xf92a, 0x0000 }, - { 0x8700, 0xf92d, 0x2000 }, - { 0x0700, 0xf92c, 0x0000 }, - { 0x0700, 0xf92e, 0x0000 }, - { 0x8700, 0xf937, 0x4000 }, - { 0x8700, 0xf933, 0x3000 }, - { 0x8700, 0xf931, 0x2000 }, - { 0x0700, 0xf930, 0x0000 }, - { 0x0700, 0xf932, 0x0000 }, - { 0x8700, 0xf935, 0x2000 }, - { 0x0700, 0xf934, 0x0000 }, - { 0x0700, 0xf936, 0x0000 }, - { 0x8700, 0xf93b, 0x3000 }, - { 0x8700, 0xf939, 0x2000 }, - { 0x0700, 0xf938, 0x0000 }, - { 0x0700, 0xf93a, 0x0000 }, - { 0x8700, 0xf93d, 0x2000 }, - { 0x0700, 0xf93c, 0x0000 }, - { 0x0700, 0xf93e, 0x0000 }, - { 0x8700, 0xf95f, 0x6000 }, - { 0x8700, 0xf94f, 0x5000 }, - { 0x8700, 0xf947, 0x4000 }, - { 0x8700, 0xf943, 0x3000 }, - { 0x8700, 0xf941, 0x2000 }, - { 0x0700, 0xf940, 0x0000 }, - { 0x0700, 0xf942, 0x0000 }, - { 0x8700, 0xf945, 0x2000 }, - { 0x0700, 0xf944, 0x0000 }, - { 0x0700, 0xf946, 0x0000 }, - { 0x8700, 0xf94b, 0x3000 }, - { 0x8700, 0xf949, 0x2000 }, - { 0x0700, 0xf948, 0x0000 }, - { 0x0700, 0xf94a, 0x0000 }, - { 0x8700, 0xf94d, 0x2000 }, - { 0x0700, 0xf94c, 0x0000 }, - { 0x0700, 0xf94e, 0x0000 }, - { 0x8700, 0xf957, 0x4000 }, - { 0x8700, 0xf953, 0x3000 }, - { 0x8700, 0xf951, 0x2000 }, - { 0x0700, 0xf950, 0x0000 }, - { 0x0700, 0xf952, 0x0000 }, - { 0x8700, 0xf955, 0x2000 }, - { 0x0700, 0xf954, 0x0000 }, - { 0x0700, 0xf956, 0x0000 }, - { 0x8700, 0xf95b, 0x3000 }, - { 0x8700, 0xf959, 0x2000 }, - { 0x0700, 0xf958, 0x0000 }, - { 0x0700, 0xf95a, 0x0000 }, - { 0x8700, 0xf95d, 0x2000 }, - { 0x0700, 0xf95c, 0x0000 }, - { 0x0700, 0xf95e, 0x0000 }, - { 0x8700, 0xf96f, 0x5000 }, - { 0x8700, 0xf967, 0x4000 }, - { 0x8700, 0xf963, 0x3000 }, - { 0x8700, 0xf961, 0x2000 }, - { 0x0700, 0xf960, 0x0000 }, - { 0x0700, 0xf962, 0x0000 }, - { 0x8700, 0xf965, 0x2000 }, - { 0x0700, 0xf964, 0x0000 }, - { 0x0700, 0xf966, 0x0000 }, - { 0x8700, 0xf96b, 0x3000 }, - { 0x8700, 0xf969, 0x2000 }, - { 0x0700, 0xf968, 0x0000 }, - { 0x0700, 0xf96a, 0x0000 }, - { 0x8700, 0xf96d, 0x2000 }, - { 0x0700, 0xf96c, 0x0000 }, - { 0x0700, 0xf96e, 0x0000 }, - { 0x8700, 0xf977, 0x4000 }, - { 0x8700, 0xf973, 0x3000 }, - { 0x8700, 0xf971, 0x2000 }, - { 0x0700, 0xf970, 0x0000 }, - { 0x0700, 0xf972, 0x0000 }, - { 0x8700, 0xf975, 0x2000 }, - { 0x0700, 0xf974, 0x0000 }, - { 0x0700, 0xf976, 0x0000 }, - { 0x8700, 0xf97b, 0x3000 }, - { 0x8700, 0xf979, 0x2000 }, - { 0x0700, 0xf978, 0x0000 }, - { 0x0700, 0xf97a, 0x0000 }, - { 0x8700, 0xf97d, 0x2000 }, - { 0x0700, 0xf97c, 0x0000 }, - { 0x0700, 0xf97e, 0x0000 }, - { 0x8700, 0xfb27, 0x9000 }, - { 0x8700, 0xf9ff, 0x8000 }, - { 0x8700, 0xf9bf, 0x7000 }, - { 0x8700, 0xf99f, 0x6000 }, - { 0x8700, 0xf98f, 0x5000 }, - { 0x8700, 0xf987, 0x4000 }, - { 0x8700, 0xf983, 0x3000 }, - { 0x8700, 0xf981, 0x2000 }, - { 0x0700, 0xf980, 0x0000 }, - { 0x0700, 0xf982, 0x0000 }, - { 0x8700, 0xf985, 0x2000 }, - { 0x0700, 0xf984, 0x0000 }, - { 0x0700, 0xf986, 0x0000 }, - { 0x8700, 0xf98b, 0x3000 }, - { 0x8700, 0xf989, 0x2000 }, - { 0x0700, 0xf988, 0x0000 }, - { 0x0700, 0xf98a, 0x0000 }, - { 0x8700, 0xf98d, 0x2000 }, - { 0x0700, 0xf98c, 0x0000 }, - { 0x0700, 0xf98e, 0x0000 }, - { 0x8700, 0xf997, 0x4000 }, - { 0x8700, 0xf993, 0x3000 }, - { 0x8700, 0xf991, 0x2000 }, - { 0x0700, 0xf990, 0x0000 }, - { 0x0700, 0xf992, 0x0000 }, - { 0x8700, 0xf995, 0x2000 }, - { 0x0700, 0xf994, 0x0000 }, - { 0x0700, 0xf996, 0x0000 }, - { 0x8700, 0xf99b, 0x3000 }, - { 0x8700, 0xf999, 0x2000 }, - { 0x0700, 0xf998, 0x0000 }, - { 0x0700, 0xf99a, 0x0000 }, - { 0x8700, 0xf99d, 0x2000 }, - { 0x0700, 0xf99c, 0x0000 }, - { 0x0700, 0xf99e, 0x0000 }, - { 0x8700, 0xf9af, 0x5000 }, - { 0x8700, 0xf9a7, 0x4000 }, - { 0x8700, 0xf9a3, 0x3000 }, - { 0x8700, 0xf9a1, 0x2000 }, - { 0x0700, 0xf9a0, 0x0000 }, - { 0x0700, 0xf9a2, 0x0000 }, - { 0x8700, 0xf9a5, 0x2000 }, - { 0x0700, 0xf9a4, 0x0000 }, - { 0x0700, 0xf9a6, 0x0000 }, - { 0x8700, 0xf9ab, 0x3000 }, - { 0x8700, 0xf9a9, 0x2000 }, - { 0x0700, 0xf9a8, 0x0000 }, - { 0x0700, 0xf9aa, 0x0000 }, - { 0x8700, 0xf9ad, 0x2000 }, - { 0x0700, 0xf9ac, 0x0000 }, - { 0x0700, 0xf9ae, 0x0000 }, - { 0x8700, 0xf9b7, 0x4000 }, - { 0x8700, 0xf9b3, 0x3000 }, - { 0x8700, 0xf9b1, 0x2000 }, - { 0x0700, 0xf9b0, 0x0000 }, - { 0x0700, 0xf9b2, 0x0000 }, - { 0x8700, 0xf9b5, 0x2000 }, - { 0x0700, 0xf9b4, 0x0000 }, - { 0x0700, 0xf9b6, 0x0000 }, - { 0x8700, 0xf9bb, 0x3000 }, - { 0x8700, 0xf9b9, 0x2000 }, - { 0x0700, 0xf9b8, 0x0000 }, - { 0x0700, 0xf9ba, 0x0000 }, - { 0x8700, 0xf9bd, 0x2000 }, - { 0x0700, 0xf9bc, 0x0000 }, - { 0x0700, 0xf9be, 0x0000 }, - { 0x8700, 0xf9df, 0x6000 }, - { 0x8700, 0xf9cf, 0x5000 }, - { 0x8700, 0xf9c7, 0x4000 }, - { 0x8700, 0xf9c3, 0x3000 }, - { 0x8700, 0xf9c1, 0x2000 }, - { 0x0700, 0xf9c0, 0x0000 }, - { 0x0700, 0xf9c2, 0x0000 }, - { 0x8700, 0xf9c5, 0x2000 }, - { 0x0700, 0xf9c4, 0x0000 }, - { 0x0700, 0xf9c6, 0x0000 }, - { 0x8700, 0xf9cb, 0x3000 }, - { 0x8700, 0xf9c9, 0x2000 }, - { 0x0700, 0xf9c8, 0x0000 }, - { 0x0700, 0xf9ca, 0x0000 }, - { 0x8700, 0xf9cd, 0x2000 }, - { 0x0700, 0xf9cc, 0x0000 }, - { 0x0700, 0xf9ce, 0x0000 }, - { 0x8700, 0xf9d7, 0x4000 }, - { 0x8700, 0xf9d3, 0x3000 }, - { 0x8700, 0xf9d1, 0x2000 }, - { 0x0700, 0xf9d0, 0x0000 }, - { 0x0700, 0xf9d2, 0x0000 }, - { 0x8700, 0xf9d5, 0x2000 }, - { 0x0700, 0xf9d4, 0x0000 }, - { 0x0700, 0xf9d6, 0x0000 }, - { 0x8700, 0xf9db, 0x3000 }, - { 0x8700, 0xf9d9, 0x2000 }, - { 0x0700, 0xf9d8, 0x0000 }, - { 0x0700, 0xf9da, 0x0000 }, - { 0x8700, 0xf9dd, 0x2000 }, - { 0x0700, 0xf9dc, 0x0000 }, - { 0x0700, 0xf9de, 0x0000 }, - { 0x8700, 0xf9ef, 0x5000 }, - { 0x8700, 0xf9e7, 0x4000 }, - { 0x8700, 0xf9e3, 0x3000 }, - { 0x8700, 0xf9e1, 0x2000 }, - { 0x0700, 0xf9e0, 0x0000 }, - { 0x0700, 0xf9e2, 0x0000 }, - { 0x8700, 0xf9e5, 0x2000 }, - { 0x0700, 0xf9e4, 0x0000 }, - { 0x0700, 0xf9e6, 0x0000 }, - { 0x8700, 0xf9eb, 0x3000 }, - { 0x8700, 0xf9e9, 0x2000 }, - { 0x0700, 0xf9e8, 0x0000 }, - { 0x0700, 0xf9ea, 0x0000 }, - { 0x8700, 0xf9ed, 0x2000 }, - { 0x0700, 0xf9ec, 0x0000 }, - { 0x0700, 0xf9ee, 0x0000 }, - { 0x8700, 0xf9f7, 0x4000 }, - { 0x8700, 0xf9f3, 0x3000 }, - { 0x8700, 0xf9f1, 0x2000 }, - { 0x0700, 0xf9f0, 0x0000 }, - { 0x0700, 0xf9f2, 0x0000 }, - { 0x8700, 0xf9f5, 0x2000 }, - { 0x0700, 0xf9f4, 0x0000 }, - { 0x0700, 0xf9f6, 0x0000 }, - { 0x8700, 0xf9fb, 0x3000 }, - { 0x8700, 0xf9f9, 0x2000 }, - { 0x0700, 0xf9f8, 0x0000 }, - { 0x0700, 0xf9fa, 0x0000 }, - { 0x8700, 0xf9fd, 0x2000 }, - { 0x0700, 0xf9fc, 0x0000 }, - { 0x0700, 0xf9fe, 0x0000 }, - { 0x8700, 0xfa41, 0x7000 }, - { 0x8700, 0xfa1f, 0x6000 }, - { 0x8700, 0xfa0f, 0x5000 }, - { 0x8700, 0xfa07, 0x4000 }, - { 0x8700, 0xfa03, 0x3000 }, - { 0x8700, 0xfa01, 0x2000 }, - { 0x0700, 0xfa00, 0x0000 }, - { 0x0700, 0xfa02, 0x0000 }, - { 0x8700, 0xfa05, 0x2000 }, - { 0x0700, 0xfa04, 0x0000 }, - { 0x0700, 0xfa06, 0x0000 }, - { 0x8700, 0xfa0b, 0x3000 }, - { 0x8700, 0xfa09, 0x2000 }, - { 0x0700, 0xfa08, 0x0000 }, - { 0x0700, 0xfa0a, 0x0000 }, - { 0x8700, 0xfa0d, 0x2000 }, - { 0x0700, 0xfa0c, 0x0000 }, - { 0x0700, 0xfa0e, 0x0000 }, - { 0x8700, 0xfa17, 0x4000 }, - { 0x8700, 0xfa13, 0x3000 }, - { 0x8700, 0xfa11, 0x2000 }, - { 0x0700, 0xfa10, 0x0000 }, - { 0x0700, 0xfa12, 0x0000 }, - { 0x8700, 0xfa15, 0x2000 }, - { 0x0700, 0xfa14, 0x0000 }, - { 0x0700, 0xfa16, 0x0000 }, - { 0x8700, 0xfa1b, 0x3000 }, - { 0x8700, 0xfa19, 0x2000 }, - { 0x0700, 0xfa18, 0x0000 }, - { 0x0700, 0xfa1a, 0x0000 }, - { 0x8700, 0xfa1d, 0x2000 }, - { 0x0700, 0xfa1c, 0x0000 }, - { 0x0700, 0xfa1e, 0x0000 }, - { 0x8700, 0xfa31, 0x5000 }, - { 0x8700, 0xfa27, 0x4000 }, - { 0x8700, 0xfa23, 0x3000 }, - { 0x8700, 0xfa21, 0x2000 }, - { 0x0700, 0xfa20, 0x0000 }, - { 0x0700, 0xfa22, 0x0000 }, - { 0x8700, 0xfa25, 0x2000 }, - { 0x0700, 0xfa24, 0x0000 }, - { 0x0700, 0xfa26, 0x0000 }, - { 0x8700, 0xfa2b, 0x3000 }, - { 0x8700, 0xfa29, 0x2000 }, - { 0x0700, 0xfa28, 0x0000 }, - { 0x0700, 0xfa2a, 0x0000 }, - { 0x8700, 0xfa2d, 0x2000 }, - { 0x0700, 0xfa2c, 0x0000 }, - { 0x0700, 0xfa30, 0x0000 }, - { 0x8700, 0xfa39, 0x4000 }, - { 0x8700, 0xfa35, 0x3000 }, - { 0x8700, 0xfa33, 0x2000 }, - { 0x0700, 0xfa32, 0x0000 }, - { 0x0700, 0xfa34, 0x0000 }, - { 0x8700, 0xfa37, 0x2000 }, - { 0x0700, 0xfa36, 0x0000 }, - { 0x0700, 0xfa38, 0x0000 }, - { 0x8700, 0xfa3d, 0x3000 }, - { 0x8700, 0xfa3b, 0x2000 }, - { 0x0700, 0xfa3a, 0x0000 }, - { 0x0700, 0xfa3c, 0x0000 }, - { 0x8700, 0xfa3f, 0x2000 }, - { 0x0700, 0xfa3e, 0x0000 }, - { 0x0700, 0xfa40, 0x0000 }, - { 0x8700, 0xfa61, 0x6000 }, - { 0x8700, 0xfa51, 0x5000 }, - { 0x8700, 0xfa49, 0x4000 }, - { 0x8700, 0xfa45, 0x3000 }, - { 0x8700, 0xfa43, 0x2000 }, - { 0x0700, 0xfa42, 0x0000 }, - { 0x0700, 0xfa44, 0x0000 }, - { 0x8700, 0xfa47, 0x2000 }, - { 0x0700, 0xfa46, 0x0000 }, - { 0x0700, 0xfa48, 0x0000 }, - { 0x8700, 0xfa4d, 0x3000 }, - { 0x8700, 0xfa4b, 0x2000 }, - { 0x0700, 0xfa4a, 0x0000 }, - { 0x0700, 0xfa4c, 0x0000 }, - { 0x8700, 0xfa4f, 0x2000 }, - { 0x0700, 0xfa4e, 0x0000 }, - { 0x0700, 0xfa50, 0x0000 }, - { 0x8700, 0xfa59, 0x4000 }, - { 0x8700, 0xfa55, 0x3000 }, - { 0x8700, 0xfa53, 0x2000 }, - { 0x0700, 0xfa52, 0x0000 }, - { 0x0700, 0xfa54, 0x0000 }, - { 0x8700, 0xfa57, 0x2000 }, - { 0x0700, 0xfa56, 0x0000 }, - { 0x0700, 0xfa58, 0x0000 }, - { 0x8700, 0xfa5d, 0x3000 }, - { 0x8700, 0xfa5b, 0x2000 }, - { 0x0700, 0xfa5a, 0x0000 }, - { 0x0700, 0xfa5c, 0x0000 }, - { 0x8700, 0xfa5f, 0x2000 }, - { 0x0700, 0xfa5e, 0x0000 }, - { 0x0700, 0xfa60, 0x0000 }, - { 0x8500, 0xfb06, 0x5000 }, - { 0x8700, 0xfa69, 0x4000 }, - { 0x8700, 0xfa65, 0x3000 }, - { 0x8700, 0xfa63, 0x2000 }, - { 0x0700, 0xfa62, 0x0000 }, - { 0x0700, 0xfa64, 0x0000 }, - { 0x8700, 0xfa67, 0x2000 }, - { 0x0700, 0xfa66, 0x0000 }, - { 0x0700, 0xfa68, 0x0000 }, - { 0x8500, 0xfb02, 0x3000 }, - { 0x8500, 0xfb00, 0x2000 }, - { 0x0700, 0xfa6a, 0x0000 }, - { 0x0500, 0xfb01, 0x0000 }, - { 0x8500, 0xfb04, 0x2000 }, - { 0x0500, 0xfb03, 0x0000 }, - { 0x0500, 0xfb05, 0x0000 }, - { 0x8700, 0xfb1f, 0x4000 }, - { 0x8500, 0xfb16, 0x3000 }, - { 0x8500, 0xfb14, 0x2000 }, - { 0x0500, 0xfb13, 0x0000 }, - { 0x0500, 0xfb15, 0x0000 }, - { 0x8700, 0xfb1d, 0x2000 }, - { 0x0500, 0xfb17, 0x0000 }, - { 0x0c00, 0xfb1e, 0x0000 }, - { 0x8700, 0xfb23, 0x3000 }, - { 0x8700, 0xfb21, 0x2000 }, - { 0x0700, 0xfb20, 0x0000 }, - { 0x0700, 0xfb22, 0x0000 }, - { 0x8700, 0xfb25, 0x2000 }, - { 0x0700, 0xfb24, 0x0000 }, - { 0x0700, 0xfb26, 0x0000 }, - { 0x8700, 0xfbac, 0x8000 }, - { 0x8700, 0xfb6c, 0x7000 }, - { 0x8700, 0xfb4c, 0x6000 }, - { 0x8700, 0xfb38, 0x5000 }, - { 0x8700, 0xfb2f, 0x4000 }, - { 0x8700, 0xfb2b, 0x3000 }, - { 0x9900, 0xfb29, 0x2000 }, - { 0x0700, 0xfb28, 0x0000 }, - { 0x0700, 0xfb2a, 0x0000 }, - { 0x8700, 0xfb2d, 0x2000 }, - { 0x0700, 0xfb2c, 0x0000 }, - { 0x0700, 0xfb2e, 0x0000 }, - { 0x8700, 0xfb33, 0x3000 }, - { 0x8700, 0xfb31, 0x2000 }, - { 0x0700, 0xfb30, 0x0000 }, - { 0x0700, 0xfb32, 0x0000 }, - { 0x8700, 0xfb35, 0x2000 }, - { 0x0700, 0xfb34, 0x0000 }, - { 0x0700, 0xfb36, 0x0000 }, - { 0x8700, 0xfb43, 0x4000 }, - { 0x8700, 0xfb3c, 0x3000 }, - { 0x8700, 0xfb3a, 0x2000 }, - { 0x0700, 0xfb39, 0x0000 }, - { 0x0700, 0xfb3b, 0x0000 }, - { 0x8700, 0xfb40, 0x2000 }, - { 0x0700, 0xfb3e, 0x0000 }, - { 0x0700, 0xfb41, 0x0000 }, - { 0x8700, 0xfb48, 0x3000 }, - { 0x8700, 0xfb46, 0x2000 }, - { 0x0700, 0xfb44, 0x0000 }, - { 0x0700, 0xfb47, 0x0000 }, - { 0x8700, 0xfb4a, 0x2000 }, - { 0x0700, 0xfb49, 0x0000 }, - { 0x0700, 0xfb4b, 0x0000 }, - { 0x8700, 0xfb5c, 0x5000 }, - { 0x8700, 0xfb54, 0x4000 }, - { 0x8700, 0xfb50, 0x3000 }, - { 0x8700, 0xfb4e, 0x2000 }, - { 0x0700, 0xfb4d, 0x0000 }, - { 0x0700, 0xfb4f, 0x0000 }, - { 0x8700, 0xfb52, 0x2000 }, - { 0x0700, 0xfb51, 0x0000 }, - { 0x0700, 0xfb53, 0x0000 }, - { 0x8700, 0xfb58, 0x3000 }, - { 0x8700, 0xfb56, 0x2000 }, - { 0x0700, 0xfb55, 0x0000 }, - { 0x0700, 0xfb57, 0x0000 }, - { 0x8700, 0xfb5a, 0x2000 }, - { 0x0700, 0xfb59, 0x0000 }, - { 0x0700, 0xfb5b, 0x0000 }, - { 0x8700, 0xfb64, 0x4000 }, - { 0x8700, 0xfb60, 0x3000 }, - { 0x8700, 0xfb5e, 0x2000 }, - { 0x0700, 0xfb5d, 0x0000 }, - { 0x0700, 0xfb5f, 0x0000 }, - { 0x8700, 0xfb62, 0x2000 }, - { 0x0700, 0xfb61, 0x0000 }, - { 0x0700, 0xfb63, 0x0000 }, - { 0x8700, 0xfb68, 0x3000 }, - { 0x8700, 0xfb66, 0x2000 }, - { 0x0700, 0xfb65, 0x0000 }, - { 0x0700, 0xfb67, 0x0000 }, - { 0x8700, 0xfb6a, 0x2000 }, - { 0x0700, 0xfb69, 0x0000 }, - { 0x0700, 0xfb6b, 0x0000 }, - { 0x8700, 0xfb8c, 0x6000 }, - { 0x8700, 0xfb7c, 0x5000 }, - { 0x8700, 0xfb74, 0x4000 }, - { 0x8700, 0xfb70, 0x3000 }, - { 0x8700, 0xfb6e, 0x2000 }, - { 0x0700, 0xfb6d, 0x0000 }, - { 0x0700, 0xfb6f, 0x0000 }, - { 0x8700, 0xfb72, 0x2000 }, - { 0x0700, 0xfb71, 0x0000 }, - { 0x0700, 0xfb73, 0x0000 }, - { 0x8700, 0xfb78, 0x3000 }, - { 0x8700, 0xfb76, 0x2000 }, - { 0x0700, 0xfb75, 0x0000 }, - { 0x0700, 0xfb77, 0x0000 }, - { 0x8700, 0xfb7a, 0x2000 }, - { 0x0700, 0xfb79, 0x0000 }, - { 0x0700, 0xfb7b, 0x0000 }, - { 0x8700, 0xfb84, 0x4000 }, - { 0x8700, 0xfb80, 0x3000 }, - { 0x8700, 0xfb7e, 0x2000 }, - { 0x0700, 0xfb7d, 0x0000 }, - { 0x0700, 0xfb7f, 0x0000 }, - { 0x8700, 0xfb82, 0x2000 }, - { 0x0700, 0xfb81, 0x0000 }, - { 0x0700, 0xfb83, 0x0000 }, - { 0x8700, 0xfb88, 0x3000 }, - { 0x8700, 0xfb86, 0x2000 }, - { 0x0700, 0xfb85, 0x0000 }, - { 0x0700, 0xfb87, 0x0000 }, - { 0x8700, 0xfb8a, 0x2000 }, - { 0x0700, 0xfb89, 0x0000 }, - { 0x0700, 0xfb8b, 0x0000 }, - { 0x8700, 0xfb9c, 0x5000 }, - { 0x8700, 0xfb94, 0x4000 }, - { 0x8700, 0xfb90, 0x3000 }, - { 0x8700, 0xfb8e, 0x2000 }, - { 0x0700, 0xfb8d, 0x0000 }, - { 0x0700, 0xfb8f, 0x0000 }, - { 0x8700, 0xfb92, 0x2000 }, - { 0x0700, 0xfb91, 0x0000 }, - { 0x0700, 0xfb93, 0x0000 }, - { 0x8700, 0xfb98, 0x3000 }, - { 0x8700, 0xfb96, 0x2000 }, - { 0x0700, 0xfb95, 0x0000 }, - { 0x0700, 0xfb97, 0x0000 }, - { 0x8700, 0xfb9a, 0x2000 }, - { 0x0700, 0xfb99, 0x0000 }, - { 0x0700, 0xfb9b, 0x0000 }, - { 0x8700, 0xfba4, 0x4000 }, - { 0x8700, 0xfba0, 0x3000 }, - { 0x8700, 0xfb9e, 0x2000 }, - { 0x0700, 0xfb9d, 0x0000 }, - { 0x0700, 0xfb9f, 0x0000 }, - { 0x8700, 0xfba2, 0x2000 }, - { 0x0700, 0xfba1, 0x0000 }, - { 0x0700, 0xfba3, 0x0000 }, - { 0x8700, 0xfba8, 0x3000 }, - { 0x8700, 0xfba6, 0x2000 }, - { 0x0700, 0xfba5, 0x0000 }, - { 0x0700, 0xfba7, 0x0000 }, - { 0x8700, 0xfbaa, 0x2000 }, - { 0x0700, 0xfba9, 0x0000 }, - { 0x0700, 0xfbab, 0x0000 }, - { 0x8700, 0xfc0d, 0x7000 }, - { 0x8700, 0xfbed, 0x6000 }, - { 0x8700, 0xfbdd, 0x5000 }, - { 0x8700, 0xfbd5, 0x4000 }, - { 0x8700, 0xfbb0, 0x3000 }, - { 0x8700, 0xfbae, 0x2000 }, - { 0x0700, 0xfbad, 0x0000 }, - { 0x0700, 0xfbaf, 0x0000 }, - { 0x8700, 0xfbd3, 0x2000 }, - { 0x0700, 0xfbb1, 0x0000 }, - { 0x0700, 0xfbd4, 0x0000 }, - { 0x8700, 0xfbd9, 0x3000 }, - { 0x8700, 0xfbd7, 0x2000 }, - { 0x0700, 0xfbd6, 0x0000 }, - { 0x0700, 0xfbd8, 0x0000 }, - { 0x8700, 0xfbdb, 0x2000 }, - { 0x0700, 0xfbda, 0x0000 }, - { 0x0700, 0xfbdc, 0x0000 }, - { 0x8700, 0xfbe5, 0x4000 }, - { 0x8700, 0xfbe1, 0x3000 }, - { 0x8700, 0xfbdf, 0x2000 }, - { 0x0700, 0xfbde, 0x0000 }, - { 0x0700, 0xfbe0, 0x0000 }, - { 0x8700, 0xfbe3, 0x2000 }, - { 0x0700, 0xfbe2, 0x0000 }, - { 0x0700, 0xfbe4, 0x0000 }, - { 0x8700, 0xfbe9, 0x3000 }, - { 0x8700, 0xfbe7, 0x2000 }, - { 0x0700, 0xfbe6, 0x0000 }, - { 0x0700, 0xfbe8, 0x0000 }, - { 0x8700, 0xfbeb, 0x2000 }, - { 0x0700, 0xfbea, 0x0000 }, - { 0x0700, 0xfbec, 0x0000 }, - { 0x8700, 0xfbfd, 0x5000 }, - { 0x8700, 0xfbf5, 0x4000 }, - { 0x8700, 0xfbf1, 0x3000 }, - { 0x8700, 0xfbef, 0x2000 }, - { 0x0700, 0xfbee, 0x0000 }, - { 0x0700, 0xfbf0, 0x0000 }, - { 0x8700, 0xfbf3, 0x2000 }, - { 0x0700, 0xfbf2, 0x0000 }, - { 0x0700, 0xfbf4, 0x0000 }, - { 0x8700, 0xfbf9, 0x3000 }, - { 0x8700, 0xfbf7, 0x2000 }, - { 0x0700, 0xfbf6, 0x0000 }, - { 0x0700, 0xfbf8, 0x0000 }, - { 0x8700, 0xfbfb, 0x2000 }, - { 0x0700, 0xfbfa, 0x0000 }, - { 0x0700, 0xfbfc, 0x0000 }, - { 0x8700, 0xfc05, 0x4000 }, - { 0x8700, 0xfc01, 0x3000 }, - { 0x8700, 0xfbff, 0x2000 }, - { 0x0700, 0xfbfe, 0x0000 }, - { 0x0700, 0xfc00, 0x0000 }, - { 0x8700, 0xfc03, 0x2000 }, - { 0x0700, 0xfc02, 0x0000 }, - { 0x0700, 0xfc04, 0x0000 }, - { 0x8700, 0xfc09, 0x3000 }, - { 0x8700, 0xfc07, 0x2000 }, - { 0x0700, 0xfc06, 0x0000 }, - { 0x0700, 0xfc08, 0x0000 }, - { 0x8700, 0xfc0b, 0x2000 }, - { 0x0700, 0xfc0a, 0x0000 }, - { 0x0700, 0xfc0c, 0x0000 }, - { 0x8700, 0xfc2d, 0x6000 }, - { 0x8700, 0xfc1d, 0x5000 }, - { 0x8700, 0xfc15, 0x4000 }, - { 0x8700, 0xfc11, 0x3000 }, - { 0x8700, 0xfc0f, 0x2000 }, - { 0x0700, 0xfc0e, 0x0000 }, - { 0x0700, 0xfc10, 0x0000 }, - { 0x8700, 0xfc13, 0x2000 }, - { 0x0700, 0xfc12, 0x0000 }, - { 0x0700, 0xfc14, 0x0000 }, - { 0x8700, 0xfc19, 0x3000 }, - { 0x8700, 0xfc17, 0x2000 }, - { 0x0700, 0xfc16, 0x0000 }, - { 0x0700, 0xfc18, 0x0000 }, - { 0x8700, 0xfc1b, 0x2000 }, - { 0x0700, 0xfc1a, 0x0000 }, - { 0x0700, 0xfc1c, 0x0000 }, - { 0x8700, 0xfc25, 0x4000 }, - { 0x8700, 0xfc21, 0x3000 }, - { 0x8700, 0xfc1f, 0x2000 }, - { 0x0700, 0xfc1e, 0x0000 }, - { 0x0700, 0xfc20, 0x0000 }, - { 0x8700, 0xfc23, 0x2000 }, - { 0x0700, 0xfc22, 0x0000 }, - { 0x0700, 0xfc24, 0x0000 }, - { 0x8700, 0xfc29, 0x3000 }, - { 0x8700, 0xfc27, 0x2000 }, - { 0x0700, 0xfc26, 0x0000 }, - { 0x0700, 0xfc28, 0x0000 }, - { 0x8700, 0xfc2b, 0x2000 }, - { 0x0700, 0xfc2a, 0x0000 }, - { 0x0700, 0xfc2c, 0x0000 }, - { 0x8700, 0xfc3d, 0x5000 }, - { 0x8700, 0xfc35, 0x4000 }, - { 0x8700, 0xfc31, 0x3000 }, - { 0x8700, 0xfc2f, 0x2000 }, - { 0x0700, 0xfc2e, 0x0000 }, - { 0x0700, 0xfc30, 0x0000 }, - { 0x8700, 0xfc33, 0x2000 }, - { 0x0700, 0xfc32, 0x0000 }, - { 0x0700, 0xfc34, 0x0000 }, - { 0x8700, 0xfc39, 0x3000 }, - { 0x8700, 0xfc37, 0x2000 }, - { 0x0700, 0xfc36, 0x0000 }, - { 0x0700, 0xfc38, 0x0000 }, - { 0x8700, 0xfc3b, 0x2000 }, - { 0x0700, 0xfc3a, 0x0000 }, - { 0x0700, 0xfc3c, 0x0000 }, - { 0x8700, 0xfc45, 0x4000 }, - { 0x8700, 0xfc41, 0x3000 }, - { 0x8700, 0xfc3f, 0x2000 }, - { 0x0700, 0xfc3e, 0x0000 }, - { 0x0700, 0xfc40, 0x0000 }, - { 0x8700, 0xfc43, 0x2000 }, - { 0x0700, 0xfc42, 0x0000 }, - { 0x0700, 0xfc44, 0x0000 }, - { 0x8700, 0xfc49, 0x3000 }, - { 0x8700, 0xfc47, 0x2000 }, - { 0x0700, 0xfc46, 0x0000 }, - { 0x0700, 0xfc48, 0x0000 }, - { 0x8700, 0xfc4b, 0x2000 }, - { 0x0700, 0xfc4a, 0x0000 }, - { 0x0700, 0xfc4c, 0x0000 }, - { 0x8700, 0xfeac, 0xa000 }, - { 0x8700, 0xfd5d, 0x9000 }, - { 0x8700, 0xfccd, 0x8000 }, - { 0x8700, 0xfc8d, 0x7000 }, - { 0x8700, 0xfc6d, 0x6000 }, - { 0x8700, 0xfc5d, 0x5000 }, - { 0x8700, 0xfc55, 0x4000 }, - { 0x8700, 0xfc51, 0x3000 }, - { 0x8700, 0xfc4f, 0x2000 }, - { 0x0700, 0xfc4e, 0x0000 }, - { 0x0700, 0xfc50, 0x0000 }, - { 0x8700, 0xfc53, 0x2000 }, - { 0x0700, 0xfc52, 0x0000 }, - { 0x0700, 0xfc54, 0x0000 }, - { 0x8700, 0xfc59, 0x3000 }, - { 0x8700, 0xfc57, 0x2000 }, - { 0x0700, 0xfc56, 0x0000 }, - { 0x0700, 0xfc58, 0x0000 }, - { 0x8700, 0xfc5b, 0x2000 }, - { 0x0700, 0xfc5a, 0x0000 }, - { 0x0700, 0xfc5c, 0x0000 }, - { 0x8700, 0xfc65, 0x4000 }, - { 0x8700, 0xfc61, 0x3000 }, - { 0x8700, 0xfc5f, 0x2000 }, - { 0x0700, 0xfc5e, 0x0000 }, - { 0x0700, 0xfc60, 0x0000 }, - { 0x8700, 0xfc63, 0x2000 }, - { 0x0700, 0xfc62, 0x0000 }, - { 0x0700, 0xfc64, 0x0000 }, - { 0x8700, 0xfc69, 0x3000 }, - { 0x8700, 0xfc67, 0x2000 }, - { 0x0700, 0xfc66, 0x0000 }, - { 0x0700, 0xfc68, 0x0000 }, - { 0x8700, 0xfc6b, 0x2000 }, - { 0x0700, 0xfc6a, 0x0000 }, - { 0x0700, 0xfc6c, 0x0000 }, - { 0x8700, 0xfc7d, 0x5000 }, - { 0x8700, 0xfc75, 0x4000 }, - { 0x8700, 0xfc71, 0x3000 }, - { 0x8700, 0xfc6f, 0x2000 }, - { 0x0700, 0xfc6e, 0x0000 }, - { 0x0700, 0xfc70, 0x0000 }, - { 0x8700, 0xfc73, 0x2000 }, - { 0x0700, 0xfc72, 0x0000 }, - { 0x0700, 0xfc74, 0x0000 }, - { 0x8700, 0xfc79, 0x3000 }, - { 0x8700, 0xfc77, 0x2000 }, - { 0x0700, 0xfc76, 0x0000 }, - { 0x0700, 0xfc78, 0x0000 }, - { 0x8700, 0xfc7b, 0x2000 }, - { 0x0700, 0xfc7a, 0x0000 }, - { 0x0700, 0xfc7c, 0x0000 }, - { 0x8700, 0xfc85, 0x4000 }, - { 0x8700, 0xfc81, 0x3000 }, - { 0x8700, 0xfc7f, 0x2000 }, - { 0x0700, 0xfc7e, 0x0000 }, - { 0x0700, 0xfc80, 0x0000 }, - { 0x8700, 0xfc83, 0x2000 }, - { 0x0700, 0xfc82, 0x0000 }, - { 0x0700, 0xfc84, 0x0000 }, - { 0x8700, 0xfc89, 0x3000 }, - { 0x8700, 0xfc87, 0x2000 }, - { 0x0700, 0xfc86, 0x0000 }, - { 0x0700, 0xfc88, 0x0000 }, - { 0x8700, 0xfc8b, 0x2000 }, - { 0x0700, 0xfc8a, 0x0000 }, - { 0x0700, 0xfc8c, 0x0000 }, - { 0x8700, 0xfcad, 0x6000 }, - { 0x8700, 0xfc9d, 0x5000 }, - { 0x8700, 0xfc95, 0x4000 }, - { 0x8700, 0xfc91, 0x3000 }, - { 0x8700, 0xfc8f, 0x2000 }, - { 0x0700, 0xfc8e, 0x0000 }, - { 0x0700, 0xfc90, 0x0000 }, - { 0x8700, 0xfc93, 0x2000 }, - { 0x0700, 0xfc92, 0x0000 }, - { 0x0700, 0xfc94, 0x0000 }, - { 0x8700, 0xfc99, 0x3000 }, - { 0x8700, 0xfc97, 0x2000 }, - { 0x0700, 0xfc96, 0x0000 }, - { 0x0700, 0xfc98, 0x0000 }, - { 0x8700, 0xfc9b, 0x2000 }, - { 0x0700, 0xfc9a, 0x0000 }, - { 0x0700, 0xfc9c, 0x0000 }, - { 0x8700, 0xfca5, 0x4000 }, - { 0x8700, 0xfca1, 0x3000 }, - { 0x8700, 0xfc9f, 0x2000 }, - { 0x0700, 0xfc9e, 0x0000 }, - { 0x0700, 0xfca0, 0x0000 }, - { 0x8700, 0xfca3, 0x2000 }, - { 0x0700, 0xfca2, 0x0000 }, - { 0x0700, 0xfca4, 0x0000 }, - { 0x8700, 0xfca9, 0x3000 }, - { 0x8700, 0xfca7, 0x2000 }, - { 0x0700, 0xfca6, 0x0000 }, - { 0x0700, 0xfca8, 0x0000 }, - { 0x8700, 0xfcab, 0x2000 }, - { 0x0700, 0xfcaa, 0x0000 }, - { 0x0700, 0xfcac, 0x0000 }, - { 0x8700, 0xfcbd, 0x5000 }, - { 0x8700, 0xfcb5, 0x4000 }, - { 0x8700, 0xfcb1, 0x3000 }, - { 0x8700, 0xfcaf, 0x2000 }, - { 0x0700, 0xfcae, 0x0000 }, - { 0x0700, 0xfcb0, 0x0000 }, - { 0x8700, 0xfcb3, 0x2000 }, - { 0x0700, 0xfcb2, 0x0000 }, - { 0x0700, 0xfcb4, 0x0000 }, - { 0x8700, 0xfcb9, 0x3000 }, - { 0x8700, 0xfcb7, 0x2000 }, - { 0x0700, 0xfcb6, 0x0000 }, - { 0x0700, 0xfcb8, 0x0000 }, - { 0x8700, 0xfcbb, 0x2000 }, - { 0x0700, 0xfcba, 0x0000 }, - { 0x0700, 0xfcbc, 0x0000 }, - { 0x8700, 0xfcc5, 0x4000 }, - { 0x8700, 0xfcc1, 0x3000 }, - { 0x8700, 0xfcbf, 0x2000 }, - { 0x0700, 0xfcbe, 0x0000 }, - { 0x0700, 0xfcc0, 0x0000 }, - { 0x8700, 0xfcc3, 0x2000 }, - { 0x0700, 0xfcc2, 0x0000 }, - { 0x0700, 0xfcc4, 0x0000 }, - { 0x8700, 0xfcc9, 0x3000 }, - { 0x8700, 0xfcc7, 0x2000 }, - { 0x0700, 0xfcc6, 0x0000 }, - { 0x0700, 0xfcc8, 0x0000 }, - { 0x8700, 0xfccb, 0x2000 }, - { 0x0700, 0xfcca, 0x0000 }, - { 0x0700, 0xfccc, 0x0000 }, - { 0x8700, 0xfd0d, 0x7000 }, - { 0x8700, 0xfced, 0x6000 }, - { 0x8700, 0xfcdd, 0x5000 }, - { 0x8700, 0xfcd5, 0x4000 }, - { 0x8700, 0xfcd1, 0x3000 }, - { 0x8700, 0xfccf, 0x2000 }, - { 0x0700, 0xfcce, 0x0000 }, - { 0x0700, 0xfcd0, 0x0000 }, - { 0x8700, 0xfcd3, 0x2000 }, - { 0x0700, 0xfcd2, 0x0000 }, - { 0x0700, 0xfcd4, 0x0000 }, - { 0x8700, 0xfcd9, 0x3000 }, - { 0x8700, 0xfcd7, 0x2000 }, - { 0x0700, 0xfcd6, 0x0000 }, - { 0x0700, 0xfcd8, 0x0000 }, - { 0x8700, 0xfcdb, 0x2000 }, - { 0x0700, 0xfcda, 0x0000 }, - { 0x0700, 0xfcdc, 0x0000 }, - { 0x8700, 0xfce5, 0x4000 }, - { 0x8700, 0xfce1, 0x3000 }, - { 0x8700, 0xfcdf, 0x2000 }, - { 0x0700, 0xfcde, 0x0000 }, - { 0x0700, 0xfce0, 0x0000 }, - { 0x8700, 0xfce3, 0x2000 }, - { 0x0700, 0xfce2, 0x0000 }, - { 0x0700, 0xfce4, 0x0000 }, - { 0x8700, 0xfce9, 0x3000 }, - { 0x8700, 0xfce7, 0x2000 }, - { 0x0700, 0xfce6, 0x0000 }, - { 0x0700, 0xfce8, 0x0000 }, - { 0x8700, 0xfceb, 0x2000 }, - { 0x0700, 0xfcea, 0x0000 }, - { 0x0700, 0xfcec, 0x0000 }, - { 0x8700, 0xfcfd, 0x5000 }, - { 0x8700, 0xfcf5, 0x4000 }, - { 0x8700, 0xfcf1, 0x3000 }, - { 0x8700, 0xfcef, 0x2000 }, - { 0x0700, 0xfcee, 0x0000 }, - { 0x0700, 0xfcf0, 0x0000 }, - { 0x8700, 0xfcf3, 0x2000 }, - { 0x0700, 0xfcf2, 0x0000 }, - { 0x0700, 0xfcf4, 0x0000 }, - { 0x8700, 0xfcf9, 0x3000 }, - { 0x8700, 0xfcf7, 0x2000 }, - { 0x0700, 0xfcf6, 0x0000 }, - { 0x0700, 0xfcf8, 0x0000 }, - { 0x8700, 0xfcfb, 0x2000 }, - { 0x0700, 0xfcfa, 0x0000 }, - { 0x0700, 0xfcfc, 0x0000 }, - { 0x8700, 0xfd05, 0x4000 }, - { 0x8700, 0xfd01, 0x3000 }, - { 0x8700, 0xfcff, 0x2000 }, - { 0x0700, 0xfcfe, 0x0000 }, - { 0x0700, 0xfd00, 0x0000 }, - { 0x8700, 0xfd03, 0x2000 }, - { 0x0700, 0xfd02, 0x0000 }, - { 0x0700, 0xfd04, 0x0000 }, - { 0x8700, 0xfd09, 0x3000 }, - { 0x8700, 0xfd07, 0x2000 }, - { 0x0700, 0xfd06, 0x0000 }, - { 0x0700, 0xfd08, 0x0000 }, - { 0x8700, 0xfd0b, 0x2000 }, - { 0x0700, 0xfd0a, 0x0000 }, - { 0x0700, 0xfd0c, 0x0000 }, - { 0x8700, 0xfd2d, 0x6000 }, - { 0x8700, 0xfd1d, 0x5000 }, - { 0x8700, 0xfd15, 0x4000 }, - { 0x8700, 0xfd11, 0x3000 }, - { 0x8700, 0xfd0f, 0x2000 }, - { 0x0700, 0xfd0e, 0x0000 }, - { 0x0700, 0xfd10, 0x0000 }, - { 0x8700, 0xfd13, 0x2000 }, - { 0x0700, 0xfd12, 0x0000 }, - { 0x0700, 0xfd14, 0x0000 }, - { 0x8700, 0xfd19, 0x3000 }, - { 0x8700, 0xfd17, 0x2000 }, - { 0x0700, 0xfd16, 0x0000 }, - { 0x0700, 0xfd18, 0x0000 }, - { 0x8700, 0xfd1b, 0x2000 }, - { 0x0700, 0xfd1a, 0x0000 }, - { 0x0700, 0xfd1c, 0x0000 }, - { 0x8700, 0xfd25, 0x4000 }, - { 0x8700, 0xfd21, 0x3000 }, - { 0x8700, 0xfd1f, 0x2000 }, - { 0x0700, 0xfd1e, 0x0000 }, - { 0x0700, 0xfd20, 0x0000 }, - { 0x8700, 0xfd23, 0x2000 }, - { 0x0700, 0xfd22, 0x0000 }, - { 0x0700, 0xfd24, 0x0000 }, - { 0x8700, 0xfd29, 0x3000 }, - { 0x8700, 0xfd27, 0x2000 }, - { 0x0700, 0xfd26, 0x0000 }, - { 0x0700, 0xfd28, 0x0000 }, - { 0x8700, 0xfd2b, 0x2000 }, - { 0x0700, 0xfd2a, 0x0000 }, - { 0x0700, 0xfd2c, 0x0000 }, - { 0x8700, 0xfd3d, 0x5000 }, - { 0x8700, 0xfd35, 0x4000 }, - { 0x8700, 0xfd31, 0x3000 }, - { 0x8700, 0xfd2f, 0x2000 }, - { 0x0700, 0xfd2e, 0x0000 }, - { 0x0700, 0xfd30, 0x0000 }, - { 0x8700, 0xfd33, 0x2000 }, - { 0x0700, 0xfd32, 0x0000 }, - { 0x0700, 0xfd34, 0x0000 }, - { 0x8700, 0xfd39, 0x3000 }, - { 0x8700, 0xfd37, 0x2000 }, - { 0x0700, 0xfd36, 0x0000 }, - { 0x0700, 0xfd38, 0x0000 }, - { 0x8700, 0xfd3b, 0x2000 }, - { 0x0700, 0xfd3a, 0x0000 }, - { 0x0700, 0xfd3c, 0x0000 }, - { 0x8700, 0xfd55, 0x4000 }, - { 0x8700, 0xfd51, 0x3000 }, - { 0x9200, 0xfd3f, 0x2000 }, - { 0x1600, 0xfd3e, 0x0000 }, - { 0x0700, 0xfd50, 0x0000 }, - { 0x8700, 0xfd53, 0x2000 }, - { 0x0700, 0xfd52, 0x0000 }, - { 0x0700, 0xfd54, 0x0000 }, - { 0x8700, 0xfd59, 0x3000 }, - { 0x8700, 0xfd57, 0x2000 }, - { 0x0700, 0xfd56, 0x0000 }, - { 0x0700, 0xfd58, 0x0000 }, - { 0x8700, 0xfd5b, 0x2000 }, - { 0x0700, 0xfd5a, 0x0000 }, - { 0x0700, 0xfd5c, 0x0000 }, - { 0x8c00, 0xfe09, 0x8000 }, - { 0x8700, 0xfd9f, 0x7000 }, - { 0x8700, 0xfd7d, 0x6000 }, - { 0x8700, 0xfd6d, 0x5000 }, - { 0x8700, 0xfd65, 0x4000 }, - { 0x8700, 0xfd61, 0x3000 }, - { 0x8700, 0xfd5f, 0x2000 }, - { 0x0700, 0xfd5e, 0x0000 }, - { 0x0700, 0xfd60, 0x0000 }, - { 0x8700, 0xfd63, 0x2000 }, - { 0x0700, 0xfd62, 0x0000 }, - { 0x0700, 0xfd64, 0x0000 }, - { 0x8700, 0xfd69, 0x3000 }, - { 0x8700, 0xfd67, 0x2000 }, - { 0x0700, 0xfd66, 0x0000 }, - { 0x0700, 0xfd68, 0x0000 }, - { 0x8700, 0xfd6b, 0x2000 }, - { 0x0700, 0xfd6a, 0x0000 }, - { 0x0700, 0xfd6c, 0x0000 }, - { 0x8700, 0xfd75, 0x4000 }, - { 0x8700, 0xfd71, 0x3000 }, - { 0x8700, 0xfd6f, 0x2000 }, - { 0x0700, 0xfd6e, 0x0000 }, - { 0x0700, 0xfd70, 0x0000 }, - { 0x8700, 0xfd73, 0x2000 }, - { 0x0700, 0xfd72, 0x0000 }, - { 0x0700, 0xfd74, 0x0000 }, - { 0x8700, 0xfd79, 0x3000 }, - { 0x8700, 0xfd77, 0x2000 }, - { 0x0700, 0xfd76, 0x0000 }, - { 0x0700, 0xfd78, 0x0000 }, - { 0x8700, 0xfd7b, 0x2000 }, - { 0x0700, 0xfd7a, 0x0000 }, - { 0x0700, 0xfd7c, 0x0000 }, - { 0x8700, 0xfd8d, 0x5000 }, - { 0x8700, 0xfd85, 0x4000 }, - { 0x8700, 0xfd81, 0x3000 }, - { 0x8700, 0xfd7f, 0x2000 }, - { 0x0700, 0xfd7e, 0x0000 }, - { 0x0700, 0xfd80, 0x0000 }, - { 0x8700, 0xfd83, 0x2000 }, - { 0x0700, 0xfd82, 0x0000 }, - { 0x0700, 0xfd84, 0x0000 }, - { 0x8700, 0xfd89, 0x3000 }, - { 0x8700, 0xfd87, 0x2000 }, - { 0x0700, 0xfd86, 0x0000 }, - { 0x0700, 0xfd88, 0x0000 }, - { 0x8700, 0xfd8b, 0x2000 }, - { 0x0700, 0xfd8a, 0x0000 }, - { 0x0700, 0xfd8c, 0x0000 }, - { 0x8700, 0xfd97, 0x4000 }, - { 0x8700, 0xfd93, 0x3000 }, - { 0x8700, 0xfd8f, 0x2000 }, - { 0x0700, 0xfd8e, 0x0000 }, - { 0x0700, 0xfd92, 0x0000 }, - { 0x8700, 0xfd95, 0x2000 }, - { 0x0700, 0xfd94, 0x0000 }, - { 0x0700, 0xfd96, 0x0000 }, - { 0x8700, 0xfd9b, 0x3000 }, - { 0x8700, 0xfd99, 0x2000 }, - { 0x0700, 0xfd98, 0x0000 }, - { 0x0700, 0xfd9a, 0x0000 }, - { 0x8700, 0xfd9d, 0x2000 }, - { 0x0700, 0xfd9c, 0x0000 }, - { 0x0700, 0xfd9e, 0x0000 }, - { 0x8700, 0xfdbf, 0x6000 }, - { 0x8700, 0xfdaf, 0x5000 }, - { 0x8700, 0xfda7, 0x4000 }, - { 0x8700, 0xfda3, 0x3000 }, - { 0x8700, 0xfda1, 0x2000 }, - { 0x0700, 0xfda0, 0x0000 }, - { 0x0700, 0xfda2, 0x0000 }, - { 0x8700, 0xfda5, 0x2000 }, - { 0x0700, 0xfda4, 0x0000 }, - { 0x0700, 0xfda6, 0x0000 }, - { 0x8700, 0xfdab, 0x3000 }, - { 0x8700, 0xfda9, 0x2000 }, - { 0x0700, 0xfda8, 0x0000 }, - { 0x0700, 0xfdaa, 0x0000 }, - { 0x8700, 0xfdad, 0x2000 }, - { 0x0700, 0xfdac, 0x0000 }, - { 0x0700, 0xfdae, 0x0000 }, - { 0x8700, 0xfdb7, 0x4000 }, - { 0x8700, 0xfdb3, 0x3000 }, - { 0x8700, 0xfdb1, 0x2000 }, - { 0x0700, 0xfdb0, 0x0000 }, - { 0x0700, 0xfdb2, 0x0000 }, - { 0x8700, 0xfdb5, 0x2000 }, - { 0x0700, 0xfdb4, 0x0000 }, - { 0x0700, 0xfdb6, 0x0000 }, - { 0x8700, 0xfdbb, 0x3000 }, - { 0x8700, 0xfdb9, 0x2000 }, - { 0x0700, 0xfdb8, 0x0000 }, - { 0x0700, 0xfdba, 0x0000 }, - { 0x8700, 0xfdbd, 0x2000 }, - { 0x0700, 0xfdbc, 0x0000 }, - { 0x0700, 0xfdbe, 0x0000 }, - { 0x8700, 0xfdf7, 0x5000 }, - { 0x8700, 0xfdc7, 0x4000 }, - { 0x8700, 0xfdc3, 0x3000 }, - { 0x8700, 0xfdc1, 0x2000 }, - { 0x0700, 0xfdc0, 0x0000 }, - { 0x0700, 0xfdc2, 0x0000 }, - { 0x8700, 0xfdc5, 0x2000 }, - { 0x0700, 0xfdc4, 0x0000 }, - { 0x0700, 0xfdc6, 0x0000 }, - { 0x8700, 0xfdf3, 0x3000 }, - { 0x8700, 0xfdf1, 0x2000 }, - { 0x0700, 0xfdf0, 0x0000 }, - { 0x0700, 0xfdf2, 0x0000 }, - { 0x8700, 0xfdf5, 0x2000 }, - { 0x0700, 0xfdf4, 0x0000 }, - { 0x0700, 0xfdf6, 0x0000 }, - { 0x8c00, 0xfe01, 0x4000 }, - { 0x8700, 0xfdfb, 0x3000 }, - { 0x8700, 0xfdf9, 0x2000 }, - { 0x0700, 0xfdf8, 0x0000 }, - { 0x0700, 0xfdfa, 0x0000 }, - { 0x9a00, 0xfdfd, 0x2000 }, - { 0x1700, 0xfdfc, 0x0000 }, - { 0x0c00, 0xfe00, 0x0000 }, - { 0x8c00, 0xfe05, 0x3000 }, - { 0x8c00, 0xfe03, 0x2000 }, - { 0x0c00, 0xfe02, 0x0000 }, - { 0x0c00, 0xfe04, 0x0000 }, - { 0x8c00, 0xfe07, 0x2000 }, - { 0x0c00, 0xfe06, 0x0000 }, - { 0x0c00, 0xfe08, 0x0000 }, - { 0x9900, 0xfe66, 0x7000 }, - { 0x9500, 0xfe45, 0x6000 }, - { 0x9600, 0xfe35, 0x5000 }, - { 0x8c00, 0xfe21, 0x4000 }, - { 0x8c00, 0xfe0d, 0x3000 }, - { 0x8c00, 0xfe0b, 0x2000 }, - { 0x0c00, 0xfe0a, 0x0000 }, - { 0x0c00, 0xfe0c, 0x0000 }, - { 0x8c00, 0xfe0f, 0x2000 }, - { 0x0c00, 0xfe0e, 0x0000 }, - { 0x0c00, 0xfe20, 0x0000 }, - { 0x9100, 0xfe31, 0x3000 }, - { 0x8c00, 0xfe23, 0x2000 }, - { 0x0c00, 0xfe22, 0x0000 }, - { 0x1500, 0xfe30, 0x0000 }, - { 0x9000, 0xfe33, 0x2000 }, - { 0x1100, 0xfe32, 0x0000 }, - { 0x1000, 0xfe34, 0x0000 }, - { 0x9600, 0xfe3d, 0x4000 }, - { 0x9600, 0xfe39, 0x3000 }, - { 0x9600, 0xfe37, 0x2000 }, - { 0x1200, 0xfe36, 0x0000 }, - { 0x1200, 0xfe38, 0x0000 }, - { 0x9600, 0xfe3b, 0x2000 }, - { 0x1200, 0xfe3a, 0x0000 }, - { 0x1200, 0xfe3c, 0x0000 }, - { 0x9600, 0xfe41, 0x3000 }, - { 0x9600, 0xfe3f, 0x2000 }, - { 0x1200, 0xfe3e, 0x0000 }, - { 0x1200, 0xfe40, 0x0000 }, - { 0x9600, 0xfe43, 0x2000 }, - { 0x1200, 0xfe42, 0x0000 }, - { 0x1200, 0xfe44, 0x0000 }, - { 0x9500, 0xfe56, 0x5000 }, - { 0x9000, 0xfe4d, 0x4000 }, - { 0x9500, 0xfe49, 0x3000 }, - { 0x9600, 0xfe47, 0x2000 }, - { 0x1500, 0xfe46, 0x0000 }, - { 0x1200, 0xfe48, 0x0000 }, - { 0x9500, 0xfe4b, 0x2000 }, - { 0x1500, 0xfe4a, 0x0000 }, - { 0x1500, 0xfe4c, 0x0000 }, - { 0x9500, 0xfe51, 0x3000 }, - { 0x9000, 0xfe4f, 0x2000 }, - { 0x1000, 0xfe4e, 0x0000 }, - { 0x1500, 0xfe50, 0x0000 }, - { 0x9500, 0xfe54, 0x2000 }, - { 0x1500, 0xfe52, 0x0000 }, - { 0x1500, 0xfe55, 0x0000 }, - { 0x9200, 0xfe5e, 0x4000 }, - { 0x9200, 0xfe5a, 0x3000 }, - { 0x9100, 0xfe58, 0x2000 }, - { 0x1500, 0xfe57, 0x0000 }, - { 0x1600, 0xfe59, 0x0000 }, - { 0x9200, 0xfe5c, 0x2000 }, - { 0x1600, 0xfe5b, 0x0000 }, - { 0x1600, 0xfe5d, 0x0000 }, - { 0x9900, 0xfe62, 0x3000 }, - { 0x9500, 0xfe60, 0x2000 }, - { 0x1500, 0xfe5f, 0x0000 }, - { 0x1500, 0xfe61, 0x0000 }, - { 0x9900, 0xfe64, 0x2000 }, - { 0x1100, 0xfe63, 0x0000 }, - { 0x1900, 0xfe65, 0x0000 }, - { 0x8700, 0xfe8c, 0x6000 }, - { 0x8700, 0xfe7c, 0x5000 }, - { 0x8700, 0xfe73, 0x4000 }, - { 0x9500, 0xfe6b, 0x3000 }, - { 0x9700, 0xfe69, 0x2000 }, - { 0x1500, 0xfe68, 0x0000 }, - { 0x1500, 0xfe6a, 0x0000 }, - { 0x8700, 0xfe71, 0x2000 }, - { 0x0700, 0xfe70, 0x0000 }, - { 0x0700, 0xfe72, 0x0000 }, - { 0x8700, 0xfe78, 0x3000 }, - { 0x8700, 0xfe76, 0x2000 }, - { 0x0700, 0xfe74, 0x0000 }, - { 0x0700, 0xfe77, 0x0000 }, - { 0x8700, 0xfe7a, 0x2000 }, - { 0x0700, 0xfe79, 0x0000 }, - { 0x0700, 0xfe7b, 0x0000 }, - { 0x8700, 0xfe84, 0x4000 }, - { 0x8700, 0xfe80, 0x3000 }, - { 0x8700, 0xfe7e, 0x2000 }, - { 0x0700, 0xfe7d, 0x0000 }, - { 0x0700, 0xfe7f, 0x0000 }, - { 0x8700, 0xfe82, 0x2000 }, - { 0x0700, 0xfe81, 0x0000 }, - { 0x0700, 0xfe83, 0x0000 }, - { 0x8700, 0xfe88, 0x3000 }, - { 0x8700, 0xfe86, 0x2000 }, - { 0x0700, 0xfe85, 0x0000 }, - { 0x0700, 0xfe87, 0x0000 }, - { 0x8700, 0xfe8a, 0x2000 }, - { 0x0700, 0xfe89, 0x0000 }, - { 0x0700, 0xfe8b, 0x0000 }, - { 0x8700, 0xfe9c, 0x5000 }, - { 0x8700, 0xfe94, 0x4000 }, - { 0x8700, 0xfe90, 0x3000 }, - { 0x8700, 0xfe8e, 0x2000 }, - { 0x0700, 0xfe8d, 0x0000 }, - { 0x0700, 0xfe8f, 0x0000 }, - { 0x8700, 0xfe92, 0x2000 }, - { 0x0700, 0xfe91, 0x0000 }, - { 0x0700, 0xfe93, 0x0000 }, - { 0x8700, 0xfe98, 0x3000 }, - { 0x8700, 0xfe96, 0x2000 }, - { 0x0700, 0xfe95, 0x0000 }, - { 0x0700, 0xfe97, 0x0000 }, - { 0x8700, 0xfe9a, 0x2000 }, - { 0x0700, 0xfe99, 0x0000 }, - { 0x0700, 0xfe9b, 0x0000 }, - { 0x8700, 0xfea4, 0x4000 }, - { 0x8700, 0xfea0, 0x3000 }, - { 0x8700, 0xfe9e, 0x2000 }, - { 0x0700, 0xfe9d, 0x0000 }, - { 0x0700, 0xfe9f, 0x0000 }, - { 0x8700, 0xfea2, 0x2000 }, - { 0x0700, 0xfea1, 0x0000 }, - { 0x0700, 0xfea3, 0x0000 }, - { 0x8700, 0xfea8, 0x3000 }, - { 0x8700, 0xfea6, 0x2000 }, - { 0x0700, 0xfea5, 0x0000 }, - { 0x0700, 0xfea7, 0x0000 }, - { 0x8700, 0xfeaa, 0x2000 }, - { 0x0700, 0xfea9, 0x0000 }, - { 0x0700, 0xfeab, 0x0000 }, - { 0x8700, 0xffaf, 0x9000 }, - { 0x8900, 0xff2f, 0x8020 }, - { 0x8700, 0xfeec, 0x7000 }, - { 0x8700, 0xfecc, 0x6000 }, - { 0x8700, 0xfebc, 0x5000 }, - { 0x8700, 0xfeb4, 0x4000 }, - { 0x8700, 0xfeb0, 0x3000 }, - { 0x8700, 0xfeae, 0x2000 }, - { 0x0700, 0xfead, 0x0000 }, - { 0x0700, 0xfeaf, 0x0000 }, - { 0x8700, 0xfeb2, 0x2000 }, - { 0x0700, 0xfeb1, 0x0000 }, - { 0x0700, 0xfeb3, 0x0000 }, - { 0x8700, 0xfeb8, 0x3000 }, - { 0x8700, 0xfeb6, 0x2000 }, - { 0x0700, 0xfeb5, 0x0000 }, - { 0x0700, 0xfeb7, 0x0000 }, - { 0x8700, 0xfeba, 0x2000 }, - { 0x0700, 0xfeb9, 0x0000 }, - { 0x0700, 0xfebb, 0x0000 }, - { 0x8700, 0xfec4, 0x4000 }, - { 0x8700, 0xfec0, 0x3000 }, - { 0x8700, 0xfebe, 0x2000 }, - { 0x0700, 0xfebd, 0x0000 }, - { 0x0700, 0xfebf, 0x0000 }, - { 0x8700, 0xfec2, 0x2000 }, - { 0x0700, 0xfec1, 0x0000 }, - { 0x0700, 0xfec3, 0x0000 }, - { 0x8700, 0xfec8, 0x3000 }, - { 0x8700, 0xfec6, 0x2000 }, - { 0x0700, 0xfec5, 0x0000 }, - { 0x0700, 0xfec7, 0x0000 }, - { 0x8700, 0xfeca, 0x2000 }, - { 0x0700, 0xfec9, 0x0000 }, - { 0x0700, 0xfecb, 0x0000 }, - { 0x8700, 0xfedc, 0x5000 }, - { 0x8700, 0xfed4, 0x4000 }, - { 0x8700, 0xfed0, 0x3000 }, - { 0x8700, 0xfece, 0x2000 }, - { 0x0700, 0xfecd, 0x0000 }, - { 0x0700, 0xfecf, 0x0000 }, - { 0x8700, 0xfed2, 0x2000 }, - { 0x0700, 0xfed1, 0x0000 }, - { 0x0700, 0xfed3, 0x0000 }, - { 0x8700, 0xfed8, 0x3000 }, - { 0x8700, 0xfed6, 0x2000 }, - { 0x0700, 0xfed5, 0x0000 }, - { 0x0700, 0xfed7, 0x0000 }, - { 0x8700, 0xfeda, 0x2000 }, - { 0x0700, 0xfed9, 0x0000 }, - { 0x0700, 0xfedb, 0x0000 }, - { 0x8700, 0xfee4, 0x4000 }, - { 0x8700, 0xfee0, 0x3000 }, - { 0x8700, 0xfede, 0x2000 }, - { 0x0700, 0xfedd, 0x0000 }, - { 0x0700, 0xfedf, 0x0000 }, - { 0x8700, 0xfee2, 0x2000 }, - { 0x0700, 0xfee1, 0x0000 }, - { 0x0700, 0xfee3, 0x0000 }, - { 0x8700, 0xfee8, 0x3000 }, - { 0x8700, 0xfee6, 0x2000 }, - { 0x0700, 0xfee5, 0x0000 }, - { 0x0700, 0xfee7, 0x0000 }, - { 0x8700, 0xfeea, 0x2000 }, - { 0x0700, 0xfee9, 0x0000 }, - { 0x0700, 0xfeeb, 0x0000 }, - { 0x9500, 0xff0f, 0x6000 }, - { 0x8700, 0xfefc, 0x5000 }, - { 0x8700, 0xfef4, 0x4000 }, - { 0x8700, 0xfef0, 0x3000 }, - { 0x8700, 0xfeee, 0x2000 }, - { 0x0700, 0xfeed, 0x0000 }, - { 0x0700, 0xfeef, 0x0000 }, - { 0x8700, 0xfef2, 0x2000 }, - { 0x0700, 0xfef1, 0x0000 }, - { 0x0700, 0xfef3, 0x0000 }, - { 0x8700, 0xfef8, 0x3000 }, - { 0x8700, 0xfef6, 0x2000 }, - { 0x0700, 0xfef5, 0x0000 }, - { 0x0700, 0xfef7, 0x0000 }, - { 0x8700, 0xfefa, 0x2000 }, - { 0x0700, 0xfef9, 0x0000 }, - { 0x0700, 0xfefb, 0x0000 }, - { 0x9500, 0xff07, 0x4000 }, - { 0x9500, 0xff03, 0x3000 }, - { 0x9500, 0xff01, 0x2000 }, - { 0x0100, 0xfeff, 0x0000 }, - { 0x1500, 0xff02, 0x0000 }, - { 0x9500, 0xff05, 0x2000 }, - { 0x1700, 0xff04, 0x0000 }, - { 0x1500, 0xff06, 0x0000 }, - { 0x9900, 0xff0b, 0x3000 }, - { 0x9200, 0xff09, 0x2000 }, - { 0x1600, 0xff08, 0x0000 }, - { 0x1500, 0xff0a, 0x0000 }, - { 0x9100, 0xff0d, 0x2000 }, - { 0x1500, 0xff0c, 0x0000 }, - { 0x1500, 0xff0e, 0x0000 }, - { 0x9500, 0xff1f, 0x5000 }, - { 0x8d00, 0xff17, 0x4000 }, - { 0x8d00, 0xff13, 0x3000 }, - { 0x8d00, 0xff11, 0x2000 }, - { 0x0d00, 0xff10, 0x0000 }, - { 0x0d00, 0xff12, 0x0000 }, - { 0x8d00, 0xff15, 0x2000 }, - { 0x0d00, 0xff14, 0x0000 }, - { 0x0d00, 0xff16, 0x0000 }, - { 0x9500, 0xff1b, 0x3000 }, - { 0x8d00, 0xff19, 0x2000 }, - { 0x0d00, 0xff18, 0x0000 }, - { 0x1500, 0xff1a, 0x0000 }, - { 0x9900, 0xff1d, 0x2000 }, - { 0x1900, 0xff1c, 0x0000 }, - { 0x1900, 0xff1e, 0x0000 }, - { 0x8900, 0xff27, 0x4020 }, - { 0x8900, 0xff23, 0x3020 }, - { 0x8900, 0xff21, 0x2020 }, - { 0x1500, 0xff20, 0x0000 }, - { 0x0900, 0xff22, 0x0020 }, - { 0x8900, 0xff25, 0x2020 }, - { 0x0900, 0xff24, 0x0020 }, - { 0x0900, 0xff26, 0x0020 }, - { 0x8900, 0xff2b, 0x3020 }, - { 0x8900, 0xff29, 0x2020 }, - { 0x0900, 0xff28, 0x0020 }, - { 0x0900, 0xff2a, 0x0020 }, - { 0x8900, 0xff2d, 0x2020 }, - { 0x0900, 0xff2c, 0x0020 }, - { 0x0900, 0xff2e, 0x0020 }, - { 0x8700, 0xff6f, 0x7000 }, - { 0x8500, 0xff4f, 0x6fe0 }, - { 0x9000, 0xff3f, 0x5000 }, - { 0x8900, 0xff37, 0x4020 }, - { 0x8900, 0xff33, 0x3020 }, - { 0x8900, 0xff31, 0x2020 }, - { 0x0900, 0xff30, 0x0020 }, - { 0x0900, 0xff32, 0x0020 }, - { 0x8900, 0xff35, 0x2020 }, - { 0x0900, 0xff34, 0x0020 }, - { 0x0900, 0xff36, 0x0020 }, - { 0x9600, 0xff3b, 0x3000 }, - { 0x8900, 0xff39, 0x2020 }, - { 0x0900, 0xff38, 0x0020 }, - { 0x0900, 0xff3a, 0x0020 }, - { 0x9200, 0xff3d, 0x2000 }, - { 0x1500, 0xff3c, 0x0000 }, - { 0x1800, 0xff3e, 0x0000 }, - { 0x8500, 0xff47, 0x4fe0 }, - { 0x8500, 0xff43, 0x3fe0 }, - { 0x8500, 0xff41, 0x2fe0 }, - { 0x1800, 0xff40, 0x0000 }, - { 0x0500, 0xff42, 0x0fe0 }, - { 0x8500, 0xff45, 0x2fe0 }, - { 0x0500, 0xff44, 0x0fe0 }, - { 0x0500, 0xff46, 0x0fe0 }, - { 0x8500, 0xff4b, 0x3fe0 }, - { 0x8500, 0xff49, 0x2fe0 }, - { 0x0500, 0xff48, 0x0fe0 }, - { 0x0500, 0xff4a, 0x0fe0 }, - { 0x8500, 0xff4d, 0x2fe0 }, - { 0x0500, 0xff4c, 0x0fe0 }, - { 0x0500, 0xff4e, 0x0fe0 }, - { 0x9600, 0xff5f, 0x5000 }, - { 0x8500, 0xff57, 0x4fe0 }, - { 0x8500, 0xff53, 0x3fe0 }, - { 0x8500, 0xff51, 0x2fe0 }, - { 0x0500, 0xff50, 0x0fe0 }, - { 0x0500, 0xff52, 0x0fe0 }, - { 0x8500, 0xff55, 0x2fe0 }, - { 0x0500, 0xff54, 0x0fe0 }, - { 0x0500, 0xff56, 0x0fe0 }, - { 0x9600, 0xff5b, 0x3000 }, - { 0x8500, 0xff59, 0x2fe0 }, - { 0x0500, 0xff58, 0x0fe0 }, - { 0x0500, 0xff5a, 0x0fe0 }, - { 0x9200, 0xff5d, 0x2000 }, - { 0x1900, 0xff5c, 0x0000 }, - { 0x1900, 0xff5e, 0x0000 }, - { 0x8700, 0xff67, 0x4000 }, - { 0x9200, 0xff63, 0x3000 }, - { 0x9500, 0xff61, 0x2000 }, - { 0x1200, 0xff60, 0x0000 }, - { 0x1600, 0xff62, 0x0000 }, - { 0x9000, 0xff65, 0x2000 }, - { 0x1500, 0xff64, 0x0000 }, - { 0x0700, 0xff66, 0x0000 }, - { 0x8700, 0xff6b, 0x3000 }, - { 0x8700, 0xff69, 0x2000 }, - { 0x0700, 0xff68, 0x0000 }, - { 0x0700, 0xff6a, 0x0000 }, - { 0x8700, 0xff6d, 0x2000 }, - { 0x0700, 0xff6c, 0x0000 }, - { 0x0700, 0xff6e, 0x0000 }, - { 0x8700, 0xff8f, 0x6000 }, - { 0x8700, 0xff7f, 0x5000 }, - { 0x8700, 0xff77, 0x4000 }, - { 0x8700, 0xff73, 0x3000 }, - { 0x8700, 0xff71, 0x2000 }, - { 0x0600, 0xff70, 0x0000 }, - { 0x0700, 0xff72, 0x0000 }, - { 0x8700, 0xff75, 0x2000 }, - { 0x0700, 0xff74, 0x0000 }, - { 0x0700, 0xff76, 0x0000 }, - { 0x8700, 0xff7b, 0x3000 }, - { 0x8700, 0xff79, 0x2000 }, - { 0x0700, 0xff78, 0x0000 }, - { 0x0700, 0xff7a, 0x0000 }, - { 0x8700, 0xff7d, 0x2000 }, - { 0x0700, 0xff7c, 0x0000 }, - { 0x0700, 0xff7e, 0x0000 }, - { 0x8700, 0xff87, 0x4000 }, - { 0x8700, 0xff83, 0x3000 }, - { 0x8700, 0xff81, 0x2000 }, - { 0x0700, 0xff80, 0x0000 }, - { 0x0700, 0xff82, 0x0000 }, - { 0x8700, 0xff85, 0x2000 }, - { 0x0700, 0xff84, 0x0000 }, - { 0x0700, 0xff86, 0x0000 }, - { 0x8700, 0xff8b, 0x3000 }, - { 0x8700, 0xff89, 0x2000 }, - { 0x0700, 0xff88, 0x0000 }, - { 0x0700, 0xff8a, 0x0000 }, - { 0x8700, 0xff8d, 0x2000 }, - { 0x0700, 0xff8c, 0x0000 }, - { 0x0700, 0xff8e, 0x0000 }, - { 0x8600, 0xff9f, 0x5000 }, - { 0x8700, 0xff97, 0x4000 }, - { 0x8700, 0xff93, 0x3000 }, - { 0x8700, 0xff91, 0x2000 }, - { 0x0700, 0xff90, 0x0000 }, - { 0x0700, 0xff92, 0x0000 }, - { 0x8700, 0xff95, 0x2000 }, - { 0x0700, 0xff94, 0x0000 }, - { 0x0700, 0xff96, 0x0000 }, - { 0x8700, 0xff9b, 0x3000 }, - { 0x8700, 0xff99, 0x2000 }, - { 0x0700, 0xff98, 0x0000 }, - { 0x0700, 0xff9a, 0x0000 }, - { 0x8700, 0xff9d, 0x2000 }, - { 0x0700, 0xff9c, 0x0000 }, - { 0x0600, 0xff9e, 0x0000 }, - { 0x8700, 0xffa7, 0x4000 }, - { 0x8700, 0xffa3, 0x3000 }, - { 0x8700, 0xffa1, 0x2000 }, - { 0x0700, 0xffa0, 0x0000 }, - { 0x0700, 0xffa2, 0x0000 }, - { 0x8700, 0xffa5, 0x2000 }, - { 0x0700, 0xffa4, 0x0000 }, - { 0x0700, 0xffa6, 0x0000 }, - { 0x8700, 0xffab, 0x3000 }, - { 0x8700, 0xffa9, 0x2000 }, - { 0x0700, 0xffa8, 0x0000 }, - { 0x0700, 0xffaa, 0x0000 }, - { 0x8700, 0xffad, 0x2000 }, - { 0x0700, 0xffac, 0x0000 }, - { 0x0700, 0xffae, 0x0000 }, - { 0x8701, 0x004c, 0x8000 }, - { 0x8701, 0x0008, 0x7000 }, - { 0x8700, 0xffd6, 0x6000 }, - { 0x8700, 0xffc2, 0x5000 }, - { 0x8700, 0xffb7, 0x4000 }, - { 0x8700, 0xffb3, 0x3000 }, - { 0x8700, 0xffb1, 0x2000 }, - { 0x0700, 0xffb0, 0x0000 }, - { 0x0700, 0xffb2, 0x0000 }, - { 0x8700, 0xffb5, 0x2000 }, - { 0x0700, 0xffb4, 0x0000 }, - { 0x0700, 0xffb6, 0x0000 }, - { 0x8700, 0xffbb, 0x3000 }, - { 0x8700, 0xffb9, 0x2000 }, - { 0x0700, 0xffb8, 0x0000 }, - { 0x0700, 0xffba, 0x0000 }, - { 0x8700, 0xffbd, 0x2000 }, - { 0x0700, 0xffbc, 0x0000 }, - { 0x0700, 0xffbe, 0x0000 }, - { 0x8700, 0xffcc, 0x4000 }, - { 0x8700, 0xffc6, 0x3000 }, - { 0x8700, 0xffc4, 0x2000 }, - { 0x0700, 0xffc3, 0x0000 }, - { 0x0700, 0xffc5, 0x0000 }, - { 0x8700, 0xffca, 0x2000 }, - { 0x0700, 0xffc7, 0x0000 }, - { 0x0700, 0xffcb, 0x0000 }, - { 0x8700, 0xffd2, 0x3000 }, - { 0x8700, 0xffce, 0x2000 }, - { 0x0700, 0xffcd, 0x0000 }, - { 0x0700, 0xffcf, 0x0000 }, - { 0x8700, 0xffd4, 0x2000 }, - { 0x0700, 0xffd3, 0x0000 }, - { 0x0700, 0xffd5, 0x0000 }, - { 0x9900, 0xffec, 0x5000 }, - { 0x9800, 0xffe3, 0x4000 }, - { 0x8700, 0xffdc, 0x3000 }, - { 0x8700, 0xffda, 0x2000 }, - { 0x0700, 0xffd7, 0x0000 }, - { 0x0700, 0xffdb, 0x0000 }, - { 0x9700, 0xffe1, 0x2000 }, - { 0x1700, 0xffe0, 0x0000 }, - { 0x1900, 0xffe2, 0x0000 }, - { 0x9a00, 0xffe8, 0x3000 }, - { 0x9700, 0xffe5, 0x2000 }, - { 0x1a00, 0xffe4, 0x0000 }, - { 0x1700, 0xffe6, 0x0000 }, - { 0x9900, 0xffea, 0x2000 }, - { 0x1900, 0xffe9, 0x0000 }, - { 0x1900, 0xffeb, 0x0000 }, - { 0x8701, 0x0000, 0x4000 }, - { 0x8100, 0xfffa, 0x3000 }, - { 0x9a00, 0xffee, 0x2000 }, - { 0x1a00, 0xffed, 0x0000 }, - { 0x0100, 0xfff9, 0x0000 }, - { 0x9a00, 0xfffc, 0x2000 }, - { 0x0100, 0xfffb, 0x0000 }, - { 0x1a00, 0xfffd, 0x0000 }, - { 0x8701, 0x0004, 0x3000 }, - { 0x8701, 0x0002, 0x2000 }, - { 0x0701, 0x0001, 0x0000 }, - { 0x0701, 0x0003, 0x0000 }, - { 0x8701, 0x0006, 0x2000 }, - { 0x0701, 0x0005, 0x0000 }, - { 0x0701, 0x0007, 0x0000 }, - { 0x8701, 0x002a, 0x6000 }, - { 0x8701, 0x0019, 0x5000 }, - { 0x8701, 0x0011, 0x4000 }, - { 0x8701, 0x000d, 0x3000 }, - { 0x8701, 0x000a, 0x2000 }, - { 0x0701, 0x0009, 0x0000 }, - { 0x0701, 0x000b, 0x0000 }, - { 0x8701, 0x000f, 0x2000 }, - { 0x0701, 0x000e, 0x0000 }, - { 0x0701, 0x0010, 0x0000 }, - { 0x8701, 0x0015, 0x3000 }, - { 0x8701, 0x0013, 0x2000 }, - { 0x0701, 0x0012, 0x0000 }, - { 0x0701, 0x0014, 0x0000 }, - { 0x8701, 0x0017, 0x2000 }, - { 0x0701, 0x0016, 0x0000 }, - { 0x0701, 0x0018, 0x0000 }, - { 0x8701, 0x0021, 0x4000 }, - { 0x8701, 0x001d, 0x3000 }, - { 0x8701, 0x001b, 0x2000 }, - { 0x0701, 0x001a, 0x0000 }, - { 0x0701, 0x001c, 0x0000 }, - { 0x8701, 0x001f, 0x2000 }, - { 0x0701, 0x001e, 0x0000 }, - { 0x0701, 0x0020, 0x0000 }, - { 0x8701, 0x0025, 0x3000 }, - { 0x8701, 0x0023, 0x2000 }, - { 0x0701, 0x0022, 0x0000 }, - { 0x0701, 0x0024, 0x0000 }, - { 0x8701, 0x0028, 0x2000 }, - { 0x0701, 0x0026, 0x0000 }, - { 0x0701, 0x0029, 0x0000 }, - { 0x8701, 0x003a, 0x5000 }, - { 0x8701, 0x0032, 0x4000 }, - { 0x8701, 0x002e, 0x3000 }, - { 0x8701, 0x002c, 0x2000 }, - { 0x0701, 0x002b, 0x0000 }, - { 0x0701, 0x002d, 0x0000 }, - { 0x8701, 0x0030, 0x2000 }, - { 0x0701, 0x002f, 0x0000 }, - { 0x0701, 0x0031, 0x0000 }, - { 0x8701, 0x0036, 0x3000 }, - { 0x8701, 0x0034, 0x2000 }, - { 0x0701, 0x0033, 0x0000 }, - { 0x0701, 0x0035, 0x0000 }, - { 0x8701, 0x0038, 0x2000 }, - { 0x0701, 0x0037, 0x0000 }, - { 0x0701, 0x0039, 0x0000 }, - { 0x8701, 0x0044, 0x4000 }, - { 0x8701, 0x0040, 0x3000 }, - { 0x8701, 0x003d, 0x2000 }, - { 0x0701, 0x003c, 0x0000 }, - { 0x0701, 0x003f, 0x0000 }, - { 0x8701, 0x0042, 0x2000 }, - { 0x0701, 0x0041, 0x0000 }, - { 0x0701, 0x0043, 0x0000 }, - { 0x8701, 0x0048, 0x3000 }, - { 0x8701, 0x0046, 0x2000 }, - { 0x0701, 0x0045, 0x0000 }, - { 0x0701, 0x0047, 0x0000 }, - { 0x8701, 0x004a, 0x2000 }, - { 0x0701, 0x0049, 0x0000 }, - { 0x0701, 0x004b, 0x0000 }, - { 0x8701, 0x00b0, 0x7000 }, - { 0x8701, 0x0090, 0x6000 }, - { 0x8701, 0x0080, 0x5000 }, - { 0x8701, 0x0056, 0x4000 }, - { 0x8701, 0x0052, 0x3000 }, - { 0x8701, 0x0050, 0x2000 }, - { 0x0701, 0x004d, 0x0000 }, - { 0x0701, 0x0051, 0x0000 }, - { 0x8701, 0x0054, 0x2000 }, - { 0x0701, 0x0053, 0x0000 }, - { 0x0701, 0x0055, 0x0000 }, - { 0x8701, 0x005a, 0x3000 }, - { 0x8701, 0x0058, 0x2000 }, - { 0x0701, 0x0057, 0x0000 }, - { 0x0701, 0x0059, 0x0000 }, - { 0x8701, 0x005c, 0x2000 }, - { 0x0701, 0x005b, 0x0000 }, - { 0x0701, 0x005d, 0x0000 }, - { 0x8701, 0x0088, 0x4000 }, - { 0x8701, 0x0084, 0x3000 }, - { 0x8701, 0x0082, 0x2000 }, - { 0x0701, 0x0081, 0x0000 }, - { 0x0701, 0x0083, 0x0000 }, - { 0x8701, 0x0086, 0x2000 }, - { 0x0701, 0x0085, 0x0000 }, - { 0x0701, 0x0087, 0x0000 }, - { 0x8701, 0x008c, 0x3000 }, - { 0x8701, 0x008a, 0x2000 }, - { 0x0701, 0x0089, 0x0000 }, - { 0x0701, 0x008b, 0x0000 }, - { 0x8701, 0x008e, 0x2000 }, - { 0x0701, 0x008d, 0x0000 }, - { 0x0701, 0x008f, 0x0000 }, - { 0x8701, 0x00a0, 0x5000 }, - { 0x8701, 0x0098, 0x4000 }, - { 0x8701, 0x0094, 0x3000 }, - { 0x8701, 0x0092, 0x2000 }, - { 0x0701, 0x0091, 0x0000 }, - { 0x0701, 0x0093, 0x0000 }, - { 0x8701, 0x0096, 0x2000 }, - { 0x0701, 0x0095, 0x0000 }, - { 0x0701, 0x0097, 0x0000 }, - { 0x8701, 0x009c, 0x3000 }, - { 0x8701, 0x009a, 0x2000 }, - { 0x0701, 0x0099, 0x0000 }, - { 0x0701, 0x009b, 0x0000 }, - { 0x8701, 0x009e, 0x2000 }, - { 0x0701, 0x009d, 0x0000 }, - { 0x0701, 0x009f, 0x0000 }, - { 0x8701, 0x00a8, 0x4000 }, - { 0x8701, 0x00a4, 0x3000 }, - { 0x8701, 0x00a2, 0x2000 }, - { 0x0701, 0x00a1, 0x0000 }, - { 0x0701, 0x00a3, 0x0000 }, - { 0x8701, 0x00a6, 0x2000 }, - { 0x0701, 0x00a5, 0x0000 }, - { 0x0701, 0x00a7, 0x0000 }, - { 0x8701, 0x00ac, 0x3000 }, - { 0x8701, 0x00aa, 0x2000 }, - { 0x0701, 0x00a9, 0x0000 }, - { 0x0701, 0x00ab, 0x0000 }, - { 0x8701, 0x00ae, 0x2000 }, - { 0x0701, 0x00ad, 0x0000 }, - { 0x0701, 0x00af, 0x0000 }, - { 0x8701, 0x00d0, 0x6000 }, - { 0x8701, 0x00c0, 0x5000 }, - { 0x8701, 0x00b8, 0x4000 }, - { 0x8701, 0x00b4, 0x3000 }, - { 0x8701, 0x00b2, 0x2000 }, - { 0x0701, 0x00b1, 0x0000 }, - { 0x0701, 0x00b3, 0x0000 }, - { 0x8701, 0x00b6, 0x2000 }, - { 0x0701, 0x00b5, 0x0000 }, - { 0x0701, 0x00b7, 0x0000 }, - { 0x8701, 0x00bc, 0x3000 }, - { 0x8701, 0x00ba, 0x2000 }, - { 0x0701, 0x00b9, 0x0000 }, - { 0x0701, 0x00bb, 0x0000 }, - { 0x8701, 0x00be, 0x2000 }, - { 0x0701, 0x00bd, 0x0000 }, - { 0x0701, 0x00bf, 0x0000 }, - { 0x8701, 0x00c8, 0x4000 }, - { 0x8701, 0x00c4, 0x3000 }, - { 0x8701, 0x00c2, 0x2000 }, - { 0x0701, 0x00c1, 0x0000 }, - { 0x0701, 0x00c3, 0x0000 }, - { 0x8701, 0x00c6, 0x2000 }, - { 0x0701, 0x00c5, 0x0000 }, - { 0x0701, 0x00c7, 0x0000 }, - { 0x8701, 0x00cc, 0x3000 }, - { 0x8701, 0x00ca, 0x2000 }, - { 0x0701, 0x00c9, 0x0000 }, - { 0x0701, 0x00cb, 0x0000 }, - { 0x8701, 0x00ce, 0x2000 }, - { 0x0701, 0x00cd, 0x0000 }, - { 0x0701, 0x00cf, 0x0000 }, - { 0x8701, 0x00e0, 0x5000 }, - { 0x8701, 0x00d8, 0x4000 }, - { 0x8701, 0x00d4, 0x3000 }, - { 0x8701, 0x00d2, 0x2000 }, - { 0x0701, 0x00d1, 0x0000 }, - { 0x0701, 0x00d3, 0x0000 }, - { 0x8701, 0x00d6, 0x2000 }, - { 0x0701, 0x00d5, 0x0000 }, - { 0x0701, 0x00d7, 0x0000 }, - { 0x8701, 0x00dc, 0x3000 }, - { 0x8701, 0x00da, 0x2000 }, - { 0x0701, 0x00d9, 0x0000 }, - { 0x0701, 0x00db, 0x0000 }, - { 0x8701, 0x00de, 0x2000 }, - { 0x0701, 0x00dd, 0x0000 }, - { 0x0701, 0x00df, 0x0000 }, - { 0x8701, 0x00e8, 0x4000 }, - { 0x8701, 0x00e4, 0x3000 }, - { 0x8701, 0x00e2, 0x2000 }, - { 0x0701, 0x00e1, 0x0000 }, - { 0x0701, 0x00e3, 0x0000 }, - { 0x8701, 0x00e6, 0x2000 }, - { 0x0701, 0x00e5, 0x0000 }, - { 0x0701, 0x00e7, 0x0000 }, - { 0x8701, 0x00ec, 0x3000 }, - { 0x8701, 0x00ea, 0x2000 }, - { 0x0701, 0x00e9, 0x0000 }, - { 0x0701, 0x00eb, 0x0000 }, - { 0x8701, 0x00ee, 0x2000 }, - { 0x0701, 0x00ed, 0x0000 }, - { 0x0701, 0x00ef, 0x0000 }, - { 0x8501, 0xd459, 0xb000 }, - { 0x9a01, 0xd080, 0xa000 }, - { 0x8701, 0x045f, 0x9000 }, - { 0x8701, 0x0349, 0x8000 }, - { 0x9a01, 0x013c, 0x7000 }, - { 0x8f01, 0x0119, 0x6000 }, - { 0x8f01, 0x0109, 0x5000 }, - { 0x8701, 0x00f8, 0x4000 }, - { 0x8701, 0x00f4, 0x3000 }, - { 0x8701, 0x00f2, 0x2000 }, - { 0x0701, 0x00f1, 0x0000 }, - { 0x0701, 0x00f3, 0x0000 }, - { 0x8701, 0x00f6, 0x2000 }, - { 0x0701, 0x00f5, 0x0000 }, - { 0x0701, 0x00f7, 0x0000 }, - { 0x9501, 0x0101, 0x3000 }, - { 0x8701, 0x00fa, 0x2000 }, - { 0x0701, 0x00f9, 0x0000 }, - { 0x1501, 0x0100, 0x0000 }, - { 0x8f01, 0x0107, 0x2000 }, - { 0x1a01, 0x0102, 0x0000 }, - { 0x0f01, 0x0108, 0x0000 }, - { 0x8f01, 0x0111, 0x4000 }, - { 0x8f01, 0x010d, 0x3000 }, - { 0x8f01, 0x010b, 0x2000 }, - { 0x0f01, 0x010a, 0x0000 }, - { 0x0f01, 0x010c, 0x0000 }, - { 0x8f01, 0x010f, 0x2000 }, - { 0x0f01, 0x010e, 0x0000 }, - { 0x0f01, 0x0110, 0x0000 }, - { 0x8f01, 0x0115, 0x3000 }, - { 0x8f01, 0x0113, 0x2000 }, - { 0x0f01, 0x0112, 0x0000 }, - { 0x0f01, 0x0114, 0x0000 }, - { 0x8f01, 0x0117, 0x2000 }, - { 0x0f01, 0x0116, 0x0000 }, - { 0x0f01, 0x0118, 0x0000 }, - { 0x8f01, 0x0129, 0x5000 }, - { 0x8f01, 0x0121, 0x4000 }, - { 0x8f01, 0x011d, 0x3000 }, - { 0x8f01, 0x011b, 0x2000 }, - { 0x0f01, 0x011a, 0x0000 }, - { 0x0f01, 0x011c, 0x0000 }, - { 0x8f01, 0x011f, 0x2000 }, - { 0x0f01, 0x011e, 0x0000 }, - { 0x0f01, 0x0120, 0x0000 }, - { 0x8f01, 0x0125, 0x3000 }, - { 0x8f01, 0x0123, 0x2000 }, - { 0x0f01, 0x0122, 0x0000 }, - { 0x0f01, 0x0124, 0x0000 }, - { 0x8f01, 0x0127, 0x2000 }, - { 0x0f01, 0x0126, 0x0000 }, - { 0x0f01, 0x0128, 0x0000 }, - { 0x8f01, 0x0131, 0x4000 }, - { 0x8f01, 0x012d, 0x3000 }, - { 0x8f01, 0x012b, 0x2000 }, - { 0x0f01, 0x012a, 0x0000 }, - { 0x0f01, 0x012c, 0x0000 }, - { 0x8f01, 0x012f, 0x2000 }, - { 0x0f01, 0x012e, 0x0000 }, - { 0x0f01, 0x0130, 0x0000 }, - { 0x9a01, 0x0138, 0x3000 }, - { 0x8f01, 0x0133, 0x2000 }, - { 0x0f01, 0x0132, 0x0000 }, - { 0x1a01, 0x0137, 0x0000 }, - { 0x9a01, 0x013a, 0x2000 }, - { 0x1a01, 0x0139, 0x0000 }, - { 0x1a01, 0x013b, 0x0000 }, - { 0x8701, 0x031c, 0x6000 }, - { 0x8701, 0x030c, 0x5000 }, - { 0x8701, 0x0304, 0x4000 }, - { 0x8701, 0x0300, 0x3000 }, - { 0x9a01, 0x013e, 0x2000 }, - { 0x1a01, 0x013d, 0x0000 }, - { 0x1a01, 0x013f, 0x0000 }, - { 0x8701, 0x0302, 0x2000 }, - { 0x0701, 0x0301, 0x0000 }, - { 0x0701, 0x0303, 0x0000 }, - { 0x8701, 0x0308, 0x3000 }, - { 0x8701, 0x0306, 0x2000 }, - { 0x0701, 0x0305, 0x0000 }, - { 0x0701, 0x0307, 0x0000 }, - { 0x8701, 0x030a, 0x2000 }, - { 0x0701, 0x0309, 0x0000 }, - { 0x0701, 0x030b, 0x0000 }, - { 0x8701, 0x0314, 0x4000 }, - { 0x8701, 0x0310, 0x3000 }, - { 0x8701, 0x030e, 0x2000 }, - { 0x0701, 0x030d, 0x0000 }, - { 0x0701, 0x030f, 0x0000 }, - { 0x8701, 0x0312, 0x2000 }, - { 0x0701, 0x0311, 0x0000 }, - { 0x0701, 0x0313, 0x0000 }, - { 0x8701, 0x0318, 0x3000 }, - { 0x8701, 0x0316, 0x2000 }, - { 0x0701, 0x0315, 0x0000 }, - { 0x0701, 0x0317, 0x0000 }, - { 0x8701, 0x031a, 0x2000 }, - { 0x0701, 0x0319, 0x0000 }, - { 0x0701, 0x031b, 0x0000 }, - { 0x8701, 0x0339, 0x5000 }, - { 0x8701, 0x0331, 0x4000 }, - { 0x8f01, 0x0321, 0x3000 }, - { 0x8701, 0x031e, 0x2000 }, - { 0x0701, 0x031d, 0x0000 }, - { 0x0f01, 0x0320, 0x0000 }, - { 0x8f01, 0x0323, 0x2000 }, - { 0x0f01, 0x0322, 0x0000 }, - { 0x0701, 0x0330, 0x0000 }, - { 0x8701, 0x0335, 0x3000 }, - { 0x8701, 0x0333, 0x2000 }, - { 0x0701, 0x0332, 0x0000 }, - { 0x0701, 0x0334, 0x0000 }, - { 0x8701, 0x0337, 0x2000 }, - { 0x0701, 0x0336, 0x0000 }, - { 0x0701, 0x0338, 0x0000 }, - { 0x8701, 0x0341, 0x4000 }, - { 0x8701, 0x033d, 0x3000 }, - { 0x8701, 0x033b, 0x2000 }, - { 0x0701, 0x033a, 0x0000 }, - { 0x0701, 0x033c, 0x0000 }, - { 0x8701, 0x033f, 0x2000 }, - { 0x0701, 0x033e, 0x0000 }, - { 0x0701, 0x0340, 0x0000 }, - { 0x8701, 0x0345, 0x3000 }, - { 0x8701, 0x0343, 0x2000 }, - { 0x0701, 0x0342, 0x0000 }, - { 0x0701, 0x0344, 0x0000 }, - { 0x8701, 0x0347, 0x2000 }, - { 0x0701, 0x0346, 0x0000 }, - { 0x0701, 0x0348, 0x0000 }, - { 0x8901, 0x041f, 0x7028 }, - { 0x9501, 0x039f, 0x6000 }, - { 0x8701, 0x038e, 0x5000 }, - { 0x8701, 0x0386, 0x4000 }, - { 0x8701, 0x0382, 0x3000 }, - { 0x8701, 0x0380, 0x2000 }, - { 0x0e01, 0x034a, 0x0000 }, - { 0x0701, 0x0381, 0x0000 }, - { 0x8701, 0x0384, 0x2000 }, - { 0x0701, 0x0383, 0x0000 }, - { 0x0701, 0x0385, 0x0000 }, - { 0x8701, 0x038a, 0x3000 }, - { 0x8701, 0x0388, 0x2000 }, - { 0x0701, 0x0387, 0x0000 }, - { 0x0701, 0x0389, 0x0000 }, - { 0x8701, 0x038c, 0x2000 }, - { 0x0701, 0x038b, 0x0000 }, - { 0x0701, 0x038d, 0x0000 }, - { 0x8701, 0x0396, 0x4000 }, - { 0x8701, 0x0392, 0x3000 }, - { 0x8701, 0x0390, 0x2000 }, - { 0x0701, 0x038f, 0x0000 }, - { 0x0701, 0x0391, 0x0000 }, - { 0x8701, 0x0394, 0x2000 }, - { 0x0701, 0x0393, 0x0000 }, - { 0x0701, 0x0395, 0x0000 }, - { 0x8701, 0x039a, 0x3000 }, - { 0x8701, 0x0398, 0x2000 }, - { 0x0701, 0x0397, 0x0000 }, - { 0x0701, 0x0399, 0x0000 }, - { 0x8701, 0x039c, 0x2000 }, - { 0x0701, 0x039b, 0x0000 }, - { 0x0701, 0x039d, 0x0000 }, - { 0x8901, 0x040f, 0x5028 }, - { 0x8901, 0x0407, 0x4028 }, - { 0x8901, 0x0403, 0x3028 }, - { 0x8901, 0x0401, 0x2028 }, - { 0x0901, 0x0400, 0x0028 }, - { 0x0901, 0x0402, 0x0028 }, - { 0x8901, 0x0405, 0x2028 }, - { 0x0901, 0x0404, 0x0028 }, - { 0x0901, 0x0406, 0x0028 }, - { 0x8901, 0x040b, 0x3028 }, - { 0x8901, 0x0409, 0x2028 }, - { 0x0901, 0x0408, 0x0028 }, - { 0x0901, 0x040a, 0x0028 }, - { 0x8901, 0x040d, 0x2028 }, - { 0x0901, 0x040c, 0x0028 }, - { 0x0901, 0x040e, 0x0028 }, - { 0x8901, 0x0417, 0x4028 }, - { 0x8901, 0x0413, 0x3028 }, - { 0x8901, 0x0411, 0x2028 }, - { 0x0901, 0x0410, 0x0028 }, - { 0x0901, 0x0412, 0x0028 }, - { 0x8901, 0x0415, 0x2028 }, - { 0x0901, 0x0414, 0x0028 }, - { 0x0901, 0x0416, 0x0028 }, - { 0x8901, 0x041b, 0x3028 }, - { 0x8901, 0x0419, 0x2028 }, - { 0x0901, 0x0418, 0x0028 }, - { 0x0901, 0x041a, 0x0028 }, - { 0x8901, 0x041d, 0x2028 }, - { 0x0901, 0x041c, 0x0028 }, - { 0x0901, 0x041e, 0x0028 }, - { 0x8501, 0x043f, 0x6fd8 }, - { 0x8501, 0x042f, 0x5fd8 }, - { 0x8901, 0x0427, 0x4028 }, - { 0x8901, 0x0423, 0x3028 }, - { 0x8901, 0x0421, 0x2028 }, - { 0x0901, 0x0420, 0x0028 }, - { 0x0901, 0x0422, 0x0028 }, - { 0x8901, 0x0425, 0x2028 }, - { 0x0901, 0x0424, 0x0028 }, - { 0x0901, 0x0426, 0x0028 }, - { 0x8501, 0x042b, 0x3fd8 }, - { 0x8501, 0x0429, 0x2fd8 }, - { 0x0501, 0x0428, 0x0fd8 }, - { 0x0501, 0x042a, 0x0fd8 }, - { 0x8501, 0x042d, 0x2fd8 }, - { 0x0501, 0x042c, 0x0fd8 }, - { 0x0501, 0x042e, 0x0fd8 }, - { 0x8501, 0x0437, 0x4fd8 }, - { 0x8501, 0x0433, 0x3fd8 }, - { 0x8501, 0x0431, 0x2fd8 }, - { 0x0501, 0x0430, 0x0fd8 }, - { 0x0501, 0x0432, 0x0fd8 }, - { 0x8501, 0x0435, 0x2fd8 }, - { 0x0501, 0x0434, 0x0fd8 }, - { 0x0501, 0x0436, 0x0fd8 }, - { 0x8501, 0x043b, 0x3fd8 }, - { 0x8501, 0x0439, 0x2fd8 }, - { 0x0501, 0x0438, 0x0fd8 }, - { 0x0501, 0x043a, 0x0fd8 }, - { 0x8501, 0x043d, 0x2fd8 }, - { 0x0501, 0x043c, 0x0fd8 }, - { 0x0501, 0x043e, 0x0fd8 }, - { 0x8501, 0x044f, 0x5fd8 }, - { 0x8501, 0x0447, 0x4fd8 }, - { 0x8501, 0x0443, 0x3fd8 }, - { 0x8501, 0x0441, 0x2fd8 }, - { 0x0501, 0x0440, 0x0fd8 }, - { 0x0501, 0x0442, 0x0fd8 }, - { 0x8501, 0x0445, 0x2fd8 }, - { 0x0501, 0x0444, 0x0fd8 }, - { 0x0501, 0x0446, 0x0fd8 }, - { 0x8501, 0x044b, 0x3fd8 }, - { 0x8501, 0x0449, 0x2fd8 }, - { 0x0501, 0x0448, 0x0fd8 }, - { 0x0501, 0x044a, 0x0fd8 }, - { 0x8501, 0x044d, 0x2fd8 }, - { 0x0501, 0x044c, 0x0fd8 }, - { 0x0501, 0x044e, 0x0fd8 }, - { 0x8701, 0x0457, 0x4000 }, - { 0x8701, 0x0453, 0x3000 }, - { 0x8701, 0x0451, 0x2000 }, - { 0x0701, 0x0450, 0x0000 }, - { 0x0701, 0x0452, 0x0000 }, - { 0x8701, 0x0455, 0x2000 }, - { 0x0701, 0x0454, 0x0000 }, - { 0x0701, 0x0456, 0x0000 }, - { 0x8701, 0x045b, 0x3000 }, - { 0x8701, 0x0459, 0x2000 }, - { 0x0701, 0x0458, 0x0000 }, - { 0x0701, 0x045a, 0x0000 }, - { 0x8701, 0x045d, 0x2000 }, - { 0x0701, 0x045c, 0x0000 }, - { 0x0701, 0x045e, 0x0000 }, - { 0x9a01, 0xd000, 0x8000 }, - { 0x8d01, 0x04a1, 0x7000 }, - { 0x8701, 0x047f, 0x6000 }, - { 0x8701, 0x046f, 0x5000 }, - { 0x8701, 0x0467, 0x4000 }, - { 0x8701, 0x0463, 0x3000 }, - { 0x8701, 0x0461, 0x2000 }, - { 0x0701, 0x0460, 0x0000 }, - { 0x0701, 0x0462, 0x0000 }, - { 0x8701, 0x0465, 0x2000 }, - { 0x0701, 0x0464, 0x0000 }, - { 0x0701, 0x0466, 0x0000 }, - { 0x8701, 0x046b, 0x3000 }, - { 0x8701, 0x0469, 0x2000 }, - { 0x0701, 0x0468, 0x0000 }, - { 0x0701, 0x046a, 0x0000 }, - { 0x8701, 0x046d, 0x2000 }, - { 0x0701, 0x046c, 0x0000 }, - { 0x0701, 0x046e, 0x0000 }, - { 0x8701, 0x0477, 0x4000 }, - { 0x8701, 0x0473, 0x3000 }, - { 0x8701, 0x0471, 0x2000 }, - { 0x0701, 0x0470, 0x0000 }, - { 0x0701, 0x0472, 0x0000 }, - { 0x8701, 0x0475, 0x2000 }, - { 0x0701, 0x0474, 0x0000 }, - { 0x0701, 0x0476, 0x0000 }, - { 0x8701, 0x047b, 0x3000 }, - { 0x8701, 0x0479, 0x2000 }, - { 0x0701, 0x0478, 0x0000 }, - { 0x0701, 0x047a, 0x0000 }, - { 0x8701, 0x047d, 0x2000 }, - { 0x0701, 0x047c, 0x0000 }, - { 0x0701, 0x047e, 0x0000 }, - { 0x8701, 0x048f, 0x5000 }, - { 0x8701, 0x0487, 0x4000 }, - { 0x8701, 0x0483, 0x3000 }, - { 0x8701, 0x0481, 0x2000 }, - { 0x0701, 0x0480, 0x0000 }, - { 0x0701, 0x0482, 0x0000 }, - { 0x8701, 0x0485, 0x2000 }, - { 0x0701, 0x0484, 0x0000 }, - { 0x0701, 0x0486, 0x0000 }, - { 0x8701, 0x048b, 0x3000 }, - { 0x8701, 0x0489, 0x2000 }, - { 0x0701, 0x0488, 0x0000 }, - { 0x0701, 0x048a, 0x0000 }, - { 0x8701, 0x048d, 0x2000 }, - { 0x0701, 0x048c, 0x0000 }, - { 0x0701, 0x048e, 0x0000 }, - { 0x8701, 0x0497, 0x4000 }, - { 0x8701, 0x0493, 0x3000 }, - { 0x8701, 0x0491, 0x2000 }, - { 0x0701, 0x0490, 0x0000 }, - { 0x0701, 0x0492, 0x0000 }, - { 0x8701, 0x0495, 0x2000 }, - { 0x0701, 0x0494, 0x0000 }, - { 0x0701, 0x0496, 0x0000 }, - { 0x8701, 0x049b, 0x3000 }, - { 0x8701, 0x0499, 0x2000 }, - { 0x0701, 0x0498, 0x0000 }, - { 0x0701, 0x049a, 0x0000 }, - { 0x8701, 0x049d, 0x2000 }, - { 0x0701, 0x049c, 0x0000 }, - { 0x0d01, 0x04a0, 0x0000 }, - { 0x8701, 0x081a, 0x6000 }, - { 0x8701, 0x080a, 0x5000 }, - { 0x8d01, 0x04a9, 0x4000 }, - { 0x8d01, 0x04a5, 0x3000 }, - { 0x8d01, 0x04a3, 0x2000 }, - { 0x0d01, 0x04a2, 0x0000 }, - { 0x0d01, 0x04a4, 0x0000 }, - { 0x8d01, 0x04a7, 0x2000 }, - { 0x0d01, 0x04a6, 0x0000 }, - { 0x0d01, 0x04a8, 0x0000 }, - { 0x8701, 0x0803, 0x3000 }, - { 0x8701, 0x0801, 0x2000 }, - { 0x0701, 0x0800, 0x0000 }, - { 0x0701, 0x0802, 0x0000 }, - { 0x8701, 0x0805, 0x2000 }, - { 0x0701, 0x0804, 0x0000 }, - { 0x0701, 0x0808, 0x0000 }, - { 0x8701, 0x0812, 0x4000 }, - { 0x8701, 0x080e, 0x3000 }, - { 0x8701, 0x080c, 0x2000 }, - { 0x0701, 0x080b, 0x0000 }, - { 0x0701, 0x080d, 0x0000 }, - { 0x8701, 0x0810, 0x2000 }, - { 0x0701, 0x080f, 0x0000 }, - { 0x0701, 0x0811, 0x0000 }, - { 0x8701, 0x0816, 0x3000 }, - { 0x8701, 0x0814, 0x2000 }, - { 0x0701, 0x0813, 0x0000 }, - { 0x0701, 0x0815, 0x0000 }, - { 0x8701, 0x0818, 0x2000 }, - { 0x0701, 0x0817, 0x0000 }, - { 0x0701, 0x0819, 0x0000 }, - { 0x8701, 0x082a, 0x5000 }, - { 0x8701, 0x0822, 0x4000 }, - { 0x8701, 0x081e, 0x3000 }, - { 0x8701, 0x081c, 0x2000 }, - { 0x0701, 0x081b, 0x0000 }, - { 0x0701, 0x081d, 0x0000 }, - { 0x8701, 0x0820, 0x2000 }, - { 0x0701, 0x081f, 0x0000 }, - { 0x0701, 0x0821, 0x0000 }, - { 0x8701, 0x0826, 0x3000 }, - { 0x8701, 0x0824, 0x2000 }, - { 0x0701, 0x0823, 0x0000 }, - { 0x0701, 0x0825, 0x0000 }, - { 0x8701, 0x0828, 0x2000 }, - { 0x0701, 0x0827, 0x0000 }, - { 0x0701, 0x0829, 0x0000 }, - { 0x8701, 0x0832, 0x4000 }, - { 0x8701, 0x082e, 0x3000 }, - { 0x8701, 0x082c, 0x2000 }, - { 0x0701, 0x082b, 0x0000 }, - { 0x0701, 0x082d, 0x0000 }, - { 0x8701, 0x0830, 0x2000 }, - { 0x0701, 0x082f, 0x0000 }, - { 0x0701, 0x0831, 0x0000 }, - { 0x8701, 0x0837, 0x3000 }, - { 0x8701, 0x0834, 0x2000 }, - { 0x0701, 0x0833, 0x0000 }, - { 0x0701, 0x0835, 0x0000 }, - { 0x8701, 0x083c, 0x2000 }, - { 0x0701, 0x0838, 0x0000 }, - { 0x0701, 0x083f, 0x0000 }, - { 0x9a01, 0xd040, 0x7000 }, - { 0x9a01, 0xd020, 0x6000 }, - { 0x9a01, 0xd010, 0x5000 }, - { 0x9a01, 0xd008, 0x4000 }, - { 0x9a01, 0xd004, 0x3000 }, - { 0x9a01, 0xd002, 0x2000 }, - { 0x1a01, 0xd001, 0x0000 }, - { 0x1a01, 0xd003, 0x0000 }, - { 0x9a01, 0xd006, 0x2000 }, - { 0x1a01, 0xd005, 0x0000 }, - { 0x1a01, 0xd007, 0x0000 }, - { 0x9a01, 0xd00c, 0x3000 }, - { 0x9a01, 0xd00a, 0x2000 }, - { 0x1a01, 0xd009, 0x0000 }, - { 0x1a01, 0xd00b, 0x0000 }, - { 0x9a01, 0xd00e, 0x2000 }, - { 0x1a01, 0xd00d, 0x0000 }, - { 0x1a01, 0xd00f, 0x0000 }, - { 0x9a01, 0xd018, 0x4000 }, - { 0x9a01, 0xd014, 0x3000 }, - { 0x9a01, 0xd012, 0x2000 }, - { 0x1a01, 0xd011, 0x0000 }, - { 0x1a01, 0xd013, 0x0000 }, - { 0x9a01, 0xd016, 0x2000 }, - { 0x1a01, 0xd015, 0x0000 }, - { 0x1a01, 0xd017, 0x0000 }, - { 0x9a01, 0xd01c, 0x3000 }, - { 0x9a01, 0xd01a, 0x2000 }, - { 0x1a01, 0xd019, 0x0000 }, - { 0x1a01, 0xd01b, 0x0000 }, - { 0x9a01, 0xd01e, 0x2000 }, - { 0x1a01, 0xd01d, 0x0000 }, - { 0x1a01, 0xd01f, 0x0000 }, - { 0x9a01, 0xd030, 0x5000 }, - { 0x9a01, 0xd028, 0x4000 }, - { 0x9a01, 0xd024, 0x3000 }, - { 0x9a01, 0xd022, 0x2000 }, - { 0x1a01, 0xd021, 0x0000 }, - { 0x1a01, 0xd023, 0x0000 }, - { 0x9a01, 0xd026, 0x2000 }, - { 0x1a01, 0xd025, 0x0000 }, - { 0x1a01, 0xd027, 0x0000 }, - { 0x9a01, 0xd02c, 0x3000 }, - { 0x9a01, 0xd02a, 0x2000 }, - { 0x1a01, 0xd029, 0x0000 }, - { 0x1a01, 0xd02b, 0x0000 }, - { 0x9a01, 0xd02e, 0x2000 }, - { 0x1a01, 0xd02d, 0x0000 }, - { 0x1a01, 0xd02f, 0x0000 }, - { 0x9a01, 0xd038, 0x4000 }, - { 0x9a01, 0xd034, 0x3000 }, - { 0x9a01, 0xd032, 0x2000 }, - { 0x1a01, 0xd031, 0x0000 }, - { 0x1a01, 0xd033, 0x0000 }, - { 0x9a01, 0xd036, 0x2000 }, - { 0x1a01, 0xd035, 0x0000 }, - { 0x1a01, 0xd037, 0x0000 }, - { 0x9a01, 0xd03c, 0x3000 }, - { 0x9a01, 0xd03a, 0x2000 }, - { 0x1a01, 0xd039, 0x0000 }, - { 0x1a01, 0xd03b, 0x0000 }, - { 0x9a01, 0xd03e, 0x2000 }, - { 0x1a01, 0xd03d, 0x0000 }, - { 0x1a01, 0xd03f, 0x0000 }, - { 0x9a01, 0xd060, 0x6000 }, - { 0x9a01, 0xd050, 0x5000 }, - { 0x9a01, 0xd048, 0x4000 }, - { 0x9a01, 0xd044, 0x3000 }, - { 0x9a01, 0xd042, 0x2000 }, - { 0x1a01, 0xd041, 0x0000 }, - { 0x1a01, 0xd043, 0x0000 }, - { 0x9a01, 0xd046, 0x2000 }, - { 0x1a01, 0xd045, 0x0000 }, - { 0x1a01, 0xd047, 0x0000 }, - { 0x9a01, 0xd04c, 0x3000 }, - { 0x9a01, 0xd04a, 0x2000 }, - { 0x1a01, 0xd049, 0x0000 }, - { 0x1a01, 0xd04b, 0x0000 }, - { 0x9a01, 0xd04e, 0x2000 }, - { 0x1a01, 0xd04d, 0x0000 }, - { 0x1a01, 0xd04f, 0x0000 }, - { 0x9a01, 0xd058, 0x4000 }, - { 0x9a01, 0xd054, 0x3000 }, - { 0x9a01, 0xd052, 0x2000 }, - { 0x1a01, 0xd051, 0x0000 }, - { 0x1a01, 0xd053, 0x0000 }, - { 0x9a01, 0xd056, 0x2000 }, - { 0x1a01, 0xd055, 0x0000 }, - { 0x1a01, 0xd057, 0x0000 }, - { 0x9a01, 0xd05c, 0x3000 }, - { 0x9a01, 0xd05a, 0x2000 }, - { 0x1a01, 0xd059, 0x0000 }, - { 0x1a01, 0xd05b, 0x0000 }, - { 0x9a01, 0xd05e, 0x2000 }, - { 0x1a01, 0xd05d, 0x0000 }, - { 0x1a01, 0xd05f, 0x0000 }, - { 0x9a01, 0xd070, 0x5000 }, - { 0x9a01, 0xd068, 0x4000 }, - { 0x9a01, 0xd064, 0x3000 }, - { 0x9a01, 0xd062, 0x2000 }, - { 0x1a01, 0xd061, 0x0000 }, - { 0x1a01, 0xd063, 0x0000 }, - { 0x9a01, 0xd066, 0x2000 }, - { 0x1a01, 0xd065, 0x0000 }, - { 0x1a01, 0xd067, 0x0000 }, - { 0x9a01, 0xd06c, 0x3000 }, - { 0x9a01, 0xd06a, 0x2000 }, - { 0x1a01, 0xd069, 0x0000 }, - { 0x1a01, 0xd06b, 0x0000 }, - { 0x9a01, 0xd06e, 0x2000 }, - { 0x1a01, 0xd06d, 0x0000 }, - { 0x1a01, 0xd06f, 0x0000 }, - { 0x9a01, 0xd078, 0x4000 }, - { 0x9a01, 0xd074, 0x3000 }, - { 0x9a01, 0xd072, 0x2000 }, - { 0x1a01, 0xd071, 0x0000 }, - { 0x1a01, 0xd073, 0x0000 }, - { 0x9a01, 0xd076, 0x2000 }, - { 0x1a01, 0xd075, 0x0000 }, - { 0x1a01, 0xd077, 0x0000 }, - { 0x9a01, 0xd07c, 0x3000 }, - { 0x9a01, 0xd07a, 0x2000 }, - { 0x1a01, 0xd079, 0x0000 }, - { 0x1a01, 0xd07b, 0x0000 }, - { 0x9a01, 0xd07e, 0x2000 }, - { 0x1a01, 0xd07d, 0x0000 }, - { 0x1a01, 0xd07f, 0x0000 }, - { 0x9a01, 0xd18d, 0x9000 }, - { 0x9a01, 0xd10a, 0x8000 }, - { 0x9a01, 0xd0c0, 0x7000 }, - { 0x9a01, 0xd0a0, 0x6000 }, - { 0x9a01, 0xd090, 0x5000 }, - { 0x9a01, 0xd088, 0x4000 }, - { 0x9a01, 0xd084, 0x3000 }, - { 0x9a01, 0xd082, 0x2000 }, - { 0x1a01, 0xd081, 0x0000 }, - { 0x1a01, 0xd083, 0x0000 }, - { 0x9a01, 0xd086, 0x2000 }, - { 0x1a01, 0xd085, 0x0000 }, - { 0x1a01, 0xd087, 0x0000 }, - { 0x9a01, 0xd08c, 0x3000 }, - { 0x9a01, 0xd08a, 0x2000 }, - { 0x1a01, 0xd089, 0x0000 }, - { 0x1a01, 0xd08b, 0x0000 }, - { 0x9a01, 0xd08e, 0x2000 }, - { 0x1a01, 0xd08d, 0x0000 }, - { 0x1a01, 0xd08f, 0x0000 }, - { 0x9a01, 0xd098, 0x4000 }, - { 0x9a01, 0xd094, 0x3000 }, - { 0x9a01, 0xd092, 0x2000 }, - { 0x1a01, 0xd091, 0x0000 }, - { 0x1a01, 0xd093, 0x0000 }, - { 0x9a01, 0xd096, 0x2000 }, - { 0x1a01, 0xd095, 0x0000 }, - { 0x1a01, 0xd097, 0x0000 }, - { 0x9a01, 0xd09c, 0x3000 }, - { 0x9a01, 0xd09a, 0x2000 }, - { 0x1a01, 0xd099, 0x0000 }, - { 0x1a01, 0xd09b, 0x0000 }, - { 0x9a01, 0xd09e, 0x2000 }, - { 0x1a01, 0xd09d, 0x0000 }, - { 0x1a01, 0xd09f, 0x0000 }, - { 0x9a01, 0xd0b0, 0x5000 }, - { 0x9a01, 0xd0a8, 0x4000 }, - { 0x9a01, 0xd0a4, 0x3000 }, - { 0x9a01, 0xd0a2, 0x2000 }, - { 0x1a01, 0xd0a1, 0x0000 }, - { 0x1a01, 0xd0a3, 0x0000 }, - { 0x9a01, 0xd0a6, 0x2000 }, - { 0x1a01, 0xd0a5, 0x0000 }, - { 0x1a01, 0xd0a7, 0x0000 }, - { 0x9a01, 0xd0ac, 0x3000 }, - { 0x9a01, 0xd0aa, 0x2000 }, - { 0x1a01, 0xd0a9, 0x0000 }, - { 0x1a01, 0xd0ab, 0x0000 }, - { 0x9a01, 0xd0ae, 0x2000 }, - { 0x1a01, 0xd0ad, 0x0000 }, - { 0x1a01, 0xd0af, 0x0000 }, - { 0x9a01, 0xd0b8, 0x4000 }, - { 0x9a01, 0xd0b4, 0x3000 }, - { 0x9a01, 0xd0b2, 0x2000 }, - { 0x1a01, 0xd0b1, 0x0000 }, - { 0x1a01, 0xd0b3, 0x0000 }, - { 0x9a01, 0xd0b6, 0x2000 }, - { 0x1a01, 0xd0b5, 0x0000 }, - { 0x1a01, 0xd0b7, 0x0000 }, - { 0x9a01, 0xd0bc, 0x3000 }, - { 0x9a01, 0xd0ba, 0x2000 }, - { 0x1a01, 0xd0b9, 0x0000 }, - { 0x1a01, 0xd0bb, 0x0000 }, - { 0x9a01, 0xd0be, 0x2000 }, - { 0x1a01, 0xd0bd, 0x0000 }, - { 0x1a01, 0xd0bf, 0x0000 }, - { 0x9a01, 0xd0e0, 0x6000 }, - { 0x9a01, 0xd0d0, 0x5000 }, - { 0x9a01, 0xd0c8, 0x4000 }, - { 0x9a01, 0xd0c4, 0x3000 }, - { 0x9a01, 0xd0c2, 0x2000 }, - { 0x1a01, 0xd0c1, 0x0000 }, - { 0x1a01, 0xd0c3, 0x0000 }, - { 0x9a01, 0xd0c6, 0x2000 }, - { 0x1a01, 0xd0c5, 0x0000 }, - { 0x1a01, 0xd0c7, 0x0000 }, - { 0x9a01, 0xd0cc, 0x3000 }, - { 0x9a01, 0xd0ca, 0x2000 }, - { 0x1a01, 0xd0c9, 0x0000 }, - { 0x1a01, 0xd0cb, 0x0000 }, - { 0x9a01, 0xd0ce, 0x2000 }, - { 0x1a01, 0xd0cd, 0x0000 }, - { 0x1a01, 0xd0cf, 0x0000 }, - { 0x9a01, 0xd0d8, 0x4000 }, - { 0x9a01, 0xd0d4, 0x3000 }, - { 0x9a01, 0xd0d2, 0x2000 }, - { 0x1a01, 0xd0d1, 0x0000 }, - { 0x1a01, 0xd0d3, 0x0000 }, - { 0x9a01, 0xd0d6, 0x2000 }, - { 0x1a01, 0xd0d5, 0x0000 }, - { 0x1a01, 0xd0d7, 0x0000 }, - { 0x9a01, 0xd0dc, 0x3000 }, - { 0x9a01, 0xd0da, 0x2000 }, - { 0x1a01, 0xd0d9, 0x0000 }, - { 0x1a01, 0xd0db, 0x0000 }, - { 0x9a01, 0xd0de, 0x2000 }, - { 0x1a01, 0xd0dd, 0x0000 }, - { 0x1a01, 0xd0df, 0x0000 }, - { 0x9a01, 0xd0f0, 0x5000 }, - { 0x9a01, 0xd0e8, 0x4000 }, - { 0x9a01, 0xd0e4, 0x3000 }, - { 0x9a01, 0xd0e2, 0x2000 }, - { 0x1a01, 0xd0e1, 0x0000 }, - { 0x1a01, 0xd0e3, 0x0000 }, - { 0x9a01, 0xd0e6, 0x2000 }, - { 0x1a01, 0xd0e5, 0x0000 }, - { 0x1a01, 0xd0e7, 0x0000 }, - { 0x9a01, 0xd0ec, 0x3000 }, - { 0x9a01, 0xd0ea, 0x2000 }, - { 0x1a01, 0xd0e9, 0x0000 }, - { 0x1a01, 0xd0eb, 0x0000 }, - { 0x9a01, 0xd0ee, 0x2000 }, - { 0x1a01, 0xd0ed, 0x0000 }, - { 0x1a01, 0xd0ef, 0x0000 }, - { 0x9a01, 0xd102, 0x4000 }, - { 0x9a01, 0xd0f4, 0x3000 }, - { 0x9a01, 0xd0f2, 0x2000 }, - { 0x1a01, 0xd0f1, 0x0000 }, - { 0x1a01, 0xd0f3, 0x0000 }, - { 0x9a01, 0xd100, 0x2000 }, - { 0x1a01, 0xd0f5, 0x0000 }, - { 0x1a01, 0xd101, 0x0000 }, - { 0x9a01, 0xd106, 0x3000 }, - { 0x9a01, 0xd104, 0x2000 }, - { 0x1a01, 0xd103, 0x0000 }, - { 0x1a01, 0xd105, 0x0000 }, - { 0x9a01, 0xd108, 0x2000 }, - { 0x1a01, 0xd107, 0x0000 }, - { 0x1a01, 0xd109, 0x0000 }, - { 0x9a01, 0xd14d, 0x7000 }, - { 0x9a01, 0xd12d, 0x6000 }, - { 0x9a01, 0xd11a, 0x5000 }, - { 0x9a01, 0xd112, 0x4000 }, - { 0x9a01, 0xd10e, 0x3000 }, - { 0x9a01, 0xd10c, 0x2000 }, - { 0x1a01, 0xd10b, 0x0000 }, - { 0x1a01, 0xd10d, 0x0000 }, - { 0x9a01, 0xd110, 0x2000 }, - { 0x1a01, 0xd10f, 0x0000 }, - { 0x1a01, 0xd111, 0x0000 }, - { 0x9a01, 0xd116, 0x3000 }, - { 0x9a01, 0xd114, 0x2000 }, - { 0x1a01, 0xd113, 0x0000 }, - { 0x1a01, 0xd115, 0x0000 }, - { 0x9a01, 0xd118, 0x2000 }, - { 0x1a01, 0xd117, 0x0000 }, - { 0x1a01, 0xd119, 0x0000 }, - { 0x9a01, 0xd122, 0x4000 }, - { 0x9a01, 0xd11e, 0x3000 }, - { 0x9a01, 0xd11c, 0x2000 }, - { 0x1a01, 0xd11b, 0x0000 }, - { 0x1a01, 0xd11d, 0x0000 }, - { 0x9a01, 0xd120, 0x2000 }, - { 0x1a01, 0xd11f, 0x0000 }, - { 0x1a01, 0xd121, 0x0000 }, - { 0x9a01, 0xd126, 0x3000 }, - { 0x9a01, 0xd124, 0x2000 }, - { 0x1a01, 0xd123, 0x0000 }, - { 0x1a01, 0xd125, 0x0000 }, - { 0x9a01, 0xd12b, 0x2000 }, - { 0x1a01, 0xd12a, 0x0000 }, - { 0x1a01, 0xd12c, 0x0000 }, - { 0x9a01, 0xd13d, 0x5000 }, - { 0x9a01, 0xd135, 0x4000 }, - { 0x9a01, 0xd131, 0x3000 }, - { 0x9a01, 0xd12f, 0x2000 }, - { 0x1a01, 0xd12e, 0x0000 }, - { 0x1a01, 0xd130, 0x0000 }, - { 0x9a01, 0xd133, 0x2000 }, - { 0x1a01, 0xd132, 0x0000 }, - { 0x1a01, 0xd134, 0x0000 }, - { 0x9a01, 0xd139, 0x3000 }, - { 0x9a01, 0xd137, 0x2000 }, - { 0x1a01, 0xd136, 0x0000 }, - { 0x1a01, 0xd138, 0x0000 }, - { 0x9a01, 0xd13b, 0x2000 }, - { 0x1a01, 0xd13a, 0x0000 }, - { 0x1a01, 0xd13c, 0x0000 }, - { 0x9a01, 0xd145, 0x4000 }, - { 0x9a01, 0xd141, 0x3000 }, - { 0x9a01, 0xd13f, 0x2000 }, - { 0x1a01, 0xd13e, 0x0000 }, - { 0x1a01, 0xd140, 0x0000 }, - { 0x9a01, 0xd143, 0x2000 }, - { 0x1a01, 0xd142, 0x0000 }, - { 0x1a01, 0xd144, 0x0000 }, - { 0x9a01, 0xd149, 0x3000 }, - { 0x9a01, 0xd147, 0x2000 }, - { 0x1a01, 0xd146, 0x0000 }, - { 0x1a01, 0xd148, 0x0000 }, - { 0x9a01, 0xd14b, 0x2000 }, - { 0x1a01, 0xd14a, 0x0000 }, - { 0x1a01, 0xd14c, 0x0000 }, - { 0x8a01, 0xd16d, 0x6000 }, - { 0x9a01, 0xd15d, 0x5000 }, - { 0x9a01, 0xd155, 0x4000 }, - { 0x9a01, 0xd151, 0x3000 }, - { 0x9a01, 0xd14f, 0x2000 }, - { 0x1a01, 0xd14e, 0x0000 }, - { 0x1a01, 0xd150, 0x0000 }, - { 0x9a01, 0xd153, 0x2000 }, - { 0x1a01, 0xd152, 0x0000 }, - { 0x1a01, 0xd154, 0x0000 }, - { 0x9a01, 0xd159, 0x3000 }, - { 0x9a01, 0xd157, 0x2000 }, - { 0x1a01, 0xd156, 0x0000 }, - { 0x1a01, 0xd158, 0x0000 }, - { 0x9a01, 0xd15b, 0x2000 }, - { 0x1a01, 0xd15a, 0x0000 }, - { 0x1a01, 0xd15c, 0x0000 }, - { 0x8a01, 0xd165, 0x4000 }, - { 0x9a01, 0xd161, 0x3000 }, - { 0x9a01, 0xd15f, 0x2000 }, - { 0x1a01, 0xd15e, 0x0000 }, - { 0x1a01, 0xd160, 0x0000 }, - { 0x9a01, 0xd163, 0x2000 }, - { 0x1a01, 0xd162, 0x0000 }, - { 0x1a01, 0xd164, 0x0000 }, - { 0x8c01, 0xd169, 0x3000 }, - { 0x8c01, 0xd167, 0x2000 }, - { 0x0a01, 0xd166, 0x0000 }, - { 0x0c01, 0xd168, 0x0000 }, - { 0x9a01, 0xd16b, 0x2000 }, - { 0x1a01, 0xd16a, 0x0000 }, - { 0x1a01, 0xd16c, 0x0000 }, - { 0x8c01, 0xd17d, 0x5000 }, - { 0x8101, 0xd175, 0x4000 }, - { 0x8a01, 0xd171, 0x3000 }, - { 0x8a01, 0xd16f, 0x2000 }, - { 0x0a01, 0xd16e, 0x0000 }, - { 0x0a01, 0xd170, 0x0000 }, - { 0x8101, 0xd173, 0x2000 }, - { 0x0a01, 0xd172, 0x0000 }, - { 0x0101, 0xd174, 0x0000 }, - { 0x8101, 0xd179, 0x3000 }, - { 0x8101, 0xd177, 0x2000 }, - { 0x0101, 0xd176, 0x0000 }, - { 0x0101, 0xd178, 0x0000 }, - { 0x8c01, 0xd17b, 0x2000 }, - { 0x0101, 0xd17a, 0x0000 }, - { 0x0c01, 0xd17c, 0x0000 }, - { 0x8c01, 0xd185, 0x4000 }, - { 0x8c01, 0xd181, 0x3000 }, - { 0x8c01, 0xd17f, 0x2000 }, - { 0x0c01, 0xd17e, 0x0000 }, - { 0x0c01, 0xd180, 0x0000 }, - { 0x9a01, 0xd183, 0x2000 }, - { 0x0c01, 0xd182, 0x0000 }, - { 0x1a01, 0xd184, 0x0000 }, - { 0x8c01, 0xd189, 0x3000 }, - { 0x8c01, 0xd187, 0x2000 }, - { 0x0c01, 0xd186, 0x0000 }, - { 0x0c01, 0xd188, 0x0000 }, - { 0x8c01, 0xd18b, 0x2000 }, - { 0x0c01, 0xd18a, 0x0000 }, - { 0x1a01, 0xd18c, 0x0000 }, - { 0x9a01, 0xd32f, 0x8000 }, - { 0x9a01, 0xd1cd, 0x7000 }, - { 0x8c01, 0xd1ad, 0x6000 }, - { 0x9a01, 0xd19d, 0x5000 }, - { 0x9a01, 0xd195, 0x4000 }, - { 0x9a01, 0xd191, 0x3000 }, - { 0x9a01, 0xd18f, 0x2000 }, - { 0x1a01, 0xd18e, 0x0000 }, - { 0x1a01, 0xd190, 0x0000 }, - { 0x9a01, 0xd193, 0x2000 }, - { 0x1a01, 0xd192, 0x0000 }, - { 0x1a01, 0xd194, 0x0000 }, - { 0x9a01, 0xd199, 0x3000 }, - { 0x9a01, 0xd197, 0x2000 }, - { 0x1a01, 0xd196, 0x0000 }, - { 0x1a01, 0xd198, 0x0000 }, - { 0x9a01, 0xd19b, 0x2000 }, - { 0x1a01, 0xd19a, 0x0000 }, - { 0x1a01, 0xd19c, 0x0000 }, - { 0x9a01, 0xd1a5, 0x4000 }, - { 0x9a01, 0xd1a1, 0x3000 }, - { 0x9a01, 0xd19f, 0x2000 }, - { 0x1a01, 0xd19e, 0x0000 }, - { 0x1a01, 0xd1a0, 0x0000 }, - { 0x9a01, 0xd1a3, 0x2000 }, - { 0x1a01, 0xd1a2, 0x0000 }, - { 0x1a01, 0xd1a4, 0x0000 }, - { 0x9a01, 0xd1a9, 0x3000 }, - { 0x9a01, 0xd1a7, 0x2000 }, - { 0x1a01, 0xd1a6, 0x0000 }, - { 0x1a01, 0xd1a8, 0x0000 }, - { 0x8c01, 0xd1ab, 0x2000 }, - { 0x0c01, 0xd1aa, 0x0000 }, - { 0x0c01, 0xd1ac, 0x0000 }, - { 0x9a01, 0xd1bd, 0x5000 }, - { 0x9a01, 0xd1b5, 0x4000 }, - { 0x9a01, 0xd1b1, 0x3000 }, - { 0x9a01, 0xd1af, 0x2000 }, - { 0x1a01, 0xd1ae, 0x0000 }, - { 0x1a01, 0xd1b0, 0x0000 }, - { 0x9a01, 0xd1b3, 0x2000 }, - { 0x1a01, 0xd1b2, 0x0000 }, - { 0x1a01, 0xd1b4, 0x0000 }, - { 0x9a01, 0xd1b9, 0x3000 }, - { 0x9a01, 0xd1b7, 0x2000 }, - { 0x1a01, 0xd1b6, 0x0000 }, - { 0x1a01, 0xd1b8, 0x0000 }, - { 0x9a01, 0xd1bb, 0x2000 }, - { 0x1a01, 0xd1ba, 0x0000 }, - { 0x1a01, 0xd1bc, 0x0000 }, - { 0x9a01, 0xd1c5, 0x4000 }, - { 0x9a01, 0xd1c1, 0x3000 }, - { 0x9a01, 0xd1bf, 0x2000 }, - { 0x1a01, 0xd1be, 0x0000 }, - { 0x1a01, 0xd1c0, 0x0000 }, - { 0x9a01, 0xd1c3, 0x2000 }, - { 0x1a01, 0xd1c2, 0x0000 }, - { 0x1a01, 0xd1c4, 0x0000 }, - { 0x9a01, 0xd1c9, 0x3000 }, - { 0x9a01, 0xd1c7, 0x2000 }, - { 0x1a01, 0xd1c6, 0x0000 }, - { 0x1a01, 0xd1c8, 0x0000 }, - { 0x9a01, 0xd1cb, 0x2000 }, - { 0x1a01, 0xd1ca, 0x0000 }, - { 0x1a01, 0xd1cc, 0x0000 }, - { 0x9a01, 0xd30f, 0x6000 }, - { 0x9a01, 0xd1dd, 0x5000 }, - { 0x9a01, 0xd1d5, 0x4000 }, - { 0x9a01, 0xd1d1, 0x3000 }, - { 0x9a01, 0xd1cf, 0x2000 }, - { 0x1a01, 0xd1ce, 0x0000 }, - { 0x1a01, 0xd1d0, 0x0000 }, - { 0x9a01, 0xd1d3, 0x2000 }, - { 0x1a01, 0xd1d2, 0x0000 }, - { 0x1a01, 0xd1d4, 0x0000 }, - { 0x9a01, 0xd1d9, 0x3000 }, - { 0x9a01, 0xd1d7, 0x2000 }, - { 0x1a01, 0xd1d6, 0x0000 }, - { 0x1a01, 0xd1d8, 0x0000 }, - { 0x9a01, 0xd1db, 0x2000 }, - { 0x1a01, 0xd1da, 0x0000 }, - { 0x1a01, 0xd1dc, 0x0000 }, - { 0x9a01, 0xd307, 0x4000 }, - { 0x9a01, 0xd303, 0x3000 }, - { 0x9a01, 0xd301, 0x2000 }, - { 0x1a01, 0xd300, 0x0000 }, - { 0x1a01, 0xd302, 0x0000 }, - { 0x9a01, 0xd305, 0x2000 }, - { 0x1a01, 0xd304, 0x0000 }, - { 0x1a01, 0xd306, 0x0000 }, - { 0x9a01, 0xd30b, 0x3000 }, - { 0x9a01, 0xd309, 0x2000 }, - { 0x1a01, 0xd308, 0x0000 }, - { 0x1a01, 0xd30a, 0x0000 }, - { 0x9a01, 0xd30d, 0x2000 }, - { 0x1a01, 0xd30c, 0x0000 }, - { 0x1a01, 0xd30e, 0x0000 }, - { 0x9a01, 0xd31f, 0x5000 }, - { 0x9a01, 0xd317, 0x4000 }, - { 0x9a01, 0xd313, 0x3000 }, - { 0x9a01, 0xd311, 0x2000 }, - { 0x1a01, 0xd310, 0x0000 }, - { 0x1a01, 0xd312, 0x0000 }, - { 0x9a01, 0xd315, 0x2000 }, - { 0x1a01, 0xd314, 0x0000 }, - { 0x1a01, 0xd316, 0x0000 }, - { 0x9a01, 0xd31b, 0x3000 }, - { 0x9a01, 0xd319, 0x2000 }, - { 0x1a01, 0xd318, 0x0000 }, - { 0x1a01, 0xd31a, 0x0000 }, - { 0x9a01, 0xd31d, 0x2000 }, - { 0x1a01, 0xd31c, 0x0000 }, - { 0x1a01, 0xd31e, 0x0000 }, - { 0x9a01, 0xd327, 0x4000 }, - { 0x9a01, 0xd323, 0x3000 }, - { 0x9a01, 0xd321, 0x2000 }, - { 0x1a01, 0xd320, 0x0000 }, - { 0x1a01, 0xd322, 0x0000 }, - { 0x9a01, 0xd325, 0x2000 }, - { 0x1a01, 0xd324, 0x0000 }, - { 0x1a01, 0xd326, 0x0000 }, - { 0x9a01, 0xd32b, 0x3000 }, - { 0x9a01, 0xd329, 0x2000 }, - { 0x1a01, 0xd328, 0x0000 }, - { 0x1a01, 0xd32a, 0x0000 }, - { 0x9a01, 0xd32d, 0x2000 }, - { 0x1a01, 0xd32c, 0x0000 }, - { 0x1a01, 0xd32e, 0x0000 }, - { 0x8901, 0xd418, 0x7000 }, - { 0x9a01, 0xd34f, 0x6000 }, - { 0x9a01, 0xd33f, 0x5000 }, - { 0x9a01, 0xd337, 0x4000 }, - { 0x9a01, 0xd333, 0x3000 }, - { 0x9a01, 0xd331, 0x2000 }, - { 0x1a01, 0xd330, 0x0000 }, - { 0x1a01, 0xd332, 0x0000 }, - { 0x9a01, 0xd335, 0x2000 }, - { 0x1a01, 0xd334, 0x0000 }, - { 0x1a01, 0xd336, 0x0000 }, - { 0x9a01, 0xd33b, 0x3000 }, - { 0x9a01, 0xd339, 0x2000 }, - { 0x1a01, 0xd338, 0x0000 }, - { 0x1a01, 0xd33a, 0x0000 }, - { 0x9a01, 0xd33d, 0x2000 }, - { 0x1a01, 0xd33c, 0x0000 }, - { 0x1a01, 0xd33e, 0x0000 }, - { 0x9a01, 0xd347, 0x4000 }, - { 0x9a01, 0xd343, 0x3000 }, - { 0x9a01, 0xd341, 0x2000 }, - { 0x1a01, 0xd340, 0x0000 }, - { 0x1a01, 0xd342, 0x0000 }, - { 0x9a01, 0xd345, 0x2000 }, - { 0x1a01, 0xd344, 0x0000 }, - { 0x1a01, 0xd346, 0x0000 }, - { 0x9a01, 0xd34b, 0x3000 }, - { 0x9a01, 0xd349, 0x2000 }, - { 0x1a01, 0xd348, 0x0000 }, - { 0x1a01, 0xd34a, 0x0000 }, - { 0x9a01, 0xd34d, 0x2000 }, - { 0x1a01, 0xd34c, 0x0000 }, - { 0x1a01, 0xd34e, 0x0000 }, - { 0x8901, 0xd408, 0x5000 }, - { 0x8901, 0xd400, 0x4000 }, - { 0x9a01, 0xd353, 0x3000 }, - { 0x9a01, 0xd351, 0x2000 }, - { 0x1a01, 0xd350, 0x0000 }, - { 0x1a01, 0xd352, 0x0000 }, - { 0x9a01, 0xd355, 0x2000 }, - { 0x1a01, 0xd354, 0x0000 }, - { 0x1a01, 0xd356, 0x0000 }, - { 0x8901, 0xd404, 0x3000 }, - { 0x8901, 0xd402, 0x2000 }, - { 0x0901, 0xd401, 0x0000 }, - { 0x0901, 0xd403, 0x0000 }, - { 0x8901, 0xd406, 0x2000 }, - { 0x0901, 0xd405, 0x0000 }, - { 0x0901, 0xd407, 0x0000 }, - { 0x8901, 0xd410, 0x4000 }, - { 0x8901, 0xd40c, 0x3000 }, - { 0x8901, 0xd40a, 0x2000 }, - { 0x0901, 0xd409, 0x0000 }, - { 0x0901, 0xd40b, 0x0000 }, - { 0x8901, 0xd40e, 0x2000 }, - { 0x0901, 0xd40d, 0x0000 }, - { 0x0901, 0xd40f, 0x0000 }, - { 0x8901, 0xd414, 0x3000 }, - { 0x8901, 0xd412, 0x2000 }, - { 0x0901, 0xd411, 0x0000 }, - { 0x0901, 0xd413, 0x0000 }, - { 0x8901, 0xd416, 0x2000 }, - { 0x0901, 0xd415, 0x0000 }, - { 0x0901, 0xd417, 0x0000 }, - { 0x8901, 0xd438, 0x6000 }, - { 0x8501, 0xd428, 0x5000 }, - { 0x8501, 0xd420, 0x4000 }, - { 0x8501, 0xd41c, 0x3000 }, - { 0x8501, 0xd41a, 0x2000 }, - { 0x0901, 0xd419, 0x0000 }, - { 0x0501, 0xd41b, 0x0000 }, - { 0x8501, 0xd41e, 0x2000 }, - { 0x0501, 0xd41d, 0x0000 }, - { 0x0501, 0xd41f, 0x0000 }, - { 0x8501, 0xd424, 0x3000 }, - { 0x8501, 0xd422, 0x2000 }, - { 0x0501, 0xd421, 0x0000 }, - { 0x0501, 0xd423, 0x0000 }, - { 0x8501, 0xd426, 0x2000 }, - { 0x0501, 0xd425, 0x0000 }, - { 0x0501, 0xd427, 0x0000 }, - { 0x8501, 0xd430, 0x4000 }, - { 0x8501, 0xd42c, 0x3000 }, - { 0x8501, 0xd42a, 0x2000 }, - { 0x0501, 0xd429, 0x0000 }, - { 0x0501, 0xd42b, 0x0000 }, - { 0x8501, 0xd42e, 0x2000 }, - { 0x0501, 0xd42d, 0x0000 }, - { 0x0501, 0xd42f, 0x0000 }, - { 0x8901, 0xd434, 0x3000 }, - { 0x8501, 0xd432, 0x2000 }, - { 0x0501, 0xd431, 0x0000 }, - { 0x0501, 0xd433, 0x0000 }, - { 0x8901, 0xd436, 0x2000 }, - { 0x0901, 0xd435, 0x0000 }, - { 0x0901, 0xd437, 0x0000 }, - { 0x8901, 0xd448, 0x5000 }, - { 0x8901, 0xd440, 0x4000 }, - { 0x8901, 0xd43c, 0x3000 }, - { 0x8901, 0xd43a, 0x2000 }, - { 0x0901, 0xd439, 0x0000 }, - { 0x0901, 0xd43b, 0x0000 }, - { 0x8901, 0xd43e, 0x2000 }, - { 0x0901, 0xd43d, 0x0000 }, - { 0x0901, 0xd43f, 0x0000 }, - { 0x8901, 0xd444, 0x3000 }, - { 0x8901, 0xd442, 0x2000 }, - { 0x0901, 0xd441, 0x0000 }, - { 0x0901, 0xd443, 0x0000 }, - { 0x8901, 0xd446, 0x2000 }, - { 0x0901, 0xd445, 0x0000 }, - { 0x0901, 0xd447, 0x0000 }, - { 0x8501, 0xd450, 0x4000 }, - { 0x8901, 0xd44c, 0x3000 }, - { 0x8901, 0xd44a, 0x2000 }, - { 0x0901, 0xd449, 0x0000 }, - { 0x0901, 0xd44b, 0x0000 }, - { 0x8501, 0xd44e, 0x2000 }, - { 0x0901, 0xd44d, 0x0000 }, - { 0x0501, 0xd44f, 0x0000 }, - { 0x8501, 0xd454, 0x3000 }, - { 0x8501, 0xd452, 0x2000 }, - { 0x0501, 0xd451, 0x0000 }, - { 0x0501, 0xd453, 0x0000 }, - { 0x8501, 0xd457, 0x2000 }, - { 0x0501, 0xd456, 0x0000 }, - { 0x0501, 0xd458, 0x0000 }, - { 0x8702, 0xf876, 0xb000 }, - { 0x8901, 0xd670, 0xa000 }, - { 0x8901, 0xd570, 0x9000 }, - { 0x8901, 0xd4e4, 0x8000 }, - { 0x8501, 0xd499, 0x7000 }, - { 0x8901, 0xd479, 0x6000 }, - { 0x8901, 0xd469, 0x5000 }, - { 0x8501, 0xd461, 0x4000 }, - { 0x8501, 0xd45d, 0x3000 }, - { 0x8501, 0xd45b, 0x2000 }, - { 0x0501, 0xd45a, 0x0000 }, - { 0x0501, 0xd45c, 0x0000 }, - { 0x8501, 0xd45f, 0x2000 }, - { 0x0501, 0xd45e, 0x0000 }, - { 0x0501, 0xd460, 0x0000 }, - { 0x8501, 0xd465, 0x3000 }, - { 0x8501, 0xd463, 0x2000 }, - { 0x0501, 0xd462, 0x0000 }, - { 0x0501, 0xd464, 0x0000 }, - { 0x8501, 0xd467, 0x2000 }, - { 0x0501, 0xd466, 0x0000 }, - { 0x0901, 0xd468, 0x0000 }, - { 0x8901, 0xd471, 0x4000 }, - { 0x8901, 0xd46d, 0x3000 }, - { 0x8901, 0xd46b, 0x2000 }, - { 0x0901, 0xd46a, 0x0000 }, - { 0x0901, 0xd46c, 0x0000 }, - { 0x8901, 0xd46f, 0x2000 }, - { 0x0901, 0xd46e, 0x0000 }, - { 0x0901, 0xd470, 0x0000 }, - { 0x8901, 0xd475, 0x3000 }, - { 0x8901, 0xd473, 0x2000 }, - { 0x0901, 0xd472, 0x0000 }, - { 0x0901, 0xd474, 0x0000 }, - { 0x8901, 0xd477, 0x2000 }, - { 0x0901, 0xd476, 0x0000 }, - { 0x0901, 0xd478, 0x0000 }, - { 0x8501, 0xd489, 0x5000 }, - { 0x8901, 0xd481, 0x4000 }, - { 0x8901, 0xd47d, 0x3000 }, - { 0x8901, 0xd47b, 0x2000 }, - { 0x0901, 0xd47a, 0x0000 }, - { 0x0901, 0xd47c, 0x0000 }, - { 0x8901, 0xd47f, 0x2000 }, - { 0x0901, 0xd47e, 0x0000 }, - { 0x0901, 0xd480, 0x0000 }, - { 0x8501, 0xd485, 0x3000 }, - { 0x8501, 0xd483, 0x2000 }, - { 0x0501, 0xd482, 0x0000 }, - { 0x0501, 0xd484, 0x0000 }, - { 0x8501, 0xd487, 0x2000 }, - { 0x0501, 0xd486, 0x0000 }, - { 0x0501, 0xd488, 0x0000 }, - { 0x8501, 0xd491, 0x4000 }, - { 0x8501, 0xd48d, 0x3000 }, - { 0x8501, 0xd48b, 0x2000 }, - { 0x0501, 0xd48a, 0x0000 }, - { 0x0501, 0xd48c, 0x0000 }, - { 0x8501, 0xd48f, 0x2000 }, - { 0x0501, 0xd48e, 0x0000 }, - { 0x0501, 0xd490, 0x0000 }, - { 0x8501, 0xd495, 0x3000 }, - { 0x8501, 0xd493, 0x2000 }, - { 0x0501, 0xd492, 0x0000 }, - { 0x0501, 0xd494, 0x0000 }, - { 0x8501, 0xd497, 0x2000 }, - { 0x0501, 0xd496, 0x0000 }, - { 0x0501, 0xd498, 0x0000 }, - { 0x8501, 0xd4c3, 0x6000 }, - { 0x8901, 0xd4b1, 0x5000 }, - { 0x8901, 0xd4a6, 0x4000 }, - { 0x8901, 0xd49e, 0x3000 }, - { 0x8501, 0xd49b, 0x2000 }, - { 0x0501, 0xd49a, 0x0000 }, - { 0x0901, 0xd49c, 0x0000 }, - { 0x8901, 0xd4a2, 0x2000 }, - { 0x0901, 0xd49f, 0x0000 }, - { 0x0901, 0xd4a5, 0x0000 }, - { 0x8901, 0xd4ac, 0x3000 }, - { 0x8901, 0xd4aa, 0x2000 }, - { 0x0901, 0xd4a9, 0x0000 }, - { 0x0901, 0xd4ab, 0x0000 }, - { 0x8901, 0xd4af, 0x2000 }, - { 0x0901, 0xd4ae, 0x0000 }, - { 0x0901, 0xd4b0, 0x0000 }, - { 0x8501, 0xd4b9, 0x4000 }, - { 0x8901, 0xd4b5, 0x3000 }, - { 0x8901, 0xd4b3, 0x2000 }, - { 0x0901, 0xd4b2, 0x0000 }, - { 0x0901, 0xd4b4, 0x0000 }, - { 0x8501, 0xd4b7, 0x2000 }, - { 0x0501, 0xd4b6, 0x0000 }, - { 0x0501, 0xd4b8, 0x0000 }, - { 0x8501, 0xd4bf, 0x3000 }, - { 0x8501, 0xd4bd, 0x2000 }, - { 0x0501, 0xd4bb, 0x0000 }, - { 0x0501, 0xd4be, 0x0000 }, - { 0x8501, 0xd4c1, 0x2000 }, - { 0x0501, 0xd4c0, 0x0000 }, - { 0x0501, 0xd4c2, 0x0000 }, - { 0x8901, 0xd4d4, 0x5000 }, - { 0x8501, 0xd4cc, 0x4000 }, - { 0x8501, 0xd4c8, 0x3000 }, - { 0x8501, 0xd4c6, 0x2000 }, - { 0x0501, 0xd4c5, 0x0000 }, - { 0x0501, 0xd4c7, 0x0000 }, - { 0x8501, 0xd4ca, 0x2000 }, - { 0x0501, 0xd4c9, 0x0000 }, - { 0x0501, 0xd4cb, 0x0000 }, - { 0x8901, 0xd4d0, 0x3000 }, - { 0x8501, 0xd4ce, 0x2000 }, - { 0x0501, 0xd4cd, 0x0000 }, - { 0x0501, 0xd4cf, 0x0000 }, - { 0x8901, 0xd4d2, 0x2000 }, - { 0x0901, 0xd4d1, 0x0000 }, - { 0x0901, 0xd4d3, 0x0000 }, - { 0x8901, 0xd4dc, 0x4000 }, - { 0x8901, 0xd4d8, 0x3000 }, - { 0x8901, 0xd4d6, 0x2000 }, - { 0x0901, 0xd4d5, 0x0000 }, - { 0x0901, 0xd4d7, 0x0000 }, - { 0x8901, 0xd4da, 0x2000 }, - { 0x0901, 0xd4d9, 0x0000 }, - { 0x0901, 0xd4db, 0x0000 }, - { 0x8901, 0xd4e0, 0x3000 }, - { 0x8901, 0xd4de, 0x2000 }, - { 0x0901, 0xd4dd, 0x0000 }, - { 0x0901, 0xd4df, 0x0000 }, - { 0x8901, 0xd4e2, 0x2000 }, - { 0x0901, 0xd4e1, 0x0000 }, - { 0x0901, 0xd4e3, 0x0000 }, - { 0x8501, 0xd529, 0x7000 }, - { 0x8901, 0xd504, 0x6000 }, - { 0x8501, 0xd4f4, 0x5000 }, - { 0x8501, 0xd4ec, 0x4000 }, - { 0x8901, 0xd4e8, 0x3000 }, - { 0x8901, 0xd4e6, 0x2000 }, - { 0x0901, 0xd4e5, 0x0000 }, - { 0x0901, 0xd4e7, 0x0000 }, - { 0x8501, 0xd4ea, 0x2000 }, - { 0x0901, 0xd4e9, 0x0000 }, - { 0x0501, 0xd4eb, 0x0000 }, - { 0x8501, 0xd4f0, 0x3000 }, - { 0x8501, 0xd4ee, 0x2000 }, - { 0x0501, 0xd4ed, 0x0000 }, - { 0x0501, 0xd4ef, 0x0000 }, - { 0x8501, 0xd4f2, 0x2000 }, - { 0x0501, 0xd4f1, 0x0000 }, - { 0x0501, 0xd4f3, 0x0000 }, - { 0x8501, 0xd4fc, 0x4000 }, - { 0x8501, 0xd4f8, 0x3000 }, - { 0x8501, 0xd4f6, 0x2000 }, - { 0x0501, 0xd4f5, 0x0000 }, - { 0x0501, 0xd4f7, 0x0000 }, - { 0x8501, 0xd4fa, 0x2000 }, - { 0x0501, 0xd4f9, 0x0000 }, - { 0x0501, 0xd4fb, 0x0000 }, - { 0x8501, 0xd500, 0x3000 }, - { 0x8501, 0xd4fe, 0x2000 }, - { 0x0501, 0xd4fd, 0x0000 }, - { 0x0501, 0xd4ff, 0x0000 }, - { 0x8501, 0xd502, 0x2000 }, - { 0x0501, 0xd501, 0x0000 }, - { 0x0501, 0xd503, 0x0000 }, - { 0x8901, 0xd518, 0x5000 }, - { 0x8901, 0xd50f, 0x4000 }, - { 0x8901, 0xd509, 0x3000 }, - { 0x8901, 0xd507, 0x2000 }, - { 0x0901, 0xd505, 0x0000 }, - { 0x0901, 0xd508, 0x0000 }, - { 0x8901, 0xd50d, 0x2000 }, - { 0x0901, 0xd50a, 0x0000 }, - { 0x0901, 0xd50e, 0x0000 }, - { 0x8901, 0xd513, 0x3000 }, - { 0x8901, 0xd511, 0x2000 }, - { 0x0901, 0xd510, 0x0000 }, - { 0x0901, 0xd512, 0x0000 }, - { 0x8901, 0xd516, 0x2000 }, - { 0x0901, 0xd514, 0x0000 }, - { 0x0901, 0xd517, 0x0000 }, - { 0x8501, 0xd521, 0x4000 }, - { 0x8901, 0xd51c, 0x3000 }, - { 0x8901, 0xd51a, 0x2000 }, - { 0x0901, 0xd519, 0x0000 }, - { 0x0901, 0xd51b, 0x0000 }, - { 0x8501, 0xd51f, 0x2000 }, - { 0x0501, 0xd51e, 0x0000 }, - { 0x0501, 0xd520, 0x0000 }, - { 0x8501, 0xd525, 0x3000 }, - { 0x8501, 0xd523, 0x2000 }, - { 0x0501, 0xd522, 0x0000 }, - { 0x0501, 0xd524, 0x0000 }, - { 0x8501, 0xd527, 0x2000 }, - { 0x0501, 0xd526, 0x0000 }, - { 0x0501, 0xd528, 0x0000 }, - { 0x8901, 0xd54f, 0x6000 }, - { 0x8901, 0xd539, 0x5000 }, - { 0x8501, 0xd531, 0x4000 }, - { 0x8501, 0xd52d, 0x3000 }, - { 0x8501, 0xd52b, 0x2000 }, - { 0x0501, 0xd52a, 0x0000 }, - { 0x0501, 0xd52c, 0x0000 }, - { 0x8501, 0xd52f, 0x2000 }, - { 0x0501, 0xd52e, 0x0000 }, - { 0x0501, 0xd530, 0x0000 }, - { 0x8501, 0xd535, 0x3000 }, - { 0x8501, 0xd533, 0x2000 }, - { 0x0501, 0xd532, 0x0000 }, - { 0x0501, 0xd534, 0x0000 }, - { 0x8501, 0xd537, 0x2000 }, - { 0x0501, 0xd536, 0x0000 }, - { 0x0901, 0xd538, 0x0000 }, - { 0x8901, 0xd543, 0x4000 }, - { 0x8901, 0xd53e, 0x3000 }, - { 0x8901, 0xd53c, 0x2000 }, - { 0x0901, 0xd53b, 0x0000 }, - { 0x0901, 0xd53d, 0x0000 }, - { 0x8901, 0xd541, 0x2000 }, - { 0x0901, 0xd540, 0x0000 }, - { 0x0901, 0xd542, 0x0000 }, - { 0x8901, 0xd54b, 0x3000 }, - { 0x8901, 0xd546, 0x2000 }, - { 0x0901, 0xd544, 0x0000 }, - { 0x0901, 0xd54a, 0x0000 }, - { 0x8901, 0xd54d, 0x2000 }, - { 0x0901, 0xd54c, 0x0000 }, - { 0x0901, 0xd54e, 0x0000 }, - { 0x8501, 0xd560, 0x5000 }, - { 0x8501, 0xd558, 0x4000 }, - { 0x8501, 0xd554, 0x3000 }, - { 0x8501, 0xd552, 0x2000 }, - { 0x0901, 0xd550, 0x0000 }, - { 0x0501, 0xd553, 0x0000 }, - { 0x8501, 0xd556, 0x2000 }, - { 0x0501, 0xd555, 0x0000 }, - { 0x0501, 0xd557, 0x0000 }, - { 0x8501, 0xd55c, 0x3000 }, - { 0x8501, 0xd55a, 0x2000 }, - { 0x0501, 0xd559, 0x0000 }, - { 0x0501, 0xd55b, 0x0000 }, - { 0x8501, 0xd55e, 0x2000 }, - { 0x0501, 0xd55d, 0x0000 }, - { 0x0501, 0xd55f, 0x0000 }, - { 0x8501, 0xd568, 0x4000 }, - { 0x8501, 0xd564, 0x3000 }, - { 0x8501, 0xd562, 0x2000 }, - { 0x0501, 0xd561, 0x0000 }, - { 0x0501, 0xd563, 0x0000 }, - { 0x8501, 0xd566, 0x2000 }, - { 0x0501, 0xd565, 0x0000 }, - { 0x0501, 0xd567, 0x0000 }, - { 0x8901, 0xd56c, 0x3000 }, - { 0x8501, 0xd56a, 0x2000 }, - { 0x0501, 0xd569, 0x0000 }, - { 0x0501, 0xd56b, 0x0000 }, - { 0x8901, 0xd56e, 0x2000 }, - { 0x0901, 0xd56d, 0x0000 }, - { 0x0901, 0xd56f, 0x0000 }, - { 0x8501, 0xd5f0, 0x8000 }, - { 0x8901, 0xd5b0, 0x7000 }, - { 0x8501, 0xd590, 0x6000 }, - { 0x8901, 0xd580, 0x5000 }, - { 0x8901, 0xd578, 0x4000 }, - { 0x8901, 0xd574, 0x3000 }, - { 0x8901, 0xd572, 0x2000 }, - { 0x0901, 0xd571, 0x0000 }, - { 0x0901, 0xd573, 0x0000 }, - { 0x8901, 0xd576, 0x2000 }, - { 0x0901, 0xd575, 0x0000 }, - { 0x0901, 0xd577, 0x0000 }, - { 0x8901, 0xd57c, 0x3000 }, - { 0x8901, 0xd57a, 0x2000 }, - { 0x0901, 0xd579, 0x0000 }, - { 0x0901, 0xd57b, 0x0000 }, - { 0x8901, 0xd57e, 0x2000 }, - { 0x0901, 0xd57d, 0x0000 }, - { 0x0901, 0xd57f, 0x0000 }, - { 0x8501, 0xd588, 0x4000 }, - { 0x8901, 0xd584, 0x3000 }, - { 0x8901, 0xd582, 0x2000 }, - { 0x0901, 0xd581, 0x0000 }, - { 0x0901, 0xd583, 0x0000 }, - { 0x8501, 0xd586, 0x2000 }, - { 0x0901, 0xd585, 0x0000 }, - { 0x0501, 0xd587, 0x0000 }, - { 0x8501, 0xd58c, 0x3000 }, - { 0x8501, 0xd58a, 0x2000 }, - { 0x0501, 0xd589, 0x0000 }, - { 0x0501, 0xd58b, 0x0000 }, - { 0x8501, 0xd58e, 0x2000 }, - { 0x0501, 0xd58d, 0x0000 }, - { 0x0501, 0xd58f, 0x0000 }, - { 0x8901, 0xd5a0, 0x5000 }, - { 0x8501, 0xd598, 0x4000 }, - { 0x8501, 0xd594, 0x3000 }, - { 0x8501, 0xd592, 0x2000 }, - { 0x0501, 0xd591, 0x0000 }, - { 0x0501, 0xd593, 0x0000 }, - { 0x8501, 0xd596, 0x2000 }, - { 0x0501, 0xd595, 0x0000 }, - { 0x0501, 0xd597, 0x0000 }, - { 0x8501, 0xd59c, 0x3000 }, - { 0x8501, 0xd59a, 0x2000 }, - { 0x0501, 0xd599, 0x0000 }, - { 0x0501, 0xd59b, 0x0000 }, - { 0x8501, 0xd59e, 0x2000 }, - { 0x0501, 0xd59d, 0x0000 }, - { 0x0501, 0xd59f, 0x0000 }, - { 0x8901, 0xd5a8, 0x4000 }, - { 0x8901, 0xd5a4, 0x3000 }, - { 0x8901, 0xd5a2, 0x2000 }, - { 0x0901, 0xd5a1, 0x0000 }, - { 0x0901, 0xd5a3, 0x0000 }, - { 0x8901, 0xd5a6, 0x2000 }, - { 0x0901, 0xd5a5, 0x0000 }, - { 0x0901, 0xd5a7, 0x0000 }, - { 0x8901, 0xd5ac, 0x3000 }, - { 0x8901, 0xd5aa, 0x2000 }, - { 0x0901, 0xd5a9, 0x0000 }, - { 0x0901, 0xd5ab, 0x0000 }, - { 0x8901, 0xd5ae, 0x2000 }, - { 0x0901, 0xd5ad, 0x0000 }, - { 0x0901, 0xd5af, 0x0000 }, - { 0x8501, 0xd5d0, 0x6000 }, - { 0x8501, 0xd5c0, 0x5000 }, - { 0x8901, 0xd5b8, 0x4000 }, - { 0x8901, 0xd5b4, 0x3000 }, - { 0x8901, 0xd5b2, 0x2000 }, - { 0x0901, 0xd5b1, 0x0000 }, - { 0x0901, 0xd5b3, 0x0000 }, - { 0x8901, 0xd5b6, 0x2000 }, - { 0x0901, 0xd5b5, 0x0000 }, - { 0x0901, 0xd5b7, 0x0000 }, - { 0x8501, 0xd5bc, 0x3000 }, - { 0x8501, 0xd5ba, 0x2000 }, - { 0x0901, 0xd5b9, 0x0000 }, - { 0x0501, 0xd5bb, 0x0000 }, - { 0x8501, 0xd5be, 0x2000 }, - { 0x0501, 0xd5bd, 0x0000 }, - { 0x0501, 0xd5bf, 0x0000 }, - { 0x8501, 0xd5c8, 0x4000 }, - { 0x8501, 0xd5c4, 0x3000 }, - { 0x8501, 0xd5c2, 0x2000 }, - { 0x0501, 0xd5c1, 0x0000 }, - { 0x0501, 0xd5c3, 0x0000 }, - { 0x8501, 0xd5c6, 0x2000 }, - { 0x0501, 0xd5c5, 0x0000 }, - { 0x0501, 0xd5c7, 0x0000 }, - { 0x8501, 0xd5cc, 0x3000 }, - { 0x8501, 0xd5ca, 0x2000 }, - { 0x0501, 0xd5c9, 0x0000 }, - { 0x0501, 0xd5cb, 0x0000 }, - { 0x8501, 0xd5ce, 0x2000 }, - { 0x0501, 0xd5cd, 0x0000 }, - { 0x0501, 0xd5cf, 0x0000 }, - { 0x8901, 0xd5e0, 0x5000 }, - { 0x8901, 0xd5d8, 0x4000 }, - { 0x8901, 0xd5d4, 0x3000 }, - { 0x8501, 0xd5d2, 0x2000 }, - { 0x0501, 0xd5d1, 0x0000 }, - { 0x0501, 0xd5d3, 0x0000 }, - { 0x8901, 0xd5d6, 0x2000 }, - { 0x0901, 0xd5d5, 0x0000 }, - { 0x0901, 0xd5d7, 0x0000 }, - { 0x8901, 0xd5dc, 0x3000 }, - { 0x8901, 0xd5da, 0x2000 }, - { 0x0901, 0xd5d9, 0x0000 }, - { 0x0901, 0xd5db, 0x0000 }, - { 0x8901, 0xd5de, 0x2000 }, - { 0x0901, 0xd5dd, 0x0000 }, - { 0x0901, 0xd5df, 0x0000 }, - { 0x8901, 0xd5e8, 0x4000 }, - { 0x8901, 0xd5e4, 0x3000 }, - { 0x8901, 0xd5e2, 0x2000 }, - { 0x0901, 0xd5e1, 0x0000 }, - { 0x0901, 0xd5e3, 0x0000 }, - { 0x8901, 0xd5e6, 0x2000 }, - { 0x0901, 0xd5e5, 0x0000 }, - { 0x0901, 0xd5e7, 0x0000 }, - { 0x8901, 0xd5ec, 0x3000 }, - { 0x8901, 0xd5ea, 0x2000 }, - { 0x0901, 0xd5e9, 0x0000 }, - { 0x0901, 0xd5eb, 0x0000 }, - { 0x8501, 0xd5ee, 0x2000 }, - { 0x0901, 0xd5ed, 0x0000 }, - { 0x0501, 0xd5ef, 0x0000 }, - { 0x8501, 0xd630, 0x7000 }, - { 0x8901, 0xd610, 0x6000 }, - { 0x8501, 0xd600, 0x5000 }, - { 0x8501, 0xd5f8, 0x4000 }, - { 0x8501, 0xd5f4, 0x3000 }, - { 0x8501, 0xd5f2, 0x2000 }, - { 0x0501, 0xd5f1, 0x0000 }, - { 0x0501, 0xd5f3, 0x0000 }, - { 0x8501, 0xd5f6, 0x2000 }, - { 0x0501, 0xd5f5, 0x0000 }, - { 0x0501, 0xd5f7, 0x0000 }, - { 0x8501, 0xd5fc, 0x3000 }, - { 0x8501, 0xd5fa, 0x2000 }, - { 0x0501, 0xd5f9, 0x0000 }, - { 0x0501, 0xd5fb, 0x0000 }, - { 0x8501, 0xd5fe, 0x2000 }, - { 0x0501, 0xd5fd, 0x0000 }, - { 0x0501, 0xd5ff, 0x0000 }, - { 0x8901, 0xd608, 0x4000 }, - { 0x8501, 0xd604, 0x3000 }, - { 0x8501, 0xd602, 0x2000 }, - { 0x0501, 0xd601, 0x0000 }, - { 0x0501, 0xd603, 0x0000 }, - { 0x8501, 0xd606, 0x2000 }, - { 0x0501, 0xd605, 0x0000 }, - { 0x0501, 0xd607, 0x0000 }, - { 0x8901, 0xd60c, 0x3000 }, - { 0x8901, 0xd60a, 0x2000 }, - { 0x0901, 0xd609, 0x0000 }, - { 0x0901, 0xd60b, 0x0000 }, - { 0x8901, 0xd60e, 0x2000 }, - { 0x0901, 0xd60d, 0x0000 }, - { 0x0901, 0xd60f, 0x0000 }, - { 0x8901, 0xd620, 0x5000 }, - { 0x8901, 0xd618, 0x4000 }, - { 0x8901, 0xd614, 0x3000 }, - { 0x8901, 0xd612, 0x2000 }, - { 0x0901, 0xd611, 0x0000 }, - { 0x0901, 0xd613, 0x0000 }, - { 0x8901, 0xd616, 0x2000 }, - { 0x0901, 0xd615, 0x0000 }, - { 0x0901, 0xd617, 0x0000 }, - { 0x8901, 0xd61c, 0x3000 }, - { 0x8901, 0xd61a, 0x2000 }, - { 0x0901, 0xd619, 0x0000 }, - { 0x0901, 0xd61b, 0x0000 }, - { 0x8901, 0xd61e, 0x2000 }, - { 0x0901, 0xd61d, 0x0000 }, - { 0x0901, 0xd61f, 0x0000 }, - { 0x8501, 0xd628, 0x4000 }, - { 0x8501, 0xd624, 0x3000 }, - { 0x8501, 0xd622, 0x2000 }, - { 0x0901, 0xd621, 0x0000 }, - { 0x0501, 0xd623, 0x0000 }, - { 0x8501, 0xd626, 0x2000 }, - { 0x0501, 0xd625, 0x0000 }, - { 0x0501, 0xd627, 0x0000 }, - { 0x8501, 0xd62c, 0x3000 }, - { 0x8501, 0xd62a, 0x2000 }, - { 0x0501, 0xd629, 0x0000 }, - { 0x0501, 0xd62b, 0x0000 }, - { 0x8501, 0xd62e, 0x2000 }, - { 0x0501, 0xd62d, 0x0000 }, - { 0x0501, 0xd62f, 0x0000 }, - { 0x8901, 0xd650, 0x6000 }, - { 0x8901, 0xd640, 0x5000 }, - { 0x8501, 0xd638, 0x4000 }, - { 0x8501, 0xd634, 0x3000 }, - { 0x8501, 0xd632, 0x2000 }, - { 0x0501, 0xd631, 0x0000 }, - { 0x0501, 0xd633, 0x0000 }, - { 0x8501, 0xd636, 0x2000 }, - { 0x0501, 0xd635, 0x0000 }, - { 0x0501, 0xd637, 0x0000 }, - { 0x8901, 0xd63c, 0x3000 }, - { 0x8501, 0xd63a, 0x2000 }, - { 0x0501, 0xd639, 0x0000 }, - { 0x0501, 0xd63b, 0x0000 }, - { 0x8901, 0xd63e, 0x2000 }, - { 0x0901, 0xd63d, 0x0000 }, - { 0x0901, 0xd63f, 0x0000 }, - { 0x8901, 0xd648, 0x4000 }, - { 0x8901, 0xd644, 0x3000 }, - { 0x8901, 0xd642, 0x2000 }, - { 0x0901, 0xd641, 0x0000 }, - { 0x0901, 0xd643, 0x0000 }, - { 0x8901, 0xd646, 0x2000 }, - { 0x0901, 0xd645, 0x0000 }, - { 0x0901, 0xd647, 0x0000 }, - { 0x8901, 0xd64c, 0x3000 }, - { 0x8901, 0xd64a, 0x2000 }, - { 0x0901, 0xd649, 0x0000 }, - { 0x0901, 0xd64b, 0x0000 }, - { 0x8901, 0xd64e, 0x2000 }, - { 0x0901, 0xd64d, 0x0000 }, - { 0x0901, 0xd64f, 0x0000 }, - { 0x8501, 0xd660, 0x5000 }, - { 0x8501, 0xd658, 0x4000 }, - { 0x8901, 0xd654, 0x3000 }, - { 0x8901, 0xd652, 0x2000 }, - { 0x0901, 0xd651, 0x0000 }, - { 0x0901, 0xd653, 0x0000 }, - { 0x8501, 0xd656, 0x2000 }, - { 0x0901, 0xd655, 0x0000 }, - { 0x0501, 0xd657, 0x0000 }, - { 0x8501, 0xd65c, 0x3000 }, - { 0x8501, 0xd65a, 0x2000 }, - { 0x0501, 0xd659, 0x0000 }, - { 0x0501, 0xd65b, 0x0000 }, - { 0x8501, 0xd65e, 0x2000 }, - { 0x0501, 0xd65d, 0x0000 }, - { 0x0501, 0xd65f, 0x0000 }, - { 0x8501, 0xd668, 0x4000 }, - { 0x8501, 0xd664, 0x3000 }, - { 0x8501, 0xd662, 0x2000 }, - { 0x0501, 0xd661, 0x0000 }, - { 0x0501, 0xd663, 0x0000 }, - { 0x8501, 0xd666, 0x2000 }, - { 0x0501, 0xd665, 0x0000 }, - { 0x0501, 0xd667, 0x0000 }, - { 0x8501, 0xd66c, 0x3000 }, - { 0x8501, 0xd66a, 0x2000 }, - { 0x0501, 0xd669, 0x0000 }, - { 0x0501, 0xd66b, 0x0000 }, - { 0x8501, 0xd66e, 0x2000 }, - { 0x0501, 0xd66d, 0x0000 }, - { 0x0501, 0xd66f, 0x0000 }, - { 0x8501, 0xd774, 0x9000 }, - { 0x8901, 0xd6f4, 0x8000 }, - { 0x8901, 0xd6b4, 0x7000 }, - { 0x8501, 0xd690, 0x6000 }, - { 0x8901, 0xd680, 0x5000 }, - { 0x8901, 0xd678, 0x4000 }, - { 0x8901, 0xd674, 0x3000 }, - { 0x8901, 0xd672, 0x2000 }, - { 0x0901, 0xd671, 0x0000 }, - { 0x0901, 0xd673, 0x0000 }, - { 0x8901, 0xd676, 0x2000 }, - { 0x0901, 0xd675, 0x0000 }, - { 0x0901, 0xd677, 0x0000 }, - { 0x8901, 0xd67c, 0x3000 }, - { 0x8901, 0xd67a, 0x2000 }, - { 0x0901, 0xd679, 0x0000 }, - { 0x0901, 0xd67b, 0x0000 }, - { 0x8901, 0xd67e, 0x2000 }, - { 0x0901, 0xd67d, 0x0000 }, - { 0x0901, 0xd67f, 0x0000 }, - { 0x8901, 0xd688, 0x4000 }, - { 0x8901, 0xd684, 0x3000 }, - { 0x8901, 0xd682, 0x2000 }, - { 0x0901, 0xd681, 0x0000 }, - { 0x0901, 0xd683, 0x0000 }, - { 0x8901, 0xd686, 0x2000 }, - { 0x0901, 0xd685, 0x0000 }, - { 0x0901, 0xd687, 0x0000 }, - { 0x8501, 0xd68c, 0x3000 }, - { 0x8501, 0xd68a, 0x2000 }, - { 0x0901, 0xd689, 0x0000 }, - { 0x0501, 0xd68b, 0x0000 }, - { 0x8501, 0xd68e, 0x2000 }, - { 0x0501, 0xd68d, 0x0000 }, - { 0x0501, 0xd68f, 0x0000 }, - { 0x8501, 0xd6a0, 0x5000 }, - { 0x8501, 0xd698, 0x4000 }, - { 0x8501, 0xd694, 0x3000 }, - { 0x8501, 0xd692, 0x2000 }, - { 0x0501, 0xd691, 0x0000 }, - { 0x0501, 0xd693, 0x0000 }, - { 0x8501, 0xd696, 0x2000 }, - { 0x0501, 0xd695, 0x0000 }, - { 0x0501, 0xd697, 0x0000 }, - { 0x8501, 0xd69c, 0x3000 }, - { 0x8501, 0xd69a, 0x2000 }, - { 0x0501, 0xd699, 0x0000 }, - { 0x0501, 0xd69b, 0x0000 }, - { 0x8501, 0xd69e, 0x2000 }, - { 0x0501, 0xd69d, 0x0000 }, - { 0x0501, 0xd69f, 0x0000 }, - { 0x8901, 0xd6ac, 0x4000 }, - { 0x8901, 0xd6a8, 0x3000 }, - { 0x8501, 0xd6a2, 0x2000 }, - { 0x0501, 0xd6a1, 0x0000 }, - { 0x0501, 0xd6a3, 0x0000 }, - { 0x8901, 0xd6aa, 0x2000 }, - { 0x0901, 0xd6a9, 0x0000 }, - { 0x0901, 0xd6ab, 0x0000 }, - { 0x8901, 0xd6b0, 0x3000 }, - { 0x8901, 0xd6ae, 0x2000 }, - { 0x0901, 0xd6ad, 0x0000 }, - { 0x0901, 0xd6af, 0x0000 }, - { 0x8901, 0xd6b2, 0x2000 }, - { 0x0901, 0xd6b1, 0x0000 }, - { 0x0901, 0xd6b3, 0x0000 }, - { 0x8501, 0xd6d4, 0x6000 }, - { 0x8501, 0xd6c4, 0x5000 }, - { 0x8901, 0xd6bc, 0x4000 }, - { 0x8901, 0xd6b8, 0x3000 }, - { 0x8901, 0xd6b6, 0x2000 }, - { 0x0901, 0xd6b5, 0x0000 }, - { 0x0901, 0xd6b7, 0x0000 }, - { 0x8901, 0xd6ba, 0x2000 }, - { 0x0901, 0xd6b9, 0x0000 }, - { 0x0901, 0xd6bb, 0x0000 }, - { 0x8901, 0xd6c0, 0x3000 }, - { 0x8901, 0xd6be, 0x2000 }, - { 0x0901, 0xd6bd, 0x0000 }, - { 0x0901, 0xd6bf, 0x0000 }, - { 0x8501, 0xd6c2, 0x2000 }, - { 0x1901, 0xd6c1, 0x0000 }, - { 0x0501, 0xd6c3, 0x0000 }, - { 0x8501, 0xd6cc, 0x4000 }, - { 0x8501, 0xd6c8, 0x3000 }, - { 0x8501, 0xd6c6, 0x2000 }, - { 0x0501, 0xd6c5, 0x0000 }, - { 0x0501, 0xd6c7, 0x0000 }, - { 0x8501, 0xd6ca, 0x2000 }, - { 0x0501, 0xd6c9, 0x0000 }, - { 0x0501, 0xd6cb, 0x0000 }, - { 0x8501, 0xd6d0, 0x3000 }, - { 0x8501, 0xd6ce, 0x2000 }, - { 0x0501, 0xd6cd, 0x0000 }, - { 0x0501, 0xd6cf, 0x0000 }, - { 0x8501, 0xd6d2, 0x2000 }, - { 0x0501, 0xd6d1, 0x0000 }, - { 0x0501, 0xd6d3, 0x0000 }, - { 0x8901, 0xd6e4, 0x5000 }, - { 0x8501, 0xd6dc, 0x4000 }, - { 0x8501, 0xd6d8, 0x3000 }, - { 0x8501, 0xd6d6, 0x2000 }, - { 0x0501, 0xd6d5, 0x0000 }, - { 0x0501, 0xd6d7, 0x0000 }, - { 0x8501, 0xd6da, 0x2000 }, - { 0x0501, 0xd6d9, 0x0000 }, - { 0x1901, 0xd6db, 0x0000 }, - { 0x8501, 0xd6e0, 0x3000 }, - { 0x8501, 0xd6de, 0x2000 }, - { 0x0501, 0xd6dd, 0x0000 }, - { 0x0501, 0xd6df, 0x0000 }, - { 0x8901, 0xd6e2, 0x2000 }, - { 0x0501, 0xd6e1, 0x0000 }, - { 0x0901, 0xd6e3, 0x0000 }, - { 0x8901, 0xd6ec, 0x4000 }, - { 0x8901, 0xd6e8, 0x3000 }, - { 0x8901, 0xd6e6, 0x2000 }, - { 0x0901, 0xd6e5, 0x0000 }, - { 0x0901, 0xd6e7, 0x0000 }, - { 0x8901, 0xd6ea, 0x2000 }, - { 0x0901, 0xd6e9, 0x0000 }, - { 0x0901, 0xd6eb, 0x0000 }, - { 0x8901, 0xd6f0, 0x3000 }, - { 0x8901, 0xd6ee, 0x2000 }, - { 0x0901, 0xd6ed, 0x0000 }, - { 0x0901, 0xd6ef, 0x0000 }, - { 0x8901, 0xd6f2, 0x2000 }, - { 0x0901, 0xd6f1, 0x0000 }, - { 0x0901, 0xd6f3, 0x0000 }, - { 0x8901, 0xd734, 0x7000 }, - { 0x8501, 0xd714, 0x6000 }, - { 0x8501, 0xd704, 0x5000 }, - { 0x8501, 0xd6fc, 0x4000 }, - { 0x8901, 0xd6f8, 0x3000 }, - { 0x8901, 0xd6f6, 0x2000 }, - { 0x0901, 0xd6f5, 0x0000 }, - { 0x0901, 0xd6f7, 0x0000 }, - { 0x8901, 0xd6fa, 0x2000 }, - { 0x0901, 0xd6f9, 0x0000 }, - { 0x1901, 0xd6fb, 0x0000 }, - { 0x8501, 0xd700, 0x3000 }, - { 0x8501, 0xd6fe, 0x2000 }, - { 0x0501, 0xd6fd, 0x0000 }, - { 0x0501, 0xd6ff, 0x0000 }, - { 0x8501, 0xd702, 0x2000 }, - { 0x0501, 0xd701, 0x0000 }, - { 0x0501, 0xd703, 0x0000 }, - { 0x8501, 0xd70c, 0x4000 }, - { 0x8501, 0xd708, 0x3000 }, - { 0x8501, 0xd706, 0x2000 }, - { 0x0501, 0xd705, 0x0000 }, - { 0x0501, 0xd707, 0x0000 }, - { 0x8501, 0xd70a, 0x2000 }, - { 0x0501, 0xd709, 0x0000 }, - { 0x0501, 0xd70b, 0x0000 }, - { 0x8501, 0xd710, 0x3000 }, - { 0x8501, 0xd70e, 0x2000 }, - { 0x0501, 0xd70d, 0x0000 }, - { 0x0501, 0xd70f, 0x0000 }, - { 0x8501, 0xd712, 0x2000 }, - { 0x0501, 0xd711, 0x0000 }, - { 0x0501, 0xd713, 0x0000 }, - { 0x8901, 0xd724, 0x5000 }, - { 0x8901, 0xd71c, 0x4000 }, - { 0x8501, 0xd718, 0x3000 }, - { 0x8501, 0xd716, 0x2000 }, - { 0x1901, 0xd715, 0x0000 }, - { 0x0501, 0xd717, 0x0000 }, - { 0x8501, 0xd71a, 0x2000 }, - { 0x0501, 0xd719, 0x0000 }, - { 0x0501, 0xd71b, 0x0000 }, - { 0x8901, 0xd720, 0x3000 }, - { 0x8901, 0xd71e, 0x2000 }, - { 0x0901, 0xd71d, 0x0000 }, - { 0x0901, 0xd71f, 0x0000 }, - { 0x8901, 0xd722, 0x2000 }, - { 0x0901, 0xd721, 0x0000 }, - { 0x0901, 0xd723, 0x0000 }, - { 0x8901, 0xd72c, 0x4000 }, - { 0x8901, 0xd728, 0x3000 }, - { 0x8901, 0xd726, 0x2000 }, - { 0x0901, 0xd725, 0x0000 }, - { 0x0901, 0xd727, 0x0000 }, - { 0x8901, 0xd72a, 0x2000 }, - { 0x0901, 0xd729, 0x0000 }, - { 0x0901, 0xd72b, 0x0000 }, - { 0x8901, 0xd730, 0x3000 }, - { 0x8901, 0xd72e, 0x2000 }, - { 0x0901, 0xd72d, 0x0000 }, - { 0x0901, 0xd72f, 0x0000 }, - { 0x8901, 0xd732, 0x2000 }, - { 0x0901, 0xd731, 0x0000 }, - { 0x0901, 0xd733, 0x0000 }, - { 0x8501, 0xd754, 0x6000 }, - { 0x8501, 0xd744, 0x5000 }, - { 0x8501, 0xd73c, 0x4000 }, - { 0x8501, 0xd738, 0x3000 }, - { 0x8501, 0xd736, 0x2000 }, - { 0x1901, 0xd735, 0x0000 }, - { 0x0501, 0xd737, 0x0000 }, - { 0x8501, 0xd73a, 0x2000 }, - { 0x0501, 0xd739, 0x0000 }, - { 0x0501, 0xd73b, 0x0000 }, - { 0x8501, 0xd740, 0x3000 }, - { 0x8501, 0xd73e, 0x2000 }, - { 0x0501, 0xd73d, 0x0000 }, - { 0x0501, 0xd73f, 0x0000 }, - { 0x8501, 0xd742, 0x2000 }, - { 0x0501, 0xd741, 0x0000 }, - { 0x0501, 0xd743, 0x0000 }, - { 0x8501, 0xd74c, 0x4000 }, - { 0x8501, 0xd748, 0x3000 }, - { 0x8501, 0xd746, 0x2000 }, - { 0x0501, 0xd745, 0x0000 }, - { 0x0501, 0xd747, 0x0000 }, - { 0x8501, 0xd74a, 0x2000 }, - { 0x0501, 0xd749, 0x0000 }, - { 0x0501, 0xd74b, 0x0000 }, - { 0x8501, 0xd750, 0x3000 }, - { 0x8501, 0xd74e, 0x2000 }, - { 0x0501, 0xd74d, 0x0000 }, - { 0x1901, 0xd74f, 0x0000 }, - { 0x8501, 0xd752, 0x2000 }, - { 0x0501, 0xd751, 0x0000 }, - { 0x0501, 0xd753, 0x0000 }, - { 0x8901, 0xd764, 0x5000 }, - { 0x8901, 0xd75c, 0x4000 }, - { 0x8901, 0xd758, 0x3000 }, - { 0x8901, 0xd756, 0x2000 }, - { 0x0501, 0xd755, 0x0000 }, - { 0x0901, 0xd757, 0x0000 }, - { 0x8901, 0xd75a, 0x2000 }, - { 0x0901, 0xd759, 0x0000 }, - { 0x0901, 0xd75b, 0x0000 }, - { 0x8901, 0xd760, 0x3000 }, - { 0x8901, 0xd75e, 0x2000 }, - { 0x0901, 0xd75d, 0x0000 }, - { 0x0901, 0xd75f, 0x0000 }, - { 0x8901, 0xd762, 0x2000 }, - { 0x0901, 0xd761, 0x0000 }, - { 0x0901, 0xd763, 0x0000 }, - { 0x8901, 0xd76c, 0x4000 }, - { 0x8901, 0xd768, 0x3000 }, - { 0x8901, 0xd766, 0x2000 }, - { 0x0901, 0xd765, 0x0000 }, - { 0x0901, 0xd767, 0x0000 }, - { 0x8901, 0xd76a, 0x2000 }, - { 0x0901, 0xd769, 0x0000 }, - { 0x0901, 0xd76b, 0x0000 }, - { 0x8501, 0xd770, 0x3000 }, - { 0x8901, 0xd76e, 0x2000 }, - { 0x0901, 0xd76d, 0x0000 }, - { 0x1901, 0xd76f, 0x0000 }, - { 0x8501, 0xd772, 0x2000 }, - { 0x0501, 0xd771, 0x0000 }, - { 0x0501, 0xd773, 0x0000 }, - { 0x8d01, 0xd7f8, 0x8000 }, - { 0x8501, 0xd7b4, 0x7000 }, - { 0x8901, 0xd794, 0x6000 }, - { 0x8501, 0xd784, 0x5000 }, - { 0x8501, 0xd77c, 0x4000 }, - { 0x8501, 0xd778, 0x3000 }, - { 0x8501, 0xd776, 0x2000 }, - { 0x0501, 0xd775, 0x0000 }, - { 0x0501, 0xd777, 0x0000 }, - { 0x8501, 0xd77a, 0x2000 }, - { 0x0501, 0xd779, 0x0000 }, - { 0x0501, 0xd77b, 0x0000 }, - { 0x8501, 0xd780, 0x3000 }, - { 0x8501, 0xd77e, 0x2000 }, - { 0x0501, 0xd77d, 0x0000 }, - { 0x0501, 0xd77f, 0x0000 }, - { 0x8501, 0xd782, 0x2000 }, - { 0x0501, 0xd781, 0x0000 }, - { 0x0501, 0xd783, 0x0000 }, - { 0x8501, 0xd78c, 0x4000 }, - { 0x8501, 0xd788, 0x3000 }, - { 0x8501, 0xd786, 0x2000 }, - { 0x0501, 0xd785, 0x0000 }, - { 0x0501, 0xd787, 0x0000 }, - { 0x8501, 0xd78a, 0x2000 }, - { 0x1901, 0xd789, 0x0000 }, - { 0x0501, 0xd78b, 0x0000 }, - { 0x8901, 0xd790, 0x3000 }, - { 0x8501, 0xd78e, 0x2000 }, - { 0x0501, 0xd78d, 0x0000 }, - { 0x0501, 0xd78f, 0x0000 }, - { 0x8901, 0xd792, 0x2000 }, - { 0x0901, 0xd791, 0x0000 }, - { 0x0901, 0xd793, 0x0000 }, - { 0x8901, 0xd7a4, 0x5000 }, - { 0x8901, 0xd79c, 0x4000 }, - { 0x8901, 0xd798, 0x3000 }, - { 0x8901, 0xd796, 0x2000 }, - { 0x0901, 0xd795, 0x0000 }, - { 0x0901, 0xd797, 0x0000 }, - { 0x8901, 0xd79a, 0x2000 }, - { 0x0901, 0xd799, 0x0000 }, - { 0x0901, 0xd79b, 0x0000 }, - { 0x8901, 0xd7a0, 0x3000 }, - { 0x8901, 0xd79e, 0x2000 }, - { 0x0901, 0xd79d, 0x0000 }, - { 0x0901, 0xd79f, 0x0000 }, - { 0x8901, 0xd7a2, 0x2000 }, - { 0x0901, 0xd7a1, 0x0000 }, - { 0x0901, 0xd7a3, 0x0000 }, - { 0x8501, 0xd7ac, 0x4000 }, - { 0x8901, 0xd7a8, 0x3000 }, - { 0x8901, 0xd7a6, 0x2000 }, - { 0x0901, 0xd7a5, 0x0000 }, - { 0x0901, 0xd7a7, 0x0000 }, - { 0x8501, 0xd7aa, 0x2000 }, - { 0x1901, 0xd7a9, 0x0000 }, - { 0x0501, 0xd7ab, 0x0000 }, - { 0x8501, 0xd7b0, 0x3000 }, - { 0x8501, 0xd7ae, 0x2000 }, - { 0x0501, 0xd7ad, 0x0000 }, - { 0x0501, 0xd7af, 0x0000 }, - { 0x8501, 0xd7b2, 0x2000 }, - { 0x0501, 0xd7b1, 0x0000 }, - { 0x0501, 0xd7b3, 0x0000 }, - { 0x8d01, 0xd7d8, 0x6000 }, - { 0x8501, 0xd7c4, 0x5000 }, - { 0x8501, 0xd7bc, 0x4000 }, - { 0x8501, 0xd7b8, 0x3000 }, - { 0x8501, 0xd7b6, 0x2000 }, - { 0x0501, 0xd7b5, 0x0000 }, - { 0x0501, 0xd7b7, 0x0000 }, - { 0x8501, 0xd7ba, 0x2000 }, - { 0x0501, 0xd7b9, 0x0000 }, - { 0x0501, 0xd7bb, 0x0000 }, - { 0x8501, 0xd7c0, 0x3000 }, - { 0x8501, 0xd7be, 0x2000 }, - { 0x0501, 0xd7bd, 0x0000 }, - { 0x0501, 0xd7bf, 0x0000 }, - { 0x8501, 0xd7c2, 0x2000 }, - { 0x0501, 0xd7c1, 0x0000 }, - { 0x1901, 0xd7c3, 0x0000 }, - { 0x8d01, 0xd7d0, 0x4000 }, - { 0x8501, 0xd7c8, 0x3000 }, - { 0x8501, 0xd7c6, 0x2000 }, - { 0x0501, 0xd7c5, 0x0000 }, - { 0x0501, 0xd7c7, 0x0000 }, - { 0x8d01, 0xd7ce, 0x2000 }, - { 0x0501, 0xd7c9, 0x0000 }, - { 0x0d01, 0xd7cf, 0x0000 }, - { 0x8d01, 0xd7d4, 0x3000 }, - { 0x8d01, 0xd7d2, 0x2000 }, - { 0x0d01, 0xd7d1, 0x0000 }, - { 0x0d01, 0xd7d3, 0x0000 }, - { 0x8d01, 0xd7d6, 0x2000 }, - { 0x0d01, 0xd7d5, 0x0000 }, - { 0x0d01, 0xd7d7, 0x0000 }, - { 0x8d01, 0xd7e8, 0x5000 }, - { 0x8d01, 0xd7e0, 0x4000 }, - { 0x8d01, 0xd7dc, 0x3000 }, - { 0x8d01, 0xd7da, 0x2000 }, - { 0x0d01, 0xd7d9, 0x0000 }, - { 0x0d01, 0xd7db, 0x0000 }, - { 0x8d01, 0xd7de, 0x2000 }, - { 0x0d01, 0xd7dd, 0x0000 }, - { 0x0d01, 0xd7df, 0x0000 }, - { 0x8d01, 0xd7e4, 0x3000 }, - { 0x8d01, 0xd7e2, 0x2000 }, - { 0x0d01, 0xd7e1, 0x0000 }, - { 0x0d01, 0xd7e3, 0x0000 }, - { 0x8d01, 0xd7e6, 0x2000 }, - { 0x0d01, 0xd7e5, 0x0000 }, - { 0x0d01, 0xd7e7, 0x0000 }, - { 0x8d01, 0xd7f0, 0x4000 }, - { 0x8d01, 0xd7ec, 0x3000 }, - { 0x8d01, 0xd7ea, 0x2000 }, - { 0x0d01, 0xd7e9, 0x0000 }, - { 0x0d01, 0xd7eb, 0x0000 }, - { 0x8d01, 0xd7ee, 0x2000 }, - { 0x0d01, 0xd7ed, 0x0000 }, - { 0x0d01, 0xd7ef, 0x0000 }, - { 0x8d01, 0xd7f4, 0x3000 }, - { 0x8d01, 0xd7f2, 0x2000 }, - { 0x0d01, 0xd7f1, 0x0000 }, - { 0x0d01, 0xd7f3, 0x0000 }, - { 0x8d01, 0xd7f6, 0x2000 }, - { 0x0d01, 0xd7f5, 0x0000 }, - { 0x0d01, 0xd7f7, 0x0000 }, - { 0x8702, 0xf836, 0x7000 }, - { 0x8702, 0xf816, 0x6000 }, - { 0x8702, 0xf806, 0x5000 }, - { 0x8702, 0x0000, 0x4000 }, - { 0x8d01, 0xd7fc, 0x3000 }, - { 0x8d01, 0xd7fa, 0x2000 }, - { 0x0d01, 0xd7f9, 0x0000 }, - { 0x0d01, 0xd7fb, 0x0000 }, - { 0x8d01, 0xd7fe, 0x2000 }, - { 0x0d01, 0xd7fd, 0x0000 }, - { 0x0d01, 0xd7ff, 0x0000 }, - { 0x8702, 0xf802, 0x3000 }, - { 0x8702, 0xf800, 0x2000 }, - { 0x0702, 0xa6d6, 0x0000 }, - { 0x0702, 0xf801, 0x0000 }, - { 0x8702, 0xf804, 0x2000 }, - { 0x0702, 0xf803, 0x0000 }, - { 0x0702, 0xf805, 0x0000 }, - { 0x8702, 0xf80e, 0x4000 }, - { 0x8702, 0xf80a, 0x3000 }, - { 0x8702, 0xf808, 0x2000 }, - { 0x0702, 0xf807, 0x0000 }, - { 0x0702, 0xf809, 0x0000 }, - { 0x8702, 0xf80c, 0x2000 }, - { 0x0702, 0xf80b, 0x0000 }, - { 0x0702, 0xf80d, 0x0000 }, - { 0x8702, 0xf812, 0x3000 }, - { 0x8702, 0xf810, 0x2000 }, - { 0x0702, 0xf80f, 0x0000 }, - { 0x0702, 0xf811, 0x0000 }, - { 0x8702, 0xf814, 0x2000 }, - { 0x0702, 0xf813, 0x0000 }, - { 0x0702, 0xf815, 0x0000 }, - { 0x8702, 0xf826, 0x5000 }, - { 0x8702, 0xf81e, 0x4000 }, - { 0x8702, 0xf81a, 0x3000 }, - { 0x8702, 0xf818, 0x2000 }, - { 0x0702, 0xf817, 0x0000 }, - { 0x0702, 0xf819, 0x0000 }, - { 0x8702, 0xf81c, 0x2000 }, - { 0x0702, 0xf81b, 0x0000 }, - { 0x0702, 0xf81d, 0x0000 }, - { 0x8702, 0xf822, 0x3000 }, - { 0x8702, 0xf820, 0x2000 }, - { 0x0702, 0xf81f, 0x0000 }, - { 0x0702, 0xf821, 0x0000 }, - { 0x8702, 0xf824, 0x2000 }, - { 0x0702, 0xf823, 0x0000 }, - { 0x0702, 0xf825, 0x0000 }, - { 0x8702, 0xf82e, 0x4000 }, - { 0x8702, 0xf82a, 0x3000 }, - { 0x8702, 0xf828, 0x2000 }, - { 0x0702, 0xf827, 0x0000 }, - { 0x0702, 0xf829, 0x0000 }, - { 0x8702, 0xf82c, 0x2000 }, - { 0x0702, 0xf82b, 0x0000 }, - { 0x0702, 0xf82d, 0x0000 }, - { 0x8702, 0xf832, 0x3000 }, - { 0x8702, 0xf830, 0x2000 }, - { 0x0702, 0xf82f, 0x0000 }, - { 0x0702, 0xf831, 0x0000 }, - { 0x8702, 0xf834, 0x2000 }, - { 0x0702, 0xf833, 0x0000 }, - { 0x0702, 0xf835, 0x0000 }, - { 0x8702, 0xf856, 0x6000 }, - { 0x8702, 0xf846, 0x5000 }, - { 0x8702, 0xf83e, 0x4000 }, - { 0x8702, 0xf83a, 0x3000 }, - { 0x8702, 0xf838, 0x2000 }, - { 0x0702, 0xf837, 0x0000 }, - { 0x0702, 0xf839, 0x0000 }, - { 0x8702, 0xf83c, 0x2000 }, - { 0x0702, 0xf83b, 0x0000 }, - { 0x0702, 0xf83d, 0x0000 }, - { 0x8702, 0xf842, 0x3000 }, - { 0x8702, 0xf840, 0x2000 }, - { 0x0702, 0xf83f, 0x0000 }, - { 0x0702, 0xf841, 0x0000 }, - { 0x8702, 0xf844, 0x2000 }, - { 0x0702, 0xf843, 0x0000 }, - { 0x0702, 0xf845, 0x0000 }, - { 0x8702, 0xf84e, 0x4000 }, - { 0x8702, 0xf84a, 0x3000 }, - { 0x8702, 0xf848, 0x2000 }, - { 0x0702, 0xf847, 0x0000 }, - { 0x0702, 0xf849, 0x0000 }, - { 0x8702, 0xf84c, 0x2000 }, - { 0x0702, 0xf84b, 0x0000 }, - { 0x0702, 0xf84d, 0x0000 }, - { 0x8702, 0xf852, 0x3000 }, - { 0x8702, 0xf850, 0x2000 }, - { 0x0702, 0xf84f, 0x0000 }, - { 0x0702, 0xf851, 0x0000 }, - { 0x8702, 0xf854, 0x2000 }, - { 0x0702, 0xf853, 0x0000 }, - { 0x0702, 0xf855, 0x0000 }, - { 0x8702, 0xf866, 0x5000 }, - { 0x8702, 0xf85e, 0x4000 }, - { 0x8702, 0xf85a, 0x3000 }, - { 0x8702, 0xf858, 0x2000 }, - { 0x0702, 0xf857, 0x0000 }, - { 0x0702, 0xf859, 0x0000 }, - { 0x8702, 0xf85c, 0x2000 }, - { 0x0702, 0xf85b, 0x0000 }, - { 0x0702, 0xf85d, 0x0000 }, - { 0x8702, 0xf862, 0x3000 }, - { 0x8702, 0xf860, 0x2000 }, - { 0x0702, 0xf85f, 0x0000 }, - { 0x0702, 0xf861, 0x0000 }, - { 0x8702, 0xf864, 0x2000 }, - { 0x0702, 0xf863, 0x0000 }, - { 0x0702, 0xf865, 0x0000 }, - { 0x8702, 0xf86e, 0x4000 }, - { 0x8702, 0xf86a, 0x3000 }, - { 0x8702, 0xf868, 0x2000 }, - { 0x0702, 0xf867, 0x0000 }, - { 0x0702, 0xf869, 0x0000 }, - { 0x8702, 0xf86c, 0x2000 }, - { 0x0702, 0xf86b, 0x0000 }, - { 0x0702, 0xf86d, 0x0000 }, - { 0x8702, 0xf872, 0x3000 }, - { 0x8702, 0xf870, 0x2000 }, - { 0x0702, 0xf86f, 0x0000 }, - { 0x0702, 0xf871, 0x0000 }, - { 0x8702, 0xf874, 0x2000 }, - { 0x0702, 0xf873, 0x0000 }, - { 0x0702, 0xf875, 0x0000 }, - { 0x8702, 0xf976, 0x9000 }, - { 0x8702, 0xf8f6, 0x8000 }, - { 0x8702, 0xf8b6, 0x7000 }, - { 0x8702, 0xf896, 0x6000 }, - { 0x8702, 0xf886, 0x5000 }, - { 0x8702, 0xf87e, 0x4000 }, - { 0x8702, 0xf87a, 0x3000 }, - { 0x8702, 0xf878, 0x2000 }, - { 0x0702, 0xf877, 0x0000 }, - { 0x0702, 0xf879, 0x0000 }, - { 0x8702, 0xf87c, 0x2000 }, - { 0x0702, 0xf87b, 0x0000 }, - { 0x0702, 0xf87d, 0x0000 }, - { 0x8702, 0xf882, 0x3000 }, - { 0x8702, 0xf880, 0x2000 }, - { 0x0702, 0xf87f, 0x0000 }, - { 0x0702, 0xf881, 0x0000 }, - { 0x8702, 0xf884, 0x2000 }, - { 0x0702, 0xf883, 0x0000 }, - { 0x0702, 0xf885, 0x0000 }, - { 0x8702, 0xf88e, 0x4000 }, - { 0x8702, 0xf88a, 0x3000 }, - { 0x8702, 0xf888, 0x2000 }, - { 0x0702, 0xf887, 0x0000 }, - { 0x0702, 0xf889, 0x0000 }, - { 0x8702, 0xf88c, 0x2000 }, - { 0x0702, 0xf88b, 0x0000 }, - { 0x0702, 0xf88d, 0x0000 }, - { 0x8702, 0xf892, 0x3000 }, - { 0x8702, 0xf890, 0x2000 }, - { 0x0702, 0xf88f, 0x0000 }, - { 0x0702, 0xf891, 0x0000 }, - { 0x8702, 0xf894, 0x2000 }, - { 0x0702, 0xf893, 0x0000 }, - { 0x0702, 0xf895, 0x0000 }, - { 0x8702, 0xf8a6, 0x5000 }, - { 0x8702, 0xf89e, 0x4000 }, - { 0x8702, 0xf89a, 0x3000 }, - { 0x8702, 0xf898, 0x2000 }, - { 0x0702, 0xf897, 0x0000 }, - { 0x0702, 0xf899, 0x0000 }, - { 0x8702, 0xf89c, 0x2000 }, - { 0x0702, 0xf89b, 0x0000 }, - { 0x0702, 0xf89d, 0x0000 }, - { 0x8702, 0xf8a2, 0x3000 }, - { 0x8702, 0xf8a0, 0x2000 }, - { 0x0702, 0xf89f, 0x0000 }, - { 0x0702, 0xf8a1, 0x0000 }, - { 0x8702, 0xf8a4, 0x2000 }, - { 0x0702, 0xf8a3, 0x0000 }, - { 0x0702, 0xf8a5, 0x0000 }, - { 0x8702, 0xf8ae, 0x4000 }, - { 0x8702, 0xf8aa, 0x3000 }, - { 0x8702, 0xf8a8, 0x2000 }, - { 0x0702, 0xf8a7, 0x0000 }, - { 0x0702, 0xf8a9, 0x0000 }, - { 0x8702, 0xf8ac, 0x2000 }, - { 0x0702, 0xf8ab, 0x0000 }, - { 0x0702, 0xf8ad, 0x0000 }, - { 0x8702, 0xf8b2, 0x3000 }, - { 0x8702, 0xf8b0, 0x2000 }, - { 0x0702, 0xf8af, 0x0000 }, - { 0x0702, 0xf8b1, 0x0000 }, - { 0x8702, 0xf8b4, 0x2000 }, - { 0x0702, 0xf8b3, 0x0000 }, - { 0x0702, 0xf8b5, 0x0000 }, - { 0x8702, 0xf8d6, 0x6000 }, - { 0x8702, 0xf8c6, 0x5000 }, - { 0x8702, 0xf8be, 0x4000 }, - { 0x8702, 0xf8ba, 0x3000 }, - { 0x8702, 0xf8b8, 0x2000 }, - { 0x0702, 0xf8b7, 0x0000 }, - { 0x0702, 0xf8b9, 0x0000 }, - { 0x8702, 0xf8bc, 0x2000 }, - { 0x0702, 0xf8bb, 0x0000 }, - { 0x0702, 0xf8bd, 0x0000 }, - { 0x8702, 0xf8c2, 0x3000 }, - { 0x8702, 0xf8c0, 0x2000 }, - { 0x0702, 0xf8bf, 0x0000 }, - { 0x0702, 0xf8c1, 0x0000 }, - { 0x8702, 0xf8c4, 0x2000 }, - { 0x0702, 0xf8c3, 0x0000 }, - { 0x0702, 0xf8c5, 0x0000 }, - { 0x8702, 0xf8ce, 0x4000 }, - { 0x8702, 0xf8ca, 0x3000 }, - { 0x8702, 0xf8c8, 0x2000 }, - { 0x0702, 0xf8c7, 0x0000 }, - { 0x0702, 0xf8c9, 0x0000 }, - { 0x8702, 0xf8cc, 0x2000 }, - { 0x0702, 0xf8cb, 0x0000 }, - { 0x0702, 0xf8cd, 0x0000 }, - { 0x8702, 0xf8d2, 0x3000 }, - { 0x8702, 0xf8d0, 0x2000 }, - { 0x0702, 0xf8cf, 0x0000 }, - { 0x0702, 0xf8d1, 0x0000 }, - { 0x8702, 0xf8d4, 0x2000 }, - { 0x0702, 0xf8d3, 0x0000 }, - { 0x0702, 0xf8d5, 0x0000 }, - { 0x8702, 0xf8e6, 0x5000 }, - { 0x8702, 0xf8de, 0x4000 }, - { 0x8702, 0xf8da, 0x3000 }, - { 0x8702, 0xf8d8, 0x2000 }, - { 0x0702, 0xf8d7, 0x0000 }, - { 0x0702, 0xf8d9, 0x0000 }, - { 0x8702, 0xf8dc, 0x2000 }, - { 0x0702, 0xf8db, 0x0000 }, - { 0x0702, 0xf8dd, 0x0000 }, - { 0x8702, 0xf8e2, 0x3000 }, - { 0x8702, 0xf8e0, 0x2000 }, - { 0x0702, 0xf8df, 0x0000 }, - { 0x0702, 0xf8e1, 0x0000 }, - { 0x8702, 0xf8e4, 0x2000 }, - { 0x0702, 0xf8e3, 0x0000 }, - { 0x0702, 0xf8e5, 0x0000 }, - { 0x8702, 0xf8ee, 0x4000 }, - { 0x8702, 0xf8ea, 0x3000 }, - { 0x8702, 0xf8e8, 0x2000 }, - { 0x0702, 0xf8e7, 0x0000 }, - { 0x0702, 0xf8e9, 0x0000 }, - { 0x8702, 0xf8ec, 0x2000 }, - { 0x0702, 0xf8eb, 0x0000 }, - { 0x0702, 0xf8ed, 0x0000 }, - { 0x8702, 0xf8f2, 0x3000 }, - { 0x8702, 0xf8f0, 0x2000 }, - { 0x0702, 0xf8ef, 0x0000 }, - { 0x0702, 0xf8f1, 0x0000 }, - { 0x8702, 0xf8f4, 0x2000 }, - { 0x0702, 0xf8f3, 0x0000 }, - { 0x0702, 0xf8f5, 0x0000 }, - { 0x8702, 0xf936, 0x7000 }, - { 0x8702, 0xf916, 0x6000 }, - { 0x8702, 0xf906, 0x5000 }, - { 0x8702, 0xf8fe, 0x4000 }, - { 0x8702, 0xf8fa, 0x3000 }, - { 0x8702, 0xf8f8, 0x2000 }, - { 0x0702, 0xf8f7, 0x0000 }, - { 0x0702, 0xf8f9, 0x0000 }, - { 0x8702, 0xf8fc, 0x2000 }, - { 0x0702, 0xf8fb, 0x0000 }, - { 0x0702, 0xf8fd, 0x0000 }, - { 0x8702, 0xf902, 0x3000 }, - { 0x8702, 0xf900, 0x2000 }, - { 0x0702, 0xf8ff, 0x0000 }, - { 0x0702, 0xf901, 0x0000 }, - { 0x8702, 0xf904, 0x2000 }, - { 0x0702, 0xf903, 0x0000 }, - { 0x0702, 0xf905, 0x0000 }, - { 0x8702, 0xf90e, 0x4000 }, - { 0x8702, 0xf90a, 0x3000 }, - { 0x8702, 0xf908, 0x2000 }, - { 0x0702, 0xf907, 0x0000 }, - { 0x0702, 0xf909, 0x0000 }, - { 0x8702, 0xf90c, 0x2000 }, - { 0x0702, 0xf90b, 0x0000 }, - { 0x0702, 0xf90d, 0x0000 }, - { 0x8702, 0xf912, 0x3000 }, - { 0x8702, 0xf910, 0x2000 }, - { 0x0702, 0xf90f, 0x0000 }, - { 0x0702, 0xf911, 0x0000 }, - { 0x8702, 0xf914, 0x2000 }, - { 0x0702, 0xf913, 0x0000 }, - { 0x0702, 0xf915, 0x0000 }, - { 0x8702, 0xf926, 0x5000 }, - { 0x8702, 0xf91e, 0x4000 }, - { 0x8702, 0xf91a, 0x3000 }, - { 0x8702, 0xf918, 0x2000 }, - { 0x0702, 0xf917, 0x0000 }, - { 0x0702, 0xf919, 0x0000 }, - { 0x8702, 0xf91c, 0x2000 }, - { 0x0702, 0xf91b, 0x0000 }, - { 0x0702, 0xf91d, 0x0000 }, - { 0x8702, 0xf922, 0x3000 }, - { 0x8702, 0xf920, 0x2000 }, - { 0x0702, 0xf91f, 0x0000 }, - { 0x0702, 0xf921, 0x0000 }, - { 0x8702, 0xf924, 0x2000 }, - { 0x0702, 0xf923, 0x0000 }, - { 0x0702, 0xf925, 0x0000 }, - { 0x8702, 0xf92e, 0x4000 }, - { 0x8702, 0xf92a, 0x3000 }, - { 0x8702, 0xf928, 0x2000 }, - { 0x0702, 0xf927, 0x0000 }, - { 0x0702, 0xf929, 0x0000 }, - { 0x8702, 0xf92c, 0x2000 }, - { 0x0702, 0xf92b, 0x0000 }, - { 0x0702, 0xf92d, 0x0000 }, - { 0x8702, 0xf932, 0x3000 }, - { 0x8702, 0xf930, 0x2000 }, - { 0x0702, 0xf92f, 0x0000 }, - { 0x0702, 0xf931, 0x0000 }, - { 0x8702, 0xf934, 0x2000 }, - { 0x0702, 0xf933, 0x0000 }, - { 0x0702, 0xf935, 0x0000 }, - { 0x8702, 0xf956, 0x6000 }, - { 0x8702, 0xf946, 0x5000 }, - { 0x8702, 0xf93e, 0x4000 }, - { 0x8702, 0xf93a, 0x3000 }, - { 0x8702, 0xf938, 0x2000 }, - { 0x0702, 0xf937, 0x0000 }, - { 0x0702, 0xf939, 0x0000 }, - { 0x8702, 0xf93c, 0x2000 }, - { 0x0702, 0xf93b, 0x0000 }, - { 0x0702, 0xf93d, 0x0000 }, - { 0x8702, 0xf942, 0x3000 }, - { 0x8702, 0xf940, 0x2000 }, - { 0x0702, 0xf93f, 0x0000 }, - { 0x0702, 0xf941, 0x0000 }, - { 0x8702, 0xf944, 0x2000 }, - { 0x0702, 0xf943, 0x0000 }, - { 0x0702, 0xf945, 0x0000 }, - { 0x8702, 0xf94e, 0x4000 }, - { 0x8702, 0xf94a, 0x3000 }, - { 0x8702, 0xf948, 0x2000 }, - { 0x0702, 0xf947, 0x0000 }, - { 0x0702, 0xf949, 0x0000 }, - { 0x8702, 0xf94c, 0x2000 }, - { 0x0702, 0xf94b, 0x0000 }, - { 0x0702, 0xf94d, 0x0000 }, - { 0x8702, 0xf952, 0x3000 }, - { 0x8702, 0xf950, 0x2000 }, - { 0x0702, 0xf94f, 0x0000 }, - { 0x0702, 0xf951, 0x0000 }, - { 0x8702, 0xf954, 0x2000 }, - { 0x0702, 0xf953, 0x0000 }, - { 0x0702, 0xf955, 0x0000 }, - { 0x8702, 0xf966, 0x5000 }, - { 0x8702, 0xf95e, 0x4000 }, - { 0x8702, 0xf95a, 0x3000 }, - { 0x8702, 0xf958, 0x2000 }, - { 0x0702, 0xf957, 0x0000 }, - { 0x0702, 0xf959, 0x0000 }, - { 0x8702, 0xf95c, 0x2000 }, - { 0x0702, 0xf95b, 0x0000 }, - { 0x0702, 0xf95d, 0x0000 }, - { 0x8702, 0xf962, 0x3000 }, - { 0x8702, 0xf960, 0x2000 }, - { 0x0702, 0xf95f, 0x0000 }, - { 0x0702, 0xf961, 0x0000 }, - { 0x8702, 0xf964, 0x2000 }, - { 0x0702, 0xf963, 0x0000 }, - { 0x0702, 0xf965, 0x0000 }, - { 0x8702, 0xf96e, 0x4000 }, - { 0x8702, 0xf96a, 0x3000 }, - { 0x8702, 0xf968, 0x2000 }, - { 0x0702, 0xf967, 0x0000 }, - { 0x0702, 0xf969, 0x0000 }, - { 0x8702, 0xf96c, 0x2000 }, - { 0x0702, 0xf96b, 0x0000 }, - { 0x0702, 0xf96d, 0x0000 }, - { 0x8702, 0xf972, 0x3000 }, - { 0x8702, 0xf970, 0x2000 }, - { 0x0702, 0xf96f, 0x0000 }, - { 0x0702, 0xf971, 0x0000 }, - { 0x8702, 0xf974, 0x2000 }, - { 0x0702, 0xf973, 0x0000 }, - { 0x0702, 0xf975, 0x0000 }, - { 0x810e, 0x0077, 0x9000 }, - { 0x8702, 0xf9f6, 0x8000 }, - { 0x8702, 0xf9b6, 0x7000 }, - { 0x8702, 0xf996, 0x6000 }, - { 0x8702, 0xf986, 0x5000 }, - { 0x8702, 0xf97e, 0x4000 }, - { 0x8702, 0xf97a, 0x3000 }, - { 0x8702, 0xf978, 0x2000 }, - { 0x0702, 0xf977, 0x0000 }, - { 0x0702, 0xf979, 0x0000 }, - { 0x8702, 0xf97c, 0x2000 }, - { 0x0702, 0xf97b, 0x0000 }, - { 0x0702, 0xf97d, 0x0000 }, - { 0x8702, 0xf982, 0x3000 }, - { 0x8702, 0xf980, 0x2000 }, - { 0x0702, 0xf97f, 0x0000 }, - { 0x0702, 0xf981, 0x0000 }, - { 0x8702, 0xf984, 0x2000 }, - { 0x0702, 0xf983, 0x0000 }, - { 0x0702, 0xf985, 0x0000 }, - { 0x8702, 0xf98e, 0x4000 }, - { 0x8702, 0xf98a, 0x3000 }, - { 0x8702, 0xf988, 0x2000 }, - { 0x0702, 0xf987, 0x0000 }, - { 0x0702, 0xf989, 0x0000 }, - { 0x8702, 0xf98c, 0x2000 }, - { 0x0702, 0xf98b, 0x0000 }, - { 0x0702, 0xf98d, 0x0000 }, - { 0x8702, 0xf992, 0x3000 }, - { 0x8702, 0xf990, 0x2000 }, - { 0x0702, 0xf98f, 0x0000 }, - { 0x0702, 0xf991, 0x0000 }, - { 0x8702, 0xf994, 0x2000 }, - { 0x0702, 0xf993, 0x0000 }, - { 0x0702, 0xf995, 0x0000 }, - { 0x8702, 0xf9a6, 0x5000 }, - { 0x8702, 0xf99e, 0x4000 }, - { 0x8702, 0xf99a, 0x3000 }, - { 0x8702, 0xf998, 0x2000 }, - { 0x0702, 0xf997, 0x0000 }, - { 0x0702, 0xf999, 0x0000 }, - { 0x8702, 0xf99c, 0x2000 }, - { 0x0702, 0xf99b, 0x0000 }, - { 0x0702, 0xf99d, 0x0000 }, - { 0x8702, 0xf9a2, 0x3000 }, - { 0x8702, 0xf9a0, 0x2000 }, - { 0x0702, 0xf99f, 0x0000 }, - { 0x0702, 0xf9a1, 0x0000 }, - { 0x8702, 0xf9a4, 0x2000 }, - { 0x0702, 0xf9a3, 0x0000 }, - { 0x0702, 0xf9a5, 0x0000 }, - { 0x8702, 0xf9ae, 0x4000 }, - { 0x8702, 0xf9aa, 0x3000 }, - { 0x8702, 0xf9a8, 0x2000 }, - { 0x0702, 0xf9a7, 0x0000 }, - { 0x0702, 0xf9a9, 0x0000 }, - { 0x8702, 0xf9ac, 0x2000 }, - { 0x0702, 0xf9ab, 0x0000 }, - { 0x0702, 0xf9ad, 0x0000 }, - { 0x8702, 0xf9b2, 0x3000 }, - { 0x8702, 0xf9b0, 0x2000 }, - { 0x0702, 0xf9af, 0x0000 }, - { 0x0702, 0xf9b1, 0x0000 }, - { 0x8702, 0xf9b4, 0x2000 }, - { 0x0702, 0xf9b3, 0x0000 }, - { 0x0702, 0xf9b5, 0x0000 }, - { 0x8702, 0xf9d6, 0x6000 }, - { 0x8702, 0xf9c6, 0x5000 }, - { 0x8702, 0xf9be, 0x4000 }, - { 0x8702, 0xf9ba, 0x3000 }, - { 0x8702, 0xf9b8, 0x2000 }, - { 0x0702, 0xf9b7, 0x0000 }, - { 0x0702, 0xf9b9, 0x0000 }, - { 0x8702, 0xf9bc, 0x2000 }, - { 0x0702, 0xf9bb, 0x0000 }, - { 0x0702, 0xf9bd, 0x0000 }, - { 0x8702, 0xf9c2, 0x3000 }, - { 0x8702, 0xf9c0, 0x2000 }, - { 0x0702, 0xf9bf, 0x0000 }, - { 0x0702, 0xf9c1, 0x0000 }, - { 0x8702, 0xf9c4, 0x2000 }, - { 0x0702, 0xf9c3, 0x0000 }, - { 0x0702, 0xf9c5, 0x0000 }, - { 0x8702, 0xf9ce, 0x4000 }, - { 0x8702, 0xf9ca, 0x3000 }, - { 0x8702, 0xf9c8, 0x2000 }, - { 0x0702, 0xf9c7, 0x0000 }, - { 0x0702, 0xf9c9, 0x0000 }, - { 0x8702, 0xf9cc, 0x2000 }, - { 0x0702, 0xf9cb, 0x0000 }, - { 0x0702, 0xf9cd, 0x0000 }, - { 0x8702, 0xf9d2, 0x3000 }, - { 0x8702, 0xf9d0, 0x2000 }, - { 0x0702, 0xf9cf, 0x0000 }, - { 0x0702, 0xf9d1, 0x0000 }, - { 0x8702, 0xf9d4, 0x2000 }, - { 0x0702, 0xf9d3, 0x0000 }, - { 0x0702, 0xf9d5, 0x0000 }, - { 0x8702, 0xf9e6, 0x5000 }, - { 0x8702, 0xf9de, 0x4000 }, - { 0x8702, 0xf9da, 0x3000 }, - { 0x8702, 0xf9d8, 0x2000 }, - { 0x0702, 0xf9d7, 0x0000 }, - { 0x0702, 0xf9d9, 0x0000 }, - { 0x8702, 0xf9dc, 0x2000 }, - { 0x0702, 0xf9db, 0x0000 }, - { 0x0702, 0xf9dd, 0x0000 }, - { 0x8702, 0xf9e2, 0x3000 }, - { 0x8702, 0xf9e0, 0x2000 }, - { 0x0702, 0xf9df, 0x0000 }, - { 0x0702, 0xf9e1, 0x0000 }, - { 0x8702, 0xf9e4, 0x2000 }, - { 0x0702, 0xf9e3, 0x0000 }, - { 0x0702, 0xf9e5, 0x0000 }, - { 0x8702, 0xf9ee, 0x4000 }, - { 0x8702, 0xf9ea, 0x3000 }, - { 0x8702, 0xf9e8, 0x2000 }, - { 0x0702, 0xf9e7, 0x0000 }, - { 0x0702, 0xf9e9, 0x0000 }, - { 0x8702, 0xf9ec, 0x2000 }, - { 0x0702, 0xf9eb, 0x0000 }, - { 0x0702, 0xf9ed, 0x0000 }, - { 0x8702, 0xf9f2, 0x3000 }, - { 0x8702, 0xf9f0, 0x2000 }, - { 0x0702, 0xf9ef, 0x0000 }, - { 0x0702, 0xf9f1, 0x0000 }, - { 0x8702, 0xf9f4, 0x2000 }, - { 0x0702, 0xf9f3, 0x0000 }, - { 0x0702, 0xf9f5, 0x0000 }, - { 0x810e, 0x0037, 0x7000 }, - { 0x8702, 0xfa16, 0x6000 }, - { 0x8702, 0xfa06, 0x5000 }, - { 0x8702, 0xf9fe, 0x4000 }, - { 0x8702, 0xf9fa, 0x3000 }, - { 0x8702, 0xf9f8, 0x2000 }, - { 0x0702, 0xf9f7, 0x0000 }, - { 0x0702, 0xf9f9, 0x0000 }, - { 0x8702, 0xf9fc, 0x2000 }, - { 0x0702, 0xf9fb, 0x0000 }, - { 0x0702, 0xf9fd, 0x0000 }, - { 0x8702, 0xfa02, 0x3000 }, - { 0x8702, 0xfa00, 0x2000 }, - { 0x0702, 0xf9ff, 0x0000 }, - { 0x0702, 0xfa01, 0x0000 }, - { 0x8702, 0xfa04, 0x2000 }, - { 0x0702, 0xfa03, 0x0000 }, - { 0x0702, 0xfa05, 0x0000 }, - { 0x8702, 0xfa0e, 0x4000 }, - { 0x8702, 0xfa0a, 0x3000 }, - { 0x8702, 0xfa08, 0x2000 }, - { 0x0702, 0xfa07, 0x0000 }, - { 0x0702, 0xfa09, 0x0000 }, - { 0x8702, 0xfa0c, 0x2000 }, - { 0x0702, 0xfa0b, 0x0000 }, - { 0x0702, 0xfa0d, 0x0000 }, - { 0x8702, 0xfa12, 0x3000 }, - { 0x8702, 0xfa10, 0x2000 }, - { 0x0702, 0xfa0f, 0x0000 }, - { 0x0702, 0xfa11, 0x0000 }, - { 0x8702, 0xfa14, 0x2000 }, - { 0x0702, 0xfa13, 0x0000 }, - { 0x0702, 0xfa15, 0x0000 }, - { 0x810e, 0x0027, 0x5000 }, - { 0x810e, 0x0001, 0x4000 }, - { 0x8702, 0xfa1a, 0x3000 }, - { 0x8702, 0xfa18, 0x2000 }, - { 0x0702, 0xfa17, 0x0000 }, - { 0x0702, 0xfa19, 0x0000 }, - { 0x8702, 0xfa1c, 0x2000 }, - { 0x0702, 0xfa1b, 0x0000 }, - { 0x0702, 0xfa1d, 0x0000 }, - { 0x810e, 0x0023, 0x3000 }, - { 0x810e, 0x0021, 0x2000 }, - { 0x010e, 0x0020, 0x0000 }, - { 0x010e, 0x0022, 0x0000 }, - { 0x810e, 0x0025, 0x2000 }, - { 0x010e, 0x0024, 0x0000 }, - { 0x010e, 0x0026, 0x0000 }, - { 0x810e, 0x002f, 0x4000 }, - { 0x810e, 0x002b, 0x3000 }, - { 0x810e, 0x0029, 0x2000 }, - { 0x010e, 0x0028, 0x0000 }, - { 0x010e, 0x002a, 0x0000 }, - { 0x810e, 0x002d, 0x2000 }, - { 0x010e, 0x002c, 0x0000 }, - { 0x010e, 0x002e, 0x0000 }, - { 0x810e, 0x0033, 0x3000 }, - { 0x810e, 0x0031, 0x2000 }, - { 0x010e, 0x0030, 0x0000 }, - { 0x010e, 0x0032, 0x0000 }, - { 0x810e, 0x0035, 0x2000 }, - { 0x010e, 0x0034, 0x0000 }, - { 0x010e, 0x0036, 0x0000 }, - { 0x810e, 0x0057, 0x6000 }, - { 0x810e, 0x0047, 0x5000 }, - { 0x810e, 0x003f, 0x4000 }, - { 0x810e, 0x003b, 0x3000 }, - { 0x810e, 0x0039, 0x2000 }, - { 0x010e, 0x0038, 0x0000 }, - { 0x010e, 0x003a, 0x0000 }, - { 0x810e, 0x003d, 0x2000 }, - { 0x010e, 0x003c, 0x0000 }, - { 0x010e, 0x003e, 0x0000 }, - { 0x810e, 0x0043, 0x3000 }, - { 0x810e, 0x0041, 0x2000 }, - { 0x010e, 0x0040, 0x0000 }, - { 0x010e, 0x0042, 0x0000 }, - { 0x810e, 0x0045, 0x2000 }, - { 0x010e, 0x0044, 0x0000 }, - { 0x010e, 0x0046, 0x0000 }, - { 0x810e, 0x004f, 0x4000 }, - { 0x810e, 0x004b, 0x3000 }, - { 0x810e, 0x0049, 0x2000 }, - { 0x010e, 0x0048, 0x0000 }, - { 0x010e, 0x004a, 0x0000 }, - { 0x810e, 0x004d, 0x2000 }, - { 0x010e, 0x004c, 0x0000 }, - { 0x010e, 0x004e, 0x0000 }, - { 0x810e, 0x0053, 0x3000 }, - { 0x810e, 0x0051, 0x2000 }, - { 0x010e, 0x0050, 0x0000 }, - { 0x010e, 0x0052, 0x0000 }, - { 0x810e, 0x0055, 0x2000 }, - { 0x010e, 0x0054, 0x0000 }, - { 0x010e, 0x0056, 0x0000 }, - { 0x810e, 0x0067, 0x5000 }, - { 0x810e, 0x005f, 0x4000 }, - { 0x810e, 0x005b, 0x3000 }, - { 0x810e, 0x0059, 0x2000 }, - { 0x010e, 0x0058, 0x0000 }, - { 0x010e, 0x005a, 0x0000 }, - { 0x810e, 0x005d, 0x2000 }, - { 0x010e, 0x005c, 0x0000 }, - { 0x010e, 0x005e, 0x0000 }, - { 0x810e, 0x0063, 0x3000 }, - { 0x810e, 0x0061, 0x2000 }, - { 0x010e, 0x0060, 0x0000 }, - { 0x010e, 0x0062, 0x0000 }, - { 0x810e, 0x0065, 0x2000 }, - { 0x010e, 0x0064, 0x0000 }, - { 0x010e, 0x0066, 0x0000 }, - { 0x810e, 0x006f, 0x4000 }, - { 0x810e, 0x006b, 0x3000 }, - { 0x810e, 0x0069, 0x2000 }, - { 0x010e, 0x0068, 0x0000 }, - { 0x010e, 0x006a, 0x0000 }, - { 0x810e, 0x006d, 0x2000 }, - { 0x010e, 0x006c, 0x0000 }, - { 0x010e, 0x006e, 0x0000 }, - { 0x810e, 0x0073, 0x3000 }, - { 0x810e, 0x0071, 0x2000 }, - { 0x010e, 0x0070, 0x0000 }, - { 0x010e, 0x0072, 0x0000 }, - { 0x810e, 0x0075, 0x2000 }, - { 0x010e, 0x0074, 0x0000 }, - { 0x010e, 0x0076, 0x0000 }, - { 0x8c0e, 0x0177, 0x8000 }, - { 0x8c0e, 0x0137, 0x7000 }, - { 0x8c0e, 0x0117, 0x6000 }, - { 0x8c0e, 0x0107, 0x5000 }, - { 0x810e, 0x007f, 0x4000 }, - { 0x810e, 0x007b, 0x3000 }, - { 0x810e, 0x0079, 0x2000 }, - { 0x010e, 0x0078, 0x0000 }, - { 0x010e, 0x007a, 0x0000 }, - { 0x810e, 0x007d, 0x2000 }, - { 0x010e, 0x007c, 0x0000 }, - { 0x010e, 0x007e, 0x0000 }, - { 0x8c0e, 0x0103, 0x3000 }, - { 0x8c0e, 0x0101, 0x2000 }, - { 0x0c0e, 0x0100, 0x0000 }, - { 0x0c0e, 0x0102, 0x0000 }, - { 0x8c0e, 0x0105, 0x2000 }, - { 0x0c0e, 0x0104, 0x0000 }, - { 0x0c0e, 0x0106, 0x0000 }, - { 0x8c0e, 0x010f, 0x4000 }, - { 0x8c0e, 0x010b, 0x3000 }, - { 0x8c0e, 0x0109, 0x2000 }, - { 0x0c0e, 0x0108, 0x0000 }, - { 0x0c0e, 0x010a, 0x0000 }, - { 0x8c0e, 0x010d, 0x2000 }, - { 0x0c0e, 0x010c, 0x0000 }, - { 0x0c0e, 0x010e, 0x0000 }, - { 0x8c0e, 0x0113, 0x3000 }, - { 0x8c0e, 0x0111, 0x2000 }, - { 0x0c0e, 0x0110, 0x0000 }, - { 0x0c0e, 0x0112, 0x0000 }, - { 0x8c0e, 0x0115, 0x2000 }, - { 0x0c0e, 0x0114, 0x0000 }, - { 0x0c0e, 0x0116, 0x0000 }, - { 0x8c0e, 0x0127, 0x5000 }, - { 0x8c0e, 0x011f, 0x4000 }, - { 0x8c0e, 0x011b, 0x3000 }, - { 0x8c0e, 0x0119, 0x2000 }, - { 0x0c0e, 0x0118, 0x0000 }, - { 0x0c0e, 0x011a, 0x0000 }, - { 0x8c0e, 0x011d, 0x2000 }, - { 0x0c0e, 0x011c, 0x0000 }, - { 0x0c0e, 0x011e, 0x0000 }, - { 0x8c0e, 0x0123, 0x3000 }, - { 0x8c0e, 0x0121, 0x2000 }, - { 0x0c0e, 0x0120, 0x0000 }, - { 0x0c0e, 0x0122, 0x0000 }, - { 0x8c0e, 0x0125, 0x2000 }, - { 0x0c0e, 0x0124, 0x0000 }, - { 0x0c0e, 0x0126, 0x0000 }, - { 0x8c0e, 0x012f, 0x4000 }, - { 0x8c0e, 0x012b, 0x3000 }, - { 0x8c0e, 0x0129, 0x2000 }, - { 0x0c0e, 0x0128, 0x0000 }, - { 0x0c0e, 0x012a, 0x0000 }, - { 0x8c0e, 0x012d, 0x2000 }, - { 0x0c0e, 0x012c, 0x0000 }, - { 0x0c0e, 0x012e, 0x0000 }, - { 0x8c0e, 0x0133, 0x3000 }, - { 0x8c0e, 0x0131, 0x2000 }, - { 0x0c0e, 0x0130, 0x0000 }, - { 0x0c0e, 0x0132, 0x0000 }, - { 0x8c0e, 0x0135, 0x2000 }, - { 0x0c0e, 0x0134, 0x0000 }, - { 0x0c0e, 0x0136, 0x0000 }, - { 0x8c0e, 0x0157, 0x6000 }, - { 0x8c0e, 0x0147, 0x5000 }, - { 0x8c0e, 0x013f, 0x4000 }, - { 0x8c0e, 0x013b, 0x3000 }, - { 0x8c0e, 0x0139, 0x2000 }, - { 0x0c0e, 0x0138, 0x0000 }, - { 0x0c0e, 0x013a, 0x0000 }, - { 0x8c0e, 0x013d, 0x2000 }, - { 0x0c0e, 0x013c, 0x0000 }, - { 0x0c0e, 0x013e, 0x0000 }, - { 0x8c0e, 0x0143, 0x3000 }, - { 0x8c0e, 0x0141, 0x2000 }, - { 0x0c0e, 0x0140, 0x0000 }, - { 0x0c0e, 0x0142, 0x0000 }, - { 0x8c0e, 0x0145, 0x2000 }, - { 0x0c0e, 0x0144, 0x0000 }, - { 0x0c0e, 0x0146, 0x0000 }, - { 0x8c0e, 0x014f, 0x4000 }, - { 0x8c0e, 0x014b, 0x3000 }, - { 0x8c0e, 0x0149, 0x2000 }, - { 0x0c0e, 0x0148, 0x0000 }, - { 0x0c0e, 0x014a, 0x0000 }, - { 0x8c0e, 0x014d, 0x2000 }, - { 0x0c0e, 0x014c, 0x0000 }, - { 0x0c0e, 0x014e, 0x0000 }, - { 0x8c0e, 0x0153, 0x3000 }, - { 0x8c0e, 0x0151, 0x2000 }, - { 0x0c0e, 0x0150, 0x0000 }, - { 0x0c0e, 0x0152, 0x0000 }, - { 0x8c0e, 0x0155, 0x2000 }, - { 0x0c0e, 0x0154, 0x0000 }, - { 0x0c0e, 0x0156, 0x0000 }, - { 0x8c0e, 0x0167, 0x5000 }, - { 0x8c0e, 0x015f, 0x4000 }, - { 0x8c0e, 0x015b, 0x3000 }, - { 0x8c0e, 0x0159, 0x2000 }, - { 0x0c0e, 0x0158, 0x0000 }, - { 0x0c0e, 0x015a, 0x0000 }, - { 0x8c0e, 0x015d, 0x2000 }, - { 0x0c0e, 0x015c, 0x0000 }, - { 0x0c0e, 0x015e, 0x0000 }, - { 0x8c0e, 0x0163, 0x3000 }, - { 0x8c0e, 0x0161, 0x2000 }, - { 0x0c0e, 0x0160, 0x0000 }, - { 0x0c0e, 0x0162, 0x0000 }, - { 0x8c0e, 0x0165, 0x2000 }, - { 0x0c0e, 0x0164, 0x0000 }, - { 0x0c0e, 0x0166, 0x0000 }, - { 0x8c0e, 0x016f, 0x4000 }, - { 0x8c0e, 0x016b, 0x3000 }, - { 0x8c0e, 0x0169, 0x2000 }, - { 0x0c0e, 0x0168, 0x0000 }, - { 0x0c0e, 0x016a, 0x0000 }, - { 0x8c0e, 0x016d, 0x2000 }, - { 0x0c0e, 0x016c, 0x0000 }, - { 0x0c0e, 0x016e, 0x0000 }, - { 0x8c0e, 0x0173, 0x3000 }, - { 0x8c0e, 0x0171, 0x2000 }, - { 0x0c0e, 0x0170, 0x0000 }, - { 0x0c0e, 0x0172, 0x0000 }, - { 0x8c0e, 0x0175, 0x2000 }, - { 0x0c0e, 0x0174, 0x0000 }, - { 0x0c0e, 0x0176, 0x0000 }, - { 0x8c0e, 0x01b7, 0x7000 }, - { 0x8c0e, 0x0197, 0x6000 }, - { 0x8c0e, 0x0187, 0x5000 }, - { 0x8c0e, 0x017f, 0x4000 }, - { 0x8c0e, 0x017b, 0x3000 }, - { 0x8c0e, 0x0179, 0x2000 }, - { 0x0c0e, 0x0178, 0x0000 }, - { 0x0c0e, 0x017a, 0x0000 }, - { 0x8c0e, 0x017d, 0x2000 }, - { 0x0c0e, 0x017c, 0x0000 }, - { 0x0c0e, 0x017e, 0x0000 }, - { 0x8c0e, 0x0183, 0x3000 }, - { 0x8c0e, 0x0181, 0x2000 }, - { 0x0c0e, 0x0180, 0x0000 }, - { 0x0c0e, 0x0182, 0x0000 }, - { 0x8c0e, 0x0185, 0x2000 }, - { 0x0c0e, 0x0184, 0x0000 }, - { 0x0c0e, 0x0186, 0x0000 }, - { 0x8c0e, 0x018f, 0x4000 }, - { 0x8c0e, 0x018b, 0x3000 }, - { 0x8c0e, 0x0189, 0x2000 }, - { 0x0c0e, 0x0188, 0x0000 }, - { 0x0c0e, 0x018a, 0x0000 }, - { 0x8c0e, 0x018d, 0x2000 }, - { 0x0c0e, 0x018c, 0x0000 }, - { 0x0c0e, 0x018e, 0x0000 }, - { 0x8c0e, 0x0193, 0x3000 }, - { 0x8c0e, 0x0191, 0x2000 }, - { 0x0c0e, 0x0190, 0x0000 }, - { 0x0c0e, 0x0192, 0x0000 }, - { 0x8c0e, 0x0195, 0x2000 }, - { 0x0c0e, 0x0194, 0x0000 }, - { 0x0c0e, 0x0196, 0x0000 }, - { 0x8c0e, 0x01a7, 0x5000 }, - { 0x8c0e, 0x019f, 0x4000 }, - { 0x8c0e, 0x019b, 0x3000 }, - { 0x8c0e, 0x0199, 0x2000 }, - { 0x0c0e, 0x0198, 0x0000 }, - { 0x0c0e, 0x019a, 0x0000 }, - { 0x8c0e, 0x019d, 0x2000 }, - { 0x0c0e, 0x019c, 0x0000 }, - { 0x0c0e, 0x019e, 0x0000 }, - { 0x8c0e, 0x01a3, 0x3000 }, - { 0x8c0e, 0x01a1, 0x2000 }, - { 0x0c0e, 0x01a0, 0x0000 }, - { 0x0c0e, 0x01a2, 0x0000 }, - { 0x8c0e, 0x01a5, 0x2000 }, - { 0x0c0e, 0x01a4, 0x0000 }, - { 0x0c0e, 0x01a6, 0x0000 }, - { 0x8c0e, 0x01af, 0x4000 }, - { 0x8c0e, 0x01ab, 0x3000 }, - { 0x8c0e, 0x01a9, 0x2000 }, - { 0x0c0e, 0x01a8, 0x0000 }, - { 0x0c0e, 0x01aa, 0x0000 }, - { 0x8c0e, 0x01ad, 0x2000 }, - { 0x0c0e, 0x01ac, 0x0000 }, - { 0x0c0e, 0x01ae, 0x0000 }, - { 0x8c0e, 0x01b3, 0x3000 }, - { 0x8c0e, 0x01b1, 0x2000 }, - { 0x0c0e, 0x01b0, 0x0000 }, - { 0x0c0e, 0x01b2, 0x0000 }, - { 0x8c0e, 0x01b5, 0x2000 }, - { 0x0c0e, 0x01b4, 0x0000 }, - { 0x0c0e, 0x01b6, 0x0000 }, - { 0x8c0e, 0x01d7, 0x6000 }, - { 0x8c0e, 0x01c7, 0x5000 }, - { 0x8c0e, 0x01bf, 0x4000 }, - { 0x8c0e, 0x01bb, 0x3000 }, - { 0x8c0e, 0x01b9, 0x2000 }, - { 0x0c0e, 0x01b8, 0x0000 }, - { 0x0c0e, 0x01ba, 0x0000 }, - { 0x8c0e, 0x01bd, 0x2000 }, - { 0x0c0e, 0x01bc, 0x0000 }, - { 0x0c0e, 0x01be, 0x0000 }, - { 0x8c0e, 0x01c3, 0x3000 }, - { 0x8c0e, 0x01c1, 0x2000 }, - { 0x0c0e, 0x01c0, 0x0000 }, - { 0x0c0e, 0x01c2, 0x0000 }, - { 0x8c0e, 0x01c5, 0x2000 }, - { 0x0c0e, 0x01c4, 0x0000 }, - { 0x0c0e, 0x01c6, 0x0000 }, - { 0x8c0e, 0x01cf, 0x4000 }, - { 0x8c0e, 0x01cb, 0x3000 }, - { 0x8c0e, 0x01c9, 0x2000 }, - { 0x0c0e, 0x01c8, 0x0000 }, - { 0x0c0e, 0x01ca, 0x0000 }, - { 0x8c0e, 0x01cd, 0x2000 }, - { 0x0c0e, 0x01cc, 0x0000 }, - { 0x0c0e, 0x01ce, 0x0000 }, - { 0x8c0e, 0x01d3, 0x3000 }, - { 0x8c0e, 0x01d1, 0x2000 }, - { 0x0c0e, 0x01d0, 0x0000 }, - { 0x0c0e, 0x01d2, 0x0000 }, - { 0x8c0e, 0x01d5, 0x2000 }, - { 0x0c0e, 0x01d4, 0x0000 }, - { 0x0c0e, 0x01d6, 0x0000 }, - { 0x8c0e, 0x01e7, 0x5000 }, - { 0x8c0e, 0x01df, 0x4000 }, - { 0x8c0e, 0x01db, 0x3000 }, - { 0x8c0e, 0x01d9, 0x2000 }, - { 0x0c0e, 0x01d8, 0x0000 }, - { 0x0c0e, 0x01da, 0x0000 }, - { 0x8c0e, 0x01dd, 0x2000 }, - { 0x0c0e, 0x01dc, 0x0000 }, - { 0x0c0e, 0x01de, 0x0000 }, - { 0x8c0e, 0x01e3, 0x3000 }, - { 0x8c0e, 0x01e1, 0x2000 }, - { 0x0c0e, 0x01e0, 0x0000 }, - { 0x0c0e, 0x01e2, 0x0000 }, - { 0x8c0e, 0x01e5, 0x2000 }, - { 0x0c0e, 0x01e4, 0x0000 }, - { 0x0c0e, 0x01e6, 0x0000 }, - { 0x8c0e, 0x01ef, 0x4000 }, - { 0x8c0e, 0x01eb, 0x3000 }, - { 0x8c0e, 0x01e9, 0x2000 }, - { 0x0c0e, 0x01e8, 0x0000 }, - { 0x0c0e, 0x01ea, 0x0000 }, - { 0x8c0e, 0x01ed, 0x2000 }, - { 0x0c0e, 0x01ec, 0x0000 }, - { 0x0c0e, 0x01ee, 0x0000 }, - { 0x830f, 0xfffd, 0x2000 }, - { 0x030f, 0x0000, 0x0000 }, - { 0x0310, 0x0000, 0x1000 }, - { 0x0310, 0xfffd, 0x0000 }, -}; diff --git a/vendor/cegui-0.4.0-custom/src/pcre/ucptypetable.c b/vendor/cegui-0.4.0-custom/src/pcre/ucptypetable.c deleted file mode 100644 index 129529b5d6..0000000000 --- a/vendor/cegui-0.4.0-custom/src/pcre/ucptypetable.c +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* -This is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. See -the file Tech.Notes for some information on the internals. - -Written by: Philip Hazel - - Copyright (c) 1997-2004 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* This module contains a table for translating Unicode property names into -code values for the ucp_findchar function. It is in a separate module so that -it can be included both in the main pcre library, and into pcretest (for -printing out internals). */ - -typedef struct { - const char *name; - int value; -} ucp_type_table; - -static ucp_type_table utt[] = { - { "C", 128 + ucp_C }, - { "Cc", ucp_Cc }, - { "Cf", ucp_Cf }, - { "Cn", ucp_Cn }, - { "Co", ucp_Co }, - { "Cs", ucp_Cs }, - { "L", 128 + ucp_L }, - { "Ll", ucp_Ll }, - { "Lm", ucp_Lm }, - { "Lo", ucp_Lo }, - { "Lt", ucp_Lt }, - { "Lu", ucp_Lu }, - { "M", 128 + ucp_M }, - { "Mc", ucp_Mc }, - { "Me", ucp_Me }, - { "Mn", ucp_Mn }, - { "N", 128 + ucp_N }, - { "Nd", ucp_Nd }, - { "Nl", ucp_Nl }, - { "No", ucp_No }, - { "P", 128 + ucp_P }, - { "Pc", ucp_Pc }, - { "Pd", ucp_Pd }, - { "Pe", ucp_Pe }, - { "Pf", ucp_Pf }, - { "Pi", ucp_Pi }, - { "Po", ucp_Po }, - { "Ps", ucp_Ps }, - { "S", 128 + ucp_S }, - { "Sc", ucp_Sc }, - { "Sk", ucp_Sk }, - { "Sm", ucp_Sm }, - { "So", ucp_So }, - { "Z", 128 + ucp_Z }, - { "Zl", ucp_Zl }, - { "Zp", ucp_Zp }, - { "Zs", ucp_Zs } -}; - -/* End of ucptypetable.c */ diff --git a/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9renderer.cpp b/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9renderer.cpp deleted file mode 100644 index 51e9fdd3bd..0000000000 --- a/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9renderer.cpp +++ /dev/null @@ -1,727 +0,0 @@ -/************************************************************************ - filename: d3d9renderer.cpp - created: 17/7/2004 - author: Paul D Turner with D3D 9 Updates by Magnus Österlind - - purpose: Main source file for Renderer class using DirectX 9.0 -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "renderers/directx9GUIRenderer/d3d9renderer.h" -#include "renderers/directx9GUIRenderer/d3d9texture.h" -#include "CEGUIExceptions.h" -#include "CEGUISystem.h" - -#include -#include -#undef min - -// Start of CEGUI namespace section -namespace CEGUI -{ -/************************************************************************* - Constants definitions -*************************************************************************/ -const int DirectX9Renderer::VERTEX_PER_QUAD = 6; -const int DirectX9Renderer::VERTEX_PER_TRIANGLE = 3; -const int DirectX9Renderer::VERTEXBUFFER_CAPACITY = 4096; -const ulong DirectX9Renderer::VERTEX_FVF = (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1); - - -/************************************************************************* - Constructor -*************************************************************************/ -DirectX9Renderer::DirectX9Renderer(LPDIRECT3DDEVICE9 device, uint max_quads) -{ - d_device = device; - Size size(getViewportSize()); - - constructor_impl(device, size); -} - - -/************************************************************************* - method to do work of constructor -*************************************************************************/ -void DirectX9Renderer::constructor_impl(LPDIRECT3DDEVICE9 device, const Size& display_size) -{ - d_device = device; - d_queueing = true; - d_currTexture = NULL; - d_buffer = NULL; - d_bufferPos = 0; - - // initialise renderer display area - d_display_area.d_left = 0; - d_display_area.d_top = 0; - d_display_area.setSize(display_size); - - // Create a vertex buffer - if (FAILED(d_device->CreateVertexBuffer( - (VERTEXBUFFER_CAPACITY * sizeof(QuadVertex)), - D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, - VERTEX_FVF, - D3DPOOL_DEFAULT, - &d_buffer, - NULL))) - { - // Ideally, this would have been a RendererException, but we can't use that until the System object is created - // and that requires a Renderer passed to the constructor, so we throw this instead. - throw std::runtime_error("Creation of VertexBuffer for Renderer object failed"); - } - - // get the maximum available texture size. - D3DCAPS9 devCaps; - if (FAILED(device->GetDeviceCaps(&devCaps))) - { - // release vertex buffer - d_buffer->Release(); - throw std::runtime_error("Unable to retrieve device capabilities from Direct3DDevice9."); - } - - // set max texture size the the smaller of max width and max height. - d_maxTextureSize = ceguimin(devCaps.MaxTextureWidth, devCaps.MaxTextureHeight); - - d_device->AddRef(); - - // set ID string - d_identifierString = "CEGUI::DirectX81Renderer - Official Direct3D 9 based renderer module for CEGUI"; -} - - -/************************************************************************* - Destructor -*************************************************************************/ -DirectX9Renderer::~DirectX9Renderer(void) -{ - if (d_buffer != NULL) - { - d_buffer->Release(); - } - - destroyAllTextures(); - - if (d_device != NULL) - { - d_device->Release(); - } -} - - -/************************************************************************* - add's a quad to the list to be rendered -*************************************************************************/ -void DirectX9Renderer::addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode, const Image* image) -{ - // if not queueing, render directly (as in, right now!) - if (!d_queueing) - { - renderQuadDirect(dest_rect, z, tex, texture_rect, colours, quad_split_mode); - } - else - { - QuadInfo quad; - - quad.position = dest_rect; - quad.z = z; - quad.texture = ((DirectX9Texture*)tex); - quad.image = image; - quad.texPosition = texture_rect; - quad.topLeftCol = colours.d_top_left.getARGB(); - quad.topRightCol = colours.d_top_right.getARGB(); - quad.bottomLeftCol = colours.d_bottom_left.getARGB(); - quad.bottomRightCol = colours.d_bottom_right.getARGB(); - - // offset destination to get correct texel to pixel mapping from Direct3D - quad.position.offset(Point(-0.5f, -0.5f)); - - // set quad split mode - quad.splitMode = quad_split_mode; - - d_quadlist.insert(quad); - } - -} - - -// -// Check quadlist has valid image items -// -void DirectX9Renderer::NotifyImageInvalid ( Image* const image ) -{ - // Quickest thing to do here is to clear the quad list - d_quadlist.clear (); -#if 0 - for (QuadList::iterator i = d_quadlist.begin(); i != d_quadlist.end(); ) - { - const QuadInfo& quad = (*i); - if ( quad.image == image ) - { - d_quadlist.erase ( i++ ); - } - else - ++i; - } -#endif -} - - -/************************************************************************* - perform final rendering for all queued renderable quads. -*************************************************************************/ -bool DirectX9Renderer::doRender(void) -{ - d_currTexture = NULL; - - if ( !d_buffer ) - return false; - - initPerFrameStates(); - - bool locked = false; - QuadVertex* buffmem; - - // iterate over each quad in the list - for (QuadList::iterator i = d_quadlist.begin(); i != d_quadlist.end(); ++i) - { - const QuadInfo& quad = (*i); - - LPDIRECT3DTEXTURE9 d3dTexture = quad.texture->getD3DTexture(); - // flush & set texture if needed - if (d_currTexture != d3dTexture) - { - if (locked) - { - d_buffer->Unlock(); - locked = false; - } - - // render any remaining quads for current texture - renderVBuffer(); - - // set new texture - d_device->SetTexture(0, d3dTexture); - d_currTexture = d3dTexture; - } - - if (!locked) - { - buffmem = NULL; - if (FAILED(d_buffer->Lock(0, 0, (void**)&buffmem, D3DLOCK_DISCARD))) - { - return false; - } - if ( buffmem == NULL ) - { - return false; - } - - locked = true; - } - - // Hack: Inform the Font class that this glyph has been used recently, if it's a glyph being drawn - if ( quad.image ) - { - unsigned long ulCodepoint = quad.image->getCodepoint(); - // Is it a glyph? - if ( ulCodepoint != 0 && ulCodepoint > 127 && ulCodepoint < 65534 ) - { - CEGUI::Font* pFont = quad.image->getFont(); - if ( pFont ) - pFont->refreshCachedGlyph(ulCodepoint); - } - } - - // setup Vertex 1... - buffmem->x = quad.position.d_left; - buffmem->y = quad.position.d_top; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.topLeftCol; - buffmem->tu1 = quad.texPosition.d_left; - buffmem->tv1 = quad.texPosition.d_top; - ++buffmem; - - // setup Vertex 2... - - // top-left to bottom-right diagonal - if (quad.splitMode == TopLeftToBottomRight) - { - buffmem->x = quad.position.d_right; - buffmem->y = quad.position.d_bottom; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.bottomRightCol; - buffmem->tu1 = quad.texPosition.d_right; - buffmem->tv1 = quad.texPosition.d_bottom; - } - // bottom-left to top-right diagonal - else - { - buffmem->x = quad.position.d_right; - buffmem->y = quad.position.d_top; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.topRightCol; - buffmem->tu1 = quad.texPosition.d_right; - buffmem->tv1 = quad.texPosition.d_top; - } - ++buffmem; - - // setup Vertex 3... - buffmem->x = quad.position.d_left; - buffmem->y = quad.position.d_bottom; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.bottomLeftCol; - buffmem->tu1 = quad.texPosition.d_left; - buffmem->tv1 = quad.texPosition.d_bottom; - ++buffmem; - - // setup Vertex 4... - buffmem->x = quad.position.d_right; - buffmem->y = quad.position.d_top; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.topRightCol; - buffmem->tu1 = quad.texPosition.d_right; - buffmem->tv1 = quad.texPosition.d_top; - ++buffmem; - - // setup Vertex 5... - buffmem->x = quad.position.d_right; - buffmem->y = quad.position.d_bottom; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.bottomRightCol; - buffmem->tu1 = quad.texPosition.d_right; - buffmem->tv1 = quad.texPosition.d_bottom; - ++buffmem; - - // setup Vertex 6... - - // top-left to bottom-right diagonal - if (quad.splitMode == TopLeftToBottomRight) - { - buffmem->x = quad.position.d_left; - buffmem->y = quad.position.d_top; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.topLeftCol; - buffmem->tu1 = quad.texPosition.d_left; - buffmem->tv1 = quad.texPosition.d_top; - } - // bottom-left to top-right diagonal - else - { - buffmem->x = quad.position.d_left; - buffmem->y = quad.position.d_bottom; - buffmem->z = quad.z; - buffmem->rhw = 1.0f; - buffmem->diffuse = quad.bottomLeftCol; - buffmem->tu1 = quad.texPosition.d_left; - buffmem->tv1 = quad.texPosition.d_bottom; - } - ++buffmem; - - // update buffer level - d_bufferPos += VERTEX_PER_QUAD; - - // if there is not enough room in the buffer for another sprite, render what we have - if (d_bufferPos >= (VERTEXBUFFER_CAPACITY - VERTEX_PER_QUAD)) - { - if (locked) - { - d_buffer->Unlock(); - locked = false; - } - - renderVBuffer(); - } - - } - - if (locked) - { - d_buffer->Unlock(); - locked = false; - } - - renderVBuffer(); - return true; -} - - -/************************************************************************* - clear the queue -*************************************************************************/ -void DirectX9Renderer::clearRenderList(void) -{ - d_quadlist.clear(); -} - - -/************************************************************************* - create an empty texture -*************************************************************************/ -Texture* DirectX9Renderer::createTexture(void) -{ - DirectX9Texture* tex = new DirectX9Texture(this); - d_texturelist.push_back(tex); - return tex; -} - - -/************************************************************************* - Create a new Texture object and load a file into it. -*************************************************************************/ -Texture* DirectX9Renderer::createTexture(const String& filename, const String& resourceGroup) -{ - DirectX9Texture* tex = (DirectX9Texture*)createTexture(); - tex->loadFromFile(filename, resourceGroup); - - return tex; -} - - -/************************************************************************* - Create a new texture with the given dimensions -*************************************************************************/ -Texture* DirectX9Renderer::createTexture(float size) -{ - DirectX9Texture* tex = (DirectX9Texture*)createTexture(); - tex->setD3DTextureSize((uint)size); - - return tex; -} - -/************************************************************************* - Destroy a texture -*************************************************************************/ -void DirectX9Renderer::destroyTexture(Texture* texture) -{ - if (texture != NULL) - { - DirectX9Texture* tex = (DirectX9Texture*)texture; - d_texturelist.remove(tex); - delete tex; - } - -} - - -/************************************************************************* - destroy all textures still active -*************************************************************************/ -void DirectX9Renderer::destroyAllTextures(void) -{ - while (!d_texturelist.empty()) - { - destroyTexture(*(d_texturelist.begin())); - } -} - - -/************************************************************************* - setup states etc -*************************************************************************/ -void DirectX9Renderer::initPerFrameStates(void) -{ - // setup vertex stream - d_device->SetStreamSource(0, d_buffer, 0, sizeof(QuadVertex)); - d_device->SetFVF(VERTEX_FVF); - d_device->SetVertexShader( NULL ); - d_device->SetPixelShader( NULL ); - - // set device states - d_device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - d_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - d_device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - d_device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - d_device->SetRenderState(D3DRS_FOGENABLE, FALSE); - d_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - - - // setup texture addressing settings - d_device->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); - d_device->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); - - // setup colour calculations - d_device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - d_device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); - d_device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); - - // setup alpha calculations - d_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - d_device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); - d_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - - // setup filtering - d_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - d_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - - // setup scene alpha blending - d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - d_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - d_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); -} - - -/************************************************************************* - renders whatever is in the vertex buffer -*************************************************************************/ -void DirectX9Renderer::renderVBuffer(void) -{ - // if bufferPos is 0 there is no data in the buffer and nothing to render - if (d_bufferPos == 0) - { - return; - } - - // render the sprites - d_device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, (d_bufferPos / VERTEX_PER_TRIANGLE)); - - // reset buffer position to 0... - d_bufferPos = 0; -} - - -/************************************************************************* - sort quads list according to texture -*************************************************************************/ -void DirectX9Renderer::sortQuads(void) -{ -} - - -/************************************************************************* - render a quad directly to the display -*************************************************************************/ -void DirectX9Renderer::renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode) -{ - if ( !d_buffer ) - return; - - // ensure offset destination to ensure proper texel to pixel mapping from D3D. - Rect final_rect(dest_rect); - final_rect.offset(Point(-0.5f, -0.5f)); - - QuadVertex* buffmem = NULL; - - initPerFrameStates(); - d_device->SetTexture(0, ((DirectX9Texture*)tex)->getD3DTexture()); - - if (SUCCEEDED(d_buffer->Lock(0, VERTEX_PER_QUAD * sizeof(QuadVertex), (void**)&buffmem, D3DLOCK_DISCARD)) && buffmem ) - { - // setup Vertex 1... - buffmem->x = final_rect.d_left; - buffmem->y = final_rect.d_top; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_top_left.getARGB(); - buffmem->tu1 = texture_rect.d_left; - buffmem->tv1 = texture_rect.d_top; - ++buffmem; - - // setup Vertex 2... - - // top-left to bottom-right diagonal - if (quad_split_mode == TopLeftToBottomRight) - { - buffmem->x = final_rect.d_right; - buffmem->y = final_rect.d_bottom; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_bottom_right.getARGB(); - buffmem->tu1 = texture_rect.d_right; - buffmem->tv1 = texture_rect.d_bottom; - } - // bottom-left to top-right diagonal - else - { - buffmem->x = final_rect.d_right; - buffmem->y = final_rect.d_top; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_top_right.getARGB(); - buffmem->tu1 = texture_rect.d_right; - buffmem->tv1 = texture_rect.d_top; - } - ++buffmem; - - // setup Vertex 3... - buffmem->x = final_rect.d_left; - buffmem->y = final_rect.d_bottom; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_bottom_left.getARGB(); - buffmem->tu1 = texture_rect.d_left; - buffmem->tv1 = texture_rect.d_bottom; - ++buffmem; - - // setup Vertex 4... - buffmem->x = final_rect.d_right; - buffmem->y = final_rect.d_top; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_top_right.getARGB(); - buffmem->tu1 = texture_rect.d_right; - buffmem->tv1 = texture_rect.d_top; - ++buffmem; - - // setup Vertex 5... - buffmem->x = final_rect.d_right; - buffmem->y = final_rect.d_bottom; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_bottom_right.getARGB(); - buffmem->tu1 = texture_rect.d_right; - buffmem->tv1 = texture_rect.d_bottom; - ++buffmem; - - // setup Vertex 6... - - // top-left to bottom-right diagonal - if (quad_split_mode == TopLeftToBottomRight) - { - buffmem->x = final_rect.d_left; - buffmem->y = final_rect.d_top; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_top_left.getARGB(); - buffmem->tu1 = texture_rect.d_left; - buffmem->tv1 = texture_rect.d_top; - } - // bottom-left to top-right diagonal - else - { - buffmem->x = final_rect.d_left; - buffmem->y = final_rect.d_bottom; - buffmem->z = z; - buffmem->rhw = 1.0f; - buffmem->diffuse = colours.d_bottom_left.getARGB(); - buffmem->tu1 = texture_rect.d_left; - buffmem->tv1 = texture_rect.d_bottom; - } - - d_buffer->Unlock(); - d_bufferPos = VERTEX_PER_QUAD; - - renderVBuffer(); - } - -} - - -/************************************************************************* - Direct3D support method that must be called prior to a Reset call - on the Direct3DDevice. -*************************************************************************/ -void DirectX9Renderer::preD3DReset(void) -{ - // release the buffer prior to the reset call (will be re-created later) - if ( d_buffer ) - { - if (FAILED(d_buffer->Release())) - { - throw RendererException("DirectX9Renderer::preD3DReset - Failed to release the VertexBuffer used by the DirectX9Renderer object."); - } - - d_buffer = 0; - } - - // perform pre-reset operations on all textures - std::list::iterator ctex = d_texturelist.begin(); - std::list::iterator endtex = d_texturelist.end(); - - for (; ctex != endtex; ++ctex) - { - (*ctex)->preD3DReset(); - } - -} - - -/************************************************************************* - Direct3D support method that must be called after a Reset call on the - Direct3DDevice. -*************************************************************************/ -void DirectX9Renderer::postD3DReset(void) -{ - // Recreate a vertex buffer - if (FAILED(d_device->CreateVertexBuffer((VERTEXBUFFER_CAPACITY * sizeof(QuadVertex)), D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, VERTEX_FVF, D3DPOOL_DEFAULT, &d_buffer, NULL))) - { - throw RendererException("DirectX9Renderer::preD3DReset - Failed to create the VertexBuffer for use by the DirectX9Renderer object."); - } - - // perform post-reset operations on all textures - std::list::iterator ctex = d_texturelist.begin(); - std::list::iterator endtex = d_texturelist.end(); - - for (; ctex != endtex; ++ctex) - { - (*ctex)->postD3DReset(); - } - - // update display size - setDisplaySize(getViewportSize()); - - // Now we've come back, we MUST ensure a full redraw is done since the - // textures in the stored quads will have been invalidated. - System::getSingleton().signalRedraw(); -} - -/************************************************************************* - return size of device view port (if possible) -*************************************************************************/ -Size DirectX9Renderer::getViewportSize(void) -{ - // initialise renderer size - D3DVIEWPORT9 vp; - - if (FAILED(d_device->GetViewport(&vp))) - { - throw std::runtime_error("Unable to access required view port information from Direct3DDevice9."); - } - else - { - return Size((float)vp.Width, (float)vp.Height); - } - -} - - -/************************************************************************* - Set the size of the display in pixels. -*************************************************************************/ -void DirectX9Renderer::setDisplaySize(const Size& sz) -{ - if (d_display_area.getSize() != sz) - { - d_display_area.setSize(sz); - - EventArgs args; - fireEvent(EventDisplaySizeChanged, args, EventNamespace); - } - -} - - -} // End of CEGUI namespace section - diff --git a/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9texture.cpp b/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9texture.cpp deleted file mode 100644 index 377d1573fc..0000000000 --- a/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/d3d9texture.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/************************************************************************ - filename: d3d9texture.cpp - created: 17/7/2004 - author: Paul D Turner with D3D 9 Updates by Magnus Österlind - - purpose: Implements texture class for D3D9.0 system -*************************************************************************/ -/************************************************************************* - Crazy Eddie's GUI System (http://www.cegui.org.uk) - Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*************************************************************************/ -#include "renderers/directx9GUIRenderer/d3d9texture.h" -#include "renderers/directx9GUIRenderer/d3d9renderer.h" -#include "CEGUIExceptions.h" -#include "CEGUISystem.h" - -#include -#undef max - -// Start of CEGUI namespace section -namespace CEGUI -{ - -/************************************************************************* - Constructor -*************************************************************************/ -DirectX9Texture::DirectX9Texture(Renderer* owner) : - Texture(owner) -{ - d_d3dtexture = NULL; - - // do this mainly to indicate the lack of a filename. - d_isMemoryTexture = true; - d_isRenderTarget = false; -} - -/************************************************************************* - Destructor -*************************************************************************/ -DirectX9Texture::~DirectX9Texture(void) -{ - freeD3DTexture(); -} - -/************************************************************************* - Load texture from file. Texture is made to be same size as image in - file. -*************************************************************************/ -void DirectX9Texture::loadFromFile(const String& filename, const String& resourceGroup) -{ - freeD3DTexture(); - - // load the file via the resource provider - RawDataContainer texFile; - System::getSingleton().getResourceProvider()->loadRawDataContainer(filename, texFile, resourceGroup); - - D3DXIMAGE_INFO texInfo; - HRESULT hr = D3DXCreateTextureFromFileInMemoryEx(((DirectX9Renderer*)getRenderer())->getDevice(), texFile.getDataPtr(), - static_cast(texFile.getSize()), D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, - D3DX_DEFAULT, D3DX_DEFAULT, 0, &texInfo, NULL, &d_d3dtexture); - - System::getSingleton().getResourceProvider()->unloadRawDataContainer(texFile); - - if (SUCCEEDED(hr)) - { - d_width = (ushort)texInfo.Width; - d_height = (ushort)texInfo.Height; - - d_filename = filename; - d_resourceGroup = resourceGroup; - d_isMemoryTexture = true; - d_isRenderTarget = false; - } - else - { - throw RendererException((utf8*)"Failed to create Texture object from file '" + filename ); - } - -} - - -/************************************************************************* - Load texture from raw memory. -*************************************************************************/ -void DirectX9Texture::loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight) -{ - using namespace std; - - // release old texture - freeD3DTexture(); - - // calculate square size big enough for whole memory buffer - uint tex_size = ceguimax(buffWidth, buffHeight); - - // create a texture - // TODO: Check resulting pixel format and react appropriately. - HRESULT hr = D3DXCreateTexture(((DirectX9Renderer*)getRenderer())->getDevice(), tex_size, tex_size, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &d_d3dtexture); - - if (FAILED(hr)) - { - throw RendererException((utf8*)"Failed to load texture from memory: D3D Texture creation failed."); - } - else - { - D3DSURFACE_DESC texdesc; - d_d3dtexture->GetLevelDesc(0, &texdesc); - - // store new size; - d_width = (ushort)texdesc.Width; - d_height = (ushort)texdesc.Height; - - // lock the D3D texture - D3DLOCKED_RECT rect = { 0, NULL }; - hr = d_d3dtexture->LockRect(0, &rect, NULL, 0); - - if (FAILED(hr) || rect.pBits == NULL ) - { - d_d3dtexture->Release(); - d_d3dtexture = NULL; - - throw RendererException((utf8*)"Failed to load texture from memory: IDirect3DTexture9::LockRect failed."); - } - else - { - // copy data from buffer into texture - ulong* dst = (ulong*)rect.pBits; - ulong* src = (ulong*)buffPtr; - - for (uint i = 0; i < buffHeight; ++i) - { - for (uint j = 0; j < buffWidth; ++j) - { - dst[j] = src[j]; - } - - dst += rect.Pitch / sizeof(ulong); - src += buffWidth; - } - - d_d3dtexture->UnlockRect(0); - } - - } - -} - - -/************************************************************************* - safely release D3D texture associated with this Texture -*************************************************************************/ -void DirectX9Texture::freeD3DTexture(void) -{ - if (d_d3dtexture != NULL) - { - d_d3dtexture->Release(); - d_d3dtexture = NULL; - } - - d_filename.clear(); - d_isMemoryTexture = true; - d_isRenderTarget = false; -} - - -void DirectX9Texture::createRenderTarget(uint width, uint height) -{ - freeD3DTexture(); - - d_isMemoryTexture = true; - d_isRenderTarget = true; - - HRESULT hr = D3DXCreateTexture(((DirectX9Renderer*)getRenderer())->getDevice(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &d_d3dtexture); - - if (FAILED(hr)) - { - throw RendererException((utf8*)"Failed to create texture of specified size: D3D Texture creation failed."); - } - else - { - D3DSURFACE_DESC texdesc; - d_d3dtexture->GetLevelDesc(0, &texdesc); - - // store new size; - d_width = (ushort)texdesc.Width; - d_height = (ushort)texdesc.Height; - } -} - - -/************************************************************************* - allocate a D3D texture >= 'size'. Previous D3D texture is lost -*************************************************************************/ -void DirectX9Texture::setD3DTextureSize(uint size) -{ - freeD3DTexture(); - - HRESULT hr = D3DXCreateTexture(((DirectX9Renderer*)getRenderer())->getDevice(), size, size, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &d_d3dtexture); - - if (FAILED(hr)) - { - throw RendererException((utf8*)"Failed to create texture of specified size: D3D Texture creation failed."); - } - else - { - D3DSURFACE_DESC texdesc; - d_d3dtexture->GetLevelDesc(0, &texdesc); - - // store new size; - d_width = (ushort)texdesc.Width; - d_height = (ushort)texdesc.Height; - } - -} - - -/************************************************************************* - Direct3D support method that must be called prior to a Reset call - on the Direct3DDevice. -*************************************************************************/ -void DirectX9Texture::preD3DReset(void) -{ - // textures not based on files are in the managed pool, so we do - // not worry about those. - if (!d_isMemoryTexture || d_isRenderTarget) - { - // release the d3d texture - if (d_d3dtexture != NULL) - { - if (FAILED(d_d3dtexture->Release())) - { - throw RendererException("DirectX9Texture::preD3DReset - failed to release the Direct3DTexture9 object for this texture."); - } - - d_d3dtexture = NULL; - } - - } - -} - - -/************************************************************************* - Direct3D support method that must be called after a Reset call on the - Direct3DDevice. -*************************************************************************/ -void DirectX9Texture::postD3DReset(void) -{ - // textures not based on files are in the managed pool, so we do - // not worry about those. - if (!d_isMemoryTexture) - { - // The reason this copy is made is that d_filename will be reset once we - // call loadFromFile and loading would always fail due to invalid filenames. - String name(d_filename); - - // re-load the texture - loadFromFile(name, d_resourceGroup); - } else if (d_isRenderTarget) { - createRenderTarget(d_width,d_height); - } -} - -} // End of CEGUI namespace section diff --git a/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/premake5.lua b/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/premake5.lua deleted file mode 100644 index 5719c8c28e..0000000000 --- a/vendor/cegui-0.4.0-custom/src/renderers/directx9GUIRenderer/premake5.lua +++ /dev/null @@ -1,31 +0,0 @@ -project "DirectX9GUIRenderer" - language "C++" - kind "StaticLib" - targetname "DirectX9GUIRenderer" - - defines { "_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING" } - - includedirs { - "../sdk", - "../../../include" - } - - vpaths { - ["Headers/*"] = "**.h", - ["Sources"] = "**.cpp", - ["*"] = "premake5.lua" - } - - files { - "premake5.lua", - "d3d9renderer.cpp", - "d3d9texture.cpp", - "../../../include/renderers/d3d9texture.h", - "../../../include/renderers/d3d9renderer.h" - } - - filter "architecture:not x86" - flags { "ExcludeFromBuild" } - - filter "system:not windows" - flags { "ExcludeFromBuild" } \ No newline at end of file diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/readme.txt b/vendor/cegui-0.4.0-custom/src/tinyxml/readme.txt deleted file mode 100644 index 44d73e0013..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/readme.txt +++ /dev/null @@ -1,496 +0,0 @@ -/** @mainpage - -

    TinyXml

    - -TinyXml is a simple, small, C++ XML parser that can be easily -integrating into other programs. - - -

    What it does.

    - -In brief, TinyXml parses an XML document, and builds from that a -Document Object Model (DOM) that can be read, modified, and saved. - -XML stands for "eXtensible Markup Language." It allows you to create -your own document markups. Where HTML does a very good job of marking -documents for browsers, XML allows you to define any kind of document -markup, for example a document that describes a "to do" list for an -organizer application. XML is a very structured and convenient format. -All those random file formats created to store application data can -all be replaced with XML. One parser for everything. - -The best place for the complete, correct, and quite frankly hard to -read spec is at -http://www.w3.org/TR/2004/REC-xml-20040204/. An intro to XML -(that I really like) can be found at -http://skew.org/xml/tutorial. - -There are different ways to access and interact with XML data. -TinyXml uses a Document Object Model (DOM), meaning the XML data is parsed -into a C++ objects that can be browsed and manipulated, and then -written to disk or another output stream. You can also construct an XML document from -scratch with C++ objects and write this to disk or another output -stream. - -TinyXml is designed to be easy and fast to learn. It is two headers -and four cpp files. Simply add these to your project and off you go. -There is an example file - xmltest.cpp - to get you started. - -TinyXml is released under the ZLib license, -so you can use it in open source or commercial code. The details -of the license are at the top of every source file. - -TinyXml attempts to be a flexible parser, but with truly correct and -compliant XML output. TinyXml should compile on any reasonably C++ -compliant system. It does not rely on exceptions or RTTI. It can be -compiled with or without STL support. TinyXml fully supports -the UTF-8 encoding, and the first 64k character entities. - - -

    What it doesn't do.

    - -It doesnt parse or use DTDs (Document Type Definitions) or XSLs -(eXtensible Stylesheet Language.) There are other parsers out there -(check out www.sourceforge.org, search for XML) that are much more fully -featured. But they are also much bigger, take longer to set up in -your project, have a higher learning curve, and often have a more -restrictive license. If you are working with browsers or have more -complete XML needs, TinyXml is not the parser for you. - -The following DTD syntax will not parse at this time in TinyXml: - -@verbatim - - ]> -@endverbatim - -because TinyXml sees this as a !DOCTYPE node with an illegally -embedded !ELEMENT node. This may be addressed in the future. - -

    Code Status.

    - -TinyXml is mature, tested code. It is very stable. If you find -bugs, please file a bug report is on the sourceforge web site -(www.sourceforge.net/projects/tinyxml). -We'll get them straightened out as soon as possible. - -There are some areas of improvement; please check sourceforge if you are -interested in working on TinyXml. - - -

    Features

    - -

    Using STL

    - -TinyXml can be compiled to use or not use STL. When using STL, TinyXml -uses the std::string class, and fully supports std::istream, std::ostream, -operator<<, and operator>>. Many API methods have both 'const char*' and -'const std::string&' forms. - -When STL support is compiled out, no STL files are included whatsover. All -the string classes are implemented by TinyXml itself. API methods -all use the 'const char*' form for input. - -Use the compile time #define: - - TIXML_USE_STL - -to compile one version or the other. This can be passed by the compiler, -or set as the first line of "tinyxml.h". - -Note: If compiling the test code in Linux, setting the environment -variable TINYXML_USE_STL=YES/NO will control STL compilation. In the -Windows project file, STL and non STL targets are provided. In your project, -its probably easiest to add the line "#define TIXML_USE_STL" as the first -line of tinyxml.h. - -

    UTF-8

    - -TinyXml supports UTF-8 allowing to manipulate XML files in any language. TinyXml -also supports "legacy mode" - the encoding used before UTF-8 support and -probably best described as "extended ascii". - -Normally, TinyXml will try to detect the correct encoding and use it. However, -by setting the value of TIXML_DEFAULT_ENCODING in the header file, TinyXml -can be forced to always use one encoding. - -TinyXml will assume Legacy Mode until one of the following occurs: -
      -
    1. If the non-standard but common "UTF-8 lead bytes" (0xef 0xbb 0xbf) - begin the file or data stream, TinyXml will read it as UTF-8.
    2. -
    3. If the declaration tag is read, and it has an encoding="UTF-8", then - TinyXml will read it as UTF-8.
    4. -
    5. If the declaration tag is read, and it has no encoding specified, then - TinyXml will read it as UTF-8.
    6. -
    7. If the declaration tag is read, and it has an encoding="something else", then - TinyXml will read it as Legacy Mode. In legacy mode, TinyXml will - work as it did before. It's not clear what that mode does exactly, but - old content should keep working.
    8. -
    9. Until one of the above criteria is met, TinyXml runs in Legacy Mode.
    10. -
    - -What happens if the encoding is incorrectly set or detected? TinyXml will try -to read and pass through text seen as improperly encoded. You may get some strange -results or mangled characters. You may want to force TinyXml to the correct mode. - - You may force TinyXml to Legacy Mode by using LoadFile( TIXML_ENCODING_LEGACY ) or -LoadFile( filename, TIXML_ENCODING_LEGACY ). You may force it to use legacy mode all -the time by setting TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY. Likewise, you may -force it to TIXML_ENCODING_UTF8 with the same technique. - -For English users, using English XML, UTF-8 is the same as low-ASCII. You -don't need to be aware of UTF-8 or change your code in any way. You can think -of UTF-8 as a "superset" of ASCII. - -UTF-8 is not a double byte format - but it is a standard encoding of Unicode! -TinyXml does not use or directly support wchar, TCHAR, or Microsofts _UNICODE at this time. -It is common to see the term "Unicode" improperly refer to UTF-16, a wide byte encoding -of unicode. This is a source of confusion. - -For "high-ascii" languages - everything not English, pretty much - TinyXml can -handle all languages, at the same time, as long as the XML is encoded -in UTF-8. That can be a little tricky, older programs and operating systems -tend to use the "default" or "traditional" code page. Many apps (and almost all -modern ones) can output UTF-8, but older or stubborn (or just broken) ones -still output text in the default code page. - -For example, Japanese systems traditionally use SHIFT-JIS encoding. -Text encoded as SHIFT-JIS can not be read by tinyxml. -A good text editor can import SHIFT-JIS and then save as UTF-8. - -The Skew.org link does a great -job covering the encoding issue. - -The test file "utf8test.xml" is an XML containing English, Spanish, Russian, -and Simplified Chinese. (Hopefully they are translated correctly). The file -"utf8test.gif" is a screen capture of the XML file, rendered in IE. Note that -if you don't have the correct fonts (Simplified Chinese or Russian) on your -system, you won't see output that matches the GIF file even if you can parse -it correctly. Also note that (at least on my Windows machine) console output -is in a Western code page, so that Print() or printf() cannot correctly display -the file. This is not a bug in TinyXml - just an OS issue. No data is lost or -destroyed by TinyXml. The console just doesn't render UTF-8. - - -

    Entities

    -TinyXml recognizes the pre-defined "character entities", meaning special -characters. Namely: - -@verbatim - & & - < < - > > - " " - ' ' -@endverbatim - -These are recognized when the XML document is read, and translated to there -UTF-8 equivalents. For instance, text with the XML of: - -@verbatim - Far & Away -@endverbatim - -will have the Value() of "Far & Away" when queried from the TiXmlText object, -and will be written back to the XML stream/file as an ampersand. Older versions -of TinyXml "preserved" character entities, but the newer versions will translate -them into characters. - -Additionally, any character can be specified by its Unicode code point: -The syntax " " or " " are both to the non-breaking space characher. - - -

    Streams

    -With TIXML_USE_STL on, -TiXml has been modified to support both C (FILE) and C++ (operator <<,>>) -streams. There are some differences that you may need to be aware of. - -C style output: - - based on FILE* - - the Print() and SaveFile() methods - - Generates formatted output, with plenty of white space, intended to be as - human-readable as possible. They are very fast, and tolerant of ill formed - XML documents. For example, an XML document that contains 2 root elements - and 2 declarations, will still print. - -C style input: - - based on FILE* - - the Parse() and LoadFile() methods - - A fast, tolerant read. Use whenever you don't need the C++ streams. - -C++ style ouput: - - based on std::ostream - - operator<< - - Generates condensed output, intended for network transmission rather than - readability. Depending on your system's implementation of the ostream class, - these may be somewhat slower. (Or may not.) Not tolerant of ill formed XML: - a document should contain the correct one root element. Additional root level - elements will not be streamed out. - -C++ style input: - - based on std::istream - - operator>> - - Reads XML from a stream, making it useful for network transmission. The tricky - part is knowing when the XML document is complete, since there will almost - certainly be other data in the stream. TinyXml will assume the XML data is - complete after it reads the root element. Put another way, documents that - are ill-constructed with more than one root element will not read correctly. - Also note that operator>> is somewhat slower than Parse, due to both - implementation of the STL and limitations of TinyXml. - -

    White space

    -The world simply does not agree on whether white space should be kept, or condensed. -For example, pretend the '_' is a space, and look at "Hello____world". HTML, and -at least some XML parsers, will interpret this as "Hello_world". They condense white -space. Some XML parsers do not, and will leave it as "Hello____world". (Remember -to keep pretending the _ is a space.) Others suggest that __Hello___world__ should become -Hello___world. - -It's an issue that hasn't been resolved to my satisfaction. TinyXml supports the -first 2 approaches. Call TiXmlBase::SetCondenseWhiteSpace( bool ) to set the desired behavior. -The default is to condense white space. - -If you change the default, you should call TiXmlBase::SetCondenseWhiteSpace( bool ) -before making any calls to Parse XML data, and I don't recommend changing it after -it has been set. - - -

    Handles

    - -Where browsing an XML document in a robust way, it is important to check -for null returns from method calls. An error safe implementation can -generate a lot of code like: - -@verbatim -TiXmlElement* root = document.FirstChildElement( "Document" ); -if ( root ) -{ - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. -@endverbatim - -Handles have been introduced to clean this up. Using the TiXmlHandle class, -the previous code reduces to: - -@verbatim -TiXmlHandle docHandle( &document ); -TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); -if ( child2 ) -{ - // do something useful -@endverbatim - -Which is much easier to deal with. See TiXmlHandle for more information. - - -

    Row and Column tracking

    -Being able to track nodes and attributes back to their origin location -in source files can be very important for some applications. Additionally, -knowing where parsing errors occured in the original source can be very -time saving. - -TinyXml can tracks the row and column origin of all nodes and attributes -in a text file. The TiXmlBase::Row() and TiXmlBase::Column() methods return -the origin of the node in the source text. The correct tabs can be -configured in TiXmlDocument::SetTabSize(). - - -

    Using and Installing

    - -To Compile and Run xmltest: - -A Linux Makefile and a Windows Visual C++ .dsw file is provided. -Simply compile and run. It will write the file demotest.xml to your -disk and generate output on the screen. It also tests walking the -DOM by printing out the number of nodes found using different -techniques. - -The Linux makefile is very generic and will -probably run on other systems, but is only tested on Linux. You no -longer need to run 'make depend'. The dependecies have been -hard coded. - -

    Windows project file for VC6

    -
      -
    • tinyxml: tinyxml library, non-STL
    • -
    • tinyxmlSTL: tinyxml library, STL
    • -
    • tinyXmlTest: test app, non-STL
    • -
    • tinyXmlTestSTL: test app, STL
    • -
    - -

    Linux Make file

    -At the top of the makefile you can set: - -PROFILE, DEBUG, and TINYXML_USE_STL. Details (such that they are) are in -the makefile. - -In the tinyxml directory, type "make clean" then "make". The executable -file 'xmltest' will be created. - - - -

    To Use in an Application:

    - -Add tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, and tinystr.h to your -project or make file. That's it! It should compile on any reasonably -compliant C++ system. You do not need to enable exceptions or -RTTI for TinyXml. - - -

    How TinyXml works.

    - -An example is probably the best way to go. Take: -@verbatim - - - - Go to the Toy store! - Do bills - -@endverbatim - -Its not much of a To Do list, but it will do. To read this file -(say "demo.xml") you would create a document, and parse it in: -@verbatim - TiXmlDocument doc( "demo.xml" ); - doc.LoadFile(); -@endverbatim - -And its ready to go. Now lets look at some lines and how they -relate to the DOM. - -@verbatim - -@endverbatim - - The first line is a declaration, and gets turned into the - TiXmlDeclaration class. It will be the first child of the - document node. - - This is the only directive/special tag parsed by by TinyXml. - Generally directive targs are stored in TiXmlUnknown so the - commands wont be lost when it is saved back to disk. - -@verbatim - -@endverbatim - - A comment. Will become a TiXmlComment object. - -@verbatim - -@endverbatim - - The "ToDo" tag defines a TiXmlElement object. This one does not have - any attributes, but does contain 2 other elements. - -@verbatim - -@endverbatim - - Creates another TiXmlElement which is a child of the "ToDo" element. - This element has 1 attribute, with the name "priority" and the value - "1". - -Go to the - - A TiXmlText. This is a leaf node and cannot contain other nodes. - It is a child of the "Item" TiXmlElement. - -@verbatim - -@endverbatim - - - Another TiXmlElement, this one a child of the "Item" element. - -Etc. - -Looking at the entire object tree, you end up with: -@verbatim -TiXmlDocument "demo.xml" - TiXmlDeclaration "version='1.0'" "standalone=no" - TiXmlComment " Our to do list data" - TiXmlElement "ToDo" - TiXmlElement "Item" Attribtutes: priority = 1 - TiXmlText "Go to the " - TiXmlElement "bold" - TiXmlText "Toy store!" - TiXmlElement "Item" Attributes: priority=2 - TiXmlText "Do bills" -@endverbatim - -

    Documentation

    - -The documentation is build with Doxygen, using the 'dox' -configuration file. - -

    License

    - -TinyXml is released under the zlib license: - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. - -

    References

    - -The World Wide Web Consortium is the definitive standard body for -XML, and there web pages contain huge amounts of information. - -The definitive spec: -http://www.w3.org/TR/2004/REC-xml-20040204/ - -I also recommend "XML Pocket Reference" by Robert Eckstein and published by -OReilly...the book that got the whole thing started. - -

    Contributors, Contacts, and a Brief History

    - -Thanks very much to everyone who sends suggestions, bugs, ideas, and -encouragement. It all helps, and makes this project fun. A special thanks -to the contributors on the web pages that keep it lively. - -So many people have sent in bugs and ideas, that rather than list here -we try to give credit due in the "changes.txt" file. - -TinyXml was originally written be Lee Thomason. (Often the "I" still -in the documenation.) Lee reviews changes and releases new versions, -with the help of Yves Berquin and the tinyXml community. - -We appreciate your suggestions, and would love to know if you -use TinyXml. Hopefully you will enjoy it and find it useful. -Please post questions, comments, file bugs, or contact us at: - -www.sourceforge.net/projects/tinyxml - -Lee Thomason, -Yves Berquin -*/ diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.cpp b/vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.cpp deleted file mode 100644 index 90452d4291..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - -#ifndef TIXML_USE_STL - - -#include -#include -#include - -#include "tinystr.h" - -// TiXmlString constructor, based on a C string -TiXmlString::TiXmlString (const char* instring) -{ - unsigned newlen; - char * newstring; - - if (!instring) - { - allocated = 0; - cstring = NULL; - current_length = 0; - return; - } - //*ME: warning C4267: convert 'size_t' to 'unsigned int' - //*ME: Use Cast: (unsigned) - newlen = (unsigned)strlen (instring) + 1; - newstring = new char [newlen]; - memcpy (newstring, instring, newlen); - // strcpy (newstring, instring); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// TiXmlString copy constructor -TiXmlString::TiXmlString (const TiXmlString& copy) -{ - unsigned newlen; - char * newstring; - - // Prevent copy to self! - if ( © == this ) - return; - - if (! copy . allocated) - { - allocated = 0; - cstring = NULL; - current_length = 0; - return; - } - newlen = copy . length () + 1; - newstring = new char [newlen]; - // strcpy (newstring, copy . cstring); - memcpy (newstring, copy . cstring, newlen); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// TiXmlString = operator. Safe when assign own content -void TiXmlString ::operator = (const char * content) -{ - unsigned newlen; - char * newstring; - - if (! content) - { - empty_it (); - return; - } - newlen = (unsigned)strlen (content) + 1; - newstring = new char [newlen]; - // strcpy (newstring, content); - memcpy (newstring, content, newlen); - empty_it (); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// = operator. Safe when assign own content -void TiXmlString ::operator = (const TiXmlString & copy) -{ - unsigned newlen; - char * newstring; - - if (! copy . length ()) - { - empty_it (); - return; - } - newlen = copy . length () + 1; - newstring = new char [newlen]; - // strcpy (newstring, copy . c_str ()); - memcpy (newstring, copy . c_str (), newlen); - empty_it (); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - - -// append a const char * to an existing TiXmlString -void TiXmlString::append( const char* str, int len ) -{ - char * new_string; - unsigned new_alloc, new_size, size_suffix; - - // don't use strlen - it can overrun the len passed in! - const char* p = str; - size_suffix = 0; - - while ( *p && size_suffix < (unsigned)len ) - { - ++p; - ++size_suffix; - } - if ( !size_suffix) - return; - - new_size = length () + size_suffix + 1; - // check if we need to expand - if (new_size > allocated) - { - // compute new size - new_alloc = assign_new_size (new_size); - - // allocate new buffer - new_string = new char [new_alloc]; - new_string [0] = 0; - - // copy the previous allocated buffer into this one - if (allocated && cstring) - // strcpy (new_string, cstring); - memcpy (new_string, cstring, length ()); - - // append the suffix. It does exist, otherwize we wouldn't be expanding - // strncat (new_string, str, len); - memcpy (new_string + length (), - str, - size_suffix); - - // return previsously allocated buffer if any - if (allocated && cstring) - delete [] cstring; - - // update member variables - cstring = new_string; - allocated = new_alloc; - } - else - { - // we know we can safely append the new string - // strncat (cstring, str, len); - memcpy (cstring + length (), - str, - size_suffix); - } - current_length = new_size - 1; - cstring [current_length] = 0; -} - - -// append a const char * to an existing TiXmlString -void TiXmlString::append( const char * suffix ) -{ - char * new_string; - unsigned new_alloc, new_size; - - new_size = length () + strlen (suffix) + 1; - // check if we need to expand - if (new_size > allocated) - { - // compute new size - new_alloc = assign_new_size (new_size); - - // allocate new buffer - new_string = new char [new_alloc]; - new_string [0] = 0; - - // copy the previous allocated buffer into this one - if (allocated && cstring) - memcpy (new_string, cstring, 1 + length ()); - // strcpy (new_string, cstring); - - // append the suffix. It does exist, otherwize we wouldn't be expanding - // strcat (new_string, suffix); - memcpy (new_string + length (), - suffix, - strlen (suffix) + 1); - - // return previsously allocated buffer if any - if (allocated && cstring) - delete [] cstring; - - // update member variables - cstring = new_string; - allocated = new_alloc; - } - else - { - // we know we can safely append the new string - // strcat (cstring, suffix); - memcpy (cstring + length (), - suffix, - strlen (suffix) + 1); - } - current_length = new_size - 1; -} - -// Check for TiXmlString equuivalence -//bool TiXmlString::operator == (const TiXmlString & compare) const -//{ -// return (! strcmp (c_str (), compare . c_str ())); -//} - -//unsigned TiXmlString::length () const -//{ -// if (allocated) -// // return strlen (cstring); -// return current_length; -// return 0; -//} - - -unsigned TiXmlString::find (char tofind, unsigned offset) const -{ - //*ME: warning C4244: convert '__w64 int' to 'unsigned' - //*ME: Use Array-Arithmetic instead of Pointer - // char * lookup; - - if (offset >= length ()) - return (unsigned) notfound; - // for (lookup = cstring + offset; * lookup; lookup++) - // if (* lookup == tofind) - // return lookup - cstring; - for( unsigned n=offset ; cstring[n] != '\0' ; n++ ) - if( cstring[n] == tofind ) - return n ; - return (unsigned) notfound; -} - - -bool TiXmlString::operator == (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) == 0 ); - } - return false; -} - - - -bool TiXmlString::operator < (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) > 0 ); - } - return false; -} - - -bool TiXmlString::operator > (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) < 0 ); - } - return false; -} - - -#endif // TIXML_USE_STL diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.h b/vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.h deleted file mode 100644 index 540a8b171f..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/tinystr.h +++ /dev/null @@ -1,253 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - - -#ifndef TIXML_USE_STL - -#ifndef TIXML_STRING_INCLUDED -#define TIXML_STRING_INCLUDED - -#ifdef _MSC_VER -#pragma warning( disable : 4786 ) // Debugger truncating names. -#endif - -#include - -/* - TiXmlString is an emulation of the std::string template. - Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. - Only the member functions relevant to the TinyXML project have been implemented. - The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase - a string and there's no more room, we allocate a buffer twice as big as we need. -*/ -class TiXmlString -{ - public : - // TiXmlString constructor, based on a string - TiXmlString (const char * instring); - - // TiXmlString empty constructor - TiXmlString () - { - allocated = 0; - cstring = NULL; - current_length = 0; - } - - // TiXmlString copy constructor - TiXmlString (const TiXmlString& copy); - - // TiXmlString destructor - ~ TiXmlString () - { - empty_it (); - } - - // Convert a TiXmlString into a classical char * - const char * c_str () const - { - if (allocated) - return cstring; - return ""; - } - - // Return the length of a TiXmlString - unsigned length () const - { - return ( allocated ) ? current_length : 0; - } - - // TiXmlString = operator - void operator = (const char * content); - - // = operator - void operator = (const TiXmlString & copy); - - // += operator. Maps to append - TiXmlString& operator += (const char * suffix) - { - append (suffix); - return *this; - } - - // += operator. Maps to append - TiXmlString& operator += (char single) - { - append (single); - return *this; - } - - // += operator. Maps to append - TiXmlString& operator += (TiXmlString & suffix) - { - append (suffix); - return *this; - } - bool operator == (const TiXmlString & compare) const; - bool operator == (const char* compare) const; - bool operator < (const TiXmlString & compare) const; - bool operator > (const TiXmlString & compare) const; - - // Checks if a TiXmlString is empty - bool empty () const - { - return length () ? false : true; - } - - // single char extraction - const char& at (unsigned index) const - { - assert( index < length ()); - return cstring [index]; - } - - // find a char in a string. Return TiXmlString::notfound if not found - unsigned find (char lookup) const - { - return find (lookup, 0); - } - - // find a char in a string from an offset. Return TiXmlString::notfound if not found - unsigned find (char tofind, unsigned offset) const; - - /* Function to reserve a big amount of data when we know we'll need it. Be aware that this - function clears the content of the TiXmlString if any exists. - */ - void reserve (unsigned size) - { - empty_it (); - if (size) - { - allocated = size; - cstring = new char [size]; - cstring [0] = 0; - current_length = 0; - } - } - - // [] operator - char& operator [] (unsigned index) const - { - assert( index < length ()); - return cstring [index]; - } - - // Error value for find primitive - enum { notfound = 0xffffffff, - npos = notfound }; - - void append (const char *str, int len ); - - protected : - - // The base string - char * cstring; - // Number of chars allocated - unsigned allocated; - // Current string size - unsigned current_length; - - // New size computation. It is simplistic right now : it returns twice the amount - // we need - unsigned assign_new_size (unsigned minimum_to_allocate) - { - return minimum_to_allocate * 2; - } - - // Internal function that clears the content of a TiXmlString - void empty_it () - { - if (cstring) - delete [] cstring; - cstring = NULL; - allocated = 0; - current_length = 0; - } - - void append (const char *suffix ); - - // append function for another TiXmlString - void append (const TiXmlString & suffix) - { - append (suffix . c_str ()); - } - - // append for a single char. - void append (char single) - { - if ( cstring && current_length < (allocated-1) ) - { - cstring[ current_length ] = single; - ++current_length; - cstring[ current_length ] = 0; - } - else - { - char smallstr [2]; - smallstr [0] = single; - smallstr [1] = 0; - append (smallstr); - } - } - -} ; - -inline bool TiXmlString::operator == (const char* compare) const -{ - if ( allocated ) - { - assert( cstring ); - return ( strcmp( cstring, compare ) == 0 ); - } - return false; -} - -/* - TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. - Only the operators that we need for TinyXML have been developped. -*/ -class TiXmlOutStream : public TiXmlString -{ -public : - TiXmlOutStream () : TiXmlString () {} - - // TiXmlOutStream << operator. Maps to TiXmlString::append - TiXmlOutStream & operator << (const char * in) - { - append (in); - return (* this); - } - - // TiXmlOutStream << operator. Maps to TiXmlString::append - TiXmlOutStream & operator << (const TiXmlString & in) - { - append (in . c_str ()); - return (* this); - } -} ; - -#endif // TIXML_STRING_INCLUDED -#endif // TIXML_USE_STL diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.cpp b/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.cpp deleted file mode 100644 index 58ca8300cc..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.cpp +++ /dev/null @@ -1,1592 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include -#include "tinyxml.h" - -#ifdef TIXML_USE_STL -#include -#endif - - -bool TiXmlBase::condenseWhiteSpace = true; - -void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream ) -{ - TIXML_STRING buffer; - PutString( str, &buffer ); - (*stream) << buffer; -} - -void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString ) -{ - int i=0; - - while( i<(int)str.length() ) - { - unsigned char c = (unsigned char) str[i]; - - if ( c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) - { - // Hexadecimal character reference. - // Pass through unchanged. - // © -- copyright symbol, for example. - // - // The -1 is a bug fix from Rob Laveaux. It keeps - // an overflow from happening if there is no ';'. - // There are actually 2 ways to exit this loop - - // while fails (error case) and break (semicolon found). - // However, there is no mechanism (currently) for - // this function to return an error. - while ( i<(int)str.length()-1 ) - { - outString->append( str.c_str() + i, 1 ); - ++i; - if ( str[i] == ';' ) - break; - } - } - else if ( c == '&' ) - { - outString->append( entity[0].str, entity[0].strLength ); - ++i; - } - else if ( c == '<' ) - { - outString->append( entity[1].str, entity[1].strLength ); - ++i; - } - else if ( c == '>' ) - { - outString->append( entity[2].str, entity[2].strLength ); - ++i; - } - else if ( c == '\"' ) - { - outString->append( entity[3].str, entity[3].strLength ); - ++i; - } - else if ( c == '\'' ) - { - outString->append( entity[4].str, entity[4].strLength ); - ++i; - } - else if ( c < 32 ) - { - // Easy pass at non-alpha/numeric/symbol - // Below 32 is symbolic. - char buf[ 32 ]; - sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); - //*ME: warning C4267: convert 'size_t' to 'int' - //*ME: Int-Cast to make compiler happy ... - outString->append( buf, (int)strlen( buf ) ); - ++i; - } - else - { - //char realc = (char) c; - //outString->append( &realc, 1 ); - *outString += (char) c; // somewhat more efficient function call. - ++i; - } - } -} - - -// <-- Strange class for a bug fix. Search for STL_STRING_BUG -TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) -{ - buffer = new char[ str.length()+1 ]; - if ( buffer ) - { - strcpy( buffer, str.c_str() ); - } -} - - -TiXmlBase::StringToBuffer::~StringToBuffer() -{ - delete [] buffer; -} -// End strange bug fix. --> - - -TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() -{ - parent = 0; - type = _type; - firstChild = 0; - lastChild = 0; - prev = 0; - next = 0; -} - - -TiXmlNode::~TiXmlNode() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } -} - - -void TiXmlNode::CopyTo( TiXmlNode* target ) const -{ - target->SetValue (value.c_str() ); - target->userData = userData; -} - - -void TiXmlNode::Clear() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } - - firstChild = 0; - lastChild = 0; -} - - -TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) -{ - node->parent = this; - - node->prev = lastChild; - node->next = 0; - - if ( lastChild ) - lastChild->next = node; - else - firstChild = node; // it was an empty list. - - lastChild = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) -{ - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - - return LinkEndChild( node ); -} - - -TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) -{ - if ( !beforeThis || beforeThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->next = beforeThis; - node->prev = beforeThis->prev; - if ( beforeThis->prev ) - { - beforeThis->prev->next = node; - } - else - { - assert( firstChild == beforeThis ); - firstChild = node; - } - beforeThis->prev = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) -{ - if ( !afterThis || afterThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->prev = afterThis; - node->next = afterThis->next; - if ( afterThis->next ) - { - afterThis->next->prev = node; - } - else - { - assert( lastChild == afterThis ); - lastChild = node; - } - afterThis->next = node; - return node; -} - - -TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) -{ - if ( replaceThis->parent != this ) - return 0; - - TiXmlNode* node = withThis.Clone(); - if ( !node ) - return 0; - - node->next = replaceThis->next; - node->prev = replaceThis->prev; - - if ( replaceThis->next ) - replaceThis->next->prev = node; - else - lastChild = node; - - if ( replaceThis->prev ) - replaceThis->prev->next = node; - else - firstChild = node; - - delete replaceThis; - node->parent = this; - return node; -} - - -bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) -{ - if ( removeThis->parent != this ) - { - assert( 0 ); - return false; - } - - if ( removeThis->next ) - removeThis->next->prev = removeThis->prev; - else - lastChild = removeThis->prev; - - if ( removeThis->prev ) - removeThis->prev->next = removeThis->next; - else - firstChild = removeThis->next; - - delete removeThis; - return true; -} - -const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == TIXML_CAST_STRING( _value )) - return node; - } - return 0; -} - - -TiXmlNode* TiXmlNode::FirstChild( const char * _value ) -{ - TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == TIXML_CAST_STRING( _value )) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == TIXML_CAST_STRING(_value)) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::LastChild( const char * _value ) -{ - TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == TIXML_CAST_STRING(_value)) - return node; - } - return 0; -} - -const TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - -TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - -const TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - -TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - -const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == TIXML_CAST_STRING(_value)) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::NextSibling( const char * _value ) -{ - TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == TIXML_CAST_STRING(_value)) - return node; - } - return 0; -} - -const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == TIXML_CAST_STRING(_value)) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) -{ - TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == TIXML_CAST_STRING(_value)) - return node; - } - return 0; -} - -void TiXmlElement::RemoveAttribute( const char * name ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - attributeSet.Remove( node ); - delete node; - } -} - -const TiXmlElement* TiXmlNode::FirstChildElement() const -{ - const TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::FirstChildElement() -{ - TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) -{ - TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::NextSiblingElement() const -{ - const TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::NextSiblingElement() -{ - TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) -{ - TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlDocument* TiXmlNode::GetDocument() const -{ - const TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - -TiXmlDocument* TiXmlNode::GetDocument() -{ - TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - -TiXmlElement::TiXmlElement (const char * _value) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} - - -#ifdef TIXML_USE_STL -TiXmlElement::TiXmlElement( const std::string& _value ) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} -#endif - - -TiXmlElement::TiXmlElement( const TiXmlElement& copy) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - copy.CopyTo( this ); -} - - -void TiXmlElement::operator=( const TiXmlElement& base ) -{ - ClearThis(); - base.CopyTo( this ); -} - - -TiXmlElement::~TiXmlElement() -{ - ClearThis(); -} - - -void TiXmlElement::ClearThis() -{ - Clear(); - while( attributeSet.First() ) - { - TiXmlAttribute* node = attributeSet.First(); - attributeSet.Remove( node ); - delete node; - } -} - - -const char * TiXmlElement::Attribute( const char * name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - - if ( node ) - return node->Value(); - - return 0; -} - - -const char * TiXmlElement::Attribute( const char * name, int* i ) const -{ - const char * s = Attribute( name ); - if ( i ) - { - if ( s ) - *i = atoi( s ); - else - *i = 0; - } - return s; -} - - -const char * TiXmlElement::Attribute( const char * name, double* d ) const -{ - const char * s = Attribute( name ); - if ( d ) - { - if ( s ) - *d = atof( s ); - else - *d = 0; - } - return s; -} - - -int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - return node->QueryIntValue( ival ); -} - - -int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - return node->QueryDoubleValue( dval ); -} - - -void TiXmlElement::SetAttribute( const char * name, int val ) -{ - char buf[64]; - sprintf( buf, "%d", val ); - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetDoubleAttribute( const char * name, double val ) -{ - char buf[128]; - sprintf( buf, "%f", val ); - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetAttribute( const char * name, const char * _value ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} - -void TiXmlElement::Print( FILE* cfile, int depth ) const -{ - int i; - for ( i=0; iNext() ) - { - fprintf( cfile, " " ); - attrib->Print( cfile, depth ); - } - - // There are 3 different formatting approaches: - // 1) An element without children is printed as a node - // 2) An element with only a text child is printed as text - // 3) An element with children is printed on multiple lines. - TiXmlNode* node; - if ( !firstChild ) - { - fprintf( cfile, " />" ); - } - else if ( firstChild == lastChild && firstChild->ToText() ) - { - fprintf( cfile, ">" ); - firstChild->Print( cfile, depth + 1 ); - fprintf( cfile, "", value.c_str() ); - } - else - { - fprintf( cfile, ">" ); - - for ( node = firstChild; node; node=node->NextSibling() ) - { - if ( !node->ToText() ) - { - fprintf( cfile, "\n" ); - } - node->Print( cfile, depth+1 ); - } - fprintf( cfile, "\n" ); - for( i=0; i", value.c_str() ); - } -} - -void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << "<" << value; - - const TiXmlAttribute* attrib; - for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) - { - (*stream) << " "; - attrib->StreamOut( stream ); - } - - // If this node has children, give it a closing tag. Else - // make it an empty tag. - TiXmlNode* node; - if ( firstChild ) - { - (*stream) << ">"; - - for ( node = firstChild; node; node=node->NextSibling() ) - { - node->StreamOut( stream ); - } - (*stream) << ""; - } - else - { - (*stream) << " />"; - } -} - - -void TiXmlElement::CopyTo( TiXmlElement* target ) const -{ - // superclass: - TiXmlNode::CopyTo( target ); - - // Element class: - // Clone the attributes, then clone the children. - const TiXmlAttribute* attribute = 0; - for( attribute = attributeSet.First(); - attribute; - attribute = attribute->Next() ) - { - target->SetAttribute( attribute->Name(), attribute->Value() ); - } - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlElement::Clone() const -{ - TiXmlElement* clone = new TiXmlElement( Value() ); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - ClearError(); -} - -TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - value = documentName; - ClearError(); -} - - -#ifdef TIXML_USE_STL -TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - value = documentName; - ClearError(); -} -#endif - - -TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDocument::operator=( const TiXmlDocument& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) -{ - // See STL_STRING_BUG below. - StringToBuffer buf( value ); - - if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) - return true; - - return false; -} - - -bool TiXmlDocument::SaveFile() const -{ - // See STL_STRING_BUG below. - StringToBuffer buf( value ); - - if ( buf.buffer && SaveFile( buf.buffer ) ) - return true; - - return false; -} - -bool TiXmlDocument::LoadFile( const char* filename, TiXmlEncoding encoding ) -{ - // Delete the existing data: - Clear(); - location.Clear(); - - // There was a really terrifying little bug here. The code: - // value = filename - // in the STL case, cause the assignment method of the std::string to - // be called. What is strange, is that the std::string had the same - // address as it's c_str() method, and so bad things happen. Looks - // like a bug in the Microsoft STL implementation. - // See STL_STRING_BUG above. - // Fixed with the StringToBuffer class. - value = filename; - - FILE* file = fopen( value.c_str (), "r" ); - - if ( file ) - { - // Get the file size, so we can pre-allocate the string. HUGE speed impact. - long length = 0; - fseek( file, 0, SEEK_END ); - length = ftell( file ); - fseek( file, 0, SEEK_SET ); - - // Strange case, but good to handle up front. - if ( length == 0 ) - { - fclose( file ); - return false; - } - - // If we have a file, assume it is all one big XML file, and read it in. - // The document parser may decide the document ends sooner than the entire file, however. - TIXML_STRING data; - data.reserve( length ); - - const int BUF_SIZE = 2048; - char buf[BUF_SIZE]; - - while( fgets( buf, BUF_SIZE, file ) ) - { - data += buf; - } - fclose( file ); - - Parse( data.c_str(), 0, encoding ); - - if ( Error() ) - return false; - else - return true; - } - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; -} - -bool TiXmlDocument::SaveFile( const char * filename ) const -{ - // The old c stuff lives on... - FILE* fp = fopen( filename, "w" ); - if ( fp ) - { - Print( fp, 0 ); - fclose( fp ); - return true; - } - return false; -} - - -void TiXmlDocument::CopyTo( TiXmlDocument* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->error = error; - target->errorDesc = errorDesc.c_str (); - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlDocument::Clone() const -{ - TiXmlDocument* clone = new TiXmlDocument(); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlDocument::Print( FILE* cfile, int depth ) const -{ - const TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->Print( cfile, depth ); - fprintf( cfile, "\n" ); - } -} - -void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const -{ - const TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->StreamOut( out ); - - // Special rule for streams: stop after the root element. - // The stream in code will only read one element, so don't - // write more than one. - if ( node->ToElement() ) - break; - } -} - - -const TiXmlAttribute* TiXmlAttribute::Next() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -TiXmlAttribute* TiXmlAttribute::Next() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -const TiXmlAttribute* TiXmlAttribute::Previous() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -TiXmlAttribute* TiXmlAttribute::Previous() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const -{ - TIXML_STRING n, v; - - PutString( name, &n ); - PutString( value, &v ); - - if (value.find ('\"') == TIXML_STRING::npos) - fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); - else - fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); -} - - -void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const -{ - if (value.find( '\"' ) != TIXML_STRING::npos) - { - PutString( name, stream ); - (*stream) << "=" << "'"; - PutString( value, stream ); - (*stream) << "'"; - } - else - { - PutString( name, stream ); - (*stream) << "=" << "\""; - PutString( value, stream ); - (*stream) << "\""; - } -} - -int TiXmlAttribute::QueryIntValue( int* ival ) const -{ - if ( sscanf( value.c_str(), "%d", ival ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -int TiXmlAttribute::QueryDoubleValue( double* dval ) const -{ - if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -void TiXmlAttribute::SetIntValue( int _value ) -{ - char buf [64]; - sprintf (buf, "%d", _value); - SetValue (buf); -} - -void TiXmlAttribute::SetDoubleValue( double _value ) -{ - char buf [64]; - sprintf (buf, "%lf", _value); - SetValue (buf); -} - -const int TiXmlAttribute::IntValue() const -{ - return atoi (value.c_str ()); -} - -const double TiXmlAttribute::DoubleValue() const -{ - return atof (value.c_str ()); -} - - -TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlComment::operator=( const TiXmlComment& base ) -{ - Clear(); - base.CopyTo( this ); -} - - -void TiXmlComment::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - -void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << ""; -} - - -void TiXmlComment::CopyTo( TiXmlComment* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlComment::Clone() const -{ - TiXmlComment* clone = new TiXmlComment(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const -{ - TIXML_STRING buffer; - PutString( value, &buffer ); - fprintf( cfile, "%s", buffer.c_str() ); -} - - -void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const -{ - PutString( value, stream ); -} - - -void TiXmlText::CopyTo( TiXmlText* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlText::Clone() const -{ - TiXmlText* clone = 0; - clone = new TiXmlText( "" ); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDeclaration::TiXmlDeclaration( const char * _version, - const char * _encoding, - const char * _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} - - -#ifdef TIXML_USE_STL -TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} -#endif - - -TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const -{ - fprintf (cfile, ""); -} - -void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << ""; -} - - -void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->version = version; - target->encoding = encoding; - target->standalone = standalone; -} - - -TiXmlNode* TiXmlDeclaration::Clone() const -{ - TiXmlDeclaration* clone = new TiXmlDeclaration(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlUnknown::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << "<" << value << ">"; // Don't use entities here! It is unknown. -} - - -void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlUnknown::Clone() const -{ - TiXmlUnknown* clone = new TiXmlUnknown(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlAttributeSet::TiXmlAttributeSet() -{ - sentinel.next = &sentinel; - sentinel.prev = &sentinel; -} - - -TiXmlAttributeSet::~TiXmlAttributeSet() -{ - assert( sentinel.next == &sentinel ); - assert( sentinel.prev == &sentinel ); -} - - -void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) -{ - assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. - - addMe->next = &sentinel; - addMe->prev = sentinel.prev; - - sentinel.prev->next = addMe; - sentinel.prev = addMe; -} - -void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node == removeMe ) - { - node->prev->next = node->next; - node->next->prev = node->prev; - node->next = 0; - node->prev = 0; - return; - } - } - assert( 0 ); // we tried to remove a non-linked attribute. -} - -const TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) const -{ - const TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -#ifdef TIXML_USE_STL -TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base) -{ - TIXML_STRING tag; - tag.reserve( 8 * 1000 ); - base.StreamIn( &in, &tag ); - - base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); - return in; -} -#endif - - -TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base) -{ - base.StreamOut (& out); - return out; -} - - -#ifdef TIXML_USE_STL -std::string & operator<< (std::string& out, const TiXmlNode& base ) -{ - std::ostringstream os_stream( std::ostringstream::out ); - base.StreamOut( &os_stream ); - - out.append( os_stream.str() ); - return out; -} -#endif - - -TiXmlHandle TiXmlHandle::FirstChild() const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement() const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild(); - for ( i=0; - child && iNextSibling(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild( value ); - for ( i=0; - child && iNextSibling( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement(); - for ( i=0; - child && iNextSiblingElement(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement( value ); - for ( i=0; - child && iNextSiblingElement( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.h b/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.h deleted file mode 100644 index c6cf7076f9..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxml.h +++ /dev/null @@ -1,1424 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - - -#ifndef TINYXML_INCLUDED -#define TINYXML_INCLUDED - -#ifdef _MSC_VER -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include -#include -#include -#include -#include - -// Help out windows: -#if defined( _DEBUG ) && !defined( DEBUG ) -#define DEBUG -#endif - -#if defined( DEBUG ) && defined( _MSC_VER ) -#include -#define TIXML_LOG OutputDebugString -#else -#define TIXML_LOG printf -#endif - -#ifdef TIXML_USE_STL - #include - #include - #define TIXML_STRING std::string - #define TIXML_ISTREAM std::istream - #define TIXML_OSTREAM std::ostream - #define TIXML_CAST_STRING std::string -#else - #include "tinystr.h" - #define TIXML_STRING TiXmlString - #define TIXML_OSTREAM TiXmlOutStream - #define TIXML_CAST_STRING -#endif - -class TiXmlDocument; -class TiXmlElement; -class TiXmlComment; -class TiXmlUnknown; -class TiXmlAttribute; -class TiXmlText; -class TiXmlDeclaration; -class TiXmlParsingData; - -const int TIXML_MAJOR_VERSION = 2; -const int TIXML_MINOR_VERSION = 3; -const int TIXML_PATCH_VERSION = 3; - -/* Internal structure for tracking location of items - in the XML file. -*/ -struct TiXmlCursor -{ - TiXmlCursor() { Clear(); } - void Clear() { row = col = -1; } - - int row; // 0 based. - int col; // 0 based. -}; - - -// Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE -}; - - -// Used by the parsing routines. -enum TiXmlEncoding -{ - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY -}; - -const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; - -/** TiXmlBase is a base class for every class in TinyXml. - It does little except to establish that TinyXml classes - can be printed and provide some utility functions. - - In XML, the document and elements can contain - other elements and other types of nodes. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - A Decleration contains: Attributes (not on tree) - @endverbatim -*/ -class TiXmlBase -{ - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; - -public: - TiXmlBase() : userData(0) {} - virtual ~TiXmlBase() {} - - /** All TinyXml classes can print themselves to a filestream. - This is a formatted print, and will insert tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - values is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const { return location.row + 1; } - int Column() const { return location.col + 1; } ///< See Row() - - void SetUserData( void* user ) { userData = user; } - void* GetUserData() { return userData; } - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_OUT_OF_MEMORY, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - - TIXML_ERROR_STRING_COUNT - }; - -protected: - - // See STL_STRING_BUG - // Utility class to overcome a bug. - class StringToBuffer - { - public: - StringToBuffer( const TIXML_STRING& str ); - ~StringToBuffer(); - char* buffer; - }; - - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } - - virtual void StreamOut (TIXML_OSTREAM *) const = 0; - - #ifdef TIXML_USE_STL - static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); - static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); - #endif - - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - strncpy( _value, p, *length ); - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Puts a string to a stream, expanding entities as it goes. - // Note this should not contian the '<', '>', etc, or they will be transformed into entities! - static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); - - static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to Engilish words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - -private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; -}; - - -/** The parent class for everything in the Document Object Model. - (Except for attributes). - Nodes have siblings, a parent, and children. A node can be - in a document, or stand on its own. The type of a TiXmlNode - can be queried, and it can be cast to its more defined type. -*/ -class TiXmlNode : public TiXmlBase -{ - friend class TiXmlDocument; - friend class TiXmlElement; - -public: - #ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - - #else - // Used internally, not part of the public API. - friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); - #endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - DOCUMENT, - ELEMENT, - COMMENT, - UNKNOWN, - TEXT, - DECLARATION, - TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char * Value() const { return value.c_str (); } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) { value = _value;} - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "" ); - } - #endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() { return parent; } - const TiXmlNode* Parent() const { return parent; } - - const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild() { return firstChild; } - const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - TiXmlNode* FirstChild( const char * value ); ///< The first child of this node with the matching 'value'. Will be null if none found. - - const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild() { return lastChild; } - const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - TiXmlNode* LastChild( const char * value ); - - #ifdef TIXML_USE_STL - const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. - #endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - const TiXmlNode* IterateChildren( TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( TiXmlNode* previous ); - - /// This flavor of IterateChildren searches for children with a particular 'value' - const TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ); - - #ifdef TIXML_USE_STL - const TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - #endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling() const { return prev; } - TiXmlNode* PreviousSibling() { return prev; } - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling( const char * ) const; - TiXmlNode* PreviousSibling( const char * ); - - #ifdef TIXML_USE_STL - const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Navigate to a sibling node. - const TiXmlNode* NextSibling() const { return next; } - TiXmlNode* NextSibling() { return next; } - - /// Navigate to a sibling node with the given 'value'. - const TiXmlNode* NextSibling( const char * ) const; - TiXmlNode* NextSibling( const char * ); - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement() const; - TiXmlElement* NextSiblingElement(); - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement( const char * ) const; - TiXmlElement* NextSiblingElement( const char * ); - - #ifdef TIXML_USE_STL - const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement() const; - TiXmlElement* FirstChildElement(); - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement( const char * value ) const; - TiXmlElement* FirstChildElement( const char * value ); - - #ifdef TIXML_USE_STL - const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. - */ - virtual int Type() const { return type; } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - const TiXmlDocument* GetDocument() const; - TiXmlDocument* GetDocument(); - - /// Returns true if this node has no children. - bool NoChildren() const { return !firstChild; } - - const TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (const TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (const TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (const TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (const TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlText* ToText() const { return ( this && type == TEXT ) ? (const TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (const TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - - TiXmlDocument* ToDocument() { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlElement* ToElement() { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlComment* ToComment() { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlUnknown* ToUnknown() { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlText* ToText() { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlDeclaration* ToDeclaration() { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; - -protected: - TiXmlNode( NodeType _type ); - - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; - - #ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; - #endif - - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - - // Internal Value function returning a TIXML_STRING - const TIXML_STRING& SValue() const { return value ; } - - TiXmlNode* parent; - NodeType type; - - TiXmlNode* firstChild; - TiXmlNode* lastChild; - - TIXML_STRING value; - - TiXmlNode* prev; - TiXmlNode* next; - -private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. -}; - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not TiXmlNodes, since they are not - part of the tinyXML document object model. There are other - suggested ways to look at this problem. -*/ -class TiXmlAttribute : public TiXmlBase -{ - friend class TiXmlAttributeSet; - -public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - #endif - - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const { return name.c_str (); } ///< Return the name of this attribute. - const char* Value() const { return value.c_str (); } ///< Return the value of this attribute. - const int IntValue() const; ///< Return the value of this attribute, converted to an integer. - const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* value ) const; - - void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. - void SetValue( const char* _value ) { value = _value; } ///< Set the value. - - void SetIntValue( int value ); ///< Set the value from an integer. - void SetDoubleValue( double value ); ///< Set the value from a double. - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) - { - StringToBuffer buf( _name ); - SetName ( buf.buffer ? buf.buffer : "error" ); - } - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "error" ); - } - #endif - - /// Get the next sibling attribute in the DOM. Returns null at end. - const TiXmlAttribute* Next() const; - TiXmlAttribute* Next(); - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - const TiXmlAttribute* Previous() const; - TiXmlAttribute* Previous(); - - bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } - bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } - bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual void StreamOut( TIXML_OSTREAM * out ) const; - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) { document = doc; } - -private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; -}; - - -/* A class used to manage a group of attributes. - It is only used internally, both by the ELEMENT and the DECLARATION. - - The set can be changed transparent to the Element and Declaration - classes that use it, but NOT transparent to the Attribute - which has to implement a next() and previous() method. Which makes - it a bit problematic and prevents the use of STL. - - This version is implemented with circular lists because: - - I like circular lists - - it demonstrates some independence from the (typical) doubly linked list. -*/ -class TiXmlAttributeSet -{ -public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - - const TiXmlAttribute* Find( const char * name ) const; - TiXmlAttribute* Find( const char * name ); - -private: - //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), - //*ME: this class must be also use a hidden/disabled copy-constructor !!! - TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed - void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) - - TiXmlAttribute sentinel; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class TiXmlElement : public TiXmlNode -{ -public: - /// Construct an element. - TiXmlElement (const char * in_value); - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); - #endif - - TiXmlElement( const TiXmlElement& ); - - void operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - int QueryIntAttribute( const char* name, int* value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* value ) const; - /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, float* value ) const { - double d; - int result = QueryDoubleAttribute( name, &d ); - *value = (float)d; - return result; - } - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * value ); - - #ifdef TIXML_USE_STL - const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); } - const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); } - const char* Attribute( const std::string& name, double* d ) const { return Attribute( name.c_str(), d ); } - int QueryIntAttribute( const std::string& name, int* value ) const { return QueryIntAttribute( name.c_str(), value ); } - int QueryDoubleAttribute( const std::string& name, double* value ) const { return QueryDoubleAttribute( name.c_str(), value ); } - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ) - { - StringToBuffer n( name ); - StringToBuffer v( _value ); - if ( n.buffer && v.buffer ) - SetAttribute (n.buffer, v.buffer ); - } - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ) - { - StringToBuffer n( name ); - if ( n.buffer ) - SetAttribute (n.buffer, _value); - } - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); - #ifdef TIXML_USE_STL - void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. - #endif - - const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. - TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } - const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. - TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well - - // Used to be public [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut( TIXML_OSTREAM * out ) const; - - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -private: - - TiXmlAttributeSet attributeSet; -}; - - -/** An XML comment. -*/ -class TiXmlComment : public TiXmlNode -{ -public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} - TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); - - virtual ~TiXmlComment() {} - - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - /// Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** XML text. Contained in an element. -*/ -class TiXmlText : public TiXmlNode -{ - friend class TiXmlElement; -public: - /// Constructor. - TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - virtual ~TiXmlText() {} - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - #endif - - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } - void operator=( const TiXmlText& base ) { base.CopyTo( this ); } - - /// Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - bool Blank() const; // returns true if all white space and new lines - // [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - -private: -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXml will happily read or write files without a declaration, - however. There are 3 possible attributes to the declaration: - version, encoding, and standalone. - - Note: In this version of the code, the attributes are - handled as special cases, not generic attributes, simply - because there can only be at most 3 and they are always the same. -*/ -class TiXmlDeclaration : public TiXmlNode -{ -public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); -#endif - - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() {} - - /// Version. Will return an empty string if none was found. - const char *Version() const { return version.c_str (); } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const { return encoding.c_str (); } - /// Is this a standalone document? - const char *Standalone() const { return standalone.c_str (); } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - /// Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut ( TIXML_OSTREAM * out) const; - -private: - - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; -}; - - -/** Any tag that tinyXml doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into TiXmlUnknowns. -*/ -class TiXmlUnknown : public TiXmlNode -{ -public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} - virtual ~TiXmlUnknown() {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } - void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - /// Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlUnknown* target ) const; - - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** Always the top level node. A document binds together all the - XML pieces. It can be saved, loaded, and printed to the screen. - The 'value' of a document node is the xml file name. -*/ -class TiXmlDocument : public TiXmlNode -{ -public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); - #endif - - TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - - #ifdef TIXML_USE_STL - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && LoadFile( f.buffer, encoding )); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && SaveFile( f.buffer )); - } - #endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - const TiXmlElement* RootElement() const { return FirstChildElement(); } - TiXmlElement* RootElement() { return FirstChildElement(); } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const { return error; } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const { return errorDesc.c_str (); } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - const int ErrorId() const { return errorId; } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() { return errorLocation.row+1; } - int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() - - /** By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) { tabsize = _tabsize; } - - int TabSize() const { return tabsize; } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Dump the document to standard out. */ - void Print() const { Print( stdout, 0 ); } - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -protected : - virtual void StreamOut ( TIXML_OSTREAM * out) const; - // [internal use] - virtual TiXmlNode* Clone() const; - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - -private: - void CopyTo( TiXmlDocument* target ) const; - - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; -}; - - -/** - A TiXmlHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - TiXmlElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - TiXmlHandle docHandle( &document ); - TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - TiXmlHandle handleCopy = handle; - @endverbatim - - What they should not be used for is iteration: - - @verbatim - int i=0; - while ( true ) - { - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element(); - if ( !child ) - break; - // do something - ++i; - } - @endverbatim - - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs - to. Instead, prefer: - - @verbatim - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); - - for( child; child; child=child->NextSiblingElement() ) - { - // do something - } - @endverbatim -*/ -class TiXmlHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* node ) { this->node = node; } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - - #ifdef TIXML_USE_STL - TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } - TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } - - TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } - TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } - #endif - - /// Return the handle as a TiXmlNode. This may return null. - TiXmlNode* Node() const { return node; } - /// Return the handle as a TiXmlElement. This may return null. - TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } - /// Return the handle as a TiXmlText. This may return null. - TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } - /// Return the handle as a TiXmlUnknown. This may return null; - TiXmlUnknown* Unknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - -private: - TiXmlNode* node; -}; - - -#endif - diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlerror.cpp b/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlerror.cpp deleted file mode 100644 index b04add7f97..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlerror.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - -// The goal of the seperate error file is to make the first -// step towards localization. tinyxml (currently) only supports -// latin-1, but at least the error messages could now be translated. -// -// It also cleans up the code a bit. -// - -const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = -{ - "No error", - "Error", - "Failed to open file", - "Memory allocation failed.", - "Error parsing Element.", - "Failed to read Element name", - "Error reading Element value.", - "Error reading Attributes.", - "Error: empty tag.", - "Error reading end tag.", - "Error parsing Unknown.", - "Error parsing Comment.", - "Error parsing Declaration.", - "Error document empty.", - "Error null (0) or unexpected EOF found in input stream.", -}; diff --git a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlparser.cpp b/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlparser.cpp deleted file mode 100644 index 9cda6912e0..0000000000 --- a/vendor/cegui-0.4.0-custom/src/tinyxml/tinyxmlparser.cpp +++ /dev/null @@ -1,1516 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" -#include - -//#define DEBUG_PARSER - -// Note tha "PutString" hardcodes the same list. This -// is less flexible than it appears. Changing the entries -// or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = -{ - { "&", 5, '&' }, - { "<", 4, '<' }, - { ">", 4, '>' }, - { """, 6, '\"' }, - { "'", 6, '\'' } -}; - -// Bunch of unicode info at: -// http://www.unicode.org/faq/utf_bom.html -// Including the basic of this table, which determines the #bytes in the -// sequence from the lead byte. 1 placed for invalid sequences -- -// although the result will be junk, pass it through as much as possible. -// Beware of the non-characters in UTF-8: -// ef bb bf (Microsoft "lead bytes") -// ef bf be -// ef bf bf - -const char TIXML_UTF_LEAD_0 = (const char)0xef; -const char TIXML_UTF_LEAD_1 = (const char)0xbb; -const char TIXML_UTF_LEAD_2 = (const char)0xbf; - -const int TiXmlBase::utf8ByteTable[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte - 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid -}; - - -void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) -{ - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - if (input < 0x80) - *length = 1; - else if ( input < 0x800 ) - *length = 2; - else if ( input < 0x10000 ) - *length = 3; - else if ( input < 0x200000 ) - *length = 4; - else - { *length = 0; return; } // This code won't covert this correctly anyway. - - output += *length; - - // Scary scary fall throughs. - switch (*length) - { - case 4: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 3: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 2: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 1: - --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); - } -} - - -/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalpha( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalpha( anyByte ); -// } -} - - -/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalnum( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalnum( anyByte ); -// } -} - - -class TiXmlParsingData -{ - friend class TiXmlDocument; - public: - void Stamp( const char* now, TiXmlEncoding encoding ); - - const TiXmlCursor& Cursor() { return cursor; } - - private: - // Only used by the document! - TiXmlParsingData( const char* start, int _tabsize, int row, int col ) - { - assert( start ); - stamp = start; - tabsize = _tabsize; - cursor.row = row; - cursor.col = col; - } - - TiXmlCursor cursor; - const char* stamp; - int tabsize; -}; - - -void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) -{ - assert( now ); - - // Do nothing if the tabsize is 0. - if ( tabsize < 1 ) - { - return; - } - - // Get the current row, column. - int row = cursor.row; - int col = cursor.col; - const char* p = stamp; - assert( p ); - - while ( p < now ) - { - // Code contributed by Fletcher Dunn: (modified by lee) - switch (*p) { - case 0: - // We *should* never get here, but in case we do, don't - // advance past the terminating null character, ever - return; - - case '\r': - // bump down to the next line - ++row; - col = 0; - // Eat the character - ++p; - - // Check for \r\n sequence, and treat this as a single character - if (*p == '\n') { - ++p; - } - break; - - case '\n': - // bump down to the next line - ++row; - col = 0; - - // Eat the character - ++p; - - // Check for \n\r sequence, and treat this as a single - // character. (Yes, this bizarre thing does occur still - // on some arcane platforms...) - if (*p == '\r') { - ++p; - } - break; - - case '\t': - // Eat the character - ++p; - - // Skip to next tab stop - col = (col / tabsize + 1) * tabsize; - break; - - case TIXML_UTF_LEAD_0: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( *(p+1) && *(p+2) ) - { - // In these cases, don't advance the column. These are - // 0-width spaces. - if ( *(p+1)==TIXML_UTF_LEAD_1 && *(p+2)==TIXML_UTF_LEAD_2 ) - p += 3; - else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbe) ) - p += 3; - else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbf) ) - p += 3; - else - { p +=3; ++col; } // A normal character. - } - } - else - { - ++p; - ++col; - } - break; - - default: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // Eat the 1 to 4 byte utf8 character. - int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)]; - if ( step == 0 ) - step = 1; // Error case from bad encoding, but handle gracefully. - p += step; - - // Just advance one column, of course. - ++col; - } - else - { - ++p; - ++col; - } - break; - } - } - cursor.row = row; - cursor.col = col; - assert( cursor.row >= -1 ); - assert( cursor.col >= -1 ); - stamp = p; - assert( stamp ); -} - - -const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) -{ - if ( !p || !*p ) - { - return 0; - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - while ( *p ) - { - // Skip the stupid Microsoft UTF-8 Byte order marks - if ( *(p+0)==TIXML_UTF_LEAD_0 - && *(p+1)==TIXML_UTF_LEAD_1 - && *(p+2)==TIXML_UTF_LEAD_2 ) - { - p += 3; - continue; - } - else if(*(p+0)==TIXML_UTF_LEAD_0 - && *(p+1)==(const char) 0xbf - && *(p+2)==(const char) 0xbe ) - { - p += 3; - continue; - } - else if(*(p+0)==TIXML_UTF_LEAD_0 - && *(p+1)==(const char) 0xbf - && *(p+2)==(const char) 0xbf ) - { - p += 3; - continue; - } - - if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. - ++p; - else - break; - } - } - else - { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) - ++p; - } - - return p; -} - -#ifdef TIXML_USE_STL -/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - for( ;; ) - { - if ( !in->good() ) return false; - - int c = in->peek(); - // At this scope, we can't get to a document. So fail silently. - if ( !IsWhiteSpace( c ) || c <= 0 ) - return true; - - *tag += (char) in->get(); - } -} - -/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ) -{ - //assert( character > 0 && character < 128 ); // else it won't work in utf-8 - while ( in->good() ) - { - int c = in->peek(); - if ( c == character ) - return true; - if ( c <= 0 ) // Silent failure: can't get document at this scope - return false; - - in->get(); - *tag += (char) c; - } - return false; -} -#endif - -const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) -{ - *name = ""; - assert( p ); - - // Names start with letters or underscores. - // Of course, in unicode, tinyxml has no idea what a letter *is*. The - // algorithm is generous. - // - // After that, they can be letters, underscores, numbers, - // hyphens, or colons. (Colons are valid ony for namespaces, - // but tinyxml can't tell namespaces from names.) - if ( p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) - { - while( p && *p - && ( IsAlphaNum( (unsigned char ) *p, encoding ) - || *p == '_' - || *p == '-' - || *p == '.' - || *p == ':' ) ) - { - (*name) += *p; - ++p; - } - return p; - } - return 0; -} - -const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) -{ - // Presume an entity, and pull it out. - TIXML_STRING ent; - int i; - *length = 0; - - if ( *(p+1) && *(p+1) == '#' && *(p+2) ) - { - unsigned long ucs = 0; - //*ME: warning C4244: convert '__w64 int' to 'unsigned' - //*ME: Use size_t instead of unsigned (pointer-arithmetic) - size_t delta = 0; - unsigned mult = 1; - - if ( *(p+2) == 'x' ) - { - // Hexadecimal. - if ( !*(p+3) ) return 0; - - const char* q = p+3; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != 'x' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else if ( *q >= 'a' && *q <= 'f' ) - ucs += mult * (*q - 'a' + 10); - else if ( *q >= 'A' && *q <= 'F' ) - ucs += mult * (*q - 'A' + 10 ); - else - return 0; - mult *= 16; - --q; - } - } - else - { - // Decimal. - if ( !*(p+2) ) return 0; - - const char* q = p+2; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != '#' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else - return 0; - mult *= 10; - --q; - } - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - } - else - { - *value = (char)ucs; - *length = 1; - } - return p + delta + 1; - } - - // Now try to match it. - for( i=0; iappend( cArr, len ); - } - } - else - { - bool whitespace = false; - - // Remove leading white space: - p = SkipWhiteSpace( p, encoding ); - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) ) - { - if ( *p == '\r' || *p == '\n' ) - { - whitespace = true; - ++p; - } - else if ( IsWhiteSpace( *p ) ) - { - whitespace = true; - ++p; - } - else - { - // If we've found whitespace, add it before the - // new character. Any whitespace just becomes a space. - if ( whitespace ) - { - (*text) += ' '; - whitespace = false; - } - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - if ( len == 1 ) - (*text) += cArr[0]; // more efficient - else - text->append( cArr, len ); - } - } - } - if ( p ) - p += strlen( endTag ); - return p; -} - -#ifdef TIXML_USE_STL - -void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - // The basic issue with a document is that we don't know what we're - // streaming. Read something presumed to be a tag (and hope), then - // identify it, and call the appropriate stream method on the tag. - // - // This "pre-streaming" will never read the closing ">" so the - // sub-tag can orient itself. - - if ( !StreamTo( in, '<', tag ) ) - { - SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - while ( in->good() ) - { - int tagIndex = (int) tag->length(); - while ( in->good() && in->peek() != '>' ) - { - int c = in->get(); - if ( c <= 0 ) - { - SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - break; - } - (*tag) += (char) c; - } - - if ( in->good() ) - { - // We now have something we presume to be a node of - // some sort. Identify it, and call the node to - // continue streaming. - TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); - - if ( node ) - { - node->StreamIn( in, tag ); - bool isElement = node->ToElement() != 0; - delete node; - node = 0; - - // If this is the root element, we're done. Parsing will be - // done by the >> operator. - if ( isElement ) - { - return; - } - } - else - { - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - } - } - // We should have returned sooner. - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); -} - -#endif - -const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) -{ - ClearError(); - - // Parse away, at the document level. Since a document - // contains nothing but other tags, most of what happens - // here is skipping white space. - if ( !p || !*p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - // Note that, for a document, this needs to come - // before the while space skip, so that parsing - // starts from the pointer we are given. - location.Clear(); - if ( prevData ) - { - location.row = prevData->cursor.row; - location.col = prevData->cursor.col; - } - else - { - location.row = 0; - location.col = 0; - } - TiXmlParsingData data( p, TabSize(), location.row, location.col ); - location = data.Cursor(); - - if ( encoding == TIXML_ENCODING_UNKNOWN ) - { - // Check for the Microsoft UTF-8 lead bytes. - if ( *(p+0) && *(p+0) == TIXML_UTF_LEAD_0 - && *(p+1) && *(p+1) == TIXML_UTF_LEAD_1 - && *(p+2) && *(p+2) == TIXML_UTF_LEAD_2 ) - { - encoding = TIXML_ENCODING_UTF8; - } - } - - p = SkipWhiteSpace( p, encoding ); - if ( !p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - while ( p && *p ) - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, &data, encoding ); - LinkEndChild( node ); - } - else - { - break; - } - - // Did we get encoding info? - if ( encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) - { - TiXmlDeclaration* dec = node->ToDeclaration(); - const char* enc = dec->Encoding(); - assert( enc ); - - if ( *enc == 0 ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice - else - encoding = TIXML_ENCODING_LEGACY; - } - - p = SkipWhiteSpace( p, encoding ); - } - - // Was this empty? - if ( !firstChild ) { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); - return 0; - } - - // All is well. - return p; -} - -void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - // The first error in a chain is more accurate - don't set again! - if ( error ) - return; - - assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); - error = true; - errorId = err; - errorDesc = errorString[ errorId ]; - - errorLocation.Clear(); - if ( pError && data ) - { - //TiXmlParsingData data( pError, prevData ); - data->Stamp( pError, encoding ); - errorLocation = data->Cursor(); - } -} - - -TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) -{ - TiXmlNode* returnNode = 0; - - p = SkipWhiteSpace( p, encoding ); - if( !p || !*p || *p != '<' ) - { - return 0; - } - - TiXmlDocument* doc = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - if ( !p || !*p ) - { - return 0; - } - - // What is this thing? - // - Elements start with a letter or underscore, but xml is reserved. - // - Comments: "; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - p = ReadText( p, &value, false, endTag, false, encoding ); - return p; -} - - -const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) return 0; - - int tabsize = 4; - if ( document ) - tabsize = document->TabSize(); - -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - // Read the name, the '=' and the value. - const char* pErr = p; - p = ReadName( p, &name, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p || *p != '=' ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - ++p; // skip '=' - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - const char* end; - - if ( *p == '\'' ) - { - ++p; - end = "\'"; - p = ReadText( p, &value, false, end, false, encoding ); - } - else if ( *p == '"' ) - { - ++p; - end = "\""; - p = ReadText( p, &value, false, end, false, encoding ); - } - else - { - // All attribute values should be in single or double quotes. - // But this is such a common error that the parser will try - // its best, even without them. - value = ""; - while ( p && *p // existence - && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace - && *p != '/' && *p != '>' ) // tag end - { - if ( *p == '\'' || *p == '\"' ) { - // [ 1451649 ] Attribute values with trailing quotes not handled correctly - // We did not have an opening quote but seem to have a - // closing one. Give up and throw an error. - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - value += *p; - ++p; - } - } - return p; -} - -#ifdef TIXML_USE_STL -void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->peek(); - if ( c == '<' ) - return; - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - in->get(); - } -} -#endif - -const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - value = ""; -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - bool ignoreWhite = true; - - const char* end = "<"; - p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) - return p-1; // don't truncate the '<' - return 0; -} - -#ifdef TIXML_USE_STL -void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->get(); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } -} -#endif - -const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) -{ - p = SkipWhiteSpace( p, _encoding ); - // Find the beginning, find the end, and look for - // the stuff in-between. - TiXmlDocument* document = GetDocument(); - if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); - return 0; - } -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, _encoding ); - location = data->Cursor(); - } - p += 5; - - version = ""; - encoding = ""; - standalone = ""; - - while ( p && *p ) - { - if ( *p == '>' ) - { - ++p; - return p; - } - - p = SkipWhiteSpace( p, _encoding ); - if ( StringEqual( p, "version", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - version = attrib.Value(); - } - else if ( StringEqual( p, "encoding", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - encoding = attrib.Value(); - } - else if ( StringEqual( p, "standalone", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - standalone = attrib.Value(); - } - else - { - // Read over whatever it is. - while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) - ++p; - } - } - return 0; -} - -bool TiXmlText::Blank() const -{ - for ( unsigned i=0; i

    -Return to the PCRE index page. -

    tu2L0S!gc*)! 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%0DJ=zk=J%byiC=yfwcCnSOA31lq@3 zM4~4ly+Q}7hj5$)Wp^~H>x`b!6PnRqipw+8+T2qebLk+sY zVSo(ai3_azNjIwlddv|}cH*a`N1&sN$#7aYXm<94QO5+Gf%!WGXe{?OdmU=fIx2V#?-SbhSUcVgj+E=xk5o$$ zW1pF36hqh?0Nu5RaNa#EO;{k1ZK9mQdG~O|86cUJnpLZ^cw%^G)JJt@QWiu>A9$ud zZeovpmLiQG3Q@(VdvBk#ai2C^A!Qut-NZs>m7Kc_2pM;uohGie!z{FDR=^9Tj*$HO zB@6DX&4fyYpOfaM#x8jO+YO7p&B~9j^%)l5dEO<<=n;ya`mcpAr=>W7&vW8K11m4Kq(t=jZbVCdh@{)htqIZ4 zaR6CM{b1Y?;~1)VE9*#bU$R!_t?+%w+82z)iRWN-pCCU?b#-+O0af+2)t&X~rKQ?B zxoiBaxHhLUcbf{hADM8^udR^1ilEBFW(ZAWx|(QWsRlL&l#abpGPHJxZw3D%iJz^^h8wk6n!9RzAtfPVnZ{XS5Jy{eY8Q;ubl7hHrpgw z(GFd2_V$Bple~D7(n*`%$)5Cx6r25+3@ro=E!ljbx=No!`q&IB6(fr1KPZjmBt}k z@Wtv=X@tTw-}SYJR$L)88& zV_P+g1D*Y%M{yPFc80b2Ag?I;9^5GhB}c*J;Jo X?QONf1L_*z$ey)i5MvwKZ1n#JD+OD; diff --git a/vendor/cegui-0.4.0-custom/dependencies/lib/xerces-c_2D.lib b/vendor/cegui-0.4.0-custom/dependencies/lib/xerces-c_2D.lib deleted file mode 100644 index 6aed11926dd84f6bfbc080d985606d0944fe1f6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033238 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%0A~hdg3gb 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