diff --git a/examples/Demo/Builds/Android/app/CMakeLists.txt b/examples/Demo/Builds/Android/app/CMakeLists.txt
index 013b3f0fe5..d7d0abf025 100644
--- a/examples/Demo/Builds/Android/app/CMakeLists.txt
+++ b/examples/Demo/Builds/Android/app/CMakeLists.txt
@@ -51,6 +51,7 @@ add_library( ${BINARY_NAME}
"../../../Source/Demos/FlexBoxDemo.cpp"
"../../../Source/Demos/FontsDemo.cpp"
"../../../Source/Demos/GraphicsDemo.cpp"
+ "../../../Source/Demos/GridDemo.cpp"
"../../../Source/Demos/ImagesDemo.cpp"
"../../../Source/Demos/JavaScript.cpp"
"../../../Source/Demos/KeyMappingsDemo.cpp"
@@ -1099,6 +1100,11 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp"
"../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h"
"../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_Grid.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_GridItem.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_GridUnitTests.cpp"
"../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp"
"../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h"
"../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"
@@ -2410,6 +2416,11 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_
set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridUnitTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/examples/Demo/Builds/LinuxMakefile/Makefile b/examples/Demo/Builds/LinuxMakefile/Makefile
index 10241f2bb9..7f2a782475 100644
--- a/examples/Demo/Builds/LinuxMakefile/Makefile
+++ b/examples/Demo/Builds/LinuxMakefile/Makefile
@@ -85,6 +85,7 @@ OBJECTS_APP := \
$(JUCE_OBJDIR)/FlexBoxDemo_e4f3d9b7.o \
$(JUCE_OBJDIR)/FontsDemo_6da1e5e9.o \
$(JUCE_OBJDIR)/GraphicsDemo_85142ef6.o \
+ $(JUCE_OBJDIR)/GridDemo_63e53631.o \
$(JUCE_OBJDIR)/ImagesDemo_ecf13aa3.o \
$(JUCE_OBJDIR)/JavaScript_d6e42eb5.o \
$(JUCE_OBJDIR)/KeyMappingsDemo_cf05c709.o \
@@ -230,6 +231,11 @@ $(JUCE_OBJDIR)/GraphicsDemo_85142ef6.o: ../../Source/Demos/GraphicsDemo.cpp
@echo "Compiling GraphicsDemo.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+$(JUCE_OBJDIR)/GridDemo_63e53631.o: ../../Source/Demos/GridDemo.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling GridDemo.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
$(JUCE_OBJDIR)/ImagesDemo_ecf13aa3.o: ../../Source/Demos/ImagesDemo.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
@echo "Compiling ImagesDemo.cpp"
diff --git a/examples/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj b/examples/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj
index c1aac64631..75bca5e570 100644
--- a/examples/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj
+++ b/examples/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj
@@ -42,6 +42,7 @@
2BFF2E7E13527E2E764617AA = {isa = PBXBuildFile; fileRef = 7AEEF2EE40D3B8AE687C6618; };
E4A67DD76D4D063F547F0844 = {isa = PBXBuildFile; fileRef = 4DB00B418C4F068BC5FC7314; };
257CBA785DEDAF53F4E9BF60 = {isa = PBXBuildFile; fileRef = 4D569839066D92C393F58EB4; };
+ EC00D5BAB8AF26746D6AC956 = {isa = PBXBuildFile; fileRef = 3EBB84376D0639930D3ECA78; };
9C30D9613D76EEFDB1653F34 = {isa = PBXBuildFile; fileRef = 7DBF83B26277D13CB3FC1479; };
B810E94ECBCA231F60EBEA5F = {isa = PBXBuildFile; fileRef = CCEC8F9385AE939B24D27954; };
15B2A7314D1E347D65EC664D = {isa = PBXBuildFile; fileRef = F1E995A1E00C6545A4C3297B; };
@@ -105,6 +106,7 @@
3375D74953976C15513FA6AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
3482A5FDDEE5E5D405047999 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WidgetsDemo.cpp; path = ../../Source/Demos/WidgetsDemo.cpp; sourceTree = "SOURCE_ROOT"; };
39A06D3252DDA6F97FB09495 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLDemo2D.cpp; path = ../../Source/Demos/OpenGLDemo2D.cpp; sourceTree = "SOURCE_ROOT"; };
+ 3EBB84376D0639930D3ECA78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GridDemo.cpp; path = ../../Source/Demos/GridDemo.cpp; sourceTree = "SOURCE_ROOT"; };
4621682C1A4E85A088F7CEE0 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
49412C044B88516D9AF59FDD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CryptographyDemo.cpp; path = ../../Source/Demos/CryptographyDemo.cpp; sourceTree = "SOURCE_ROOT"; };
4975DB849F14413317E94609 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
@@ -205,6 +207,7 @@
7AEEF2EE40D3B8AE687C6618,
4DB00B418C4F068BC5FC7314,
4D569839066D92C393F58EB4,
+ 3EBB84376D0639930D3ECA78,
7DBF83B26277D13CB3FC1479,
CCEC8F9385AE939B24D27954,
F1E995A1E00C6545A4C3297B,
@@ -484,6 +487,7 @@
2BFF2E7E13527E2E764617AA,
E4A67DD76D4D063F547F0844,
257CBA785DEDAF53F4E9BF60,
+ EC00D5BAB8AF26746D6AC956,
9C30D9613D76EEFDB1653F34,
B810E94ECBCA231F60EBEA5F,
15B2A7314D1E347D65EC664D,
diff --git a/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj b/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj
index 1feb228a4c..c88e96845f 100644
--- a/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj
+++ b/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj
@@ -167,6 +167,7 @@
+
@@ -1578,6 +1579,15 @@
true
+
+ true
+
+
+ true
+
+
+ true
+
true
@@ -2463,6 +2473,8 @@
+
+
diff --git a/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj.filters b/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj.filters
index 77633e7dc5..89b35da17b 100644
--- a/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj.filters
+++ b/examples/Demo/Builds/VisualStudio2013/JuceDemo_App.vcxproj.filters
@@ -466,6 +466,9 @@
JuceDemo\Source\Demos
+
+ JuceDemo\Source\Demos
+
JuceDemo\Source\Demos
@@ -1993,6 +1996,15 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -4011,6 +4023,12 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj b/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj
index 140ea55ff2..c2318f8c05 100644
--- a/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj
+++ b/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj
@@ -166,6 +166,7 @@
+
@@ -1577,6 +1578,15 @@
true
+
+ true
+
+
+ true
+
+
+ true
+
true
@@ -2462,6 +2472,8 @@
+
+
diff --git a/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj.filters b/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj.filters
index f199e23038..2c87722083 100644
--- a/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj.filters
+++ b/examples/Demo/Builds/VisualStudio2015/JuceDemo_App.vcxproj.filters
@@ -466,6 +466,9 @@
JuceDemo\Source\Demos
+
+ JuceDemo\Source\Demos
+
JuceDemo\Source\Demos
@@ -1993,6 +1996,15 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -4011,6 +4023,12 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj b/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj
index 231b42bdf1..4477633aab 100644
--- a/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj
+++ b/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj
@@ -166,6 +166,7 @@
+
@@ -1577,6 +1578,15 @@
true
+
+ true
+
+
+ true
+
+
+ true
+
true
@@ -2462,6 +2472,8 @@
+
+
diff --git a/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj.filters b/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj.filters
index b97f6d12df..6c11e67fa3 100644
--- a/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj.filters
+++ b/examples/Demo/Builds/VisualStudio2017/JuceDemo_App.vcxproj.filters
@@ -466,6 +466,9 @@
JuceDemo\Source\Demos
+
+ JuceDemo\Source\Demos
+
JuceDemo\Source\Demos
@@ -1993,6 +1996,15 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -4011,6 +4023,12 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/examples/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj b/examples/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj
index c45d9f2db3..4a89ecd1f1 100644
--- a/examples/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj
+++ b/examples/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj
@@ -43,6 +43,7 @@
2BFF2E7E13527E2E764617AA = {isa = PBXBuildFile; fileRef = 7AEEF2EE40D3B8AE687C6618; };
E4A67DD76D4D063F547F0844 = {isa = PBXBuildFile; fileRef = 4DB00B418C4F068BC5FC7314; };
257CBA785DEDAF53F4E9BF60 = {isa = PBXBuildFile; fileRef = 4D569839066D92C393F58EB4; };
+ EC00D5BAB8AF26746D6AC956 = {isa = PBXBuildFile; fileRef = 3EBB84376D0639930D3ECA78; };
9C30D9613D76EEFDB1653F34 = {isa = PBXBuildFile; fileRef = 7DBF83B26277D13CB3FC1479; };
B810E94ECBCA231F60EBEA5F = {isa = PBXBuildFile; fileRef = CCEC8F9385AE939B24D27954; };
15B2A7314D1E347D65EC664D = {isa = PBXBuildFile; fileRef = F1E995A1E00C6545A4C3297B; };
@@ -106,6 +107,7 @@
3482A5FDDEE5E5D405047999 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WidgetsDemo.cpp; path = ../../Source/Demos/WidgetsDemo.cpp; sourceTree = "SOURCE_ROOT"; };
37CB4A819F38E7AF9C77A8CB = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
39A06D3252DDA6F97FB09495 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLDemo2D.cpp; path = ../../Source/Demos/OpenGLDemo2D.cpp; sourceTree = "SOURCE_ROOT"; };
+ 3EBB84376D0639930D3ECA78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GridDemo.cpp; path = ../../Source/Demos/GridDemo.cpp; sourceTree = "SOURCE_ROOT"; };
49412C044B88516D9AF59FDD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CryptographyDemo.cpp; path = ../../Source/Demos/CryptographyDemo.cpp; sourceTree = "SOURCE_ROOT"; };
4975DB849F14413317E94609 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
4C1FFE22514EB2A178750B86 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
@@ -207,6 +209,7 @@
7AEEF2EE40D3B8AE687C6618,
4DB00B418C4F068BC5FC7314,
4D569839066D92C393F58EB4,
+ 3EBB84376D0639930D3ECA78,
7DBF83B26277D13CB3FC1479,
CCEC8F9385AE939B24D27954,
F1E995A1E00C6545A4C3297B,
@@ -493,6 +496,7 @@
2BFF2E7E13527E2E764617AA,
E4A67DD76D4D063F547F0844,
257CBA785DEDAF53F4E9BF60,
+ EC00D5BAB8AF26746D6AC956,
9C30D9613D76EEFDB1653F34,
B810E94ECBCA231F60EBEA5F,
15B2A7314D1E347D65EC664D,
diff --git a/examples/Demo/JuceDemo.jucer b/examples/Demo/JuceDemo.jucer
index 185e055718..378cf064e0 100644
--- a/examples/Demo/JuceDemo.jucer
+++ b/examples/Demo/JuceDemo.jucer
@@ -235,6 +235,7 @@
+
items;
+};
+
+// This static object will register this demo type in a global list of demos..
+static JuceDemoType demo ("10 Components: GridDemo");
diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp
index b710d391a2..16b3341fd6 100644
--- a/modules/juce_gui_basics/juce_gui_basics.cpp
+++ b/modules/juce_gui_basics/juce_gui_basics.cpp
@@ -128,6 +128,9 @@
#undef KeyPress
#endif
+#include