From ffae328222bcea811109d3cdfaa158c40963fef4 Mon Sep 17 00:00:00 2001
From: Yogi <yapatel@gatech.edu>
Date: Sat, 11 Jul 2015 12:43:36 -0400
Subject: [PATCH] minor cleanup; testing moduels now

---
 Builds/Linux/Makefile                         |  138 +
 .../open-ephys.xcodeproj/project.pbxproj      |  292 ++
 Builds/VisualStudio2012/open-ephys.vcxproj    |   92 +-
 Builds/VisualStudio2013/open-ephys.vcxproj    |   92 +-
 Source/AccessClass.cpp                        |    2 +-
 Source/Processors/Editors/ChannelSelector.h   |    0
 .../Editors/NetworkEventsEditor.cpp           |  272 +-
 .../Processors/Editors/NetworkEventsEditor.h  |  128 +-
 .../PSTH/PeriStimulusTimeHistogramEditor.cpp  | 2782 ++++++++---------
 .../PluginManager/PluginManager.cpp           |  404 +--
 .../Processors/PluginManager/PluginManager.h  |  152 +-
 open-ephys.jucer                              |  292 +-
 12 files changed, 2492 insertions(+), 2154 deletions(-)
 mode change 100755 => 100644 Source/Processors/Editors/ChannelSelector.h

diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile
index 3506a5e54..b0bb69993 100644
--- a/Builds/Linux/Makefile
+++ b/Builds/Linux/Makefile
@@ -61,6 +61,8 @@ OBJECTS := \
   $(OBJDIR)/AudioNode_3db3557c.o \
   $(OBJDIR)/CAR_9a7e50f4.o \
   $(OBJDIR)/Channel_5cb2d4d2.o \
+  $(OBJDIR)/ChannelMappingEditor_9b145f15.o \
+  $(OBJDIR)/ChannelMappingNode_ec0559ea.o \
   $(OBJDIR)/EcubeEditor_ba242592.o \
   $(OBJDIR)/RHD2000Editor_dbd5a24.o \
   $(OBJDIR)/EcubeThread_d0477baf.o \
@@ -103,21 +105,34 @@ OBJECTS := \
   $(OBJDIR)/FilterEditor_93e366f5.o \
   $(OBJDIR)/FilterNode_d2b4d9ca.o \
   $(OBJDIR)/GenericProcessor_3e79932a.o \
+  $(OBJDIR)/LfpDisplayCanvas_9bbf9660.o \
+  $(OBJDIR)/LfpDisplayEditor_e7c32ff5.o \
+  $(OBJDIR)/LfpDisplayNode_fdf2e2ca.o \
   $(OBJDIR)/Merger_53fb4e4a.o \
   $(OBJDIR)/MergerEditor_e36b0997.o \
   $(OBJDIR)/MessageCenter_bd1ba084.o \
   $(OBJDIR)/MessageCenterEditor_afaf4851.o \
   $(OBJDIR)/ParameterEditor_112258eb.o \
   $(OBJDIR)/Parameter_b3e5ac9e.o \
+  $(OBJDIR)/PhaseDetector_8a25ed0e.o \
+  $(OBJDIR)/PhaseDetectorEditor_eaec855b.o \
   $(OBJDIR)/ProcessorGraph_8c3a250a.o \
   $(OBJDIR)/PulsePalOutput_f41ce62a.o \
   $(OBJDIR)/PulsePalOutputEditor_3d333977.o \
+  $(OBJDIR)/RecordControl_ecb8ada4.o \
+  $(OBJDIR)/RecordControlEditor_4355fd71.o \
   $(OBJDIR)/EngineConfigWindow_4fd44ceb.o \
   $(OBJDIR)/HDF5FileFormat_be712135.o \
   $(OBJDIR)/HDF5Recording_d14f7b19.o \
   $(OBJDIR)/OriginalRecording_d6dc3293.o \
   $(OBJDIR)/RecordEngine_97ef83aa.o \
   $(OBJDIR)/RecordNode_cc21a82a.o \
+  $(OBJDIR)/NetworkEventsEditor_fd22826.o \
+  $(OBJDIR)/NetworkEvents_5344c99a.o \
+  $(OBJDIR)/PeriStimulusTimeHistogramEditor_6be5bf55.o \
+  $(OBJDIR)/PeriStimulusTimeHistogramNode_9631ca2a.o \
+  $(OBJDIR)/tictoc_cdca1ed.o \
+  $(OBJDIR)/TrialCircularBuffer_4a4cef0c.o \
   $(OBJDIR)/ResamplingNode_9825590a.o \
   $(OBJDIR)/ResamplingNodeEditor_8b120457.o \
   $(OBJDIR)/PulsePal_14932a18.o \
@@ -125,11 +140,19 @@ OBJECTS := \
   $(OBJDIR)/ofSerial_c3b0a9e1.o \
   $(OBJDIR)/SerialInput_f5b197b8.o \
   $(OBJDIR)/SerialInputEditor_46740885.o \
+  $(OBJDIR)/SignalGenerator_993274e2.o \
+  $(OBJDIR)/SignalGeneratorEditor_b8e0de2f.o \
   $(OBJDIR)/SourceNode_de3985ea.o \
   $(OBJDIR)/SourceNodeEditor_cdc90937.o \
+  $(OBJDIR)/SpikeDetector_50b619e4.o \
+  $(OBJDIR)/SpikeDetectorEditor_502139b1.o \
   $(OBJDIR)/SpikeDisplayCanvas_2219bd20.o \
   $(OBJDIR)/SpikeDisplayEditor_6e1d56b5.o \
   $(OBJDIR)/SpikeDisplayNode_be27b98a.o \
+  $(OBJDIR)/SpikeSortBoxes_17f37282.o \
+  $(OBJDIR)/SpikeSorter_5f160cae.o \
+  $(OBJDIR)/SpikeSorterCanvas_f0ead366.o \
+  $(OBJDIR)/SpikeSorterEditor_3cee6cfb.o \
   $(OBJDIR)/Splitter_889c68aa.o \
   $(OBJDIR)/SplitterEditor_93a6dbf7.o \
   $(OBJDIR)/Visualizer_2e631df8.o \
@@ -233,6 +256,16 @@ $(OBJDIR)/Channel_5cb2d4d2.o: ../../Source/Processors/Channel/Channel.cpp
 	@echo "Compiling Channel.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/ChannelMappingEditor_9b145f15.o: ../../Source/Processors/ChannelMappingNode/ChannelMappingEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling ChannelMappingEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/ChannelMappingNode_ec0559ea.o: ../../Source/Processors/ChannelMappingNode/ChannelMappingNode.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling ChannelMappingNode.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/EcubeEditor_ba242592.o: ../../Source/Processors/DataThreads/EcubeEditor.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling EcubeEditor.cpp"
@@ -443,6 +476,21 @@ $(OBJDIR)/GenericProcessor_3e79932a.o: ../../Source/Processors/GenericProcessor/
 	@echo "Compiling GenericProcessor.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/LfpDisplayCanvas_9bbf9660.o: ../../Source/Processors/LfpDisplayNode/LfpDisplayCanvas.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LfpDisplayCanvas.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/LfpDisplayEditor_e7c32ff5.o: ../../Source/Processors/LfpDisplayNode/LfpDisplayEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LfpDisplayEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/LfpDisplayNode_fdf2e2ca.o: ../../Source/Processors/LfpDisplayNode/LfpDisplayNode.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling LfpDisplayNode.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/Merger_53fb4e4a.o: ../../Source/Processors/Merger/Merger.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling Merger.cpp"
@@ -473,6 +521,16 @@ $(OBJDIR)/Parameter_b3e5ac9e.o: ../../Source/Processors/Parameter/Parameter.cpp
 	@echo "Compiling Parameter.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/PhaseDetector_8a25ed0e.o: ../../Source/Processors/PhaseDetector/PhaseDetector.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling PhaseDetector.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/PhaseDetectorEditor_eaec855b.o: ../../Source/Processors/PhaseDetector/PhaseDetectorEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling PhaseDetectorEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/ProcessorGraph_8c3a250a.o: ../../Source/Processors/ProcessorGraph/ProcessorGraph.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling ProcessorGraph.cpp"
@@ -488,6 +546,16 @@ $(OBJDIR)/PulsePalOutputEditor_3d333977.o: ../../Source/Processors/PulsePalOutpu
 	@echo "Compiling PulsePalOutputEditor.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/RecordControl_ecb8ada4.o: ../../Source/Processors/RecordControl/RecordControl.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling RecordControl.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/RecordControlEditor_4355fd71.o: ../../Source/Processors/RecordControl/RecordControlEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling RecordControlEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/EngineConfigWindow_4fd44ceb.o: ../../Source/Processors/RecordNode/EngineConfigWindow.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling EngineConfigWindow.cpp"
@@ -518,6 +586,36 @@ $(OBJDIR)/RecordNode_cc21a82a.o: ../../Source/Processors/RecordNode/RecordNode.c
 	@echo "Compiling RecordNode.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/NetworkEventsEditor_fd22826.o: ../../Source/Processors/Editors/NetworkEventsEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling NetworkEventsEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/NetworkEvents_5344c99a.o: ../../Source/Processors/NetworkEvents/NetworkEvents.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling NetworkEvents.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/PeriStimulusTimeHistogramEditor_6be5bf55.o: ../../Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling PeriStimulusTimeHistogramEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/PeriStimulusTimeHistogramNode_9631ca2a.o: ../../Source/Processors/PSTH/PeriStimulusTimeHistogramNode.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling PeriStimulusTimeHistogramNode.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/tictoc_cdca1ed.o: ../../Source/Processors/PSTH/tictoc.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling tictoc.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/TrialCircularBuffer_4a4cef0c.o: ../../Source/Processors/PSTH/TrialCircularBuffer.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling TrialCircularBuffer.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/ResamplingNode_9825590a.o: ../../Source/Processors/ResamplingNode/ResamplingNode.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling ResamplingNode.cpp"
@@ -553,6 +651,16 @@ $(OBJDIR)/SerialInputEditor_46740885.o: ../../Source/Processors/SerialInput/Seri
 	@echo "Compiling SerialInputEditor.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/SignalGenerator_993274e2.o: ../../Source/Processors/SignalGenerator/SignalGenerator.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SignalGenerator.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/SignalGeneratorEditor_b8e0de2f.o: ../../Source/Processors/SignalGenerator/SignalGeneratorEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SignalGeneratorEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/SourceNode_de3985ea.o: ../../Source/Processors/SourceNode/SourceNode.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling SourceNode.cpp"
@@ -563,6 +671,16 @@ $(OBJDIR)/SourceNodeEditor_cdc90937.o: ../../Source/Processors/SourceNode/Source
 	@echo "Compiling SourceNodeEditor.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/SpikeDetector_50b619e4.o: ../../Source/Processors/SpikeDetector/SpikeDetector.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SpikeDetector.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/SpikeDetectorEditor_502139b1.o: ../../Source/Processors/SpikeDetector/SpikeDetectorEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SpikeDetectorEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/SpikeDisplayCanvas_2219bd20.o: ../../Source/Processors/SpikeDisplayNode/SpikeDisplayCanvas.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling SpikeDisplayCanvas.cpp"
@@ -578,6 +696,26 @@ $(OBJDIR)/SpikeDisplayNode_be27b98a.o: ../../Source/Processors/SpikeDisplayNode/
 	@echo "Compiling SpikeDisplayNode.cpp"
 	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
 
+$(OBJDIR)/SpikeSortBoxes_17f37282.o: ../../Source/Processors/SpikeSorter/SpikeSortBoxes.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SpikeSortBoxes.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/SpikeSorter_5f160cae.o: ../../Source/Processors/SpikeSorter/SpikeSorter.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SpikeSorter.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/SpikeSorterCanvas_f0ead366.o: ../../Source/Processors/SpikeSorter/SpikeSorterCanvas.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SpikeSorterCanvas.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
+$(OBJDIR)/SpikeSorterEditor_3cee6cfb.o: ../../Source/Processors/SpikeSorter/SpikeSorterEditor.cpp
+	-@mkdir -p $(OBJDIR)
+	@echo "Compiling SpikeSorterEditor.cpp"
+	@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
+
 $(OBJDIR)/Splitter_889c68aa.o: ../../Source/Processors/Splitter/Splitter.cpp
 	-@mkdir -p $(OBJDIR)
 	@echo "Compiling Splitter.cpp"
diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
index 1f936993d..4da647831 100644
--- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
+++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj
@@ -22,42 +22,89 @@
 		2D2BDB63CBD0BED07FF9E44B = {isa = PBXBuildFile; fileRef = BBE1DB78E35135B41537DCB5; };
 		4FA2949D3023FC2E377AFFB6 = {isa = PBXBuildFile; fileRef = 61317B5191E05925F232E18C; };
 		CFBB591627F730A6C98ECA25 = {isa = PBXBuildFile; fileRef = 71086F59DD72696364603E33; };
+		F08929D23989E83088DD8914 = {isa = PBXBuildFile; fileRef = 12648B73338F2CF28CED2614; };
 		14BDAEA656AAFA60334CC55C = {isa = PBXBuildFile; fileRef = 420B0E95F1300ABFDC125DBF; };
+		0ADE6EC5E6FCAC79C9EDA534 = {isa = PBXBuildFile; fileRef = DB4FF7675E5C98CF62DA8A2E; };
 		C853FCE2F6C91B3643322CF0 = {isa = PBXBuildFile; fileRef = 9F577889CB6C54A2F7B1CA80; };
+		02AAF08AB7A31598784F5EAF = {isa = PBXBuildFile; fileRef = 7B42B28FDB2E3AC67EF296F8; };
 		0AE243437B40602D35435C32 = {isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; };
+		425B09B8D50623B880FD03D6 = {isa = PBXBuildFile; fileRef = E79259F2164D16553A69B458; };
 		07A712AC1BFF4BBB74914575 = {isa = PBXBuildFile; fileRef = D39560BC785A81E49F6C502D; };
+		D761F014D76825DEFE0A7582 = {isa = PBXBuildFile; fileRef = FCA5573BA018F7E8106B89FF; };
 		9A7123033870A3CDE76FA585 = {isa = PBXBuildFile; fileRef = 8A651860B4EAFA5E94DEF3C7; };
+		475D50099CCF446232FFA63F = {isa = PBXBuildFile; fileRef = E70C1EC37D445DE1D9C85749; };
 		8352817FEDC7542D3E65B49A = {isa = PBXBuildFile; fileRef = DA4EAC64A750D0C3DEE83C5D; };
+		5D49C3544A04DDC85CAB84FA = {isa = PBXBuildFile; fileRef = C15024C101ECE85FDDCD770D; };
 		44DB81313BDDF1ECB6AD33FE = {isa = PBXBuildFile; fileRef = 1F22CC8D992B8B49D57DDB3F; };
+		7598258C53F4559D2A4CD163 = {isa = PBXBuildFile; fileRef = 19B08AF9187EC45ECDE87602; };
 		2BBDCC829E8525DF770E7E6A = {isa = PBXBuildFile; fileRef = C8EC33D17178B382027313A7; };
+		657FB45DCB77956EF22CC8B6 = {isa = PBXBuildFile; fileRef = A81E114BF75E0CEF0C7D1318; };
 		C45009DBCD71E9E234BFCE97 = {isa = PBXBuildFile; fileRef = FA8CC6FD54A9F20DA755F2EA; };
+		DE86EB9584E75F21AA2D1404 = {isa = PBXBuildFile; fileRef = 74BAC33D6BC1D961F04DCC72; };
+		E6038800731F7C747D181A51 = {isa = PBXBuildFile; fileRef = D0105584D551FED59203CC84; };
+		083570D49B258B065C833FA1 = {isa = PBXBuildFile; fileRef = E3F5E0DDF9859755B10B074D; };
+		FFCA1C44C024BCA1878F49FE = {isa = PBXBuildFile; fileRef = 25CEC111DFEC71FA6828257F; };
+		D9AAEFDB36BEA981610B7411 = {isa = PBXBuildFile; fileRef = 589657244185109F68A6B5A2; };
 		C9678AAD3560E89CCE8FA529 = {isa = PBXBuildFile; fileRef = 80A19F69D9B205BCC0ABA293; };
+		A59D1B2CCCFC73B99A92D419 = {isa = PBXBuildFile; fileRef = C7D36423459E79F3F462A421; };
 		B88BCF2522AD283DDC0B4F16 = {isa = PBXBuildFile; fileRef = FAFA97C9B7C7635298E274DB; };
+		713D95F96082E2FDDBEC45F0 = {isa = PBXBuildFile; fileRef = FD9EE3CDFCEE08859781DA65; };
 		5C597B1A42C8CB3940CBDDA9 = {isa = PBXBuildFile; fileRef = AFBAE04615D379A18B133090; };
+		C9530E58B7BB7AC2808A6B8A = {isa = PBXBuildFile; fileRef = A166A3013C7AF1BCCA050367; };
 		89FCE8890946693CD5FC4A70 = {isa = PBXBuildFile; fileRef = 235A8987D99A191D07208D2F; };
+		4CF2416B5F9F31B41476EE46 = {isa = PBXBuildFile; fileRef = 14F594C425F332F455A16D35; };
 		C9AC286A46B3A1318F298DEF = {isa = PBXBuildFile; fileRef = ECB5A75A81B90327F58CBD9E; };
+		81E21B307A9CA5FD375BCCA6 = {isa = PBXBuildFile; fileRef = 80EEDD40F49120ADBE9DCBDF; };
 		DA836EC803E4FF4EDEBE6386 = {isa = PBXBuildFile; fileRef = 2D2BAC4320470CF68743F58E; };
+		A4987DAB8931FA89CEA8E642 = {isa = PBXBuildFile; fileRef = FA2F04BA4E146ABF649BBE89; };
 		702C9BFCE865CB6C6B8BFB0D = {isa = PBXBuildFile; fileRef = 5DB3B3197F8C1E5EE159D6FC; };
+		B1C1C2C756BF23F73DA954DA = {isa = PBXBuildFile; fileRef = 8A989F74B1957BCB3B9BA398; };
 		739573501D1D440A72C5C2E5 = {isa = PBXBuildFile; fileRef = A3FB0EA0264580F6B00D993B; };
+		CA3C661A0DAE3DFA3E54C4C0 = {isa = PBXBuildFile; fileRef = 23A6BA852B71DAAF3F709428; };
 		FAE745870674A07A65690433 = {isa = PBXBuildFile; fileRef = 788F8B7719B70465762B634B; };
+		58C57FE9863EA52A46672FD9 = {isa = PBXBuildFile; fileRef = F09FD6D9CA4997216ADBF54F; };
 		24CC7E9A7E87F762D4AB0467 = {isa = PBXBuildFile; fileRef = 92602D7166325C7232B85EDD; };
+		1621D0850A6D6773B7F4853B = {isa = PBXBuildFile; fileRef = 0287B009511521BEAAE8A52C; };
 		9252537C12447F047243DEE9 = {isa = PBXBuildFile; fileRef = 041038F6E67FE0409D8ECC74; };
+		4A1D97D9259792EC2F11B51D = {isa = PBXBuildFile; fileRef = AAF5C27D2EEDD254A3652717; };
 		B081F3F4FA6D8C35E2EEE778 = {isa = PBXBuildFile; fileRef = CB5C14E82DE06F767EAD62F9; };
+		EA98DF90C4BD1AEF0514ECC9 = {isa = PBXBuildFile; fileRef = 0A6D08BC1B5ACA62F35AF5CD; };
 		7398C5E00B9093F78C697706 = {isa = PBXBuildFile; fileRef = 777D9B0FE3C110ADA980BD09; };
+		A8B7936CD511AB1B5CB7FA20 = {isa = PBXBuildFile; fileRef = 87C0534EAC82E887E1D354C3; };
 		2416F9D9E4D89A706514FC25 = {isa = PBXBuildFile; fileRef = E5FA033C407367AE0793258B; };
+		43718CB43C116FA711E64A0D = {isa = PBXBuildFile; fileRef = D1C27DAA2DDCEF188DDC8C5E; };
 		66507CA290B4730FE77B7ABC = {isa = PBXBuildFile; fileRef = D60B35D4E32DAE001056D4D5; };
+		231E09046298BE46F20233A6 = {isa = PBXBuildFile; fileRef = 56D5BE8BFA1F07F5EFF1DFE8; };
 		031957790B288A3ABED26A87 = {isa = PBXBuildFile; fileRef = 4B58436E2B47FC6BB349129F; };
+		7FAB7BAD8902C9B2CAFE74AB = {isa = PBXBuildFile; fileRef = E8D51D470C9955D7D03D5469; };
+		CC3D1CCE752AD112D4307B05 = {isa = PBXBuildFile; fileRef = 1322A008F022AF76593EAA9A; };
 		07868E8D0C1A0BB3A94E87AB = {isa = PBXBuildFile; fileRef = F603678D95461916B9D971AA; };
+		E935CA53565964A58490681C = {isa = PBXBuildFile; fileRef = DAB201178DC7489D24FEA3F4; };
 		2B90821075BA2DF4565644D4 = {isa = PBXBuildFile; fileRef = BCB5B6CEF112FC911B90E6E2; };
+		EDDA68015D1F6EBBA460438A = {isa = PBXBuildFile; fileRef = 3D782D1796455167CE41CCAB; };
 		E18FD0CB21E95A6E81286611 = {isa = PBXBuildFile; fileRef = 5E5098D437FC0612291567AC; };
+		BA442DC5447F41A262EA93C6 = {isa = PBXBuildFile; fileRef = 7814050BBF14AF7D45872768; };
 		AD938EF313A6AC879CA4BED7 = {isa = PBXBuildFile; fileRef = 52070E1171C046E4949ADFE5; };
+		3D3D8841F1BEE97CB0BFB4B9 = {isa = PBXBuildFile; fileRef = 154D5631EEFF8883BD385EB7; };
 		56C42E2DD0B4905488948796 = {isa = PBXBuildFile; fileRef = 388D5CAFAE66CCCB8ADA594C; };
+		B71515B75F424ADEE2FD9AEB = {isa = PBXBuildFile; fileRef = BA3C61B41A55C23959AA57A3; };
+		E7D895CBB979E2D43B7DE83E = {isa = PBXBuildFile; fileRef = F345254DE7F499036FB17995; };
 		DC1D91C883B609DBEF7A4235 = {isa = PBXBuildFile; fileRef = 78A1CE918B3E7ADD87DA4350; };
+		4152D4ED72BBAD132EB3D9D5 = {isa = PBXBuildFile; fileRef = 5CF96A7BBD6C4DE4D059E4A4; };
+		BD9944FE296F401D8ED449DC = {isa = PBXBuildFile; fileRef = 98EFA5304D160AD9225E38B4; };
 		8ED8249C48B1BB53F617A789 = {isa = PBXBuildFile; fileRef = 40F90FEFBD575E8A67DF68EB; };
+		ADFC97D23FC8AE1EA2E414DD = {isa = PBXBuildFile; fileRef = 677CC8DA903C77D8ECBAE26D; };
 		AD588F05EDFE59FD48A3F9B8 = {isa = PBXBuildFile; fileRef = 9C736D7B85CCD9EC40C5D0AF; };
+		FDADC8A751512464A863A260 = {isa = PBXBuildFile; fileRef = 442F01DC974E1EAC57450906; };
 		6C0A7B0D658E39227319148F = {isa = PBXBuildFile; fileRef = FAD15233FFB64C1608A60250; };
+		A9256A89B0A67E926C10D569 = {isa = PBXBuildFile; fileRef = C1B540E49C0EBA03ACDBBDFB; };
 		469E1EF233BCD61F44687C0F = {isa = PBXBuildFile; fileRef = E122ECCE167A03BDF2D282FE; };
+		98883CE5BC919B825C775CA3 = {isa = PBXBuildFile; fileRef = 8B0B1D01BA8A37EC6058E518; };
+		3980BA0A56ACF1709E7465EA = {isa = PBXBuildFile; fileRef = BD6FDA7B037CF3535431BFC8; };
 		411543734DA2029A3030D903 = {isa = PBXBuildFile; fileRef = 20BB146B925C4D4AD43BA479; };
+		7BADBB3781106EEFA7C954E7 = {isa = PBXBuildFile; fileRef = B207877BD3DC2A555E51ADD8; };
+		025EA6C7BC2F9956FF5AA7A1 = {isa = PBXBuildFile; fileRef = 54B7796F6DCF5531789CCF43; };
+		DA7D3940DC6ABC67803D505F = {isa = PBXBuildFile; fileRef = 3846F3FA0FC28CE322073E94; };
 		52AE3F7AEED81BA9ED5C4830 = {isa = PBXBuildFile; fileRef = E216D095C98F850A5FB6FB0F; };
 		50C545252FEF7B6F9D82092D = {isa = PBXBuildFile; fileRef = 70F06DBCA3948BCC1062E36F; };
 		029C3B11BE586DA100895A60 = {isa = PBXBuildFile; fileRef = 28CCF04CCC028BAE0AEE5840; };
@@ -69,61 +116,160 @@
 		AA16BE5A6BBD024C8FCFCDA8 = {isa = PBXBuildFile; fileRef = CAA3B9396EA62166234DAEF1; };
 		46511E0CF49A1F753F2EC949 = {isa = PBXBuildFile; fileRef = B23E6EBB5F99CF7FC72FAC4E; };
 		44D7379F739C19C7B78B95F5 = {isa = PBXBuildFile; fileRef = C5C843AC83A36BE87E3F97F8; };
+		6BBA2047EED8D1918CD25253 = {isa = PBXBuildFile; fileRef = 9410421AB1CD18F754FD4A9E; };
 		F4808CE43E77C8EC285A39DC = {isa = PBXBuildFile; fileRef = 2592795DB135E0F2C04406F3; };
+		29160C7519A2730BB9DA6296 = {isa = PBXBuildFile; fileRef = 10AC8A3D981DAE425D24F9F1; };
 		D1F0765F1497D5228ABCA63C = {isa = PBXBuildFile; fileRef = F6BE430A8D1C6240286ED75B; };
+		12E152732DE8BB21A2BACACA = {isa = PBXBuildFile; fileRef = 51BB55D1CE1667CD340E8358; };
 		C0925B26A0267FE011445FCB = {isa = PBXBuildFile; fileRef = C54F63E163E9F8DE60EEA1EE; };
+		5C00155E151C8AF4C3C08FFF = {isa = PBXBuildFile; fileRef = 1C567FD773309E8CE216EC9A; };
 		4976529FC367F5F6A0D04370 = {isa = PBXBuildFile; fileRef = A76B04F4829C862D4B8F66B3; };
+		3F6A34906F13DE5E65F9F785 = {isa = PBXBuildFile; fileRef = 1A05C5AF5447448AAF869508; };
 		68EBB4CEB08BD3DEAC450B95 = {isa = PBXBuildFile; fileRef = 34834859523571912C55AC94; };
+		53942219C91A015CCEF6F751 = {isa = PBXBuildFile; fileRef = D5DC73F860143308ADF769C1; };
 		24800AF87AD21CE652552EDE = {isa = PBXBuildFile; fileRef = 56F810EF10E01535A417B671; };
+		7D393CD459AD73307B4B26A2 = {isa = PBXBuildFile; fileRef = BF8C15407347975836BFA88F; };
 		0203D029CE7420984F737E51 = {isa = PBXBuildFile; fileRef = 414969AEF838522C9FE1B807; };
+		C7645118F58597FDEBF06577 = {isa = PBXBuildFile; fileRef = 5EA566ED87CC02EA6DF1993B; };
 		3BAE3A1FD0834E798B8602BF = {isa = PBXBuildFile; fileRef = 9AA19ECEFE2B49832ECEED2F; };
+		84D5E875E6E036CF685CF1FC = {isa = PBXBuildFile; fileRef = 70651FEF347D8DE167B68EB8; };
 		B49852F77C0C392C159A1914 = {isa = PBXBuildFile; fileRef = C5654EAA7B65445CF1340983; };
+		F1CFB5BF336DF4A46A570280 = {isa = PBXBuildFile; fileRef = 012F05BBF926C8F39AC7871B; };
+		9F431DA23C92CA0F8E3A2A28 = {isa = PBXBuildFile; fileRef = D9BF6DA66C22FFF5C4D41991; };
+		1F2F913B1C3DABC8850016C5 = {isa = PBXBuildFile; fileRef = CD657DBBDB4550C800F05D22; };
+		BFFD23BD72ECEC9E54936061 = {isa = PBXBuildFile; fileRef = 88C69F0563A99BD2F7BF5FBB; };
+		86971F608005DD3B71FF8676 = {isa = PBXBuildFile; fileRef = E04512D01D2F6FE00C336CAD; };
+		FA882EEE408CBBDC7BD90F14 = {isa = PBXBuildFile; fileRef = 1C64C490BD7FE9E57D6C682D; };
+		160F0B19B8A49AA1B26FAFC6 = {isa = PBXBuildFile; fileRef = B2F72769CF14BD7F882E9542; };
 		6D00BABD3FE1AA0EAA267C1C = {isa = PBXBuildFile; fileRef = 07B84F46CF90D04BB6B673C5; };
+		6B56E0463FF3D580F0C84407 = {isa = PBXBuildFile; fileRef = CA50A6F43BD78D01A8BE974B; };
 		AD371C6F383F03EF392B6581 = {isa = PBXBuildFile; fileRef = BAA5B3AD1A27F8C4D37A6869; };
+		4DF3A59A371DE10E4FFFF642 = {isa = PBXBuildFile; fileRef = 8C639E4F97B7D6070028623A; };
 		4EF2825142BBAA76FD55FE26 = {isa = PBXBuildFile; fileRef = BC1543B1F822FEEDCB9AC26D; };
+		CDB3C038ABFCB6A8EAA27D79 = {isa = PBXBuildFile; fileRef = 8F058EA775325F9C5650944E; };
 		3B05807D08271664EEC4977C = {isa = PBXBuildFile; fileRef = AEFC8A0A9A35F50E59FDE678; };
+		27A764088D184F9898FC8B4F = {isa = PBXBuildFile; fileRef = 9EB2B238943CCC32B587881C; };
 		F2586A2DCEF44961AEA247E8 = {isa = PBXBuildFile; fileRef = 934B37E2BECD69E6E27051F6; };
+		9354508D753345076D5C79E6 = {isa = PBXBuildFile; fileRef = 362898B655ABFFA23A69BBFA; };
 		3E7939ABAA984EE8BFC8CEDD = {isa = PBXBuildFile; fileRef = 4F5D51C5F8174E3824EF8B42; };
+		CD6ACBFB0637B64B9CA1A91F = {isa = PBXBuildFile; fileRef = 811BCA5BE226C5188BC5E9B9; };
+		C9F9AE4CB2009DFFD7D7A67F = {isa = PBXBuildFile; fileRef = 4F10D1D2F5ED2E7F9A997D4C; };
+		C69A92478301D81D75E1A0EC = {isa = PBXBuildFile; fileRef = 35BB20110BAC6346AA605BF9; };
+		C59D4B35ABCF3BE6D0A0665E = {isa = PBXBuildFile; fileRef = 3FE8C41480F07050CC21635F; };
+		BD5128D0C727A7CCA76C9A41 = {isa = PBXBuildFile; fileRef = 31FB49244DF85E2ACCFBDF2B; };
 		BAC379C03C2E7995F2393EF5 = {isa = PBXBuildFile; fileRef = 4CB63EE1552BBFDEB1DADB0A; };
+		326F93591218D713F4230961 = {isa = PBXBuildFile; fileRef = B695B24906116ADEFC9D9B5C; };
 		82160D8346428EC9F641FAD6 = {isa = PBXBuildFile; fileRef = 183701B0661B6FE784C6A75F; };
+		39F3181320E5E0E35EC37564 = {isa = PBXBuildFile; fileRef = E1A51630F1C6E392EBEDD469; };
 		15C43033BAB27663B4226539 = {isa = PBXBuildFile; fileRef = DE0EA2212323DEFEBA3D078F; };
+		2EEBA7B6BB147046137789E7 = {isa = PBXBuildFile; fileRef = 623684E73A6005C7BB2717A6; };
+		BD091BDB684BB28E0F953B8B = {isa = PBXBuildFile; fileRef = E849E3966302E7D4D06712F5; };
+		798FA335EA66F747EFB48247 = {isa = PBXBuildFile; fileRef = E0AB41DFF4A382B93658F53E; };
+		395F1886484CA576C63B7112 = {isa = PBXBuildFile; fileRef = 56242BB33B53F133914517BD; };
+		3BE6379EA4361C00A9D90E9A = {isa = PBXBuildFile; fileRef = F379BA0589FB65817B721314; };
 		E1247DDF1C88D99691499E52 = {isa = PBXBuildFile; fileRef = 7DB22AC6407EEA88F3FFA16D; };
+		960C8D7486F047112BD4468B = {isa = PBXBuildFile; fileRef = 398BF0B03B719107E6093F98; };
 		0E036CEA1285F9B162A07356 = {isa = PBXBuildFile; fileRef = F552E7A463C6207BC3E74C06; };
+		250BE9DED2B1E3F6799D4F68 = {isa = PBXBuildFile; fileRef = 449B26D1265BB91B331EFF84; };
 		A4A2DF3FA65BAB4322FE5E74 = {isa = PBXBuildFile; fileRef = 36332333DBF8363163F454E6; };
+		B607347408D47E361FE18387 = {isa = PBXBuildFile; fileRef = 8A07B5B6D56277A222AC0E90; };
 		0A8D8C2D02858F0F08356EA9 = {isa = PBXBuildFile; fileRef = E39CC410838072043E3C30DC; };
+		D4995270E6CB321A9F344EB1 = {isa = PBXBuildFile; fileRef = 9B1962D340B217B19B077F2A; };
 		AEDA8F23648EABF79215B566 = {isa = PBXBuildFile; fileRef = F716728550EBD8FA7B9CA7EF; };
+		D909F61CF9323366A2143DB2 = {isa = PBXBuildFile; fileRef = 25B79E00075CCF59F0A4A7D7; };
 		B806F023DF817BB2D59FEEFD = {isa = PBXBuildFile; fileRef = 949422DF0532222450E95926; };
+		1419982AA3FEFD48742EC391 = {isa = PBXBuildFile; fileRef = B657AEAFB3404A5CB270C413; };
+		BEACD5086C04D68470944B72 = {isa = PBXBuildFile; fileRef = A77E8538ED93AAADC9FE2646; };
+		11EB9F8EA8987709E851DBED = {isa = PBXBuildFile; fileRef = 84BED3AADBD3FAB6EFEC323E; };
+		96BFF19817240A0D9062A1A2 = {isa = PBXBuildFile; fileRef = DF95F463F806B844A3D6AF59; };
+		24348B377D1E9699AAB08681 = {isa = PBXBuildFile; fileRef = 60494102600DD1F7AABCD309; };
+		B8E8A7F22DCE37B735E65C43 = {isa = PBXBuildFile; fileRef = 0D29270F94FE7878DDF891AA; };
+		9FD92FEF340DC46C56216FC5 = {isa = PBXBuildFile; fileRef = 239AD53591DA0B5B4796A3DF; };
+		093F0BA37D6C91C7E92AB658 = {isa = PBXBuildFile; fileRef = 25B9B8D5E54B9C547197E414; };
+		3B0E6D1750C7ABA614451522 = {isa = PBXBuildFile; fileRef = 6DA5EDE1BF0E8D396EAE23FC; };
+		620CF6292EFB911F15916EA6 = {isa = PBXBuildFile; fileRef = 547C76794FAC1BC349163509; };
+		CCFF38BDBD01CB3623B68A97 = {isa = PBXBuildFile; fileRef = CCE779E203974113A80D6D85; };
+		7B50AD44D4F9610CE4A43414 = {isa = PBXBuildFile; fileRef = FB827FEEA15A274E5F7577DB; };
+		A41078823B3B4B995770C39E = {isa = PBXBuildFile; fileRef = 76D8904379362E11CA4EA11D; };
 		69B5045877D4C674E8A4967F = {isa = PBXBuildFile; fileRef = E102C308B0722DFFFEFF2415; };
+		8F7C39DA5FA94D2D64F0BA60 = {isa = PBXBuildFile; fileRef = B574136FEE7957F7439CB346; };
 		97105BCBC5B1BE4E86D48899 = {isa = PBXBuildFile; fileRef = 55DFE30C901793E56A7E3A22; };
+		4B750243729919C7EE437E98 = {isa = PBXBuildFile; fileRef = 1785D37A95AF0D67F69F29B6; };
 		790911EDF00A4BF77327D99A = {isa = PBXBuildFile; fileRef = 48E12736F471C43C959AD15C; };
+		042EAAFCEB9F67456BCEC978 = {isa = PBXBuildFile; fileRef = 79C32CA8069962F5DE48F633; };
 		DDDFAE2042D8AD20CC78CE3C = {isa = PBXBuildFile; fileRef = 3753B3B311AE0A9F4CC5AD40; };
+		6B168D6AA36555A28CFC0901 = {isa = PBXBuildFile; fileRef = 758BC480F153DEA79304366B; };
+		BCAB66E96F54F6CB32E4FA62 = {isa = PBXBuildFile; fileRef = DEF465116BB906FD116DA5EB; };
 		582C224AA50C9395810C8E27 = {isa = PBXBuildFile; fileRef = 308F614D30DCB9AE3767C928; };
+		C8659D1D456E717F4E5650FE = {isa = PBXBuildFile; fileRef = 92CB21BEE17D1DD03106AD87; };
 		846EF153B423E09BC5BFDAFD = {isa = PBXBuildFile; fileRef = 4C01F867D43DF7B1D98B887E; };
+		3831D26FCA910C6B23CB36FE = {isa = PBXBuildFile; fileRef = 12F73B770FFDEA8696710E86; };
 		66308BBB808DBB920AB3CBAB = {isa = PBXBuildFile; fileRef = 6D38B76951D31D96F1B71E0F; };
+		3D5543BA75736B1294050795 = {isa = PBXBuildFile; fileRef = 27FB12D08303BEC9CD15E317; };
+		1D0D651813C4A1DCBE811242 = {isa = PBXBuildFile; fileRef = 748F08ACA463113F570C51AC; };
+		E3585CC45E8167A48E97785B = {isa = PBXBuildFile; fileRef = D50EA137CEA9654AA8AB3D4C; };
+		BFAC940E5771516A92281F96 = {isa = PBXBuildFile; fileRef = 0915EBE101DD5974F692755B; };
+		A49A84A265633FAE079081E7 = {isa = PBXBuildFile; fileRef = 38E1C53CF5BB38247BCAA909; };
 		7B69E73AF79BB2B10BAA559C = {isa = PBXBuildFile; fileRef = 242B80832B3C8FF4F3CC18F1; };
+		30D2FF80A059C4F2F2641452 = {isa = PBXBuildFile; fileRef = A7BF9312D81FF5DCEAB8AC47; };
 		74A14124A3B0C5FB13583B57 = {isa = PBXBuildFile; fileRef = 326F8386BCD4E4189D0CC00F; };
+		BABD91F2DC4EDF91E155CC42 = {isa = PBXBuildFile; fileRef = B5D805B691B1C38D959F6B54; };
+		6D8A9AC5ECC0F2D26304849E = {isa = PBXBuildFile; fileRef = 89CDE7ED25D0EB7452486E85; };
+		730BD9F465C846CE50DFFC0F = {isa = PBXBuildFile; fileRef = 13A33B5CF55BDF7BDC9D1D0C; };
+		AFC645928D103D9FA51481CA = {isa = PBXBuildFile; fileRef = D0F10367EBD3945780342A37; };
+		DEC3BE6E103F30FF5260BA2A = {isa = PBXBuildFile; fileRef = 811A8689009F6FBEE2168F96; };
 		84BB28DDFF317D243DDC7FA2 = {isa = PBXBuildFile; fileRef = AAC6EC29963717E95428D7D2; };
+		DC1505106186A011077FC0B4 = {isa = PBXBuildFile; fileRef = C2CB484954A536E782B4A8E7; };
 		A14CA9089A09267E95C93E1D = {isa = PBXBuildFile; fileRef = 2F0C721AB2973FAD23C7F47B; };
+		9DE3E3BA75AAA0872C7F2A25 = {isa = PBXBuildFile; fileRef = 34CF4D00D785338941AB9590; };
 		DED0D08EFA1EFF4F1D4D3BEF = {isa = PBXBuildFile; fileRef = AC9E30922A14330704FB2573; };
+		33433C097E276713BAA2266D = {isa = PBXBuildFile; fileRef = AE1FC768C646A0EFEC3E3A11; };
+		9635A954DB8FDD6E19B977C3 = {isa = PBXBuildFile; fileRef = 92F51CF12E0C21F38D5E61E8; };
+		8D37FF507C77CC8EA831C5AE = {isa = PBXBuildFile; fileRef = FBF2BF7B97C2FF8557CF39E6; };
+		B9718533E5255AEC3F6C7B2F = {isa = PBXBuildFile; fileRef = D45EF9812FBC284BCB7EEB7C; };
+		5C54E5C528ECD500842038EB = {isa = PBXBuildFile; fileRef = 78400C0FB79F6B0D1A27A6D4; };
+		58EC9F834448B334410385EB = {isa = PBXBuildFile; fileRef = 6DF620BE87EA9F7F25A1144A; };
+		5842C5403AF4A2A6BD87F83B = {isa = PBXBuildFile; fileRef = B66B8CFF619CBF2D66F031E3; };
+		027A01C5025DEA9DAFF605D3 = {isa = PBXBuildFile; fileRef = F46365D8E42099148B843C95; };
+		145E3116F63B7BCBDB30EC96 = {isa = PBXBuildFile; fileRef = F753A8E9CE0C51998066EA07; };
 		4910924155F31E96B9BAD050 = {isa = PBXBuildFile; fileRef = B9068FF0373FA8321C33C42C; };
+		FE0BEC4F57D0EA019EF6D24A = {isa = PBXBuildFile; fileRef = E1E9FAB63BD90C10F2BEF74C; };
 		66DE280C28A69B2002C40A86 = {isa = PBXBuildFile; fileRef = 607CC2BFCB0622B3348FA1AD; };
+		B1CFD7C1DD7724CD38FA1FEC = {isa = PBXBuildFile; fileRef = 385F66531BAB16BA754E901E; };
 		5BF488044E143A2727CE2BDB = {isa = PBXBuildFile; fileRef = 0646A83E4EE738EE5D914DA6; };
 		1B620FC17AAECA4C5DE741E2 = {isa = PBXBuildFile; fileRef = 66463AB11EA4D6341C32F27E; };
+		E4DFAFCE9800EE2C9F8A8AAF = {isa = PBXBuildFile; fileRef = FFFBDB9A00240D797751FEE6; };
 		19BB86C918F89D1377F8A0E1 = {isa = PBXBuildFile; fileRef = 5894D40A0E8FA6E9B3EBF9D9; };
+		284D8B7D3CDE3742B3468855 = {isa = PBXBuildFile; fileRef = ADCB42E4C5641007A4B78025; };
+		AE270975F90CC92C27F80B05 = {isa = PBXBuildFile; fileRef = 215E1BD79B5870D5356810F0; };
 		89223664B6CB2A912E36B091 = {isa = PBXBuildFile; fileRef = F115ED75E977A54AAF036B2C; };
+		39914728A9B138EB9A04CF34 = {isa = PBXBuildFile; fileRef = AE3D7946F13CE32AE41DD1B7; };
 		8F39AD3F7938EFE82D06E89F = {isa = PBXBuildFile; fileRef = AF28CAB9C7531EF7422602E1; };
+		32E4965D513877EDAC11E9E4 = {isa = PBXBuildFile; fileRef = A186E03EC7A6A7E657F38300; };
 		BA608CEFC85F7AB9E30E0EB3 = {isa = PBXBuildFile; fileRef = F960CC94B136201BDA148EEA; };
+		8EB38EF63AACA70DFEC4CF94 = {isa = PBXBuildFile; fileRef = C59B01C8DB5B3B4773032E12; };
 		D499273B65D901D0A101CAAA = {isa = PBXBuildFile; fileRef = E5C1D021C0FD6FAD082C5D75; };
+		14133143519D06FC6F4C88C6 = {isa = PBXBuildFile; fileRef = BA422CC894B825834A0C5479; };
 		95AE939ADE096394CCD2526F = {isa = PBXBuildFile; fileRef = 9F3B3184EC6D42CEA35D6ED8; };
+		6DC53D380636F5A30B52BAC8 = {isa = PBXBuildFile; fileRef = E93BE115650B1CB80EACB841; };
 		E85DA5FC9A162F129ABA7113 = {isa = PBXBuildFile; fileRef = 0987F7E90136D0E08A606A22; };
+		B37D32878D75EDCD4400826A = {isa = PBXBuildFile; fileRef = 48F6281AB92B232E5187D00C; };
 		6A13D8F42A330E2C410B43E3 = {isa = PBXBuildFile; fileRef = 7E875E681E18D693D5ADB2FB; };
+		736608BBA6321E460BDBBBC8 = {isa = PBXBuildFile; fileRef = 57FBA8BC3104D3AF41FBECD8; };
 		13F1111511DD01E843E631CA = {isa = PBXBuildFile; fileRef = 79C91DDF3BC3F15D0338E504; };
+		D4EC5BCFAB683EA0A4473AA6 = {isa = PBXBuildFile; fileRef = 105B1452DF6CE1D80D69A9D1; };
 		9A80E3D1D1758A31D2169497 = {isa = PBXBuildFile; fileRef = 3774BBCA6CB133D9A854CF71; };
+		715C8221533FB1B9DD03F721 = {isa = PBXBuildFile; fileRef = 19148DBA36B94FA639DF3A72; };
 		F4397EAE00E0B9F96C8B6C07 = {isa = PBXBuildFile; fileRef = 17E13CCDA0C82F92EAB05BE6; };
+		12088E12BCA721D0832B39FD = {isa = PBXBuildFile; fileRef = D2696B30CBEAD7CE72510AFA; };
 		09673DA3B4D6EA61DEFC0C46 = {isa = PBXBuildFile; fileRef = 47A3942AC30A3212C01F1CAF; };
+		968E9B7C2E1974474E51F26E = {isa = PBXBuildFile; fileRef = 7D9374931D760ADC65DCBFC6; };
 		58D3FF3B1F462634167BDFB5 = {isa = PBXBuildFile; fileRef = 610E487E060C42B52FD5AAC9; };
+		6DA67142BD5D41B90A19121B = {isa = PBXBuildFile; fileRef = 0FE8ACC50ED8E7FFC9E6B9B4; };
 		3162B66BC8118715AAA527D7 = {isa = PBXBuildFile; fileRef = D2A3B4CDD296B4CEC6902FD7; };
+		4300909A1BAF9464663A9CF3 = {isa = PBXBuildFile; fileRef = 3FC794735FA8DDA39A62224B; };
 		004E78BC139419671A9EA137 = {isa = PBXBuildFile; fileRef = E08E877C3A6283CF5C803957; };
+		63181788D187F9A15BBE03D9 = {isa = PBXBuildFile; fileRef = BB26BA9CFAE8C836251E8EAF; };
 		6306AA945375749C4FE834E6 = {isa = PBXBuildFile; fileRef = 2C89EC72FF6A7118EF459DC3; };
 		AD7D05519200FB0EE1C7617A = {isa = PBXBuildFile; fileRef = A512C5B237A77EF6FB8E11A0; };
 		C2475E008FEB33B3EA7B6C7F = {isa = PBXBuildFile; fileRef = DF3C9A1DD67E879E4E0A2727; };
@@ -2945,42 +3091,89 @@
 					4FA2949D3023FC2E377AFFB6, ); runOnlyForDeploymentPostprocessing = 0; };
 		0C1B429379FBBA77A635B49A = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
 					CFBB591627F730A6C98ECA25,
+					F08929D23989E83088DD8914,
 					14BDAEA656AAFA60334CC55C,
+					0ADE6EC5E6FCAC79C9EDA534,
 					C853FCE2F6C91B3643322CF0,
+					02AAF08AB7A31598784F5EAF,
 					0AE243437B40602D35435C32,
+					425B09B8D50623B880FD03D6,
 					07A712AC1BFF4BBB74914575,
+					D761F014D76825DEFE0A7582,
 					9A7123033870A3CDE76FA585,
+					475D50099CCF446232FFA63F,
 					8352817FEDC7542D3E65B49A,
+					5D49C3544A04DDC85CAB84FA,
 					44DB81313BDDF1ECB6AD33FE,
+					7598258C53F4559D2A4CD163,
 					2BBDCC829E8525DF770E7E6A,
+					657FB45DCB77956EF22CC8B6,
 					C45009DBCD71E9E234BFCE97,
+					DE86EB9584E75F21AA2D1404,
+					E6038800731F7C747D181A51,
+					083570D49B258B065C833FA1,
+					FFCA1C44C024BCA1878F49FE,
+					D9AAEFDB36BEA981610B7411,
 					C9678AAD3560E89CCE8FA529,
+					A59D1B2CCCFC73B99A92D419,
 					B88BCF2522AD283DDC0B4F16,
+					713D95F96082E2FDDBEC45F0,
 					5C597B1A42C8CB3940CBDDA9,
+					C9530E58B7BB7AC2808A6B8A,
 					89FCE8890946693CD5FC4A70,
+					4CF2416B5F9F31B41476EE46,
 					C9AC286A46B3A1318F298DEF,
+					81E21B307A9CA5FD375BCCA6,
 					DA836EC803E4FF4EDEBE6386,
+					A4987DAB8931FA89CEA8E642,
 					702C9BFCE865CB6C6B8BFB0D,
+					B1C1C2C756BF23F73DA954DA,
 					739573501D1D440A72C5C2E5,
+					CA3C661A0DAE3DFA3E54C4C0,
 					FAE745870674A07A65690433,
+					58C57FE9863EA52A46672FD9,
 					24CC7E9A7E87F762D4AB0467,
+					1621D0850A6D6773B7F4853B,
 					9252537C12447F047243DEE9,
+					4A1D97D9259792EC2F11B51D,
 					B081F3F4FA6D8C35E2EEE778,
+					EA98DF90C4BD1AEF0514ECC9,
 					7398C5E00B9093F78C697706,
+					A8B7936CD511AB1B5CB7FA20,
 					2416F9D9E4D89A706514FC25,
+					43718CB43C116FA711E64A0D,
 					66507CA290B4730FE77B7ABC,
+					231E09046298BE46F20233A6,
 					031957790B288A3ABED26A87,
+					7FAB7BAD8902C9B2CAFE74AB,
+					CC3D1CCE752AD112D4307B05,
 					07868E8D0C1A0BB3A94E87AB,
+					E935CA53565964A58490681C,
 					2B90821075BA2DF4565644D4,
+					EDDA68015D1F6EBBA460438A,
 					E18FD0CB21E95A6E81286611,
+					BA442DC5447F41A262EA93C6,
 					AD938EF313A6AC879CA4BED7,
+					3D3D8841F1BEE97CB0BFB4B9,
 					56C42E2DD0B4905488948796,
+					B71515B75F424ADEE2FD9AEB,
+					E7D895CBB979E2D43B7DE83E,
 					DC1D91C883B609DBEF7A4235,
+					4152D4ED72BBAD132EB3D9D5,
+					BD9944FE296F401D8ED449DC,
 					8ED8249C48B1BB53F617A789,
+					ADFC97D23FC8AE1EA2E414DD,
 					AD588F05EDFE59FD48A3F9B8,
+					FDADC8A751512464A863A260,
 					6C0A7B0D658E39227319148F,
+					A9256A89B0A67E926C10D569,
 					469E1EF233BCD61F44687C0F,
+					98883CE5BC919B825C775CA3,
+					3980BA0A56ACF1709E7465EA,
 					411543734DA2029A3030D903,
+					7BADBB3781106EEFA7C954E7,
+					025EA6C7BC2F9956FF5AA7A1,
+					DA7D3940DC6ABC67803D505F,
 					52AE3F7AEED81BA9ED5C4830,
 					50C545252FEF7B6F9D82092D,
 					029C3B11BE586DA100895A60,
@@ -2992,61 +3185,160 @@
 					AA16BE5A6BBD024C8FCFCDA8,
 					46511E0CF49A1F753F2EC949,
 					44D7379F739C19C7B78B95F5,
+					6BBA2047EED8D1918CD25253,
 					F4808CE43E77C8EC285A39DC,
+					29160C7519A2730BB9DA6296,
 					D1F0765F1497D5228ABCA63C,
+					12E152732DE8BB21A2BACACA,
 					C0925B26A0267FE011445FCB,
+					5C00155E151C8AF4C3C08FFF,
 					4976529FC367F5F6A0D04370,
+					3F6A34906F13DE5E65F9F785,
 					68EBB4CEB08BD3DEAC450B95,
+					53942219C91A015CCEF6F751,
 					24800AF87AD21CE652552EDE,
+					7D393CD459AD73307B4B26A2,
 					0203D029CE7420984F737E51,
+					C7645118F58597FDEBF06577,
 					3BAE3A1FD0834E798B8602BF,
+					84D5E875E6E036CF685CF1FC,
 					B49852F77C0C392C159A1914,
+					F1CFB5BF336DF4A46A570280,
+					9F431DA23C92CA0F8E3A2A28,
+					1F2F913B1C3DABC8850016C5,
+					BFFD23BD72ECEC9E54936061,
+					86971F608005DD3B71FF8676,
+					FA882EEE408CBBDC7BD90F14,
+					160F0B19B8A49AA1B26FAFC6,
 					6D00BABD3FE1AA0EAA267C1C,
+					6B56E0463FF3D580F0C84407,
 					AD371C6F383F03EF392B6581,
+					4DF3A59A371DE10E4FFFF642,
 					4EF2825142BBAA76FD55FE26,
+					CDB3C038ABFCB6A8EAA27D79,
 					3B05807D08271664EEC4977C,
+					27A764088D184F9898FC8B4F,
 					F2586A2DCEF44961AEA247E8,
+					9354508D753345076D5C79E6,
 					3E7939ABAA984EE8BFC8CEDD,
+					CD6ACBFB0637B64B9CA1A91F,
+					C9F9AE4CB2009DFFD7D7A67F,
+					C69A92478301D81D75E1A0EC,
+					C59D4B35ABCF3BE6D0A0665E,
+					BD5128D0C727A7CCA76C9A41,
 					BAC379C03C2E7995F2393EF5,
+					326F93591218D713F4230961,
 					82160D8346428EC9F641FAD6,
+					39F3181320E5E0E35EC37564,
 					15C43033BAB27663B4226539,
+					2EEBA7B6BB147046137789E7,
+					BD091BDB684BB28E0F953B8B,
+					798FA335EA66F747EFB48247,
+					395F1886484CA576C63B7112,
+					3BE6379EA4361C00A9D90E9A,
 					E1247DDF1C88D99691499E52,
+					960C8D7486F047112BD4468B,
 					0E036CEA1285F9B162A07356,
+					250BE9DED2B1E3F6799D4F68,
 					A4A2DF3FA65BAB4322FE5E74,
+					B607347408D47E361FE18387,
 					0A8D8C2D02858F0F08356EA9,
+					D4995270E6CB321A9F344EB1,
 					AEDA8F23648EABF79215B566,
+					D909F61CF9323366A2143DB2,
 					B806F023DF817BB2D59FEEFD,
+					1419982AA3FEFD48742EC391,
+					BEACD5086C04D68470944B72,
+					11EB9F8EA8987709E851DBED,
+					96BFF19817240A0D9062A1A2,
+					24348B377D1E9699AAB08681,
+					B8E8A7F22DCE37B735E65C43,
+					9FD92FEF340DC46C56216FC5,
+					093F0BA37D6C91C7E92AB658,
+					3B0E6D1750C7ABA614451522,
+					620CF6292EFB911F15916EA6,
+					CCFF38BDBD01CB3623B68A97,
+					7B50AD44D4F9610CE4A43414,
+					A41078823B3B4B995770C39E,
 					69B5045877D4C674E8A4967F,
+					8F7C39DA5FA94D2D64F0BA60,
 					97105BCBC5B1BE4E86D48899,
+					4B750243729919C7EE437E98,
 					790911EDF00A4BF77327D99A,
+					042EAAFCEB9F67456BCEC978,
 					DDDFAE2042D8AD20CC78CE3C,
+					6B168D6AA36555A28CFC0901,
+					BCAB66E96F54F6CB32E4FA62,
 					582C224AA50C9395810C8E27,
+					C8659D1D456E717F4E5650FE,
 					846EF153B423E09BC5BFDAFD,
+					3831D26FCA910C6B23CB36FE,
 					66308BBB808DBB920AB3CBAB,
+					3D5543BA75736B1294050795,
+					1D0D651813C4A1DCBE811242,
+					E3585CC45E8167A48E97785B,
+					BFAC940E5771516A92281F96,
+					A49A84A265633FAE079081E7,
 					7B69E73AF79BB2B10BAA559C,
+					30D2FF80A059C4F2F2641452,
 					74A14124A3B0C5FB13583B57,
+					BABD91F2DC4EDF91E155CC42,
+					6D8A9AC5ECC0F2D26304849E,
+					730BD9F465C846CE50DFFC0F,
+					AFC645928D103D9FA51481CA,
+					DEC3BE6E103F30FF5260BA2A,
 					84BB28DDFF317D243DDC7FA2,
+					DC1505106186A011077FC0B4,
 					A14CA9089A09267E95C93E1D,
+					9DE3E3BA75AAA0872C7F2A25,
 					DED0D08EFA1EFF4F1D4D3BEF,
+					33433C097E276713BAA2266D,
+					9635A954DB8FDD6E19B977C3,
+					8D37FF507C77CC8EA831C5AE,
+					B9718533E5255AEC3F6C7B2F,
+					5C54E5C528ECD500842038EB,
+					58EC9F834448B334410385EB,
+					5842C5403AF4A2A6BD87F83B,
+					027A01C5025DEA9DAFF605D3,
+					145E3116F63B7BCBDB30EC96,
 					4910924155F31E96B9BAD050,
+					FE0BEC4F57D0EA019EF6D24A,
 					66DE280C28A69B2002C40A86,
+					B1CFD7C1DD7724CD38FA1FEC,
 					5BF488044E143A2727CE2BDB,
 					1B620FC17AAECA4C5DE741E2,
+					E4DFAFCE9800EE2C9F8A8AAF,
 					19BB86C918F89D1377F8A0E1,
+					284D8B7D3CDE3742B3468855,
+					AE270975F90CC92C27F80B05,
 					89223664B6CB2A912E36B091,
+					39914728A9B138EB9A04CF34,
 					8F39AD3F7938EFE82D06E89F,
+					32E4965D513877EDAC11E9E4,
 					BA608CEFC85F7AB9E30E0EB3,
+					8EB38EF63AACA70DFEC4CF94,
 					D499273B65D901D0A101CAAA,
+					14133143519D06FC6F4C88C6,
 					95AE939ADE096394CCD2526F,
+					6DC53D380636F5A30B52BAC8,
 					E85DA5FC9A162F129ABA7113,
+					B37D32878D75EDCD4400826A,
 					6A13D8F42A330E2C410B43E3,
+					736608BBA6321E460BDBBBC8,
 					13F1111511DD01E843E631CA,
+					D4EC5BCFAB683EA0A4473AA6,
 					9A80E3D1D1758A31D2169497,
+					715C8221533FB1B9DD03F721,
 					F4397EAE00E0B9F96C8B6C07,
+					12088E12BCA721D0832B39FD,
 					09673DA3B4D6EA61DEFC0C46,
+					968E9B7C2E1974474E51F26E,
 					58D3FF3B1F462634167BDFB5,
+					6DA67142BD5D41B90A19121B,
 					3162B66BC8118715AAA527D7,
+					4300909A1BAF9464663A9CF3,
 					004E78BC139419671A9EA137,
+					63181788D187F9A15BBE03D9,
 					6306AA945375749C4FE834E6,
 					AD7D05519200FB0EE1C7617A,
 					C2475E008FEB33B3EA7B6C7F,
diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj
index 456289a78..6e274b466 100644
--- a/Builds/VisualStudio2012/open-ephys.vcxproj
+++ b/Builds/VisualStudio2012/open-ephys.vcxproj
@@ -279,12 +279,8 @@
     <ClCompile Include="..\..\Source\Processors\AudioNode\AudioNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\CAR\CAR.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Channel\Channel.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Editor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp"/>
@@ -327,60 +323,34 @@
     <ClCompile Include="..\..\Source\Processors\FilterNode\FilterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\FilterNode\FilterNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\GenericProcessor\GenericProcessor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Merger\Merger.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Merger\MergerEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenter.cpp"/>
     <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Parameter\ParameterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Parameter\Parameter.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp"/>
     <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutput.cpp"/>
     <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutputEditor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5FileFormat.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5Recording.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\OriginalRecording.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\RecordEngine.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\RecordNode.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNodeEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp"/>
@@ -388,35 +358,19 @@
     <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInput.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInputEditor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNodeEditor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayCanvas.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayNode.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Splitter\Splitter.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Splitter\SplitterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\Visualizer.cpp"/>
diff --git a/Builds/VisualStudio2013/open-ephys.vcxproj b/Builds/VisualStudio2013/open-ephys.vcxproj
index ce96b5578..ce05f1be7 100644
--- a/Builds/VisualStudio2013/open-ephys.vcxproj
+++ b/Builds/VisualStudio2013/open-ephys.vcxproj
@@ -283,12 +283,8 @@
     <ClCompile Include="..\..\Source\Processors\AudioNode\AudioNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\CAR\CAR.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Channel\Channel.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Editor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp"/>
@@ -331,60 +327,34 @@
     <ClCompile Include="..\..\Source\Processors\FilterNode\FilterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\FilterNode\FilterNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\GenericProcessor\GenericProcessor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Merger\Merger.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Merger\MergerEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenter.cpp"/>
     <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Parameter\ParameterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Parameter\Parameter.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp"/>
     <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutput.cpp"/>
     <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutputEditor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5FileFormat.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5Recording.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\OriginalRecording.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\RecordEngine.cpp"/>
     <ClCompile Include="..\..\Source\Processors\RecordNode\RecordNode.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNodeEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp"/>
@@ -392,35 +362,19 @@
     <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInput.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInputEditor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNode.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNodeEditor.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayCanvas.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayNode.cpp"/>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp"/>
+    <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Splitter\Splitter.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Splitter\SplitterEditor.cpp"/>
     <ClCompile Include="..\..\Source\Processors\Visualization\Visualizer.cpp"/>
diff --git a/Source/AccessClass.cpp b/Source/AccessClass.cpp
index 216f9c82a..da66f8a0e 100644
--- a/Source/AccessClass.cpp
+++ b/Source/AccessClass.cpp
@@ -122,4 +122,4 @@ ActionBroadcaster* getBroadcaster()
     return bc.get();
 }
 
-}
\ No newline at end of file
+}
diff --git a/Source/Processors/Editors/ChannelSelector.h b/Source/Processors/Editors/ChannelSelector.h
old mode 100755
new mode 100644
diff --git a/Source/Processors/Editors/NetworkEventsEditor.cpp b/Source/Processors/Editors/NetworkEventsEditor.cpp
index bc9f5fb6a..a017995f8 100644
--- a/Source/Processors/Editors/NetworkEventsEditor.cpp
+++ b/Source/Processors/Editors/NetworkEventsEditor.cpp
@@ -1,136 +1,136 @@
-/*
-    ------------------------------------------------------------------
-
-    This file is part of the Open Ephys GUI
-    Copyright (C) 2013 Open Ephys
-
-    ------------------------------------------------------------------
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "NetworkEventsEditor.h"
-#include "../NetworkEvents/NetworkEvents.h"
-
-#include <stdio.h>
-
-NetworkEventsEditor::NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true)
-    : GenericEditor(parentNode, useDefaultParameterEditors)
-
-{
-	desiredWidth = 180;
-
-    urlLabel = new Label("Port", "Port:");
-    urlLabel->setBounds(20,80,140,25);
-    addAndMakeVisible(urlLabel);
-	NetworkEvents *p= (NetworkEvents *)getProcessor();
-
-	restartConnection = new UtilityButton("Restart Connection",Font("Default", 15, Font::plain));
-    restartConnection->setBounds(20,45,150,18);
-    restartConnection->addListener(this);
-    addAndMakeVisible(restartConnection);
-
-	
-	/*
-	trialSimulation = new UtilityButton("Trial",Font("Default", 15, Font::plain));
-    trialSimulation->setBounds(20,25,80,18);
-    trialSimulation->addListener(this);
-    addAndMakeVisible(trialSimulation);
-
-	
-	startRecord = new UtilityButton("Start Record",Font("Default", 15, Font::plain));
-    startRecord->setBounds(20,55,100,18);
-    startRecord->addListener(this);
-    addAndMakeVisible(startRecord);
-	*/
-
-	labelPort = new Label("Port", String(p->urlport));
-    labelPort->setBounds(70,85,80,18);
-    labelPort->setFont(Font("Default", 15, Font::plain));
-    labelPort->setColour(Label::textColourId, Colours::white);
-
-
-
-//		NetworkEvents *processor  = (NetworkEvents*) getProcessor();
-
-	//if (processor->threadRunning)
-		labelPort->setColour(Label::backgroundColourId, Colours::grey);
-//	else
-//		labelPort->setColour(Label::backgroundColourId, Colours::red);
-
-
-    labelPort->setEditable(true);
-    labelPort->addListener(this);
-    addAndMakeVisible(labelPort);
-
-    setEnabledState(false);
-
-}
-
-
-
-void NetworkEventsEditor::buttonEvent(Button* button)
-{
-			NetworkEvents *processor  = (NetworkEvents*) getProcessor();
-	if (button == restartConnection)
-	{
-		NetworkEvents *p= (NetworkEvents *)getProcessor();
-		p->setNewListeningPort(p->urlport);
-	}
-			/*
-	if (button == trialSimulation)
-	{
-		processor->simulateSingleTrial();
-
-	} else if (button == startRecord)
-	{
-		if (startRecord->getLabel() == "Start Record") 
-		{
-			processor->simulateStartRecord();
-			startRecord->setLabel("Stop Record");
-		} else if (startRecord->getLabel() == "Stop Record") 
-		{
-			processor->simulateStopRecord();
-			startRecord->setLabel("Start Record");
-		}
-	}
-    */
-
-}
-
-void NetworkEventsEditor::setLabelColor(juce::Colour color)
-{
-	labelPort->setColour(Label::backgroundColourId, color);
-}
-
-
-void NetworkEventsEditor::labelTextChanged(juce::Label *label)
-{
-	if (label == labelPort)
-	{
-	   Value val = label->getTextValue();
-
-		NetworkEvents *p= (NetworkEvents *)getProcessor();
-		p->setNewListeningPort(val.getValue());
-	}
-}
-
-
-NetworkEventsEditor::~NetworkEventsEditor()
-{
-
-}
-
-
+/*
+    ------------------------------------------------------------------
+
+    This file is part of the Open Ephys GUI
+    Copyright (C) 2013 Open Ephys
+
+    ------------------------------------------------------------------
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "NetworkEventsEditor.h"
+#include "../NetworkEvents/NetworkEvents.h"
+
+#include <stdio.h>
+
+NetworkEventsEditor::NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true)
+    : GenericEditor(parentNode, useDefaultParameterEditors)
+
+{
+	desiredWidth = 180;
+
+    urlLabel = new Label("Port", "Port:");
+    urlLabel->setBounds(20,80,140,25);
+    addAndMakeVisible(urlLabel);
+	NetworkEvents *p= (NetworkEvents *)getProcessor();
+
+	restartConnection = new UtilityButton("Restart Connection",Font("Default", 15, Font::plain));
+    restartConnection->setBounds(20,45,150,18);
+    restartConnection->addListener(this);
+    addAndMakeVisible(restartConnection);
+
+	
+	/*
+	trialSimulation = new UtilityButton("Trial",Font("Default", 15, Font::plain));
+    trialSimulation->setBounds(20,25,80,18);
+    trialSimulation->addListener(this);
+    addAndMakeVisible(trialSimulation);
+
+	
+	startRecord = new UtilityButton("Start Record",Font("Default", 15, Font::plain));
+    startRecord->setBounds(20,55,100,18);
+    startRecord->addListener(this);
+    addAndMakeVisible(startRecord);
+	*/
+
+	labelPort = new Label("Port", String(p->urlport));
+    labelPort->setBounds(70,85,80,18);
+    labelPort->setFont(Font("Default", 15, Font::plain));
+    labelPort->setColour(Label::textColourId, Colours::white);
+
+
+
+//		NetworkEvents *processor  = (NetworkEvents*) getProcessor();
+
+	//if (processor->threadRunning)
+		labelPort->setColour(Label::backgroundColourId, Colours::grey);
+//	else
+//		labelPort->setColour(Label::backgroundColourId, Colours::red);
+
+
+    labelPort->setEditable(true);
+    labelPort->addListener(this);
+    addAndMakeVisible(labelPort);
+
+    setEnabledState(false);
+
+}
+
+
+
+void NetworkEventsEditor::buttonEvent(Button* button)
+{
+			NetworkEvents *processor  = (NetworkEvents*) getProcessor();
+	if (button == restartConnection)
+	{
+		NetworkEvents *p= (NetworkEvents *)getProcessor();
+		p->setNewListeningPort(p->urlport);
+	}
+			/*
+	if (button == trialSimulation)
+	{
+		processor->simulateSingleTrial();
+
+	} else if (button == startRecord)
+	{
+		if (startRecord->getLabel() == "Start Record") 
+		{
+			processor->simulateStartRecord();
+			startRecord->setLabel("Stop Record");
+		} else if (startRecord->getLabel() == "Stop Record") 
+		{
+			processor->simulateStopRecord();
+			startRecord->setLabel("Start Record");
+		}
+	}
+    */
+
+}
+
+void NetworkEventsEditor::setLabelColor(juce::Colour color)
+{
+	labelPort->setColour(Label::backgroundColourId, color);
+}
+
+
+void NetworkEventsEditor::labelTextChanged(juce::Label *label)
+{
+	if (label == labelPort)
+	{
+	   Value val = label->getTextValue();
+
+		NetworkEvents *p= (NetworkEvents *)getProcessor();
+		p->setNewListeningPort(val.getValue());
+	}
+}
+
+
+NetworkEventsEditor::~NetworkEventsEditor()
+{
+
+}
+
+
diff --git a/Source/Processors/Editors/NetworkEventsEditor.h b/Source/Processors/Editors/NetworkEventsEditor.h
index cf69b266b..a27e3414c 100644
--- a/Source/Processors/Editors/NetworkEventsEditor.h
+++ b/Source/Processors/Editors/NetworkEventsEditor.h
@@ -1,64 +1,64 @@
-/*
-    ------------------------------------------------------------------
-
-    This file is part of the Open Ephys GUI
-    Copyright (C) 2013 Open Ephys
-
-    ------------------------------------------------------------------
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-
-#ifndef __NETWORKEVENTSEDITOR_H_D6EC8B49__
-#define __NETWORKEVENTSEDITOR_H_D6EC8B49__
-
-#include "../../../JuceLibraryCode/JuceHeader.h"
-#include "GenericEditor.h"
-
-class NetworkEvents;
-
-
-/**
-
-  User interface for the "FileReader" source node.
-
-  @see SourceNode, FileReaderThread
-
-*/
-
-class NetworkEventsEditor : public GenericEditor,public Label::Listener
-{
-public:
-    NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors);
-    virtual ~NetworkEventsEditor();
-
-    void buttonEvent(Button* button);
-	void labelTextChanged(juce::Label *);
-	void setLabelColor(juce::Colour color);
-private:
-
-	ScopedPointer<UtilityButton> restartConnection;
-    ScopedPointer<Label> urlLabel;
-	ScopedPointer<Label> labelPort;
-
-
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NetworkEventsEditor);
-
-};
-
-
-
-#endif  // __NETWORKEVENTSEDITOR_H_D6EC8B49__
+/*
+    ------------------------------------------------------------------
+
+    This file is part of the Open Ephys GUI
+    Copyright (C) 2013 Open Ephys
+
+    ------------------------------------------------------------------
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#ifndef __NETWORKEVENTSEDITOR_H_D6EC8B49__
+#define __NETWORKEVENTSEDITOR_H_D6EC8B49__
+
+#include "../../../JuceLibraryCode/JuceHeader.h"
+#include "GenericEditor.h"
+
+class NetworkEvents;
+
+
+/**
+
+  User interface for the "FileReader" source node.
+
+  @see SourceNode, FileReaderThread
+
+*/
+
+class NetworkEventsEditor : public GenericEditor,public Label::Listener
+{
+public:
+    NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors);
+    virtual ~NetworkEventsEditor();
+
+    void buttonEvent(Button* button);
+	void labelTextChanged(juce::Label *);
+	void setLabelColor(juce::Colour color);
+private:
+
+	ScopedPointer<UtilityButton> restartConnection;
+    ScopedPointer<Label> urlLabel;
+	ScopedPointer<Label> labelPort;
+
+
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NetworkEventsEditor);
+
+};
+
+
+
+#endif  // __NETWORKEVENTSEDITOR_H_D6EC8B49__
diff --git a/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp b/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp
index 5700a9d1d..753ec8e0e 100644
--- a/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp
+++ b/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp
@@ -1,1391 +1,1391 @@
-/*
-------------------------------------------------------------------
-
-This file is part of the Open Ephys GUI
-Copyright (C) 2015 Open Ephys
-
-------------------------------------------------------------------
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "PeriStimulusTimeHistogramEditor.h"
-#include "../../UI/EditorViewport.h"
-#include "../PSTH/TrialCircularBuffer.h"
-#include "../PSTH/tictoc.h"
-#include <stdio.h>
-
-
-#ifndef max
-#define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
-#endif
-
-
-#ifndef min
-#define min( a, b ) ( ((a) < (b)) ? (a) : (b) )
-#endif
-
-//FileSearchPathListComponent::paintListBoxItem
-PeriStimulusTimeHistogramEditor::PeriStimulusTimeHistogramEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true)
-    : VisualizerEditor(parentNode, useDefaultParameterEditors) ,periStimulusTimeHistogramCanvas(nullptr)
-{
-    showSortedUnits = true;
-    showLFP = true;
-    showCompactView = false;
-    showSmooth = true;
-    showRasters = false;
-    showAutoRescale = true;
-    showMatchRange = false;
-    TTLchannelTrialAlignment = -1;
-    smoothingMS = 10;
-
-
-    tabText = "PSTH";
-    desiredWidth = 300;
-
-
-    saveOptions = new UtilityButton("Save Options",Font("Default", 15, Font::plain));
-    saveOptions->addListener(this);
-    saveOptions->setColour(Label::textColourId, Colours::white);
-    saveOptions->setBounds(180,30,100,20);
-    addAndMakeVisible(saveOptions);
-
-
-    clearDisplay = new UtilityButton("Clear all",Font("Default", 15, Font::plain));
-    clearDisplay->addListener(this);
-    clearDisplay->setColour(Label::textColourId, Colours::white);
-    clearDisplay->setBounds(180,60,90,20);
-    addAndMakeVisible(clearDisplay);
-
-
-    visualizationOptions =  new UtilityButton("Visualization Options",Font("Default", 15, Font::plain));
-    visualizationOptions->addListener(this);
-    visualizationOptions->setColour(Label::textColourId, Colours::white);
-    visualizationOptions->setBounds(10,30,160,20);
-    addAndMakeVisible(visualizationOptions);
-
-    hardwareTrigger = new Label("hardwareTrigger","TTL Trial Alignment:");
-    hardwareTrigger->setFont(Font("Default", 14, Font::plain));
-    hardwareTrigger->setEditable(false);
-    hardwareTrigger->setJustificationType(Justification::centredLeft);
-    hardwareTrigger->setBounds(10,90,120,20);
-    addAndMakeVisible(hardwareTrigger);
-
-    hardwareTrialAlignment = new ComboBox("Hardware Trial Alignment");
-    hardwareTrialAlignment->setEditableText(false);
-    hardwareTrialAlignment->setJustificationType(Justification::centredLeft);
-    hardwareTrialAlignment->addListener(this);
-    hardwareTrialAlignment->setBounds(130,90,70,20);
-    hardwareTrialAlignment->addItem("Not set",1);
-    for (int k=0; k<8; k++)
-    {
-        hardwareTrialAlignment->addItem("TTL "+String(k+1),k+2);
-    }
-    if (TTLchannelTrialAlignment == -1)
-        hardwareTrialAlignment->setSelectedId(1, sendNotification);
-    else
-        hardwareTrialAlignment->setSelectedId(TTLchannelTrialAlignment+2, sendNotification);
-
-    addAndMakeVisible(hardwareTrialAlignment);
-
-
-}
-
-
-
-void PeriStimulusTimeHistogramEditor::saveVisualizerParameters(XmlElement* xml)
-{
-
-    XmlElement* xmlNode = xml->createNewChildElement("PSTH_EDITOR");
-    xmlNode->setAttribute("showSortedUnits",showSortedUnits);
-
-    xmlNode->setAttribute("showLFP",showLFP);
-    xmlNode->setAttribute("showCompactView",showCompactView);
-    xmlNode->setAttribute("showSmooth",showSmooth);
-    xmlNode->setAttribute("showAutoRescale",showAutoRescale);
-    xmlNode->setAttribute("showRasters",showRasters);
-    xmlNode->setAttribute("showMatchRange",showMatchRange);
-    xmlNode->setAttribute("TTLchannelTrialAlignment",TTLchannelTrialAlignment);
-    xmlNode->setAttribute("smoothingMS",smoothingMS);
-}
-
-void PeriStimulusTimeHistogramEditor::loadVisualizerParameters(XmlElement* xml)
-{
-    forEachXmlChildElement(*xml, xmlNode)
-    {
-        if (xmlNode->hasTagName("PSTH_EDITOR"))
-        {
-
-            showLFP = xmlNode->getBoolAttribute("showLFP");
-            showCompactView = xmlNode->getBoolAttribute("showCompactView");
-            showSmooth = xmlNode->getBoolAttribute("showSmooth");
-            showAutoRescale = xmlNode->getBoolAttribute("showAutoRescale");
-            showRasters= xmlNode->getBoolAttribute("showRasters",false);
-            showMatchRange = xmlNode->getBoolAttribute("showMatchRange");
-            TTLchannelTrialAlignment = xmlNode->getIntAttribute("TTLchannelTrialAlignment");
-            smoothingMS = xmlNode->getIntAttribute("smoothingMS");
-
-            if (periStimulusTimeHistogramCanvas != nullptr)
-            {
-                periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP);
-                periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits);
-                periStimulusTimeHistogramCanvas->setCompactView(showCompactView);
-                periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale);
-                periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange);
-                periStimulusTimeHistogramCanvas->setSmoothing(smoothingMS,true);
-                periStimulusTimeHistogramCanvas->setRasterMode(showRasters);
-            }
-        }
-    }
-}
-
-
-void PeriStimulusTimeHistogramEditor::comboBoxChanged(ComboBox* comboBox)
-{
-
-    if (comboBox == hardwareTrialAlignment)
-    {
-        std::cout << "Setting hardware trigger alignment channel to " << comboBox->getSelectedId()-2 << std::endl;
-        PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
-        processor->setHardwareTriggerAlignmentChannel(comboBox->getSelectedId()-2);
-    }
-}
-
-void PeriStimulusTimeHistogramEditor::visualizationMenu()
-{
-    PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
-
-    PopupMenu m;
-    m.addItem(1,"Sorted Units",true, showSortedUnits);
-    m.addItem(2,"LFP",true, showLFP);
-    m.addItem(3,"Compact View",true, showCompactView);
-
-    PopupMenu smoothingSubMenu;
-    int SmoothingFactors[8] = {0,1,2,5,10,20,50,100};
-    for (int k=0; k<8; k++)
-    {
-        String s;
-        if (SmoothingFactors[k] == 0)
-            s = "No Smoothing";
-        else
-            s = String(SmoothingFactors[k]) + " ms";
-
-        smoothingSubMenu.addItem(40+k,s,true, smoothingMS == SmoothingFactors[k]);
-    }
-
-    PopupMenu rangeTimeMenu,preRangeTimeMenu,postRangeTimeMenu;
-    double rangeTimes[4] = {0.5,1,1.5,2};
-    TrialCircularBufferParams params = processor->trialCircularBuffer->getParams();
-
-    for (int k=0; k<4; k++)
-    {
-        String s = String(rangeTimes[k],1) + " sec";
-        if (processor->trialCircularBuffer == nullptr)
-        {
-            preRangeTimeMenu.addItem(50+k,s,true, false);
-            postRangeTimeMenu.addItem(60+k,s,true, false);
-        }
-        else
-        {
-            preRangeTimeMenu.addItem(50+k,s,true, fabs(params.preSec - rangeTimes[k])<0.01);
-            postRangeTimeMenu.addItem(60+k,s,true, fabs(params.postSec - rangeTimes[k])<0.01);
-        }
-    }
-    rangeTimeMenu.addSubMenu("pre trial", preRangeTimeMenu,true);
-    rangeTimeMenu.addSubMenu("post trial", postRangeTimeMenu,true);
-
-    m.addSubMenu("Smooth Curves", smoothingSubMenu);
-    m.addItem(7,"Raster mode",true, showRasters);
-
-    m.addSubMenu("Range", rangeTimeMenu,true);
-    m.addItem(5,"Auto Rescale",true, showAutoRescale);
-    m.addItem(6,"Match range",true, showMatchRange);
-    m.addItem(8,"Bar Graph",false, false);
-    m.addItem(9,"2D Heat map",false, false);
-    const int result = m.show();
-    switch (result)
-    {
-        case 1:
-            showSortedUnits=!showSortedUnits;
-            periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits);
-            break;
-        case 2:
-            showLFP=!showLFP;
-            periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP);
-            break;
-        case 3:
-            showCompactView=!showCompactView;
-            periStimulusTimeHistogramCanvas->setCompactView(showCompactView);
-            break;
-        case 5:
-            showAutoRescale=!showAutoRescale;
-            periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale);
-            break;
-        case 6:
-            showMatchRange=!showMatchRange;
-            periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange);
-            break;
-        case 7:
-            showRasters = !showRasters;
-            periStimulusTimeHistogramCanvas->setRasterMode(showRasters);
-            break;
-    }
-    if (result >= 40 && result <= 47)
-    {
-        smoothingMS = SmoothingFactors[result-40];
-        periStimulusTimeHistogramCanvas->setSmoothing(SmoothingFactors[result-40],result-40>0);
-    }
-    else if (result >= 50 && result <= 54)
-    {
-        // this will require killing
-        double newPreSec = rangeTimes[result-50];
-        processor->modifyTimeRange(newPreSec,params.postSec);
-    }
-    else if (result >= 60 && result <= 64)
-    {
-        double newPostSec = rangeTimes[result-60];
-        processor->modifyTimeRange(params.preSec,newPostSec);
-    }
-}
-
-void PeriStimulusTimeHistogramEditor::buttonEvent(Button* button)
-{
-    VisualizerEditor::buttonEvent(button);
-    if (periStimulusTimeHistogramCanvas == nullptr)
-        return;
-
-    PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
-
-    if (button == clearDisplay)
-    {
-        if (processor->trialCircularBuffer != nullptr)
-        {
-            processor->trialCircularBuffer->clearAll();
-            repaint();
-        }
-    }
-    else if (button == visualizationOptions)
-    {
-        visualizationMenu();
-    }
-    else if (button == saveOptions)
-    {
-
-        PopupMenu m;
-
-
-        /*	m.addItem(1,"TTL",true, processor->saveTTLs);
-        	m.addItem(2,"Network Events",true, processor->saveNetworkEvents);
-        	m.addItem(7,"Network Events [when recording is off]",true, processor->saveNetworkEventsWhenNotRecording);
-        	m.addItem(3,"Eye Tracking",true, processor->saveEyeTracking);*/
-
-        //m.addItem(4,"Sorted Spikes: TS only ",true, processor->spikeSavingMode == 1);
-        m.addItem(5,"Sorted Spikes: TS+waveform",true, processor->spikeSavingMode == 2);
-        m.addItem(6,"All Spikes: TS+waveform",true, processor->spikeSavingMode == 3);
-
-        const int result = m.show();
-
-        if (result == 1)
-        {
-            processor->saveTTLs = !processor->saveTTLs;
-        }
-        else if (result == 2)
-        {
-            processor->saveNetworkEvents = !processor->saveNetworkEvents;
-        }
-        else if (result == 3)
-        {
-            processor->saveEyeTracking = !processor->saveEyeTracking;
-        }
-        else if (result == 4)
-        {
-            if (processor->spikeSavingMode == 1)
-                processor->spikeSavingMode = 0;
-            else
-                processor->spikeSavingMode = 1;
-        }
-        else if (result == 5)
-        {
-            if (processor->spikeSavingMode == 2)
-                processor->spikeSavingMode = 0;
-            else
-                processor->spikeSavingMode = 2;
-        }
-        else if (result == 6)
-        {
-            if (processor->spikeSavingMode == 3)
-                processor->spikeSavingMode = 0;
-            else
-                processor->spikeSavingMode = 3;
-        }
-        else if (result == 7)
-        {
-            processor->saveNetworkEventsWhenNotRecording = !processor->saveNetworkEventsWhenNotRecording;
-        }
-
-    } /*else if (button == visibleConditions)
-	{
-
-
-		if ( processor->trialCircularBuffer != nullptr)
-		{
-			processor->trialCircularBuffer ->lockConditions();
-			PopupMenu m;
-
-			for (int i = 0; i < processor->trialCircularBuffer->conditions.size(); i++)
-			{
-				{
-
-					String name = processor->trialCircularBuffer->conditions[i].name;
-					m.addItem(i+1, name,true,processor->trialCircularBuffer->conditions[i].visible);
-				}
-			}
-
-			const int result = m.show();
-
-			if (result > 0)
-			{
-				// update the visibility for all channels and units.
-				PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
-				processor->toggleConditionVisibility(result-1);
-				if (periStimulusTimeHistogramCanvas != nullptr)
-				{
-					periStimulusTimeHistogramCanvas->update();
-				}
-
-			}
-			processor->trialCircularBuffer ->unlockConditions();
-		}
-
-	}*/
-
-
-
-}
-
-
-Visualizer* PeriStimulusTimeHistogramEditor::createNewCanvas()
-{
-    PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
-    periStimulusTimeHistogramCanvas = new PeriStimulusTimeHistogramCanvas(processor);
-    //ActionListener* listener = (ActionListener*) periStimulusTimeHistogramCanvas;
-    //getUIComponent()->registerAnimatedComponent(listener);
-    return periStimulusTimeHistogramCanvas;
-}
-
-void PeriStimulusTimeHistogramEditor::updateCanvas()
-{
-    if (periStimulusTimeHistogramCanvas != nullptr)
-    {
-        periStimulusTimeHistogramCanvas->updateNeeded = true;
-    }
-}
-
-PeriStimulusTimeHistogramEditor::~PeriStimulusTimeHistogramEditor()
-{
-
-
-}
-
-
-
-
-
-
-
-/********************************/
-#ifndef MAX
-#define MAX(x,y)((x)>(y))?(x):(y)
-#endif
-
-#ifndef MIN
-#define MIN(x,y)((x)<(y))?(x):(y)
-#endif
-
-
-PeriStimulusTimeHistogramCanvas::PeriStimulusTimeHistogramCanvas(PeriStimulusTimeHistogramNode* n) :
-    processor(n)
-{
-    screenWidth = screenHeight = 0;
-    conditionWidth = 200;
-
-    inFocusedMode = false;
-    showLFP = true;
-    showSpikes = true;
-    matchRange = false;
-    smoothPlots = true;
-    autoRescale = true;
-    compactView = false;
-    rasterMode = false;
-    gaussianStandardDeviationMS = 10;
-    viewport = new Viewport();
-    psthDisplay = new PeriStimulusTimeHistogramDisplay(n, viewport, this);
-    viewport->setViewedComponent(psthDisplay, false);
-    viewport->setScrollBarsShown(true, true);
-    addAndMakeVisible(viewport);
-
-
-    visualizationButton = new UtilityButton("Visualization Options",Font("Default", 15, Font::plain));
-    visualizationButton->addListener(this);
-    addAndMakeVisible(visualizationButton);
-
-    clearAllButton = new UtilityButton("Clear all",Font("Default", 15, Font::plain));
-    clearAllButton->addListener(this);
-    addAndMakeVisible(clearAllButton);
-
-    conditionsViewport = new Viewport();
-    conditionsList = new ConditionList(n, conditionsViewport, this);
-    conditionsViewport->setViewedComponent(conditionsList, false);
-    conditionsViewport->setScrollBarsShown(true, true);
-    addAndMakeVisible(conditionsViewport);
-
-    zoomButton = new UtilityButton("Zoom",Font("Default", 15, Font::plain));
-    zoomButton->addListener(this);
-    zoomButton->setColour(Label::textColourId, Colours::white);
-    addAndMakeVisible(zoomButton);
-    panButton = new UtilityButton("Pan",Font("Default", 15, Font::plain));
-    panButton->addListener(this);
-    panButton->setColour(Label::textColourId, Colours::white);
-    panButton->setToggleState(true, dontSendNotification);
-
-    addAndMakeVisible(panButton);
-    resetAxesButton = new UtilityButton("Reset Axes",Font("Default", 15, Font::plain));
-    resetAxesButton->addListener(this);
-    resetAxesButton->setColour(Label::textColourId, Colours::white);
-    addAndMakeVisible(resetAxesButton);
-
-
-    resized();
-    update();
-
-}
-
-
-PeriStimulusTimeHistogramCanvas::~PeriStimulusTimeHistogramCanvas()
-{
-
-}
-
-void PeriStimulusTimeHistogramCanvas::beginAnimation()
-{
-
-    std::cout << "PeriStimulusTimeHistogramCanvas starting animation." << std::endl;
-    startCallbacks();
-
-}
-
-void PeriStimulusTimeHistogramCanvas::buttonClicked(Button* button)
-{
-    if (button == visualizationButton)
-    {
-        PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor();
-        ed->visualizationMenu();
-    }
-    else if (button == clearAllButton)
-    {
-        processor->trialCircularBuffer->clearAll();
-    }
-    else if (button == zoomButton)
-    {
-        zoomButton->setToggleState(true, dontSendNotification);
-        panButton->setToggleState(false, dontSendNotification);
-        for (int k=0; k<psthDisplay->psthPlots.size(); k++)
-        {
-            psthDisplay->psthPlots[k]->setMode(ZOOM);
-        }
-    }
-    else if (button == panButton)
-    {
-        zoomButton->setToggleState(false, dontSendNotification);
-        panButton->setToggleState(true, dontSendNotification);
-        for (int k=0; k<psthDisplay->psthPlots.size(); k++)
-        {
-            psthDisplay->psthPlots[k]->setMode(PAN);
-        }
-    }
-    else if (button == resetAxesButton)
-    {
-        for (int k=0; k<psthDisplay->psthPlots.size(); k++)
-        {
-            psthDisplay->psthPlots[k]->resetAxes();
-        }
-    }
-}
-
-void PeriStimulusTimeHistogramCanvas::endAnimation()
-{
-    std::cout << "PeriStimulusTimeHistogramCanvas ending animation." << std::endl;
-
-    stopCallbacks();
-}
-
-void PeriStimulusTimeHistogramCanvas::setRasterMode(bool rasterModeActive)
-{
-    rasterMode = rasterModeActive;
-    update();
-}
-
-void PeriStimulusTimeHistogramCanvas::setLFPvisibility(bool visible)
-{
-    showLFP = visible;
-    update();
-}
-
-void PeriStimulusTimeHistogramCanvas::setSpikesVisibility(bool visible)
-{
-    showSpikes = visible;
-    update();
-}
-
-void PeriStimulusTimeHistogramCanvas::setSmoothing(float _gaussianStandardDeviationMS, bool smooth_enabled)
-{
-    gaussianStandardDeviationMS=_gaussianStandardDeviationMS;
-    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
-    {
-        if (smooth_enabled)
-        {
-            psthDisplay->psthPlots[k]->buildSmoothKernel(gaussianStandardDeviationMS);
-            psthDisplay->psthPlots[k]->setSmoothState(true);
-        }
-        else
-        {
-            psthDisplay->psthPlots[k]->setSmoothState(false);
-        }
-        psthDisplay->psthPlots[k]->repaint();
-    }
-
-}
-
-void PeriStimulusTimeHistogramCanvas::setSmoothPSTH(bool smooth)
-{
-    smoothPlots = smooth;
-    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
-    {
-        psthDisplay->psthPlots[k]->setSmoothState(smoothPlots);
-        psthDisplay->psthPlots[k]->repaint();
-    }
-
-}
-
-void PeriStimulusTimeHistogramCanvas::setCompactView(bool compact)
-{
-    compactView = compact;
-    update();
-}
-
-void PeriStimulusTimeHistogramCanvas::setMatchRange(bool on)
-{
-    matchRange = on;
-    //update();
-}
-
-bool PeriStimulusTimeHistogramCanvas::getMatchRange()
-{
-    return matchRange;
-}
-
-void PeriStimulusTimeHistogramCanvas::setAutoRescale(bool state)
-{
-    autoRescale = state;
-    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
-    {
-        psthDisplay->psthPlots[k]->setAutoRescale(autoRescale);
-        psthDisplay->psthPlots[k]->repaint();
-    }
-}
-
-void PeriStimulusTimeHistogramCanvas::setRange(double xmin, double xmax, double ymin, double ymax, xyPlotTypes plotType)
-{
-
-    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
-    {
-        if (psthDisplay->psthPlots[k]->getPlotType() == plotType)
-        {
-            psthDisplay->psthPlots[k]->setXRange(xmin,xmax);
-            psthDisplay->psthPlots[k]->setYRange(ymin,ymax);
-        }
-        else
-        {
-            psthDisplay->psthPlots[k]->setXRange(xmin,xmax);
-        }
-    }
-}
-
-
-void PeriStimulusTimeHistogramCanvas::refreshState()
-{
-    update();
-    resized();
-}
-
-
-void PeriStimulusTimeHistogramCanvas::update()
-{
-    //std::cout << "Updating SpikeDisplayCanvas" << std::endl;
-    // clear all XY plots and create new ones...
-    // delete all existing plots.
-    // lock psth
-    bool inPanMode = panButton->getToggleState();
-
-    heightPerElectrodePix = 300;
-    widthPerUnit = 300;
-    int maxUnitsPerRow = (screenWidth-conditionWidth)/ widthPerUnit;
-    updateNeeded = false;
-    for (int k = 0; k < psthDisplay->psthPlots.size(); k++)
-    {
-        delete psthDisplay->psthPlots[k];
-    }
-    psthDisplay->psthPlots.clear();
-    if (processor->trialCircularBuffer == nullptr)
-        return;
-
-    const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
-
-    //processor->trialCircularBuffer->lockPSTH();
-    numElectrodes = processor->trialCircularBuffer->getNumElectrodes();
-    int maxUnitsPerElectrode = 0;
-    int row = 0;
-    int plotCounter = 0;
-    numCols = 0;
-    numRows = 0;
-    int plotID = 0;
-    for (int e = 0; e < numElectrodes; e++)
-    {
-        int offset = 0;
-        bool plottedSomething = false;
-        int electrodeID = processor->trialCircularBuffer->getElectrodeID(e);
-        String electrodeName = processor->trialCircularBuffer->getElectrodeName(e);
-
-        if (showLFP)
-        {
-            std::vector<int> channels = processor->trialCircularBuffer->getElectrodeChannels(e);
-            offset = channels.size();
-            for (int u=0; u<channels.size(); u++)
-            {
-                GenericPlot* newplot;
-                if (compactView)
-                {
-                    String plotName = electrodeName+" Ch:"+String(1+u);
-                    newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer,
-                                              electrodeID,
-                                              channels[u],
-                                              plotCounter,row,rasterMode,inPanMode);
-
-                    plotCounter++;
-                    numCols++;
-                    numCols = min(maxUnitsPerRow,numCols);
-
-                    if (plotCounter >= maxUnitsPerRow)
-                    {
-                        plotCounter = 0;
-                        row++;
-                    }
-                }
-                else
-                {
-                    String plotName = electrodeName+":Ch "+String(1+u);
-                    newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer,
-                                              electrodeID,
-                                              channels[u],
-                                              u,row,rasterMode,inPanMode);
-                    numCols = max(numCols,u);
-
-                }
-                newplot->setSmoothState(smoothPlots);
-                newplot->setAutoRescale(autoRescale);
-                newplot->buildSmoothKernel(gaussianStandardDeviationMS);
-                psthDisplay->psthPlots.push_back(newplot);
-                psthDisplay->addAndMakeVisible(newplot);
-                plottedSomething = true;
-            }
-
-        }
-
-        if (showSpikes)
-        {
-            int numUnits = processor->trialCircularBuffer->getNumUnitsInElectrode(e);
-            maxUnitsPerElectrode = MAX(maxUnitsPerElectrode,numUnits);
-            if (numUnits > 0)
-            {
-                for (int u=0; u<numUnits; u++)
-                {
-                    GenericPlot* newplot;
-                    if (compactView)
-                    {
-                        String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u));
-                        newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer,
-                                                  electrodeID,
-                                                  processor->trialCircularBuffer->getUnitID(e,u),
-                                                  plotCounter,row,rasterMode,inPanMode);
-                        plotCounter++;
-                        numCols++;
-                        numCols = min(maxUnitsPerRow,numCols);
-
-                        if (plotCounter >= maxUnitsPerRow)
-                        {
-                            plotCounter = 0;
-                            row++;
-                        }
-                    }
-                    else
-                    {
-                        String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u));
-                        newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer,
-                                                  electrodeID,
-                                                  processor->trialCircularBuffer->getUnitID(e,u),
-                                                  offset+u,row,rasterMode,inPanMode);
-                        numCols = max(numCols,offset+u);
-                    }
-                    newplot->setSmoothState(smoothPlots);
-                    newplot->setAutoRescale(autoRescale);
-                    newplot->buildSmoothKernel(gaussianStandardDeviationMS);
-
-                    psthDisplay->psthPlots.push_back(newplot);
-                    psthDisplay->addAndMakeVisible(newplot);
-                }
-                plottedSomething = true;
-            }
-        }
-        if (!compactView &&  plottedSomething)
-            row++;
-    }
-    if (compactView)
-    {
-        numRows = row+1;//MAX(1,row);
-    }
-    else
-    {
-        numRows = row;
-        numCols = numCols+1;
-    }
-
-    if (maxUnitsPerElectrode == 0 && !showLFP)
-    {
-        // nothing to be drawn...
-        //processor->trialCircularBuffer->unlockPSTH();
-        return;
-    }
-
-    psthDisplay->resized();
-    psthDisplay->repaint();
-    psthDisplay->refresh();
-    resized();
-    repaint();
-
-    //processor->trialCircularBuffer->unlockPSTH();
-    conditionsList->updateConditionButtons();
-}
-
-
-void PeriStimulusTimeHistogramCanvas::resized()
-{
-    screenWidth = getWidth();
-    screenHeight = getHeight();
-
-    int scrollBarThickness = viewport->getScrollBarThickness();
-
-    viewport->setBounds(0,30,getWidth()-conditionWidth,getHeight()-30);
-    int totalHeight = numRows * heightPerElectrodePix;
-    int totalWidth = numCols * widthPerUnit;
-    psthDisplay->setBounds(0,0,totalWidth, totalHeight);
-
-    int numConditions = 0;
-    if (processor->trialCircularBuffer != nullptr)
-    {
-        numConditions = processor->trialCircularBuffer->getNumConditions();
-    }
-
-    conditionsViewport->setBounds(getWidth()-conditionWidth,30,conditionWidth,getHeight());
-    conditionsList->setBounds(0,0,conditionWidth, 50+20*numConditions);
-
-    visualizationButton->setBounds(20,5,150,20);
-    clearAllButton->setBounds(200,5,150,20);
-
-    zoomButton->setBounds(360,5,60,20);
-    panButton->setBounds(440,5,60,20);
-    resetAxesButton->setBounds(510,5,150,20);
-
-}
-
-void PeriStimulusTimeHistogramCanvas::paint(Graphics& g)
-{
-    if (updateNeeded)
-        update();
-    g.fillAll(Colours::grey);
-
-}
-
-void PeriStimulusTimeHistogramCanvas::refresh()
-{
-    repaint();
-    psthDisplay->refresh();
-}
-
-/***********************************************/
-
-PeriStimulusTimeHistogramDisplay::PeriStimulusTimeHistogramDisplay(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) :
-    processor(n), viewport(p), canvas(c)
-{
-
-    font = Font("Default", 15, Font::plain);
-}
-
-PeriStimulusTimeHistogramDisplay::~PeriStimulusTimeHistogramDisplay()
-{
-    for (int k = 0; k < psthPlots.size(); k++)
-    {
-        delete(psthPlots[k]);
-    }
-    psthPlots.clear();
-}
-
-void PeriStimulusTimeHistogramDisplay::refresh()
-{
-    for (int k = 0; k < psthPlots.size(); k++)
-    {
-        psthPlots[k]->repaint();
-    }
-
-}
-
-void PeriStimulusTimeHistogramDisplay::paint(Graphics& g)
-{
-    g.setColour(Colours::white);
-    g.drawRect(0,0,getWidth(),getHeight());
-    /*
-    	font = Font("Default", 15, Font::plain);
-
-    	g.setFont(font);
-
-    	g.drawText("Test",10,0,200,20,Justification::left,false);
-    	*/
-}
-
-void PeriStimulusTimeHistogramDisplay::setAutoRescale(bool state)
-{
-    // draw n by m grid
-    PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor();
-    ed->showAutoRescale = state;
-
-    for (int k=0; k<psthPlots.size(); k++)
-    {
-        psthPlots[k]->setAutoRescale(state);
-    }
-
-}
-
-void PeriStimulusTimeHistogramDisplay::resized()
-{
-    // draw n by m grid
-    for (int k=0; k<psthPlots.size(); k++)
-    {
-        if (psthPlots[k]->isFullScreen())
-        {
-            int newSize = MIN(canvas->screenWidth,canvas->screenHeight);
-            setBounds(0,0,newSize,newSize);
-            psthPlots[k]->setBounds(0,0,newSize-30,newSize-30);
-
-        }
-        else
-        {
-            psthPlots[k]->setBounds(psthPlots[k]->getRow() * canvas->widthPerUnit,
-                                    psthPlots[k]->getCol() * canvas->heightPerElectrodePix,
-                                    canvas->widthPerUnit,
-                                    canvas->heightPerElectrodePix);
-        }
-
-    }
-}
-
-void PeriStimulusTimeHistogramDisplay::focusOnPlot(int plotID)
-{
-    int plotIndex = -1;
-    for (int i=0; i<psthPlots.size(); i++)
-    {
-        if (psthPlots[i]->getPlotID() == plotID)
-        {
-            plotIndex = i;
-            break;
-        }
-
-    }
-    if (plotIndex == -1)
-        return;
-    if (psthPlots[plotIndex]->isFullScreen())
-    {
-
-        psthPlots[plotIndex]->toggleFullScreen(false);
-        psthPlots[plotIndex]->setBounds(psthPlots[plotIndex]->getRow() * canvas->widthPerUnit,
-                                        psthPlots[plotIndex]->getCol() * canvas->heightPerElectrodePix,
-                                        canvas->widthPerUnit,
-                                        canvas->heightPerElectrodePix);
-        // hide all other plots.
-        for (int k=0; k<psthPlots.size(); k++)
-        {
-            psthPlots[k]->setVisible(true);
-            psthPlots[k]->repaint();
-        }
-
-    }
-    else
-    {
-        // hide all other plots.
-        for (int k=0; k<psthPlots.size(); k++)
-        {
-            if (psthPlots[k]->getPlotID() != plotID)
-                psthPlots[k]->setVisible(false);
-        }
-        psthPlots[plotIndex]->toggleFullScreen(true);
-        // make sure its rectangular...?
-        int newSize = MIN(canvas->screenWidth,canvas->screenHeight);
-        setBounds(0,0,newSize,newSize);
-        psthPlots[plotIndex]->setBounds(0,0,newSize-30,newSize-30);
-        psthPlots[plotIndex]->repaint();
-    }
-
-}
-
-/***********************************/
-ConditionList::ConditionList(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) :
-    processor(n), viewport(p), canvas(c)
-{
-
-    titleButton = new ColorButton("CONDITIONS LIST", Font("Default", 24, Font::plain));
-    titleButton->setBounds(0,0, 200,25);
-    titleButton->addListener(this);
-    addAndMakeVisible(titleButton);
-
-    allButton = new ColorButton("All", Font("Default", 20, Font::plain));
-    allButton->setBounds(0,25,100,20);
-    allButton->addListener(this);
-    addAndMakeVisible(allButton);
-
-    noneButton = new ColorButton("None", Font("Default", 20, Font::plain));
-    noneButton->setBounds(100,25,100,20);
-    noneButton->addListener(this);
-    addAndMakeVisible(noneButton);
-
-    updateConditionButtons();
-
-}
-
-
-void ConditionList::updateConditionButtons()
-{
-    if (processor->trialCircularBuffer != nullptr)
-    {
-        const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
-        //processor->trialCircularBuffer->lockConditions();
-        conditionButtons.clear();
-        for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++)
-        {
-            Condition cond = processor->trialCircularBuffer->getCondition(k);
-            ColorButton* conditionButton = new ColorButton(cond.name, Font("Default", 20, Font::plain));
-            conditionButton->setBounds(0,50+k*20,200,20);
-            conditionButton->setColors(Colours::white,
-                                       juce::Colour::fromRGB(cond.colorRGB[0],
-                                                             cond.colorRGB[1],
-                                                             cond.colorRGB[2]));
-            conditionButton->setEnabledState(cond.visible);
-            conditionButton->setUserDefinedData(cond.conditionID);
-            conditionButton->setShowEnabled(true);
-            conditionButton->addListener(this);
-            addAndMakeVisible(conditionButton);
-            conditionButtons.add(conditionButton);
-        }
-
-        //processor->trialCircularBuffer->unlockConditions();
-    }
-}
-
-ConditionList::~ConditionList()
-{
-
-    for (int i = 0; i < conditionButtons.size(); i++)
-    {
-        removeChildComponent(conditionButtons[i]);
-    }
-}
-
-void ConditionList::paint(Graphics& g)
-{
-    g.fillAll(juce::Colours::grey);
-    //g.drawText
-}
-
-void ConditionList::buttonClicked(Button* btn)
-{
-    ColorButton* cbtn = (ColorButton*)btn;
-    // also inform trial circular buffer about visibility change.
-    if (btn == titleButton)
-    {
-        int x = 5;
-    }
-    else if (btn == noneButton)
-    {
-        if (processor->trialCircularBuffer != nullptr)
-        {
-            //processor->trialCircularBuffer->lockConditions();
-            const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
-            for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++)
-            {
-                processor->trialCircularBuffer->modifyConditionVisibility(k,false);
-                conditionButtons[k]->setEnabledState(false);
-            }
-            //processor->trialCircularBuffer->unlockConditions();
-        }
-
-    }
-    else if (btn == allButton)
-    {
-        if (processor->trialCircularBuffer != nullptr)
-        {
-            const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
-            //processor->trialCircularBuffer->lockConditions();
-            for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++)
-            {
-                processor->trialCircularBuffer->modifyConditionVisibility(k,true);
-                conditionButtons[k]->setEnabledState(true);
-            }
-            //processor->trialCircularBuffer->unlockConditions();
-        }
-
-    }
-    else
-    {
-        // probably a condition button
-        int conditionID = cbtn->getUserDefinedData();
-        cbtn->setEnabledState(!cbtn->getEnabledState());
-        processor->trialCircularBuffer->modifyConditionVisibilityusingConditionID(conditionID, cbtn->getEnabledState());
-    }
-
-    repaint();
-}
-
-
-/*************************************************************************/
-// Generic plot replaces XYPlot class, with better class organization and code encapsulation.
-// All low level plotting of curves is handled by MatlabLikePlot object (including zooming / panning / ...)
-// All raster plots will be handled by another class (?)
-//
-
-GenericPlot::GenericPlot(String name,PeriStimulusTimeHistogramDisplay* dsp, int plotID_, xyPlotTypes plotType_,
-                         TrialCircularBuffer* tcb_, int electrodeID_, int subID_, int row_, int col_, bool rasterMode_, bool panM) :  tcb(tcb_), electrodeID(electrodeID_), plotID(plotID_),
-    plotType(plotType_), subID(subID_), row(row_), col(col_), rasterMode(rasterMode_),display(dsp),plotName(name),inPanMode(panM)
-{
-    fullScreenMode = false;
-    mlp = new MatlabLikePlot();
-    mlp->setControlButtonsVisibile(false);
-    TrialCircularBufferParams params =  tcb->getParams();
-
-    if (inPanMode)
-        mlp->setMode(DrawComponentMode::PAN);
-    else
-        mlp->setMode(DrawComponentMode::ZOOM);
-
-    if (rasterMode)
-    {
-        mlp->setImageMode(true);
-        mlp->setAutoRescale(false);
-    }
-    else
-        mlp->setImageMode(false);
-
-
-    addAndMakeVisible(mlp);
-
-    mlp->setTitle(plotName);
-    if (plotType == SPIKE_PLOT)
-    {
-        //mlp->setTitle("Unit "+String(electrodeID)+":"+String(subID));
-        mlp->setFiringRateMode(true);
-        mlp->setBorderColor(tcb->getUnitColor(electrodeID, subID));
-        int uniqueIntervalID = tcb->getUnitUniqueInterval(electrodeID, subID);
-        mlp->setActivateButtonVisiblilty(true, uniqueIntervalID);
-        mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,0,1e3);
-    }
-    else if (plotType == LFP_PLOT)
-    {
-        //	mlp->setTitle("Ch "+String(electrodeID)+":"+String(subID));
-        mlp->setBorderColor(juce::Colours::white);
-        mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,-1e3,1e3);
-    }
-
-    guassianStandardDeviationMS = 5; // default smoothing
-    buildSmoothKernel(guassianStandardDeviationMS);
-
-    smoothPlot = plotType == SPIKE_PLOT; // don't smooth LFPs
-    fullScreenMode = false;
-}
-
-xyPlotTypes GenericPlot::getPlotType()
-{
-    return plotType;
-}
-
-void GenericPlot::resized()
-{
-    int w = getWidth();
-    int h = getHeight();
-    mlp->setBounds(0,0,w,h);
-}
-
-void GenericPlot::paintSpikeRaster(Graphics& g)
-{
-    //tictoc.Tic(16);
-    int numTrialTypes = tcb->getNumTrialTypesInUnit(electrodeID, subID);
-    if (numTrialTypes > 0)
-    {
-        int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID);
-        mlp->setAuxiliaryString(String(numTrials) + " trials");
-
-        float xmin,xmax,ymin,ymax,maxValue;
-        mlp->getRange(xmin,xmax,ymin,ymax);
-        juce::Image rasterImage = tcb->getTrialsAverageUnitResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax,  maxValue);
-        mlp->drawImage(rasterImage,maxValue);
-    }
-    //tictoc.Toc(17);
-}
-
-void GenericPlot::paintSpikes(Graphics& g)
-{
-    //tictoc.Tic(15);
-    std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID);
-    int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID);
-    mlp->setAuxiliaryString(String(numTrials) + " trials");
-
-    mlp->clearplot();
-    for (int k=0; k<lines.size(); k++)
-    {
-        if (smoothPlot)
-        {
-            lines[k].smooth(smoothKernel);
-        }
-        mlp->plotxy(lines[k]);
-    }
-    //tictoc.Toc(15);
-}
-
-void GenericPlot::paintLFPraster(Graphics& g)
-{
-    //tictoc.Tic(14);
-    int numTrialTypes = tcb->getNumTrialTypesInChannel(electrodeID, subID);
-    if (numTrialTypes > 0)
-    {
-        int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID);
-        mlp->setAuxiliaryString(String(numTrials) + " trials");
-
-        float xmin,xmax,ymin,ymax,maxValue;
-        mlp->getRange(xmin,xmax,ymin,ymax);
-        juce::Image rasterImage = tcb->getTrialsAverageChannelResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax,  maxValue);
-        mlp->drawImage(rasterImage,maxValue);
-    }
-    //tictoc.Toc(14);
-}
-
-void GenericPlot::paintLFP(Graphics& g)
-{
-    //tictoc.Tic(13);
-    std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID);
-    mlp->clearplot();
-
-    int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID);
-    mlp->setAuxiliaryString(String(numTrials) + " trials");
-
-    for (int k=0; k<lines.size(); k++)
-    {
-        if (smoothPlot)
-        {
-            lines[k].smooth(smoothKernel);
-        }
-        mlp->plotxy(lines[k]);
-    }
-    //tictoc.Toc(13);
-}
-
-void GenericPlot::paint(Graphics& g)
-{
-    //printf("Entering GenericPlot::paint\n");
-    //tictoc.Tic(12);
-    if (mlp->eventsAvail())
-    {
-        String lastEvent = mlp->getLastEvent();
-        handleEventFromMatlabLikePlot(lastEvent);
-    }
-
-    if (plotType == SPIKE_PLOT)
-    {
-        if (rasterMode)
-            paintSpikeRaster(g);
-        else
-            paintSpikes(g);
-    }
-    else if (plotType == LFP_PLOT)
-    {
-        if (rasterMode)
-            paintLFPraster(g);
-        else
-            paintLFP(g);
-    }
-    //printf("Exitting GenericPlot::paint\n");
-    //tictoc.Toc(12);
-}
-
-
-void GenericPlot::setSmoothState(bool state)
-{
-    smoothPlot = state;
-}
-
-void GenericPlot::setAutoRescale(bool state)
-{
-    autoRescale = state;
-    mlp->setAutoRescale(state);
-}
-
-void GenericPlot::setXRange(double xmin, double xmax)
-{
-    float curr_minx,curr_miny,curr_maxx,curr_maxy;
-    mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy);
-    mlp->setRange(xmin,xmax,curr_miny,curr_maxy,false);
-}
-
-void GenericPlot::setYRange(double ymin,double ymax)
-{
-    float curr_minx,curr_miny,curr_maxx,curr_maxy;
-    mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy);
-    mlp->setRange(curr_minx,curr_maxx, ymin,ymax,false);
-}
-
-
-void GenericPlot::setMode(DrawComponentMode mode)
-{
-    mlp->setMode(mode);
-}
-
-void GenericPlot::resetAxes()
-{
-    TrialCircularBufferParams params =  tcb->getParams();
-    if (plotType == SPIKE_PLOT)
-    {
-        std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID);
-        double trial_xmin, trial_xmax;
-        tcb->getUnitConditionRange(electrodeID, subID, trial_xmin, trial_xmax);
-
-        float xmin=0,xmax=0;
-        double ymin=0,ymax=0;
-        float highestY=0;
-        for (int k=0; k<lines.size(); k++)
-        {
-            lines[k].getYRange(xmin,xmax,ymin,ymax);
-            highestY = MAX(highestY, ymax);
-        }
-        mlp->setRange(trial_xmin, trial_xmax,0,highestY,false);
-
-    }
-    else if (plotType == LFP_PLOT)
-    {
-        double trial_xmin, trial_xmax;
-        tcb->getElectrodeConditionRange(electrodeID, subID, trial_xmin, trial_xmax);
-
-        std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID);
-        float xmin,xmax;
-        double ymin,ymax;
-        float highestY=-1e10,lowestY=1e10;
-        for (int k=0; k<lines.size(); k++)
-        {
-            lines[k].getYRange(xmin,xmax,ymin,ymax);
-            highestY = MAX(highestY, ymax);
-            lowestY = MIN(lowestY, ymin);
-        }
-
-        mlp->setRange(trial_xmin, trial_xmax,lowestY,highestY,false);
-    }
-}
-
-void GenericPlot::buildSmoothKernel(float gaussianStandardDeviationMS_)
-{
-    guassianStandardDeviationMS = gaussianStandardDeviationMS_;
-    // assume each bin correponds to one millisecond.
-    // build the gaussian kernel
-    int numKernelBins = 2*(int)(guassianStandardDeviationMS*3.5)+1; // +- 3.5 standard deviations.
-    int zeroIndex = (numKernelBins-1)/2;
-    smoothKernel.resize(numKernelBins);
-    float sumZ = 0;
-    for (int k=0; k<numKernelBins; k++)
-    {
-        float z = float(k-zeroIndex);
-        smoothKernel[k] = exp(- (z*z)/(2*guassianStandardDeviationMS*guassianStandardDeviationMS));
-        sumZ+=smoothKernel[k];
-    }
-    // normalize kernel
-    for (int k=0; k<numKernelBins; k++)
-    {
-        smoothKernel[k] /= sumZ;
-    }
-}
-
-void GenericPlot::handleEventFromMatlabLikePlot(String event)
-{
-    std::vector<String> command = StringTS(event).splitString(' ');
-    //addEvent("NewRange "+String(xmin)+" "+String(xmax)+" "+String(ymin)+" "+String(ymax));
-    if (command[0] == "DblkClickRight")
-    {
-
-        if (plotType == SPIKE_PLOT)
-        {
-            tcb->clearUnitStatistics(electrodeID, subID);
-        }
-        else if (plotType == LFP_PLOT)
-        {
-            tcb->clearChanneltatistics(electrodeID, subID);
-        }
-
-    }
-    else if (command[0] == "DblkClickLeft")
-    {
-        // full screen toggle
-        display->focusOnPlot(plotID);
-    }
-    else if (command[0] == "StartInterval")
-    {
-
-
-        int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,true);
-        mlp->setActivateButtonVisiblilty(true, uniqueIntervalID);
-        // post this as a network message as well
-        StringTS s("UnitIntervalStart "+String(electrodeID)+" "+String(subID)+" "+String(uniqueIntervalID));
-        display->processor->handleNetworkMessage(s);
-    }
-    else if (command[0] == "StopInterval")
-    {
-        int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,false);
-        mlp->setActivateButtonVisiblilty(true, -1);
-        // post this as a network message as well
-        StringTS s("UnitIntervalStop "+String(electrodeID)+" "+String(subID) + " "+String(uniqueIntervalID));
-        display->processor->handleNetworkMessage(s);
-    }
-    else if (command[0] == "NewRange")
-    {
-        if (display->canvas->getMatchRange())
-        {
-            double xmin = command[1].getDoubleValue();
-            double xmax = command[2].getDoubleValue();
-            double ymin = command[3].getDoubleValue();
-            double ymax = command[4].getDoubleValue();
-            display->canvas->setRange(xmin,xmax,ymin,ymax,plotType);
-        }
-    }
-}
+/*
+------------------------------------------------------------------
+
+This file is part of the Open Ephys GUI
+Copyright (C) 2015 Open Ephys
+
+------------------------------------------------------------------
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "PeriStimulusTimeHistogramEditor.h"
+#include "../../UI/EditorViewport.h"
+#include "../PSTH/TrialCircularBuffer.h"
+#include "../PSTH/tictoc.h"
+#include <stdio.h>
+
+
+#ifndef max
+#define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
+#endif
+
+
+#ifndef min
+#define min( a, b ) ( ((a) < (b)) ? (a) : (b) )
+#endif
+
+//FileSearchPathListComponent::paintListBoxItem
+PeriStimulusTimeHistogramEditor::PeriStimulusTimeHistogramEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true)
+    : VisualizerEditor(parentNode, useDefaultParameterEditors) ,periStimulusTimeHistogramCanvas(nullptr)
+{
+    showSortedUnits = true;
+    showLFP = true;
+    showCompactView = false;
+    showSmooth = true;
+    showRasters = false;
+    showAutoRescale = true;
+    showMatchRange = false;
+    TTLchannelTrialAlignment = -1;
+    smoothingMS = 10;
+
+
+    tabText = "PSTH";
+    desiredWidth = 300;
+
+
+    saveOptions = new UtilityButton("Save Options",Font("Default", 15, Font::plain));
+    saveOptions->addListener(this);
+    saveOptions->setColour(Label::textColourId, Colours::white);
+    saveOptions->setBounds(180,30,100,20);
+    addAndMakeVisible(saveOptions);
+
+
+    clearDisplay = new UtilityButton("Clear all",Font("Default", 15, Font::plain));
+    clearDisplay->addListener(this);
+    clearDisplay->setColour(Label::textColourId, Colours::white);
+    clearDisplay->setBounds(180,60,90,20);
+    addAndMakeVisible(clearDisplay);
+
+
+    visualizationOptions =  new UtilityButton("Visualization Options",Font("Default", 15, Font::plain));
+    visualizationOptions->addListener(this);
+    visualizationOptions->setColour(Label::textColourId, Colours::white);
+    visualizationOptions->setBounds(10,30,160,20);
+    addAndMakeVisible(visualizationOptions);
+
+    hardwareTrigger = new Label("hardwareTrigger","TTL Trial Alignment:");
+    hardwareTrigger->setFont(Font("Default", 14, Font::plain));
+    hardwareTrigger->setEditable(false);
+    hardwareTrigger->setJustificationType(Justification::centredLeft);
+    hardwareTrigger->setBounds(10,90,120,20);
+    addAndMakeVisible(hardwareTrigger);
+
+    hardwareTrialAlignment = new ComboBox("Hardware Trial Alignment");
+    hardwareTrialAlignment->setEditableText(false);
+    hardwareTrialAlignment->setJustificationType(Justification::centredLeft);
+    hardwareTrialAlignment->addListener(this);
+    hardwareTrialAlignment->setBounds(130,90,70,20);
+    hardwareTrialAlignment->addItem("Not set",1);
+    for (int k=0; k<8; k++)
+    {
+        hardwareTrialAlignment->addItem("TTL "+String(k+1),k+2);
+    }
+    if (TTLchannelTrialAlignment == -1)
+        hardwareTrialAlignment->setSelectedId(1, sendNotification);
+    else
+        hardwareTrialAlignment->setSelectedId(TTLchannelTrialAlignment+2, sendNotification);
+
+    addAndMakeVisible(hardwareTrialAlignment);
+
+
+}
+
+
+
+void PeriStimulusTimeHistogramEditor::saveVisualizerParameters(XmlElement* xml)
+{
+
+    XmlElement* xmlNode = xml->createNewChildElement("PSTH_EDITOR");
+    xmlNode->setAttribute("showSortedUnits",showSortedUnits);
+
+    xmlNode->setAttribute("showLFP",showLFP);
+    xmlNode->setAttribute("showCompactView",showCompactView);
+    xmlNode->setAttribute("showSmooth",showSmooth);
+    xmlNode->setAttribute("showAutoRescale",showAutoRescale);
+    xmlNode->setAttribute("showRasters",showRasters);
+    xmlNode->setAttribute("showMatchRange",showMatchRange);
+    xmlNode->setAttribute("TTLchannelTrialAlignment",TTLchannelTrialAlignment);
+    xmlNode->setAttribute("smoothingMS",smoothingMS);
+}
+
+void PeriStimulusTimeHistogramEditor::loadVisualizerParameters(XmlElement* xml)
+{
+    forEachXmlChildElement(*xml, xmlNode)
+    {
+        if (xmlNode->hasTagName("PSTH_EDITOR"))
+        {
+
+            showLFP = xmlNode->getBoolAttribute("showLFP");
+            showCompactView = xmlNode->getBoolAttribute("showCompactView");
+            showSmooth = xmlNode->getBoolAttribute("showSmooth");
+            showAutoRescale = xmlNode->getBoolAttribute("showAutoRescale");
+            showRasters= xmlNode->getBoolAttribute("showRasters",false);
+            showMatchRange = xmlNode->getBoolAttribute("showMatchRange");
+            TTLchannelTrialAlignment = xmlNode->getIntAttribute("TTLchannelTrialAlignment");
+            smoothingMS = xmlNode->getIntAttribute("smoothingMS");
+
+            if (periStimulusTimeHistogramCanvas != nullptr)
+            {
+                periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP);
+                periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits);
+                periStimulusTimeHistogramCanvas->setCompactView(showCompactView);
+                periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale);
+                periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange);
+                periStimulusTimeHistogramCanvas->setSmoothing(smoothingMS,true);
+                periStimulusTimeHistogramCanvas->setRasterMode(showRasters);
+            }
+        }
+    }
+}
+
+
+void PeriStimulusTimeHistogramEditor::comboBoxChanged(ComboBox* comboBox)
+{
+
+    if (comboBox == hardwareTrialAlignment)
+    {
+        std::cout << "Setting hardware trigger alignment channel to " << comboBox->getSelectedId()-2 << std::endl;
+        PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
+        processor->setHardwareTriggerAlignmentChannel(comboBox->getSelectedId()-2);
+    }
+}
+
+void PeriStimulusTimeHistogramEditor::visualizationMenu()
+{
+    PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
+
+    PopupMenu m;
+    m.addItem(1,"Sorted Units",true, showSortedUnits);
+    m.addItem(2,"LFP",true, showLFP);
+    m.addItem(3,"Compact View",true, showCompactView);
+
+    PopupMenu smoothingSubMenu;
+    int SmoothingFactors[8] = {0,1,2,5,10,20,50,100};
+    for (int k=0; k<8; k++)
+    {
+        String s;
+        if (SmoothingFactors[k] == 0)
+            s = "No Smoothing";
+        else
+            s = String(SmoothingFactors[k]) + " ms";
+
+        smoothingSubMenu.addItem(40+k,s,true, smoothingMS == SmoothingFactors[k]);
+    }
+
+    PopupMenu rangeTimeMenu,preRangeTimeMenu,postRangeTimeMenu;
+    double rangeTimes[4] = {0.5,1,1.5,2};
+    TrialCircularBufferParams params = processor->trialCircularBuffer->getParams();
+
+    for (int k=0; k<4; k++)
+    {
+        String s = String(rangeTimes[k],1) + " sec";
+        if (processor->trialCircularBuffer == nullptr)
+        {
+            preRangeTimeMenu.addItem(50+k,s,true, false);
+            postRangeTimeMenu.addItem(60+k,s,true, false);
+        }
+        else
+        {
+            preRangeTimeMenu.addItem(50+k,s,true, fabs(params.preSec - rangeTimes[k])<0.01);
+            postRangeTimeMenu.addItem(60+k,s,true, fabs(params.postSec - rangeTimes[k])<0.01);
+        }
+    }
+    rangeTimeMenu.addSubMenu("pre trial", preRangeTimeMenu,true);
+    rangeTimeMenu.addSubMenu("post trial", postRangeTimeMenu,true);
+
+    m.addSubMenu("Smooth Curves", smoothingSubMenu);
+    m.addItem(7,"Raster mode",true, showRasters);
+
+    m.addSubMenu("Range", rangeTimeMenu,true);
+    m.addItem(5,"Auto Rescale",true, showAutoRescale);
+    m.addItem(6,"Match range",true, showMatchRange);
+    m.addItem(8,"Bar Graph",false, false);
+    m.addItem(9,"2D Heat map",false, false);
+    const int result = m.show();
+    switch (result)
+    {
+        case 1:
+            showSortedUnits=!showSortedUnits;
+            periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits);
+            break;
+        case 2:
+            showLFP=!showLFP;
+            periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP);
+            break;
+        case 3:
+            showCompactView=!showCompactView;
+            periStimulusTimeHistogramCanvas->setCompactView(showCompactView);
+            break;
+        case 5:
+            showAutoRescale=!showAutoRescale;
+            periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale);
+            break;
+        case 6:
+            showMatchRange=!showMatchRange;
+            periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange);
+            break;
+        case 7:
+            showRasters = !showRasters;
+            periStimulusTimeHistogramCanvas->setRasterMode(showRasters);
+            break;
+    }
+    if (result >= 40 && result <= 47)
+    {
+        smoothingMS = SmoothingFactors[result-40];
+        periStimulusTimeHistogramCanvas->setSmoothing(SmoothingFactors[result-40],result-40>0);
+    }
+    else if (result >= 50 && result <= 54)
+    {
+        // this will require killing
+        double newPreSec = rangeTimes[result-50];
+        processor->modifyTimeRange(newPreSec,params.postSec);
+    }
+    else if (result >= 60 && result <= 64)
+    {
+        double newPostSec = rangeTimes[result-60];
+        processor->modifyTimeRange(params.preSec,newPostSec);
+    }
+}
+
+void PeriStimulusTimeHistogramEditor::buttonEvent(Button* button)
+{
+    VisualizerEditor::buttonEvent(button);
+    if (periStimulusTimeHistogramCanvas == nullptr)
+        return;
+
+    PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
+
+    if (button == clearDisplay)
+    {
+        if (processor->trialCircularBuffer != nullptr)
+        {
+            processor->trialCircularBuffer->clearAll();
+            repaint();
+        }
+    }
+    else if (button == visualizationOptions)
+    {
+        visualizationMenu();
+    }
+    else if (button == saveOptions)
+    {
+
+        PopupMenu m;
+
+
+        /*	m.addItem(1,"TTL",true, processor->saveTTLs);
+        	m.addItem(2,"Network Events",true, processor->saveNetworkEvents);
+        	m.addItem(7,"Network Events [when recording is off]",true, processor->saveNetworkEventsWhenNotRecording);
+        	m.addItem(3,"Eye Tracking",true, processor->saveEyeTracking);*/
+
+        //m.addItem(4,"Sorted Spikes: TS only ",true, processor->spikeSavingMode == 1);
+        m.addItem(5,"Sorted Spikes: TS+waveform",true, processor->spikeSavingMode == 2);
+        m.addItem(6,"All Spikes: TS+waveform",true, processor->spikeSavingMode == 3);
+
+        const int result = m.show();
+
+        if (result == 1)
+        {
+            processor->saveTTLs = !processor->saveTTLs;
+        }
+        else if (result == 2)
+        {
+            processor->saveNetworkEvents = !processor->saveNetworkEvents;
+        }
+        else if (result == 3)
+        {
+            processor->saveEyeTracking = !processor->saveEyeTracking;
+        }
+        else if (result == 4)
+        {
+            if (processor->spikeSavingMode == 1)
+                processor->spikeSavingMode = 0;
+            else
+                processor->spikeSavingMode = 1;
+        }
+        else if (result == 5)
+        {
+            if (processor->spikeSavingMode == 2)
+                processor->spikeSavingMode = 0;
+            else
+                processor->spikeSavingMode = 2;
+        }
+        else if (result == 6)
+        {
+            if (processor->spikeSavingMode == 3)
+                processor->spikeSavingMode = 0;
+            else
+                processor->spikeSavingMode = 3;
+        }
+        else if (result == 7)
+        {
+            processor->saveNetworkEventsWhenNotRecording = !processor->saveNetworkEventsWhenNotRecording;
+        }
+
+    } /*else if (button == visibleConditions)
+	{
+
+
+		if ( processor->trialCircularBuffer != nullptr)
+		{
+			processor->trialCircularBuffer ->lockConditions();
+			PopupMenu m;
+
+			for (int i = 0; i < processor->trialCircularBuffer->conditions.size(); i++)
+			{
+				{
+
+					String name = processor->trialCircularBuffer->conditions[i].name;
+					m.addItem(i+1, name,true,processor->trialCircularBuffer->conditions[i].visible);
+				}
+			}
+
+			const int result = m.show();
+
+			if (result > 0)
+			{
+				// update the visibility for all channels and units.
+				PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
+				processor->toggleConditionVisibility(result-1);
+				if (periStimulusTimeHistogramCanvas != nullptr)
+				{
+					periStimulusTimeHistogramCanvas->update();
+				}
+
+			}
+			processor->trialCircularBuffer ->unlockConditions();
+		}
+
+	}*/
+
+
+
+}
+
+
+Visualizer* PeriStimulusTimeHistogramEditor::createNewCanvas()
+{
+    PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor();
+    periStimulusTimeHistogramCanvas = new PeriStimulusTimeHistogramCanvas(processor);
+    //ActionListener* listener = (ActionListener*) periStimulusTimeHistogramCanvas;
+    //getUIComponent()->registerAnimatedComponent(listener);
+    return periStimulusTimeHistogramCanvas;
+}
+
+void PeriStimulusTimeHistogramEditor::updateCanvas()
+{
+    if (periStimulusTimeHistogramCanvas != nullptr)
+    {
+        periStimulusTimeHistogramCanvas->updateNeeded = true;
+    }
+}
+
+PeriStimulusTimeHistogramEditor::~PeriStimulusTimeHistogramEditor()
+{
+
+
+}
+
+
+
+
+
+
+
+/********************************/
+#ifndef MAX
+#define MAX(x,y)((x)>(y))?(x):(y)
+#endif
+
+#ifndef MIN
+#define MIN(x,y)((x)<(y))?(x):(y)
+#endif
+
+
+PeriStimulusTimeHistogramCanvas::PeriStimulusTimeHistogramCanvas(PeriStimulusTimeHistogramNode* n) :
+    processor(n)
+{
+    screenWidth = screenHeight = 0;
+    conditionWidth = 200;
+
+    inFocusedMode = false;
+    showLFP = true;
+    showSpikes = true;
+    matchRange = false;
+    smoothPlots = true;
+    autoRescale = true;
+    compactView = false;
+    rasterMode = false;
+    gaussianStandardDeviationMS = 10;
+    viewport = new Viewport();
+    psthDisplay = new PeriStimulusTimeHistogramDisplay(n, viewport, this);
+    viewport->setViewedComponent(psthDisplay, false);
+    viewport->setScrollBarsShown(true, true);
+    addAndMakeVisible(viewport);
+
+
+    visualizationButton = new UtilityButton("Visualization Options",Font("Default", 15, Font::plain));
+    visualizationButton->addListener(this);
+    addAndMakeVisible(visualizationButton);
+
+    clearAllButton = new UtilityButton("Clear all",Font("Default", 15, Font::plain));
+    clearAllButton->addListener(this);
+    addAndMakeVisible(clearAllButton);
+
+    conditionsViewport = new Viewport();
+    conditionsList = new ConditionList(n, conditionsViewport, this);
+    conditionsViewport->setViewedComponent(conditionsList, false);
+    conditionsViewport->setScrollBarsShown(true, true);
+    addAndMakeVisible(conditionsViewport);
+
+    zoomButton = new UtilityButton("Zoom",Font("Default", 15, Font::plain));
+    zoomButton->addListener(this);
+    zoomButton->setColour(Label::textColourId, Colours::white);
+    addAndMakeVisible(zoomButton);
+    panButton = new UtilityButton("Pan",Font("Default", 15, Font::plain));
+    panButton->addListener(this);
+    panButton->setColour(Label::textColourId, Colours::white);
+    panButton->setToggleState(true, dontSendNotification);
+
+    addAndMakeVisible(panButton);
+    resetAxesButton = new UtilityButton("Reset Axes",Font("Default", 15, Font::plain));
+    resetAxesButton->addListener(this);
+    resetAxesButton->setColour(Label::textColourId, Colours::white);
+    addAndMakeVisible(resetAxesButton);
+
+
+    resized();
+    update();
+
+}
+
+
+PeriStimulusTimeHistogramCanvas::~PeriStimulusTimeHistogramCanvas()
+{
+
+}
+
+void PeriStimulusTimeHistogramCanvas::beginAnimation()
+{
+
+    std::cout << "PeriStimulusTimeHistogramCanvas starting animation." << std::endl;
+    startCallbacks();
+
+}
+
+void PeriStimulusTimeHistogramCanvas::buttonClicked(Button* button)
+{
+    if (button == visualizationButton)
+    {
+        PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor();
+        ed->visualizationMenu();
+    }
+    else if (button == clearAllButton)
+    {
+        processor->trialCircularBuffer->clearAll();
+    }
+    else if (button == zoomButton)
+    {
+        zoomButton->setToggleState(true, dontSendNotification);
+        panButton->setToggleState(false, dontSendNotification);
+        for (int k=0; k<psthDisplay->psthPlots.size(); k++)
+        {
+            psthDisplay->psthPlots[k]->setMode(ZOOM);
+        }
+    }
+    else if (button == panButton)
+    {
+        zoomButton->setToggleState(false, dontSendNotification);
+        panButton->setToggleState(true, dontSendNotification);
+        for (int k=0; k<psthDisplay->psthPlots.size(); k++)
+        {
+            psthDisplay->psthPlots[k]->setMode(PAN);
+        }
+    }
+    else if (button == resetAxesButton)
+    {
+        for (int k=0; k<psthDisplay->psthPlots.size(); k++)
+        {
+            psthDisplay->psthPlots[k]->resetAxes();
+        }
+    }
+}
+
+void PeriStimulusTimeHistogramCanvas::endAnimation()
+{
+    std::cout << "PeriStimulusTimeHistogramCanvas ending animation." << std::endl;
+
+    stopCallbacks();
+}
+
+void PeriStimulusTimeHistogramCanvas::setRasterMode(bool rasterModeActive)
+{
+    rasterMode = rasterModeActive;
+    update();
+}
+
+void PeriStimulusTimeHistogramCanvas::setLFPvisibility(bool visible)
+{
+    showLFP = visible;
+    update();
+}
+
+void PeriStimulusTimeHistogramCanvas::setSpikesVisibility(bool visible)
+{
+    showSpikes = visible;
+    update();
+}
+
+void PeriStimulusTimeHistogramCanvas::setSmoothing(float _gaussianStandardDeviationMS, bool smooth_enabled)
+{
+    gaussianStandardDeviationMS=_gaussianStandardDeviationMS;
+    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
+    {
+        if (smooth_enabled)
+        {
+            psthDisplay->psthPlots[k]->buildSmoothKernel(gaussianStandardDeviationMS);
+            psthDisplay->psthPlots[k]->setSmoothState(true);
+        }
+        else
+        {
+            psthDisplay->psthPlots[k]->setSmoothState(false);
+        }
+        psthDisplay->psthPlots[k]->repaint();
+    }
+
+}
+
+void PeriStimulusTimeHistogramCanvas::setSmoothPSTH(bool smooth)
+{
+    smoothPlots = smooth;
+    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
+    {
+        psthDisplay->psthPlots[k]->setSmoothState(smoothPlots);
+        psthDisplay->psthPlots[k]->repaint();
+    }
+
+}
+
+void PeriStimulusTimeHistogramCanvas::setCompactView(bool compact)
+{
+    compactView = compact;
+    update();
+}
+
+void PeriStimulusTimeHistogramCanvas::setMatchRange(bool on)
+{
+    matchRange = on;
+    //update();
+}
+
+bool PeriStimulusTimeHistogramCanvas::getMatchRange()
+{
+    return matchRange;
+}
+
+void PeriStimulusTimeHistogramCanvas::setAutoRescale(bool state)
+{
+    autoRescale = state;
+    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
+    {
+        psthDisplay->psthPlots[k]->setAutoRescale(autoRescale);
+        psthDisplay->psthPlots[k]->repaint();
+    }
+}
+
+void PeriStimulusTimeHistogramCanvas::setRange(double xmin, double xmax, double ymin, double ymax, xyPlotTypes plotType)
+{
+
+    for (int k=0; k<	psthDisplay->psthPlots.size(); k++)
+    {
+        if (psthDisplay->psthPlots[k]->getPlotType() == plotType)
+        {
+            psthDisplay->psthPlots[k]->setXRange(xmin,xmax);
+            psthDisplay->psthPlots[k]->setYRange(ymin,ymax);
+        }
+        else
+        {
+            psthDisplay->psthPlots[k]->setXRange(xmin,xmax);
+        }
+    }
+}
+
+
+void PeriStimulusTimeHistogramCanvas::refreshState()
+{
+    update();
+    resized();
+}
+
+
+void PeriStimulusTimeHistogramCanvas::update()
+{
+    //std::cout << "Updating SpikeDisplayCanvas" << std::endl;
+    // clear all XY plots and create new ones...
+    // delete all existing plots.
+    // lock psth
+    bool inPanMode = panButton->getToggleState();
+
+    heightPerElectrodePix = 300;
+    widthPerUnit = 300;
+    int maxUnitsPerRow = (screenWidth-conditionWidth)/ widthPerUnit;
+    updateNeeded = false;
+    for (int k = 0; k < psthDisplay->psthPlots.size(); k++)
+    {
+        delete psthDisplay->psthPlots[k];
+    }
+    psthDisplay->psthPlots.clear();
+    if (processor->trialCircularBuffer == nullptr)
+        return;
+
+    const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
+
+    //processor->trialCircularBuffer->lockPSTH();
+    numElectrodes = processor->trialCircularBuffer->getNumElectrodes();
+    int maxUnitsPerElectrode = 0;
+    int row = 0;
+    int plotCounter = 0;
+    numCols = 0;
+    numRows = 0;
+    int plotID = 0;
+    for (int e = 0; e < numElectrodes; e++)
+    {
+        int offset = 0;
+        bool plottedSomething = false;
+        int electrodeID = processor->trialCircularBuffer->getElectrodeID(e);
+        String electrodeName = processor->trialCircularBuffer->getElectrodeName(e);
+
+        if (showLFP)
+        {
+            std::vector<int> channels = processor->trialCircularBuffer->getElectrodeChannels(e);
+            offset = channels.size();
+            for (int u=0; u<channels.size(); u++)
+            {
+                GenericPlot* newplot;
+                if (compactView)
+                {
+                    String plotName = electrodeName+" Ch:"+String(1+u);
+                    newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer,
+                                              electrodeID,
+                                              channels[u],
+                                              plotCounter,row,rasterMode,inPanMode);
+
+                    plotCounter++;
+                    numCols++;
+                    numCols = min(maxUnitsPerRow,numCols);
+
+                    if (plotCounter >= maxUnitsPerRow)
+                    {
+                        plotCounter = 0;
+                        row++;
+                    }
+                }
+                else
+                {
+                    String plotName = electrodeName+":Ch "+String(1+u);
+                    newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer,
+                                              electrodeID,
+                                              channels[u],
+                                              u,row,rasterMode,inPanMode);
+                    numCols = max(numCols,u);
+
+                }
+                newplot->setSmoothState(smoothPlots);
+                newplot->setAutoRescale(autoRescale);
+                newplot->buildSmoothKernel(gaussianStandardDeviationMS);
+                psthDisplay->psthPlots.push_back(newplot);
+                psthDisplay->addAndMakeVisible(newplot);
+                plottedSomething = true;
+            }
+
+        }
+
+        if (showSpikes)
+        {
+            int numUnits = processor->trialCircularBuffer->getNumUnitsInElectrode(e);
+            maxUnitsPerElectrode = MAX(maxUnitsPerElectrode,numUnits);
+            if (numUnits > 0)
+            {
+                for (int u=0; u<numUnits; u++)
+                {
+                    GenericPlot* newplot;
+                    if (compactView)
+                    {
+                        String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u));
+                        newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer,
+                                                  electrodeID,
+                                                  processor->trialCircularBuffer->getUnitID(e,u),
+                                                  plotCounter,row,rasterMode,inPanMode);
+                        plotCounter++;
+                        numCols++;
+                        numCols = min(maxUnitsPerRow,numCols);
+
+                        if (plotCounter >= maxUnitsPerRow)
+                        {
+                            plotCounter = 0;
+                            row++;
+                        }
+                    }
+                    else
+                    {
+                        String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u));
+                        newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer,
+                                                  electrodeID,
+                                                  processor->trialCircularBuffer->getUnitID(e,u),
+                                                  offset+u,row,rasterMode,inPanMode);
+                        numCols = max(numCols,offset+u);
+                    }
+                    newplot->setSmoothState(smoothPlots);
+                    newplot->setAutoRescale(autoRescale);
+                    newplot->buildSmoothKernel(gaussianStandardDeviationMS);
+
+                    psthDisplay->psthPlots.push_back(newplot);
+                    psthDisplay->addAndMakeVisible(newplot);
+                }
+                plottedSomething = true;
+            }
+        }
+        if (!compactView &&  plottedSomething)
+            row++;
+    }
+    if (compactView)
+    {
+        numRows = row+1;//MAX(1,row);
+    }
+    else
+    {
+        numRows = row;
+        numCols = numCols+1;
+    }
+
+    if (maxUnitsPerElectrode == 0 && !showLFP)
+    {
+        // nothing to be drawn...
+        //processor->trialCircularBuffer->unlockPSTH();
+        return;
+    }
+
+    psthDisplay->resized();
+    psthDisplay->repaint();
+    psthDisplay->refresh();
+    resized();
+    repaint();
+
+    //processor->trialCircularBuffer->unlockPSTH();
+    conditionsList->updateConditionButtons();
+}
+
+
+void PeriStimulusTimeHistogramCanvas::resized()
+{
+    screenWidth = getWidth();
+    screenHeight = getHeight();
+
+    int scrollBarThickness = viewport->getScrollBarThickness();
+
+    viewport->setBounds(0,30,getWidth()-conditionWidth,getHeight()-30);
+    int totalHeight = numRows * heightPerElectrodePix;
+    int totalWidth = numCols * widthPerUnit;
+    psthDisplay->setBounds(0,0,totalWidth, totalHeight);
+
+    int numConditions = 0;
+    if (processor->trialCircularBuffer != nullptr)
+    {
+        numConditions = processor->trialCircularBuffer->getNumConditions();
+    }
+
+    conditionsViewport->setBounds(getWidth()-conditionWidth,30,conditionWidth,getHeight());
+    conditionsList->setBounds(0,0,conditionWidth, 50+20*numConditions);
+
+    visualizationButton->setBounds(20,5,150,20);
+    clearAllButton->setBounds(200,5,150,20);
+
+    zoomButton->setBounds(360,5,60,20);
+    panButton->setBounds(440,5,60,20);
+    resetAxesButton->setBounds(510,5,150,20);
+
+}
+
+void PeriStimulusTimeHistogramCanvas::paint(Graphics& g)
+{
+    if (updateNeeded)
+        update();
+    g.fillAll(Colours::grey);
+
+}
+
+void PeriStimulusTimeHistogramCanvas::refresh()
+{
+    repaint();
+    psthDisplay->refresh();
+}
+
+/***********************************************/
+
+PeriStimulusTimeHistogramDisplay::PeriStimulusTimeHistogramDisplay(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) :
+    processor(n), viewport(p), canvas(c)
+{
+
+    font = Font("Default", 15, Font::plain);
+}
+
+PeriStimulusTimeHistogramDisplay::~PeriStimulusTimeHistogramDisplay()
+{
+    for (int k = 0; k < psthPlots.size(); k++)
+    {
+        delete(psthPlots[k]);
+    }
+    psthPlots.clear();
+}
+
+void PeriStimulusTimeHistogramDisplay::refresh()
+{
+    for (int k = 0; k < psthPlots.size(); k++)
+    {
+        psthPlots[k]->repaint();
+    }
+
+}
+
+void PeriStimulusTimeHistogramDisplay::paint(Graphics& g)
+{
+    g.setColour(Colours::white);
+    g.drawRect(0,0,getWidth(),getHeight());
+    /*
+    	font = Font("Default", 15, Font::plain);
+
+    	g.setFont(font);
+
+    	g.drawText("Test",10,0,200,20,Justification::left,false);
+    	*/
+}
+
+void PeriStimulusTimeHistogramDisplay::setAutoRescale(bool state)
+{
+    // draw n by m grid
+    PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor();
+    ed->showAutoRescale = state;
+
+    for (int k=0; k<psthPlots.size(); k++)
+    {
+        psthPlots[k]->setAutoRescale(state);
+    }
+
+}
+
+void PeriStimulusTimeHistogramDisplay::resized()
+{
+    // draw n by m grid
+    for (int k=0; k<psthPlots.size(); k++)
+    {
+        if (psthPlots[k]->isFullScreen())
+        {
+            int newSize = MIN(canvas->screenWidth,canvas->screenHeight);
+            setBounds(0,0,newSize,newSize);
+            psthPlots[k]->setBounds(0,0,newSize-30,newSize-30);
+
+        }
+        else
+        {
+            psthPlots[k]->setBounds(psthPlots[k]->getRow() * canvas->widthPerUnit,
+                                    psthPlots[k]->getCol() * canvas->heightPerElectrodePix,
+                                    canvas->widthPerUnit,
+                                    canvas->heightPerElectrodePix);
+        }
+
+    }
+}
+
+void PeriStimulusTimeHistogramDisplay::focusOnPlot(int plotID)
+{
+    int plotIndex = -1;
+    for (int i=0; i<psthPlots.size(); i++)
+    {
+        if (psthPlots[i]->getPlotID() == plotID)
+        {
+            plotIndex = i;
+            break;
+        }
+
+    }
+    if (plotIndex == -1)
+        return;
+    if (psthPlots[plotIndex]->isFullScreen())
+    {
+
+        psthPlots[plotIndex]->toggleFullScreen(false);
+        psthPlots[plotIndex]->setBounds(psthPlots[plotIndex]->getRow() * canvas->widthPerUnit,
+                                        psthPlots[plotIndex]->getCol() * canvas->heightPerElectrodePix,
+                                        canvas->widthPerUnit,
+                                        canvas->heightPerElectrodePix);
+        // hide all other plots.
+        for (int k=0; k<psthPlots.size(); k++)
+        {
+            psthPlots[k]->setVisible(true);
+            psthPlots[k]->repaint();
+        }
+
+    }
+    else
+    {
+        // hide all other plots.
+        for (int k=0; k<psthPlots.size(); k++)
+        {
+            if (psthPlots[k]->getPlotID() != plotID)
+                psthPlots[k]->setVisible(false);
+        }
+        psthPlots[plotIndex]->toggleFullScreen(true);
+        // make sure its rectangular...?
+        int newSize = MIN(canvas->screenWidth,canvas->screenHeight);
+        setBounds(0,0,newSize,newSize);
+        psthPlots[plotIndex]->setBounds(0,0,newSize-30,newSize-30);
+        psthPlots[plotIndex]->repaint();
+    }
+
+}
+
+/***********************************/
+ConditionList::ConditionList(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) :
+    processor(n), viewport(p), canvas(c)
+{
+
+    titleButton = new ColorButton("CONDITIONS LIST", Font("Default", 24, Font::plain));
+    titleButton->setBounds(0,0, 200,25);
+    titleButton->addListener(this);
+    addAndMakeVisible(titleButton);
+
+    allButton = new ColorButton("All", Font("Default", 20, Font::plain));
+    allButton->setBounds(0,25,100,20);
+    allButton->addListener(this);
+    addAndMakeVisible(allButton);
+
+    noneButton = new ColorButton("None", Font("Default", 20, Font::plain));
+    noneButton->setBounds(100,25,100,20);
+    noneButton->addListener(this);
+    addAndMakeVisible(noneButton);
+
+    updateConditionButtons();
+
+}
+
+
+void ConditionList::updateConditionButtons()
+{
+    if (processor->trialCircularBuffer != nullptr)
+    {
+        const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
+        //processor->trialCircularBuffer->lockConditions();
+        conditionButtons.clear();
+        for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++)
+        {
+            Condition cond = processor->trialCircularBuffer->getCondition(k);
+            ColorButton* conditionButton = new ColorButton(cond.name, Font("Default", 20, Font::plain));
+            conditionButton->setBounds(0,50+k*20,200,20);
+            conditionButton->setColors(Colours::white,
+                                       juce::Colour::fromRGB(cond.colorRGB[0],
+                                                             cond.colorRGB[1],
+                                                             cond.colorRGB[2]));
+            conditionButton->setEnabledState(cond.visible);
+            conditionButton->setUserDefinedData(cond.conditionID);
+            conditionButton->setShowEnabled(true);
+            conditionButton->addListener(this);
+            addAndMakeVisible(conditionButton);
+            conditionButtons.add(conditionButton);
+        }
+
+        //processor->trialCircularBuffer->unlockConditions();
+    }
+}
+
+ConditionList::~ConditionList()
+{
+
+    for (int i = 0; i < conditionButtons.size(); i++)
+    {
+        removeChildComponent(conditionButtons[i]);
+    }
+}
+
+void ConditionList::paint(Graphics& g)
+{
+    g.fillAll(juce::Colours::grey);
+    //g.drawText
+}
+
+void ConditionList::buttonClicked(Button* btn)
+{
+    ColorButton* cbtn = (ColorButton*)btn;
+    // also inform trial circular buffer about visibility change.
+    if (btn == titleButton)
+    {
+        int x = 5;
+    }
+    else if (btn == noneButton)
+    {
+        if (processor->trialCircularBuffer != nullptr)
+        {
+            //processor->trialCircularBuffer->lockConditions();
+            const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
+            for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++)
+            {
+                processor->trialCircularBuffer->modifyConditionVisibility(k,false);
+                conditionButtons[k]->setEnabledState(false);
+            }
+            //processor->trialCircularBuffer->unlockConditions();
+        }
+
+    }
+    else if (btn == allButton)
+    {
+        if (processor->trialCircularBuffer != nullptr)
+        {
+            const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex);
+            //processor->trialCircularBuffer->lockConditions();
+            for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++)
+            {
+                processor->trialCircularBuffer->modifyConditionVisibility(k,true);
+                conditionButtons[k]->setEnabledState(true);
+            }
+            //processor->trialCircularBuffer->unlockConditions();
+        }
+
+    }
+    else
+    {
+        // probably a condition button
+        int conditionID = cbtn->getUserDefinedData();
+        cbtn->setEnabledState(!cbtn->getEnabledState());
+        processor->trialCircularBuffer->modifyConditionVisibilityusingConditionID(conditionID, cbtn->getEnabledState());
+    }
+
+    repaint();
+}
+
+
+/*************************************************************************/
+// Generic plot replaces XYPlot class, with better class organization and code encapsulation.
+// All low level plotting of curves is handled by MatlabLikePlot object (including zooming / panning / ...)
+// All raster plots will be handled by another class (?)
+//
+
+GenericPlot::GenericPlot(String name,PeriStimulusTimeHistogramDisplay* dsp, int plotID_, xyPlotTypes plotType_,
+                         TrialCircularBuffer* tcb_, int electrodeID_, int subID_, int row_, int col_, bool rasterMode_, bool panM) :  tcb(tcb_), electrodeID(electrodeID_), plotID(plotID_),
+    plotType(plotType_), subID(subID_), row(row_), col(col_), rasterMode(rasterMode_),display(dsp),plotName(name),inPanMode(panM)
+{
+    fullScreenMode = false;
+    mlp = new MatlabLikePlot();
+    mlp->setControlButtonsVisibile(false);
+    TrialCircularBufferParams params =  tcb->getParams();
+
+    if (inPanMode)
+        mlp->setMode(DrawComponentMode::PAN);
+    else
+        mlp->setMode(DrawComponentMode::ZOOM);
+
+    if (rasterMode)
+    {
+        mlp->setImageMode(true);
+        mlp->setAutoRescale(false);
+    }
+    else
+        mlp->setImageMode(false);
+
+
+    addAndMakeVisible(mlp);
+
+    mlp->setTitle(plotName);
+    if (plotType == SPIKE_PLOT)
+    {
+        //mlp->setTitle("Unit "+String(electrodeID)+":"+String(subID));
+        mlp->setFiringRateMode(true);
+        mlp->setBorderColor(tcb->getUnitColor(electrodeID, subID));
+        int uniqueIntervalID = tcb->getUnitUniqueInterval(electrodeID, subID);
+        mlp->setActivateButtonVisiblilty(true, uniqueIntervalID);
+        mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,0,1e3);
+    }
+    else if (plotType == LFP_PLOT)
+    {
+        //	mlp->setTitle("Ch "+String(electrodeID)+":"+String(subID));
+        mlp->setBorderColor(juce::Colours::white);
+        mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,-1e3,1e3);
+    }
+
+    guassianStandardDeviationMS = 5; // default smoothing
+    buildSmoothKernel(guassianStandardDeviationMS);
+
+    smoothPlot = plotType == SPIKE_PLOT; // don't smooth LFPs
+    fullScreenMode = false;
+}
+
+xyPlotTypes GenericPlot::getPlotType()
+{
+    return plotType;
+}
+
+void GenericPlot::resized()
+{
+    int w = getWidth();
+    int h = getHeight();
+    mlp->setBounds(0,0,w,h);
+}
+
+void GenericPlot::paintSpikeRaster(Graphics& g)
+{
+    //tictoc.Tic(16);
+    int numTrialTypes = tcb->getNumTrialTypesInUnit(electrodeID, subID);
+    if (numTrialTypes > 0)
+    {
+        int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID);
+        mlp->setAuxiliaryString(String(numTrials) + " trials");
+
+        float xmin,xmax,ymin,ymax,maxValue;
+        mlp->getRange(xmin,xmax,ymin,ymax);
+        juce::Image rasterImage = tcb->getTrialsAverageUnitResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax,  maxValue);
+        mlp->drawImage(rasterImage,maxValue);
+    }
+    //tictoc.Toc(17);
+}
+
+void GenericPlot::paintSpikes(Graphics& g)
+{
+    //tictoc.Tic(15);
+    std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID);
+    int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID);
+    mlp->setAuxiliaryString(String(numTrials) + " trials");
+
+    mlp->clearplot();
+    for (int k=0; k<lines.size(); k++)
+    {
+        if (smoothPlot)
+        {
+            lines[k].smooth(smoothKernel);
+        }
+        mlp->plotxy(lines[k]);
+    }
+    //tictoc.Toc(15);
+}
+
+void GenericPlot::paintLFPraster(Graphics& g)
+{
+    //tictoc.Tic(14);
+    int numTrialTypes = tcb->getNumTrialTypesInChannel(electrodeID, subID);
+    if (numTrialTypes > 0)
+    {
+        int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID);
+        mlp->setAuxiliaryString(String(numTrials) + " trials");
+
+        float xmin,xmax,ymin,ymax,maxValue;
+        mlp->getRange(xmin,xmax,ymin,ymax);
+        juce::Image rasterImage = tcb->getTrialsAverageChannelResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax,  maxValue);
+        mlp->drawImage(rasterImage,maxValue);
+    }
+    //tictoc.Toc(14);
+}
+
+void GenericPlot::paintLFP(Graphics& g)
+{
+    //tictoc.Tic(13);
+    std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID);
+    mlp->clearplot();
+
+    int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID);
+    mlp->setAuxiliaryString(String(numTrials) + " trials");
+
+    for (int k=0; k<lines.size(); k++)
+    {
+        if (smoothPlot)
+        {
+            lines[k].smooth(smoothKernel);
+        }
+        mlp->plotxy(lines[k]);
+    }
+    //tictoc.Toc(13);
+}
+
+void GenericPlot::paint(Graphics& g)
+{
+    //printf("Entering GenericPlot::paint\n");
+    //tictoc.Tic(12);
+    if (mlp->eventsAvail())
+    {
+        String lastEvent = mlp->getLastEvent();
+        handleEventFromMatlabLikePlot(lastEvent);
+    }
+
+    if (plotType == SPIKE_PLOT)
+    {
+        if (rasterMode)
+            paintSpikeRaster(g);
+        else
+            paintSpikes(g);
+    }
+    else if (plotType == LFP_PLOT)
+    {
+        if (rasterMode)
+            paintLFPraster(g);
+        else
+            paintLFP(g);
+    }
+    //printf("Exitting GenericPlot::paint\n");
+    //tictoc.Toc(12);
+}
+
+
+void GenericPlot::setSmoothState(bool state)
+{
+    smoothPlot = state;
+}
+
+void GenericPlot::setAutoRescale(bool state)
+{
+    autoRescale = state;
+    mlp->setAutoRescale(state);
+}
+
+void GenericPlot::setXRange(double xmin, double xmax)
+{
+    float curr_minx,curr_miny,curr_maxx,curr_maxy;
+    mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy);
+    mlp->setRange(xmin,xmax,curr_miny,curr_maxy,false);
+}
+
+void GenericPlot::setYRange(double ymin,double ymax)
+{
+    float curr_minx,curr_miny,curr_maxx,curr_maxy;
+    mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy);
+    mlp->setRange(curr_minx,curr_maxx, ymin,ymax,false);
+}
+
+
+void GenericPlot::setMode(DrawComponentMode mode)
+{
+    mlp->setMode(mode);
+}
+
+void GenericPlot::resetAxes()
+{
+    TrialCircularBufferParams params =  tcb->getParams();
+    if (plotType == SPIKE_PLOT)
+    {
+        std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID);
+        double trial_xmin, trial_xmax;
+        tcb->getUnitConditionRange(electrodeID, subID, trial_xmin, trial_xmax);
+
+        float xmin=0,xmax=0;
+        double ymin=0,ymax=0;
+        float highestY=0;
+        for (int k=0; k<lines.size(); k++)
+        {
+            lines[k].getYRange(xmin,xmax,ymin,ymax);
+            highestY = MAX(highestY, ymax);
+        }
+        mlp->setRange(trial_xmin, trial_xmax,0,highestY,false);
+
+    }
+    else if (plotType == LFP_PLOT)
+    {
+        double trial_xmin, trial_xmax;
+        tcb->getElectrodeConditionRange(electrodeID, subID, trial_xmin, trial_xmax);
+
+        std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID);
+        float xmin,xmax;
+        double ymin,ymax;
+        float highestY=-1e10,lowestY=1e10;
+        for (int k=0; k<lines.size(); k++)
+        {
+            lines[k].getYRange(xmin,xmax,ymin,ymax);
+            highestY = MAX(highestY, ymax);
+            lowestY = MIN(lowestY, ymin);
+        }
+
+        mlp->setRange(trial_xmin, trial_xmax,lowestY,highestY,false);
+    }
+}
+
+void GenericPlot::buildSmoothKernel(float gaussianStandardDeviationMS_)
+{
+    guassianStandardDeviationMS = gaussianStandardDeviationMS_;
+    // assume each bin correponds to one millisecond.
+    // build the gaussian kernel
+    int numKernelBins = 2*(int)(guassianStandardDeviationMS*3.5)+1; // +- 3.5 standard deviations.
+    int zeroIndex = (numKernelBins-1)/2;
+    smoothKernel.resize(numKernelBins);
+    float sumZ = 0;
+    for (int k=0; k<numKernelBins; k++)
+    {
+        float z = float(k-zeroIndex);
+        smoothKernel[k] = exp(- (z*z)/(2*guassianStandardDeviationMS*guassianStandardDeviationMS));
+        sumZ+=smoothKernel[k];
+    }
+    // normalize kernel
+    for (int k=0; k<numKernelBins; k++)
+    {
+        smoothKernel[k] /= sumZ;
+    }
+}
+
+void GenericPlot::handleEventFromMatlabLikePlot(String event)
+{
+    std::vector<String> command = StringTS(event).splitString(' ');
+    //addEvent("NewRange "+String(xmin)+" "+String(xmax)+" "+String(ymin)+" "+String(ymax));
+    if (command[0] == "DblkClickRight")
+    {
+
+        if (plotType == SPIKE_PLOT)
+        {
+            tcb->clearUnitStatistics(electrodeID, subID);
+        }
+        else if (plotType == LFP_PLOT)
+        {
+            tcb->clearChanneltatistics(electrodeID, subID);
+        }
+
+    }
+    else if (command[0] == "DblkClickLeft")
+    {
+        // full screen toggle
+        display->focusOnPlot(plotID);
+    }
+    else if (command[0] == "StartInterval")
+    {
+
+
+        int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,true);
+        mlp->setActivateButtonVisiblilty(true, uniqueIntervalID);
+        // post this as a network message as well
+        StringTS s("UnitIntervalStart "+String(electrodeID)+" "+String(subID)+" "+String(uniqueIntervalID));
+        display->processor->handleNetworkMessage(s);
+    }
+    else if (command[0] == "StopInterval")
+    {
+        int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,false);
+        mlp->setActivateButtonVisiblilty(true, -1);
+        // post this as a network message as well
+        StringTS s("UnitIntervalStop "+String(electrodeID)+" "+String(subID) + " "+String(uniqueIntervalID));
+        display->processor->handleNetworkMessage(s);
+    }
+    else if (command[0] == "NewRange")
+    {
+        if (display->canvas->getMatchRange())
+        {
+            double xmin = command[1].getDoubleValue();
+            double xmax = command[2].getDoubleValue();
+            double ymin = command[3].getDoubleValue();
+            double ymax = command[4].getDoubleValue();
+            display->canvas->setRange(xmin,xmax,ymin,ymax,plotType);
+        }
+    }
+}
diff --git a/Source/Processors/PluginManager/PluginManager.cpp b/Source/Processors/PluginManager/PluginManager.cpp
index 89e0e5734..302b83ebb 100644
--- a/Source/Processors/PluginManager/PluginManager.cpp
+++ b/Source/Processors/PluginManager/PluginManager.cpp
@@ -1,202 +1,202 @@
-/*
-	 ------------------------------------------------------------------
-
-	 This file is part of the Open Ephys GUI
-	 Copyright (C) 2013 Open Ephys
-
-	 ------------------------------------------------------------------
-
-	 This program is free software: you can redistribute it and/or modify
-	 it under the terms of the GNU General Public License as published by
-	 the Free Software Foundation, either version 3 of the License, or
-	 (at your option) any later version.
-
-	 This program is distributed in the hope that it will be useful,
-	 but WITHOUT ANY WARRANTY; without even the implied warranty of
-	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	 GNU General Public License for more details.
-
-	 You should have received a copy of the GNU General Public License
-	 along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
- */
-
-#include <iostream>
-#include <stdio.h>
-#ifdef WIN32
-//simple hack to avoid to much conditionals
-#define dlclose(h) FreeLibrary(h)
-#else
-#include <dlfcn.h>
-#include <execinfo.h>
-#endif
-
-#include "PluginManager.h"
-#include "../../UI/ProcessorList.h"
-
-
-#ifdef WIN32
-//And this one because Windows doesn't provide an error-to-string anything
-static const char* dlerror(void)
-{
-	static char buf[32];
-	DWORD ret = GetLastError();
-	if (!ret) return NULL;
-	sprintf(buf, "DLL Error 0x%x",ret);
-	return buf;
-}
-#define ERROR_MSG(fmt,...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,__VA_ARGS__);} while(0)
-#else
-#define ERROR_MSG(fmt,args...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,## args);} while(0)
-#endif
-
-/*
-	 Takes the user-specified plugin and begins
-	 dynamic loading process. We want to ensure that
-	 no step is exectured without a checkpoint
-	 because dynamic loading calls for rellocation of RAM
-	 and works inside the same POSIX thread as the GUI.
- */
-
-PluginManager::Plugin::Plugin() {
-}
-
-PluginManager::Plugin::~Plugin() {
-}
-
-/*
-	 Allows user to select custom-compiled processor for
-	 loading into the GUI.
- */
-PluginManager::Plugin *PluginManager::Manager::loadPlugin(const String& pluginLoc) {
-	/*
-		 Load in the selected processor. This takes the
-		 dynamic object (.so) and copies it into RAM
-		 Dynamic linker requires a C-style string, so we
-		 we have to convert first.
-	 */
-	const char* processorLocCString = static_cast<const char*>(pluginLoc.toUTF8());
-
-#ifndef WIN32
-	// Clear errors
-	dlerror();
-
-	/*
-		 Changing this to resolve all variables immediately upon loading.
-		 This will provide for quicker testing of the custom
-		 processor stability and to ensure that it doesn't crash due
-		 to memory mishaps.
-	 */
-	void *handle = 0;
-	handle = dlopen(processorLocCString,RTLD_GLOBAL|RTLD_NOW);
-#else
-	HINSTANCE handle;
-	handle = LoadLibrary(processorLocCString);
-#endif
-	
-	if (!handle) {
-		printf("%s\n", dlerror());
-		dlclose(handle);
-		return 0;
-	}
-	dlerror();
-
-	/*
-		 Now that the processor is loaded up, let's look for the required
-		 functions. Apparently ISO C++ forbids against casting object
-		 pointer -> function pointer but it's safe here.
-	 */
-	Plugin *(*createFunc)() = 0;
-#ifdef WIN32
-	createFunc =(Plugin *(*)()) GetProcAddress(handle,"OpenEphysPlugin");
-#else
-	createFunc = (Plugin *(*)())(dlsym(handle,"OpenEphysPlugin"));
-#endif
-	if (!createFunc) {
-		ERROR_MSG("%s\n",dlerror());
-		dlclose(handle);
-		return 0;
-	}
-	dlerror();
-
-	/*
-		 Call the casted function pointer
-		 to call the processor constructor.
-	 */
-	Plugin *processor = 0;
-	processor = createFunc();
-	if (!processor) {
-		ERROR_MSG("Invalid processor architecture\n");
-		dlclose(handle);
-		return 0;
-	}
-	dlerror();
-
-	processor->processorHandle = handle;
-	insertListPlugin(processor);
-	return processor;
-}
-
-void PluginManager::Manager::unloadPlugin(PluginManager::Plugin *processor) {
-	if (!processor) {
-		ERROR_MSG("PluginManager::unloadPlugin: Invalid processor\n");
-		return;
-	}
-#ifdef WIN32
-	HINSTANCE handle;
-#else
-	void *handle = 0;
-#endif
-	handle = processor->processorHandle;
-	dlclose(handle);
-	removeListPlugin(processor);
-}
-
-void PluginManager::Manager::insertListPlugin(PluginManager::Plugin *processor) {
-	std::cout << "Size of list before is: " << pluginList.size() << std::endl;
-	if(!processor) {
-		ERROR_MSG("PluginManager::insertListPlugin: Invalid processor.\n");
-		return;
-	}
-	pluginList.push_back(processor);
-	std::cout << "Size of list after is: " << pluginList.size() << std::endl;
-}
-
-void PluginManager::Manager::removeListPlugin(PluginManager::Plugin *processor) {
-	std::cout << "Size of list before is: " << pluginList.size() << std::endl;
-	if(!processor) {
-		ERROR_MSG("PluginManager::removeListPlugin: Invalid processor.\n");
-		return;
-	}
-	pluginList.remove(processor);
-	std::cout << "Size of list after is: " << pluginList.size() << std::endl;
-}
-
-void PluginManager::Manager::removeAllPlugins() {
-#ifdef WIN32
-	HINSTANCE handle;
-#else
-	void *handle;
-#endif
-	for(std::list<PluginManager::Plugin *>::iterator i = pluginList.begin(); i != pluginList.end(); i = pluginList.begin()) {
-		std::cout << "Size of list before all is: " << pluginList.size() << std::endl;
-		handle = (*i)->processorHandle;
-		removeListPlugin(*i);
-		delete *i;
-		dlclose(handle);
-		std::cout << "Size of list after all is: " << pluginList.size() << std::endl;
-	}
-}
-
-PluginManager::Manager *PluginManager::Manager::instance = 0;
-PluginManager::Manager *PluginManager::Manager::getInstance() {
-	if (instance) {
-		return instance;
-	}
-
-	if (!instance) {
-		static Manager manager;
-		instance = &manager;
-	}
-	return instance;
-}
+/*
+	 ------------------------------------------------------------------
+
+	 This file is part of the Open Ephys GUI
+	 Copyright (C) 2013 Open Ephys
+
+	 ------------------------------------------------------------------
+
+	 This program is free software: you can redistribute it and/or modify
+	 it under the terms of the GNU General Public License as published by
+	 the Free Software Foundation, either version 3 of the License, or
+	 (at your option) any later version.
+
+	 This program is distributed in the hope that it will be useful,
+	 but WITHOUT ANY WARRANTY; without even the implied warranty of
+	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	 GNU General Public License for more details.
+
+	 You should have received a copy of the GNU General Public License
+	 along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#include <iostream>
+#include <stdio.h>
+#ifdef WIN32
+//simple hack to avoid to much conditionals
+#define dlclose(h) FreeLibrary(h)
+#else
+#include <dlfcn.h>
+#include <execinfo.h>
+#endif
+
+#include "PluginManager.h"
+#include "../../UI/ProcessorList.h"
+
+
+#ifdef WIN32
+//And this one because Windows doesn't provide an error-to-string anything
+static const char* dlerror(void)
+{
+	static char buf[32];
+	DWORD ret = GetLastError();
+	if (!ret) return NULL;
+	sprintf(buf, "DLL Error 0x%x",ret);
+	return buf;
+}
+#define ERROR_MSG(fmt,...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,__VA_ARGS__);} while(0)
+#else
+#define ERROR_MSG(fmt,args...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,## args);} while(0)
+#endif
+
+/*
+	 Takes the user-specified plugin and begins
+	 dynamic loading process. We want to ensure that
+	 no step is exectured without a checkpoint
+	 because dynamic loading calls for rellocation of RAM
+	 and works inside the same POSIX thread as the GUI.
+ */
+
+PluginManager::Plugin::Plugin() {
+}
+
+PluginManager::Plugin::~Plugin() {
+}
+
+/*
+	 Allows user to select custom-compiled processor for
+	 loading into the GUI.
+ */
+PluginManager::Plugin *PluginManager::Manager::loadPlugin(const String& pluginLoc) {
+	/*
+		 Load in the selected processor. This takes the
+		 dynamic object (.so) and copies it into RAM
+		 Dynamic linker requires a C-style string, so we
+		 we have to convert first.
+	 */
+	const char* processorLocCString = static_cast<const char*>(pluginLoc.toUTF8());
+
+#ifndef WIN32
+	// Clear errors
+	dlerror();
+
+	/*
+		 Changing this to resolve all variables immediately upon loading.
+		 This will provide for quicker testing of the custom
+		 processor stability and to ensure that it doesn't crash due
+		 to memory mishaps.
+	 */
+	void *handle = 0;
+	handle = dlopen(processorLocCString,RTLD_GLOBAL|RTLD_NOW);
+#else
+	HINSTANCE handle;
+	handle = LoadLibrary(processorLocCString);
+#endif
+	
+	if (!handle) {
+		printf("%s\n", dlerror());
+		dlclose(handle);
+		return 0;
+	}
+	dlerror();
+
+	/*
+		 Now that the processor is loaded up, let's look for the required
+		 functions. Apparently ISO C++ forbids against casting object
+		 pointer -> function pointer but it's safe here.
+	 */
+	Plugin *(*createFunc)() = 0;
+#ifdef WIN32
+	createFunc =(Plugin *(*)()) GetProcAddress(handle,"OpenEphysPlugin");
+#else
+	createFunc = (Plugin *(*)())(dlsym(handle,"OpenEphysPlugin"));
+#endif
+	if (!createFunc) {
+		ERROR_MSG("%s\n",dlerror());
+		dlclose(handle);
+		return 0;
+	}
+	dlerror();
+
+	/*
+		 Call the casted function pointer
+		 to call the processor constructor.
+	 */
+	Plugin *processor = 0;
+	processor = createFunc();
+	if (!processor) {
+		ERROR_MSG("Invalid processor architecture\n");
+		dlclose(handle);
+		return 0;
+	}
+	dlerror();
+
+	processor->processorHandle = handle;
+	insertListPlugin(processor);
+	return processor;
+}
+
+void PluginManager::Manager::unloadPlugin(PluginManager::Plugin *processor) {
+	if (!processor) {
+		ERROR_MSG("PluginManager::unloadPlugin: Invalid processor\n");
+		return;
+	}
+#ifdef WIN32
+	HINSTANCE handle;
+#else
+	void *handle = 0;
+#endif
+	handle = processor->processorHandle;
+	dlclose(handle);
+	removeListPlugin(processor);
+}
+
+void PluginManager::Manager::insertListPlugin(PluginManager::Plugin *processor) {
+	std::cout << "Size of list before is: " << pluginList.size() << std::endl;
+	if(!processor) {
+		ERROR_MSG("PluginManager::insertListPlugin: Invalid processor.\n");
+		return;
+	}
+	pluginList.push_back(processor);
+	std::cout << "Size of list after is: " << pluginList.size() << std::endl;
+}
+
+void PluginManager::Manager::removeListPlugin(PluginManager::Plugin *processor) {
+	std::cout << "Size of list before is: " << pluginList.size() << std::endl;
+	if(!processor) {
+		ERROR_MSG("PluginManager::removeListPlugin: Invalid processor.\n");
+		return;
+	}
+	pluginList.remove(processor);
+	std::cout << "Size of list after is: " << pluginList.size() << std::endl;
+}
+
+void PluginManager::Manager::removeAllPlugins() {
+#ifdef WIN32
+	HINSTANCE handle;
+#else
+	void *handle;
+#endif
+	for(std::list<PluginManager::Plugin *>::iterator i = pluginList.begin(); i != pluginList.end(); i = pluginList.begin()) {
+		std::cout << "Size of list before all is: " << pluginList.size() << std::endl;
+		handle = (*i)->processorHandle;
+		removeListPlugin(*i);
+		delete *i;
+		dlclose(handle);
+		std::cout << "Size of list after all is: " << pluginList.size() << std::endl;
+	}
+}
+
+PluginManager::Manager *PluginManager::Manager::instance = 0;
+PluginManager::Manager *PluginManager::Manager::getInstance() {
+	if (instance) {
+		return instance;
+	}
+
+	if (!instance) {
+		static Manager manager;
+		instance = &manager;
+	}
+	return instance;
+}
diff --git a/Source/Processors/PluginManager/PluginManager.h b/Source/Processors/PluginManager/PluginManager.h
index dfc02cc97..08a9ffa58 100644
--- a/Source/Processors/PluginManager/PluginManager.h
+++ b/Source/Processors/PluginManager/PluginManager.h
@@ -1,76 +1,76 @@
-/*
-	 ------------------------------------------------------------------
-
-	 This file is part of the Open Ephys GUI
-	 Copyright (C) 2013 Open Ephys
-
-	 ------------------------------------------------------------------
-
-	 This program is free software: you can redistribute it and/or modify
-	 it under the terms of the GNU General Public License as published by
-	 the Free Software Foundation, either version 3 of the License, or
-	 (at your option) any later version.
-
-	 This program is distributed in the hope that it will be useful,
-	 but WITHOUT ANY WARRANTY; without even the implied warranty of
-	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-	 GNU General Public License for more details.
-
-	 You should have received a copy of the GNU General Public License
-	 along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
- */
-
-#ifndef __PLUGINMGR__
-#define __PLUGINMGR__
-
-#ifdef WIN32
-#include <Windows.h>
-#endif
-#include <list>
-#include <string>
-#include <sys/types.h>
-#include "../../../JuceLibraryCode/JuceHeader.h"
-
-namespace PluginManager {
-
-	class Plugin;
-
-	class Manager {
-		friend class Plugin;
-
-		public:
-		static Manager *getInstance(void);
-		Plugin *loadPlugin(const String&);
-		void unloadPlugin(Plugin *);
-		void removeAllPlugins();
-
-		private:
-		Manager(void) {};
-		~Manager(void) {};
-		Manager(const Manager &) {};
-		Manager &operator=(const Manager &) {return *getInstance();};
-
-		void insertListPlugin(PluginManager::Plugin *);
-		void removeListPlugin(PluginManager::Plugin *);
-		std::list<PluginManager::Plugin *> pluginList;
-		static Manager *instance;
-	};
-
-	class Plugin {
-		friend class Manager;
-
-		public:
-		Plugin();
-		virtual ~Plugin();
-		void unload();
-
-		private:
-#ifdef WIN32
-			HINSTANCE processorHandle;
-#else
-		void *processorHandle;
-#endif
-	};
-};
-#endif
+/*
+	 ------------------------------------------------------------------
+
+	 This file is part of the Open Ephys GUI
+	 Copyright (C) 2013 Open Ephys
+
+	 ------------------------------------------------------------------
+
+	 This program is free software: you can redistribute it and/or modify
+	 it under the terms of the GNU General Public License as published by
+	 the Free Software Foundation, either version 3 of the License, or
+	 (at your option) any later version.
+
+	 This program is distributed in the hope that it will be useful,
+	 but WITHOUT ANY WARRANTY; without even the implied warranty of
+	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	 GNU General Public License for more details.
+
+	 You should have received a copy of the GNU General Public License
+	 along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#ifndef __PLUGINMGR__
+#define __PLUGINMGR__
+
+#ifdef WIN32
+#include <Windows.h>
+#endif
+#include <list>
+#include <string>
+#include <sys/types.h>
+#include "../../../JuceLibraryCode/JuceHeader.h"
+
+namespace PluginManager {
+
+	class Plugin;
+
+	class Manager {
+		friend class Plugin;
+
+		public:
+		static Manager *getInstance(void);
+		Plugin *loadPlugin(const String&);
+		void unloadPlugin(Plugin *);
+		void removeAllPlugins();
+
+		private:
+		Manager(void) {};
+		~Manager(void) {};
+		Manager(const Manager &) {};
+		Manager &operator=(const Manager &) {return *getInstance();};
+
+		void insertListPlugin(PluginManager::Plugin *);
+		void removeListPlugin(PluginManager::Plugin *);
+		std::list<PluginManager::Plugin *> pluginList;
+		static Manager *instance;
+	};
+
+	class Plugin {
+		friend class Manager;
+
+		public:
+		Plugin();
+		virtual ~Plugin();
+		void unload();
+
+		private:
+#ifdef WIN32
+			HINSTANCE processorHandle;
+#else
+		void *processorHandle;
+#endif
+	};
+};
+#endif
diff --git a/open-ephys.jucer b/open-ephys.jucer
index e446bed77..0425b90eb 100644
--- a/open-ephys.jucer
+++ b/open-ephys.jucer
@@ -275,31 +275,31 @@
     <GROUP id="ZMfWAFj" name="Source">
       <FILE id="QyaTEa" name="CoreServices.cpp" compile="1" resource="0"
             file="Source/CoreServices.cpp"/>
-      <FILE id="BH11mU" name="CoreServices.h" compile="0" resource="0" file="Source/CoreServices.h"/>
+      <FILE id="BH11mU" name="CoreServices.h" compile="1" resource="0" file="Source/CoreServices.h"/>
       <FILE id="AXFRUPT" name="AccessClass.cpp" compile="1" resource="0"
             file="Source/AccessClass.cpp"/>
-      <FILE id="2ViPrE" name="AccessClass.h" compile="0" resource="0" file="Source/AccessClass.h"/>
+      <FILE id="2ViPrE" name="AccessClass.h" compile="1" resource="0" file="Source/AccessClass.h"/>
       <GROUP id="leJrZDi" name="Network">
         <FILE id="mOOc0R" name="PracticalSocket.cpp" compile="1" resource="0"
               file="Source/Network/PracticalSocket.cpp"/>
-        <FILE id="5XGl6EX" name="PracticalSocket.h" compile="0" resource="0"
+        <FILE id="5XGl6EX" name="PracticalSocket.h" compile="1" resource="0"
               file="Source/Network/PracticalSocket.h"/>
       </GROUP>
       <GROUP id="gRFzu0" name="Audio">
         <FILE id="2vKx2R" name="AudioComponent.cpp" compile="1" resource="0"
               file="Source/Audio/AudioComponent.cpp"/>
-        <FILE id="lyiexes" name="AudioComponent.h" compile="0" resource="0"
+        <FILE id="lyiexes" name="AudioComponent.h" compile="1" resource="0"
               file="Source/Audio/AudioComponent.h"/>
       </GROUP>
       <GROUP id="yQmqZWk" name="Processors">
         <GROUP id="{419E358E-7049-BF7C-21D8-840285A12731}" name="PluginManager">
           <FILE id="a5xlEQ" name="PluginManager.cpp" compile="1" resource="0"
                 file="Source/Processors/PluginManager/PluginManager.cpp"/>
-          <FILE id="I8EBWd" name="PluginManager.h" compile="0" resource="0" file="Source/Processors/PluginManager/PluginManager.h"/>
+          <FILE id="I8EBWd" name="PluginManager.h" compile="1" resource="0" file="Source/Processors/PluginManager/PluginManager.h"/>
         </GROUP>
         <GROUP id="{6E059BEC-4A8F-BCDA-1F91-9B22C6CBF2E4}" name="Rectifier">
           <FILE id="oMFsRh" name="Rectifier.cpp" compile="1" resource="0" file="Source/Processors/Rectifier/Rectifier.cpp"/>
-          <FILE id="NdIO5Q" name="Rectifier.h" compile="0" resource="0" file="Source/Processors/Rectifier/Rectifier.h"/>
+          <FILE id="NdIO5Q" name="Rectifier.h" compile="1" resource="0" file="Source/Processors/Rectifier/Rectifier.h"/>
         </GROUP>
         <GROUP id="{447899E6-3974-53D0-5588-79643E8F5CA3}" name="ArduinoOutput">
           <FILE id="Ucs5gf" name="ArduinoOutput.cpp" compile="0" resource="0"
@@ -312,107 +312,107 @@
         </GROUP>
         <GROUP id="{1932782D-9D00-9B76-92DC-94E7D42BF0D2}" name="AudioNode">
           <FILE id="TV4cOO" name="AudioEditor.cpp" compile="1" resource="0" file="Source/Processors/AudioNode/AudioEditor.cpp"/>
-          <FILE id="erBMrA" name="AudioEditor.h" compile="0" resource="0" file="Source/Processors/AudioNode/AudioEditor.h"/>
+          <FILE id="erBMrA" name="AudioEditor.h" compile="1" resource="0" file="Source/Processors/AudioNode/AudioEditor.h"/>
           <FILE id="jClaJf" name="AudioNode.cpp" compile="1" resource="0" file="Source/Processors/AudioNode/AudioNode.cpp"/>
-          <FILE id="LHkdoG" name="AudioNode.h" compile="0" resource="0" file="Source/Processors/AudioNode/AudioNode.h"/>
+          <FILE id="LHkdoG" name="AudioNode.h" compile="1" resource="0" file="Source/Processors/AudioNode/AudioNode.h"/>
         </GROUP>
         <GROUP id="{524D893D-A1F5-2C0F-5BB3-5E5C4D8C697D}" name="CAR">
           <FILE id="Tt1aBa" name="CAR.cpp" compile="1" resource="0" file="Source/Processors/CAR/CAR.cpp"/>
-          <FILE id="JRBOqc" name="CAR.h" compile="0" resource="0" file="Source/Processors/CAR/CAR.h"/>
+          <FILE id="JRBOqc" name="CAR.h" compile="1" resource="0" file="Source/Processors/CAR/CAR.h"/>
         </GROUP>
         <GROUP id="{46016F19-8F25-F540-AA1C-D6E87E8D7D31}" name="Channel">
           <FILE id="X3I3e9" name="Channel.cpp" compile="1" resource="0" file="Source/Processors/Channel/Channel.cpp"/>
-          <FILE id="IEZGF3" name="Channel.h" compile="0" resource="0" file="Source/Processors/Channel/Channel.h"/>
+          <FILE id="IEZGF3" name="Channel.h" compile="1" resource="0" file="Source/Processors/Channel/Channel.h"/>
         </GROUP>
         <GROUP id="{CC57D5E1-9093-9454-4B03-5908715DFBD8}" name="ChannelMappingNode">
-          <FILE id="UhpW2V" name="ChannelMappingEditor.cpp" compile="0" resource="0"
+          <FILE id="UhpW2V" name="ChannelMappingEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/ChannelMappingNode/ChannelMappingEditor.cpp"/>
-          <FILE id="kq8tJl" name="ChannelMappingEditor.h" compile="0" resource="0"
+          <FILE id="kq8tJl" name="ChannelMappingEditor.h" compile="1" resource="0"
                 file="Source/Processors/ChannelMappingNode/ChannelMappingEditor.h"/>
-          <FILE id="gRCztM" name="ChannelMappingNode.cpp" compile="0" resource="0"
+          <FILE id="gRCztM" name="ChannelMappingNode.cpp" compile="1" resource="0"
                 file="Source/Processors/ChannelMappingNode/ChannelMappingNode.cpp"/>
-          <FILE id="blwGma" name="ChannelMappingNode.h" compile="0" resource="0"
+          <FILE id="blwGma" name="ChannelMappingNode.h" compile="1" resource="0"
                 file="Source/Processors/ChannelMappingNode/ChannelMappingNode.h"/>
         </GROUP>
         <GROUP id="ZgsuWxi" name="DataThreads">
           <FILE id="gHzlwP" name="EcubeEditor.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeEditor.cpp"/>
-          <FILE id="Bi0une" name="EcubeEditor.h" compile="0" resource="0" file="Source/Processors/DataThreads/EcubeEditor.h"/>
+          <FILE id="Bi0une" name="EcubeEditor.h" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeEditor.h"/>
           <FILE id="ZBPSXE" name="RHD2000Editor.cpp" compile="1" resource="0"
                 file="Source/Processors/DataThreads/RHD2000Editor.cpp"/>
-          <FILE id="TnZlGU" name="RHD2000Editor.h" compile="0" resource="0" file="Source/Processors/DataThreads/RHD2000Editor.h"/>
+          <FILE id="TnZlGU" name="RHD2000Editor.h" compile="1" resource="0" file="Source/Processors/DataThreads/RHD2000Editor.h"/>
           <FILE id="mbMbly" name="EcubeThread.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeThread.cpp"/>
-          <FILE id="lKsc0T" name="EcubeThread.h" compile="0" resource="0" file="Source/Processors/DataThreads/EcubeThread.h"/>
+          <FILE id="lKsc0T" name="EcubeThread.h" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeThread.h"/>
           <GROUP id="LcWQtrg" name="rhythm-api">
             <FILE id="hyM1EYD" name="okFrontPanelDLL.cpp" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp"/>
-            <FILE id="umVgAPM" name="okFrontPanelDLL.h" compile="0" resource="0"
+            <FILE id="umVgAPM" name="okFrontPanelDLL.h" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h"/>
             <FILE id="xNtaB1Q" name="rhd2000datablock.cpp" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"/>
-            <FILE id="Wg7Wpit" name="rhd2000datablock.h" compile="0" resource="0"
+            <FILE id="Wg7Wpit" name="rhd2000datablock.h" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h"/>
             <FILE id="zVeQUvs" name="rhd2000evalboard.cpp" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp"/>
-            <FILE id="0Kf2dKC" name="rhd2000evalboard.h" compile="0" resource="0"
+            <FILE id="0Kf2dKC" name="rhd2000evalboard.h" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h"/>
             <FILE id="QL3qRCG" name="rhd2000registers.cpp" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp"/>
-            <FILE id="VSCEdYf" name="rhd2000registers.h" compile="0" resource="0"
+            <FILE id="VSCEdYf" name="rhd2000registers.h" compile="1" resource="0"
                   file="Source/Processors/DataThreads/rhythm-api/rhd2000registers.h"/>
           </GROUP>
           <FILE id="g24kpza" name="RHD2000Thread.cpp" compile="1" resource="0"
                 file="Source/Processors/DataThreads/RHD2000Thread.cpp"/>
-          <FILE id="BbYdtBN" name="RHD2000Thread.h" compile="0" resource="0"
+          <FILE id="BbYdtBN" name="RHD2000Thread.h" compile="1" resource="0"
                 file="Source/Processors/DataThreads/RHD2000Thread.h"/>
           <FILE id="Qfe0ygk" name="DataBuffer.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/DataBuffer.cpp"/>
-          <FILE id="VCRMcQP" name="DataBuffer.h" compile="0" resource="0" file="Source/Processors/DataThreads/DataBuffer.h"/>
+          <FILE id="VCRMcQP" name="DataBuffer.h" compile="1" resource="0" file="Source/Processors/DataThreads/DataBuffer.h"/>
           <FILE id="9JbVKlA" name="DataThread.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/DataThread.cpp"/>
-          <FILE id="McgNvuR" name="DataThread.h" compile="0" resource="0" file="Source/Processors/DataThreads/DataThread.h"/>
+          <FILE id="McgNvuR" name="DataThread.h" compile="1" resource="0" file="Source/Processors/DataThreads/DataThread.h"/>
         </GROUP>
         <GROUP id="{BCF99568-D3A2-7CA2-E809-815D22183EA4}" name="Dsp">
           <FILE id="PHlcin" name="Bessel.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Bessel.cpp"/>
-          <FILE id="YXAcyZ" name="Bessel.h" compile="0" resource="0" file="Source/Processors/Dsp/Bessel.h"/>
+          <FILE id="YXAcyZ" name="Bessel.h" compile="1" resource="0" file="Source/Processors/Dsp/Bessel.h"/>
           <FILE id="nOEja0" name="Biquad.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Biquad.cpp"/>
-          <FILE id="DxX7XS" name="Biquad.h" compile="0" resource="0" file="Source/Processors/Dsp/Biquad.h"/>
+          <FILE id="DxX7XS" name="Biquad.h" compile="1" resource="0" file="Source/Processors/Dsp/Biquad.h"/>
           <FILE id="VQ44sd" name="Butterworth.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Butterworth.cpp"/>
-          <FILE id="NVAymk" name="Butterworth.h" compile="0" resource="0" file="Source/Processors/Dsp/Butterworth.h"/>
+          <FILE id="NVAymk" name="Butterworth.h" compile="1" resource="0" file="Source/Processors/Dsp/Butterworth.h"/>
           <FILE id="FkrTqV" name="Cascade.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Cascade.cpp"/>
-          <FILE id="pj0T3e" name="Cascade.h" compile="0" resource="0" file="Source/Processors/Dsp/Cascade.h"/>
+          <FILE id="pj0T3e" name="Cascade.h" compile="1" resource="0" file="Source/Processors/Dsp/Cascade.h"/>
           <FILE id="ggju8m" name="ChebyshevI.cpp" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevI.cpp"/>
-          <FILE id="EGxTwj" name="ChebyshevI.h" compile="0" resource="0" file="Source/Processors/Dsp/ChebyshevI.h"/>
+          <FILE id="EGxTwj" name="ChebyshevI.h" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevI.h"/>
           <FILE id="nWSeZF" name="ChebyshevII.cpp" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevII.cpp"/>
-          <FILE id="HS65B6" name="ChebyshevII.h" compile="0" resource="0" file="Source/Processors/Dsp/ChebyshevII.h"/>
-          <FILE id="jumO5X" name="Common.h" compile="0" resource="0" file="Source/Processors/Dsp/Common.h"/>
+          <FILE id="HS65B6" name="ChebyshevII.h" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevII.h"/>
+          <FILE id="jumO5X" name="Common.h" compile="1" resource="0" file="Source/Processors/Dsp/Common.h"/>
           <FILE id="E1ZdBg" name="Custom.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Custom.cpp"/>
-          <FILE id="JAxvZH" name="Custom.h" compile="0" resource="0" file="Source/Processors/Dsp/Custom.h"/>
+          <FILE id="JAxvZH" name="Custom.h" compile="1" resource="0" file="Source/Processors/Dsp/Custom.h"/>
           <FILE id="BynrL2" name="Design.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Design.cpp"/>
-          <FILE id="tINM97" name="Design.h" compile="0" resource="0" file="Source/Processors/Dsp/Design.h"/>
+          <FILE id="tINM97" name="Design.h" compile="1" resource="0" file="Source/Processors/Dsp/Design.h"/>
           <FILE id="gikZHr" name="Documentation.cpp" compile="1" resource="0"
                 file="Source/Processors/Dsp/Documentation.cpp"/>
-          <FILE id="nwwW9u" name="Dsp.h" compile="0" resource="0" file="Source/Processors/Dsp/Dsp.h"/>
+          <FILE id="nwwW9u" name="Dsp.h" compile="1" resource="0" file="Source/Processors/Dsp/Dsp.h"/>
           <FILE id="VMtjos" name="Elliptic.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Elliptic.cpp"/>
-          <FILE id="xlw76X" name="Elliptic.h" compile="0" resource="0" file="Source/Processors/Dsp/Elliptic.h"/>
+          <FILE id="xlw76X" name="Elliptic.h" compile="1" resource="0" file="Source/Processors/Dsp/Elliptic.h"/>
           <FILE id="SSUdH3" name="Filter.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Filter.cpp"/>
-          <FILE id="jMEqrr" name="Filter.h" compile="0" resource="0" file="Source/Processors/Dsp/Filter.h"/>
-          <FILE id="gORopa" name="Layout.h" compile="0" resource="0" file="Source/Processors/Dsp/Layout.h"/>
+          <FILE id="jMEqrr" name="Filter.h" compile="1" resource="0" file="Source/Processors/Dsp/Filter.h"/>
+          <FILE id="gORopa" name="Layout.h" compile="1" resource="0" file="Source/Processors/Dsp/Layout.h"/>
           <FILE id="KFWbTw" name="Legendre.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Legendre.cpp"/>
-          <FILE id="QukTBD" name="Legendre.h" compile="0" resource="0" file="Source/Processors/Dsp/Legendre.h"/>
-          <FILE id="yjHeg0" name="MathSupplement.h" compile="0" resource="0"
+          <FILE id="QukTBD" name="Legendre.h" compile="1" resource="0" file="Source/Processors/Dsp/Legendre.h"/>
+          <FILE id="yjHeg0" name="MathSupplement.h" compile="1" resource="0"
                 file="Source/Processors/Dsp/MathSupplement.h"/>
           <FILE id="lSjPpg" name="Param.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Param.cpp"/>
-          <FILE id="GbSbST" name="Params.h" compile="0" resource="0" file="Source/Processors/Dsp/Params.h"/>
+          <FILE id="GbSbST" name="Params.h" compile="1" resource="0" file="Source/Processors/Dsp/Params.h"/>
           <FILE id="iTSDrw" name="PoleFilter.cpp" compile="1" resource="0" file="Source/Processors/Dsp/PoleFilter.cpp"/>
-          <FILE id="c45usH" name="PoleFilter.h" compile="0" resource="0" file="Source/Processors/Dsp/PoleFilter.h"/>
+          <FILE id="c45usH" name="PoleFilter.h" compile="1" resource="0" file="Source/Processors/Dsp/PoleFilter.h"/>
           <FILE id="UEmTDD" name="RBJ.cpp" compile="1" resource="0" file="Source/Processors/Dsp/RBJ.cpp"/>
-          <FILE id="PjXcyh" name="RBJ.h" compile="0" resource="0" file="Source/Processors/Dsp/RBJ.h"/>
+          <FILE id="PjXcyh" name="RBJ.h" compile="1" resource="0" file="Source/Processors/Dsp/RBJ.h"/>
           <FILE id="n1FzuK" name="RootFinder.cpp" compile="1" resource="0" file="Source/Processors/Dsp/RootFinder.cpp"/>
-          <FILE id="aDg7vK" name="RootFinder.h" compile="0" resource="0" file="Source/Processors/Dsp/RootFinder.h"/>
-          <FILE id="DE0lE3" name="SmoothedFilter.h" compile="0" resource="0"
+          <FILE id="aDg7vK" name="RootFinder.h" compile="1" resource="0" file="Source/Processors/Dsp/RootFinder.h"/>
+          <FILE id="DE0lE3" name="SmoothedFilter.h" compile="1" resource="0"
                 file="Source/Processors/Dsp/SmoothedFilter.h"/>
           <FILE id="SPcR5B" name="State.cpp" compile="1" resource="0" file="Source/Processors/Dsp/State.cpp"/>
-          <FILE id="D1k4f9" name="State.h" compile="0" resource="0" file="Source/Processors/Dsp/State.h"/>
-          <FILE id="BBxUBy" name="Types.h" compile="0" resource="0" file="Source/Processors/Dsp/Types.h"/>
-          <FILE id="qXPdAz" name="Utilities.h" compile="0" resource="0" file="Source/Processors/Dsp/Utilities.h"/>
+          <FILE id="D1k4f9" name="State.h" compile="1" resource="0" file="Source/Processors/Dsp/State.h"/>
+          <FILE id="BBxUBy" name="Types.h" compile="1" resource="0" file="Source/Processors/Dsp/Types.h"/>
+          <FILE id="qXPdAz" name="Utilities.h" compile="1" resource="0" file="Source/Processors/Dsp/Utilities.h"/>
         </GROUP>
         <GROUP id="AqvwO6w" name="Editors">
           <FILE id="F68NQ3" name="ChannelSelector.cpp" compile="1" resource="0"
@@ -436,312 +436,312 @@
         <GROUP id="{5884418B-6740-1CC4-EC34-721D3F3038AE}" name="EventDetector">
           <FILE id="GzQXNv" name="EventDetector.cpp" compile="1" resource="0"
                 file="Source/Processors/EventDetector/EventDetector.cpp"/>
-          <FILE id="cB7MXO" name="EventDetector.h" compile="0" resource="0" file="Source/Processors/EventDetector/EventDetector.h"/>
+          <FILE id="cB7MXO" name="EventDetector.h" compile="1" resource="0" file="Source/Processors/EventDetector/EventDetector.h"/>
         </GROUP>
         <GROUP id="{0F7938FB-ACA3-29CA-58CE-2F0C8B5B0033}" name="EventNode">
           <FILE id="FWXJPq" name="EventNode.cpp" compile="1" resource="0" file="Source/Processors/EventNode/EventNode.cpp"/>
-          <FILE id="muOEC8" name="EventNode.h" compile="0" resource="0" file="Source/Processors/EventNode/EventNode.h"/>
+          <FILE id="muOEC8" name="EventNode.h" compile="1" resource="0" file="Source/Processors/EventNode/EventNode.h"/>
           <FILE id="Kwuq6Z" name="EventNodeEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/EventNode/EventNodeEditor.cpp"/>
-          <FILE id="LUVId3" name="EventNodeEditor.h" compile="0" resource="0"
+          <FILE id="LUVId3" name="EventNodeEditor.h" compile="1" resource="0"
                 file="Source/Processors/EventNode/EventNodeEditor.h"/>
         </GROUP>
         <GROUP id="{27CF9A8D-7C31-9AA9-6DCA-6C719E127923}" name="FileReader">
           <FILE id="i8d55i" name="KwikFileSource.cpp" compile="1" resource="0"
                 file="Source/Processors/FileReader/KwikFileSource.cpp"/>
-          <FILE id="MXFbiF" name="KwikFileSource.h" compile="0" resource="0"
+          <FILE id="MXFbiF" name="KwikFileSource.h" compile="1" resource="0"
                 file="Source/Processors/FileReader/KwikFileSource.h"/>
           <FILE id="O6lxmJ" name="FileSource.cpp" compile="1" resource="0" file="Source/Processors/FileReader/FileSource.cpp"/>
-          <FILE id="CHKZ6y" name="FileSource.h" compile="0" resource="0" file="Source/Processors/FileReader/FileSource.h"/>
+          <FILE id="CHKZ6y" name="FileSource.h" compile="1" resource="0" file="Source/Processors/FileReader/FileSource.h"/>
           <FILE id="Pg9JfX" name="FileReader.cpp" compile="1" resource="0" file="Source/Processors/FileReader/FileReader.cpp"/>
-          <FILE id="SuAWvs" name="FileReader.h" compile="0" resource="0" file="Source/Processors/FileReader/FileReader.h"/>
+          <FILE id="SuAWvs" name="FileReader.h" compile="1" resource="0" file="Source/Processors/FileReader/FileReader.h"/>
           <FILE id="Z58rr6" name="FileReaderEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/FileReader/FileReaderEditor.cpp"/>
-          <FILE id="Ocpu1k" name="FileReaderEditor.h" compile="0" resource="0"
+          <FILE id="Ocpu1k" name="FileReaderEditor.h" compile="1" resource="0"
                 file="Source/Processors/FileReader/FileReaderEditor.h"/>
         </GROUP>
         <GROUP id="{986528D4-813B-6CCB-4564-5A15140EB912}" name="FilterNode">
           <FILE id="yBlgAF" name="FilterEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/FilterNode/FilterEditor.cpp"/>
-          <FILE id="sBtXDo" name="FilterEditor.h" compile="0" resource="0" file="Source/Processors/FilterNode/FilterEditor.h"/>
+          <FILE id="sBtXDo" name="FilterEditor.h" compile="1" resource="0" file="Source/Processors/FilterNode/FilterEditor.h"/>
           <FILE id="usXu7Q" name="FilterNode.cpp" compile="1" resource="0" file="Source/Processors/FilterNode/FilterNode.cpp"/>
-          <FILE id="qnkW8d" name="FilterNode.h" compile="0" resource="0" file="Source/Processors/FilterNode/FilterNode.h"/>
+          <FILE id="qnkW8d" name="FilterNode.h" compile="1" resource="0" file="Source/Processors/FilterNode/FilterNode.h"/>
         </GROUP>
         <GROUP id="{95FA3CAF-7BFA-AFF7-4480-EADCCA5FBA66}" name="GenericProcessor">
           <FILE id="l24v5k" name="GenericProcessor.cpp" compile="1" resource="0"
                 file="Source/Processors/GenericProcessor/GenericProcessor.cpp"/>
-          <FILE id="jSfKFd" name="GenericProcessor.h" compile="0" resource="0"
+          <FILE id="jSfKFd" name="GenericProcessor.h" compile="1" resource="0"
                 file="Source/Processors/GenericProcessor/GenericProcessor.h"/>
         </GROUP>
         <GROUP id="{B8EDEED3-180D-9198-31A8-D1E42439462C}" name="LfpDisplayNode">
-          <FILE id="jKpYbZ" name="LfpDisplayCanvas.cpp" compile="0" resource="0"
+          <FILE id="jKpYbZ" name="LfpDisplayCanvas.cpp" compile="1" resource="0"
                 file="Source/Processors/LfpDisplayNode/LfpDisplayCanvas.cpp"/>
-          <FILE id="wDsfeN" name="LfpDisplayCanvas.h" compile="0" resource="0"
+          <FILE id="wDsfeN" name="LfpDisplayCanvas.h" compile="1" resource="0"
                 file="Source/Processors/LfpDisplayNode/LfpDisplayCanvas.h"/>
-          <FILE id="tWxSDp" name="LfpDisplayEditor.cpp" compile="0" resource="0"
+          <FILE id="tWxSDp" name="LfpDisplayEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/LfpDisplayNode/LfpDisplayEditor.cpp"/>
-          <FILE id="Nkg6ww" name="LfpDisplayEditor.h" compile="0" resource="0"
+          <FILE id="Nkg6ww" name="LfpDisplayEditor.h" compile="1" resource="0"
                 file="Source/Processors/LfpDisplayNode/LfpDisplayEditor.h"/>
-          <FILE id="x9mO0H" name="LfpDisplayNode.cpp" compile="0" resource="0"
+          <FILE id="x9mO0H" name="LfpDisplayNode.cpp" compile="1" resource="0"
                 file="Source/Processors/LfpDisplayNode/LfpDisplayNode.cpp"/>
-          <FILE id="rKu45v" name="LfpDisplayNode.h" compile="0" resource="0"
+          <FILE id="rKu45v" name="LfpDisplayNode.h" compile="1" resource="0"
                 file="Source/Processors/LfpDisplayNode/LfpDisplayNode.h"/>
         </GROUP>
         <GROUP id="{4B40CAAE-49C7-509A-B7E7-0C7EF011FBA1}" name="Merger">
           <FILE id="gZxAmt" name="Merger.cpp" compile="1" resource="0" file="Source/Processors/Merger/Merger.cpp"/>
-          <FILE id="w8qwHK" name="Merger.h" compile="0" resource="0" file="Source/Processors/Merger/Merger.h"/>
+          <FILE id="w8qwHK" name="Merger.h" compile="1" resource="0" file="Source/Processors/Merger/Merger.h"/>
           <FILE id="YIzAwj" name="MergerEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Merger/MergerEditor.cpp"/>
-          <FILE id="yquxy4" name="MergerEditor.h" compile="0" resource="0" file="Source/Processors/Merger/MergerEditor.h"/>
+          <FILE id="yquxy4" name="MergerEditor.h" compile="1" resource="0" file="Source/Processors/Merger/MergerEditor.h"/>
         </GROUP>
         <GROUP id="{6E21A406-000C-7894-28D6-2B45D07A304B}" name="MessageCenter">
           <FILE id="gnNHUQ" name="MessageCenter.cpp" compile="1" resource="0"
                 file="Source/Processors/MessageCenter/MessageCenter.cpp"/>
-          <FILE id="vn2uwZ" name="MessageCenter.h" compile="0" resource="0" file="Source/Processors/MessageCenter/MessageCenter.h"/>
+          <FILE id="vn2uwZ" name="MessageCenter.h" compile="1" resource="0" file="Source/Processors/MessageCenter/MessageCenter.h"/>
           <FILE id="xGnJo5" name="MessageCenterEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/MessageCenter/MessageCenterEditor.cpp"/>
-          <FILE id="r1V0KZ" name="MessageCenterEditor.h" compile="0" resource="0"
+          <FILE id="r1V0KZ" name="MessageCenterEditor.h" compile="1" resource="0"
                 file="Source/Processors/MessageCenter/MessageCenterEditor.h"/>
         </GROUP>
         <GROUP id="{86B5AC2A-0A78-6D0E-C5FE-6758DDD096DB}" name="Parameter">
           <FILE id="yyyDtp" name="ParameterEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Parameter/ParameterEditor.cpp"/>
-          <FILE id="t3vpkl" name="ParameterEditor.h" compile="0" resource="0"
+          <FILE id="t3vpkl" name="ParameterEditor.h" compile="1" resource="0"
                 file="Source/Processors/Parameter/ParameterEditor.h"/>
           <FILE id="P4fc98" name="Parameter.cpp" compile="1" resource="0" file="Source/Processors/Parameter/Parameter.cpp"/>
-          <FILE id="QdTalD" name="Parameter.h" compile="0" resource="0" file="Source/Processors/Parameter/Parameter.h"/>
+          <FILE id="QdTalD" name="Parameter.h" compile="1" resource="0" file="Source/Processors/Parameter/Parameter.h"/>
         </GROUP>
         <GROUP id="{0FB1D636-E24B-00AB-3123-3C8B78796B4A}" name="PhaseDetector">
-          <FILE id="l7SGiM" name="PhaseDetector.cpp" compile="0" resource="0"
+          <FILE id="l7SGiM" name="PhaseDetector.cpp" compile="1" resource="0"
                 file="Source/Processors/PhaseDetector/PhaseDetector.cpp"/>
-          <FILE id="eKMXut" name="PhaseDetector.h" compile="0" resource="0" file="Source/Processors/PhaseDetector/PhaseDetector.h"/>
-          <FILE id="T9hV0k" name="PhaseDetectorEditor.cpp" compile="0" resource="0"
+          <FILE id="eKMXut" name="PhaseDetector.h" compile="1" resource="0" file="Source/Processors/PhaseDetector/PhaseDetector.h"/>
+          <FILE id="T9hV0k" name="PhaseDetectorEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/PhaseDetector/PhaseDetectorEditor.cpp"/>
-          <FILE id="d4b1Wv" name="PhaseDetectorEditor.h" compile="0" resource="0"
+          <FILE id="d4b1Wv" name="PhaseDetectorEditor.h" compile="1" resource="0"
                 file="Source/Processors/PhaseDetector/PhaseDetectorEditor.h"/>
         </GROUP>
         <GROUP id="{FDEB8810-D49F-8E7C-17A7-685370EF966F}" name="ProcessorGraph">
           <FILE id="qil3t5" name="ProcessorGraph.cpp" compile="1" resource="0"
                 file="Source/Processors/ProcessorGraph/ProcessorGraph.cpp"/>
-          <FILE id="cwGSmb" name="ProcessorGraph.h" compile="0" resource="0"
+          <FILE id="cwGSmb" name="ProcessorGraph.h" compile="1" resource="0"
                 file="Source/Processors/ProcessorGraph/ProcessorGraph.h"/>
         </GROUP>
         <GROUP id="{B89E3035-1523-BBAA-12A9-AA81313B7E8F}" name="PulsePalOutput">
           <FILE id="LEaT0R" name="PulsePalOutput.cpp" compile="1" resource="0"
                 file="Source/Processors/PulsePalOutput/PulsePalOutput.cpp"/>
-          <FILE id="BwbX8M" name="PulsePalOutput.h" compile="0" resource="0"
+          <FILE id="BwbX8M" name="PulsePalOutput.h" compile="1" resource="0"
                 file="Source/Processors/PulsePalOutput/PulsePalOutput.h"/>
           <FILE id="U4ISc3" name="PulsePalOutputEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/PulsePalOutput/PulsePalOutputEditor.cpp"/>
-          <FILE id="ugyMou" name="PulsePalOutputEditor.h" compile="0" resource="0"
+          <FILE id="ugyMou" name="PulsePalOutputEditor.h" compile="1" resource="0"
                 file="Source/Processors/PulsePalOutput/PulsePalOutputEditor.h"/>
         </GROUP>
         <GROUP id="{75D455A6-2354-C8A4-0F0F-EE14C166944C}" name="RecordControl">
-          <FILE id="NfBdVb" name="RecordControl.cpp" compile="0" resource="0"
+          <FILE id="NfBdVb" name="RecordControl.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordControl/RecordControl.cpp"/>
-          <FILE id="URvuJK" name="RecordControl.h" compile="0" resource="0" file="Source/Processors/RecordControl/RecordControl.h"/>
-          <FILE id="sovXVI" name="RecordControlEditor.cpp" compile="0" resource="0"
+          <FILE id="URvuJK" name="RecordControl.h" compile="1" resource="0" file="Source/Processors/RecordControl/RecordControl.h"/>
+          <FILE id="sovXVI" name="RecordControlEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordControl/RecordControlEditor.cpp"/>
-          <FILE id="CKRdQf" name="RecordControlEditor.h" compile="0" resource="0"
+          <FILE id="CKRdQf" name="RecordControlEditor.h" compile="1" resource="0"
                 file="Source/Processors/RecordControl/RecordControlEditor.h"/>
         </GROUP>
         <GROUP id="{72D807AC-44A0-1F7A-8699-22225876FE9A}" name="RecordNode">
           <FILE id="deQ9TU" name="EngineConfigWindow.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordNode/EngineConfigWindow.cpp"/>
-          <FILE id="iSAT0P" name="EngineConfigWindow.h" compile="0" resource="0"
+          <FILE id="iSAT0P" name="EngineConfigWindow.h" compile="1" resource="0"
                 file="Source/Processors/RecordNode/EngineConfigWindow.h"/>
           <FILE id="gZdszH" name="HDF5FileFormat.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordNode/HDF5FileFormat.cpp"/>
-          <FILE id="EF7IbH" name="HDF5FileFormat.h" compile="0" resource="0"
+          <FILE id="EF7IbH" name="HDF5FileFormat.h" compile="1" resource="0"
                 file="Source/Processors/RecordNode/HDF5FileFormat.h"/>
           <FILE id="dpOVsD" name="HDF5Recording.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordNode/HDF5Recording.cpp"/>
-          <FILE id="DJgCzN" name="HDF5Recording.h" compile="0" resource="0" file="Source/Processors/RecordNode/HDF5Recording.h"/>
+          <FILE id="DJgCzN" name="HDF5Recording.h" compile="1" resource="0" file="Source/Processors/RecordNode/HDF5Recording.h"/>
           <FILE id="dpsAhU" name="OriginalRecording.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordNode/OriginalRecording.cpp"/>
-          <FILE id="okexpc" name="OriginalRecording.h" compile="0" resource="0"
+          <FILE id="okexpc" name="OriginalRecording.h" compile="1" resource="0"
                 file="Source/Processors/RecordNode/OriginalRecording.h"/>
           <FILE id="UU77gU" name="RecordEngine.cpp" compile="1" resource="0"
                 file="Source/Processors/RecordNode/RecordEngine.cpp"/>
-          <FILE id="NSKXGp" name="RecordEngine.h" compile="0" resource="0" file="Source/Processors/RecordNode/RecordEngine.h"/>
+          <FILE id="NSKXGp" name="RecordEngine.h" compile="1" resource="0" file="Source/Processors/RecordNode/RecordEngine.h"/>
           <FILE id="ccpPpJ" name="RecordNode.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/RecordNode.cpp"/>
-          <FILE id="R9n30e" name="RecordNode.h" compile="0" resource="0" file="Source/Processors/RecordNode/RecordNode.h"/>
+          <FILE id="R9n30e" name="RecordNode.h" compile="1" resource="0" file="Source/Processors/RecordNode/RecordNode.h"/>
         </GROUP>
         <GROUP id="{F022773C-7EE5-9281-45A6-78C55997C4EC}" name="NetworkEvents">
-          <FILE id="crJWqD" name="NetworkEventsEditor.cpp" compile="0" resource="0"
+          <FILE id="crJWqD" name="NetworkEventsEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Editors/NetworkEventsEditor.cpp"/>
-          <FILE id="i3MpZ5" name="NetworkEventsEditor.h" compile="0" resource="0"
+          <FILE id="i3MpZ5" name="NetworkEventsEditor.h" compile="1" resource="0"
                 file="Source/Processors/Editors/NetworkEventsEditor.h"/>
-          <FILE id="wW0nOT" name="NetworkEvents.cpp" compile="0" resource="0"
+          <FILE id="wW0nOT" name="NetworkEvents.cpp" compile="1" resource="0"
                 file="Source/Processors/NetworkEvents/NetworkEvents.cpp"/>
-          <FILE id="LxIosv" name="NetworkEvents.h" compile="0" resource="0" file="Source/Processors/NetworkEvents/NetworkEvents.h"/>
+          <FILE id="LxIosv" name="NetworkEvents.h" compile="1" resource="0" file="Source/Processors/NetworkEvents/NetworkEvents.h"/>
         </GROUP>
         <GROUP id="{273A4CD9-60CE-A6A3-13E9-8BCAF573E024}" name="PSTH">
-          <FILE id="Y6TRvD" name="PeriStimulusTimeHistogramEditor.cpp" compile="0"
+          <FILE id="Y6TRvD" name="PeriStimulusTimeHistogramEditor.cpp" compile="1"
                 resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp"/>
-          <FILE id="Z4mUYg" name="PeriStimulusTimeHistogramEditor.h" compile="0"
+          <FILE id="Z4mUYg" name="PeriStimulusTimeHistogramEditor.h" compile="1"
                 resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.h"/>
-          <FILE id="QpvGnH" name="PeriStimulusTimeHistogramNode.cpp" compile="0"
+          <FILE id="QpvGnH" name="PeriStimulusTimeHistogramNode.cpp" compile="1"
                 resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramNode.cpp"/>
-          <FILE id="zptezx" name="PeriStimulusTimeHistogramNode.h" compile="0"
+          <FILE id="zptezx" name="PeriStimulusTimeHistogramNode.h" compile="1"
                 resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramNode.h"/>
-          <FILE id="t5D2ke" name="tictoc.cpp" compile="0" resource="0" file="Source/Processors/PSTH/tictoc.cpp"/>
-          <FILE id="Jshr7Y" name="tictoc.h" compile="0" resource="0" file="Source/Processors/PSTH/tictoc.h"/>
-          <FILE id="hcemDS" name="TrialCircularBuffer.cpp" compile="0" resource="0"
+          <FILE id="t5D2ke" name="tictoc.cpp" compile="1" resource="0" file="Source/Processors/PSTH/tictoc.cpp"/>
+          <FILE id="Jshr7Y" name="tictoc.h" compile="1" resource="0" file="Source/Processors/PSTH/tictoc.h"/>
+          <FILE id="hcemDS" name="TrialCircularBuffer.cpp" compile="1" resource="0"
                 file="Source/Processors/PSTH/TrialCircularBuffer.cpp"/>
-          <FILE id="fDpocU" name="TrialCircularBuffer.h" compile="0" resource="0"
+          <FILE id="fDpocU" name="TrialCircularBuffer.h" compile="1" resource="0"
                 file="Source/Processors/PSTH/TrialCircularBuffer.h"/>
         </GROUP>
         <GROUP id="{C6F1F354-C97E-128E-9C4E-2376E039F233}" name="ResamplingNode">
           <FILE id="yIwQ4b" name="ResamplingNode.cpp" compile="1" resource="0"
                 file="Source/Processors/ResamplingNode/ResamplingNode.cpp"/>
-          <FILE id="h1zDlH" name="ResamplingNode.h" compile="0" resource="0"
+          <FILE id="h1zDlH" name="ResamplingNode.h" compile="1" resource="0"
                 file="Source/Processors/ResamplingNode/ResamplingNode.h"/>
           <FILE id="LByZh0" name="ResamplingNodeEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/ResamplingNode/ResamplingNodeEditor.cpp"/>
-          <FILE id="UFlCtp" name="ResamplingNodeEditor.h" compile="0" resource="0"
+          <FILE id="UFlCtp" name="ResamplingNodeEditor.h" compile="1" resource="0"
                 file="Source/Processors/ResamplingNode/ResamplingNodeEditor.h"/>
         </GROUP>
         <GROUP id="gFSbZKw" name="Serial">
           <FILE id="PHwlqi" name="PulsePal.cpp" compile="1" resource="0" file="Source/Processors/Serial/PulsePal.cpp"/>
-          <FILE id="R4XRyB" name="PulsePal.h" compile="0" resource="0" file="Source/Processors/Serial/PulsePal.h"/>
+          <FILE id="R4XRyB" name="PulsePal.h" compile="1" resource="0" file="Source/Processors/Serial/PulsePal.h"/>
           <FILE id="3t2ez3c" name="ofArduino.cpp" compile="1" resource="0" file="Source/Processors/Serial/ofArduino.cpp"/>
-          <FILE id="bXASAoT" name="ofArduino.h" compile="0" resource="0" file="Source/Processors/Serial/ofArduino.h"/>
-          <FILE id="hNTT1i1" name="ofConstants.h" compile="0" resource="0" file="Source/Processors/Serial/ofConstants.h"/>
+          <FILE id="bXASAoT" name="ofArduino.h" compile="1" resource="0" file="Source/Processors/Serial/ofArduino.h"/>
+          <FILE id="hNTT1i1" name="ofConstants.h" compile="1" resource="0" file="Source/Processors/Serial/ofConstants.h"/>
           <FILE id="F97Ylmz" name="ofSerial.cpp" compile="1" resource="0" file="Source/Processors/Serial/ofSerial.cpp"/>
-          <FILE id="wV1xn3Z" name="ofSerial.h" compile="0" resource="0" file="Source/Processors/Serial/ofSerial.h"/>
+          <FILE id="wV1xn3Z" name="ofSerial.h" compile="1" resource="0" file="Source/Processors/Serial/ofSerial.h"/>
         </GROUP>
         <GROUP id="{C5E76874-E767-D4E0-D8B6-F61DBB446F13}" name="SerialInput">
           <FILE id="dWXqU4" name="SerialInput.cpp" compile="1" resource="0" file="Source/Processors/SerialInput/SerialInput.cpp"/>
-          <FILE id="EReMRm" name="SerialInput.h" compile="0" resource="0" file="Source/Processors/SerialInput/SerialInput.h"/>
+          <FILE id="EReMRm" name="SerialInput.h" compile="1" resource="0" file="Source/Processors/SerialInput/SerialInput.h"/>
           <FILE id="Q0XOjv" name="SerialInputEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/SerialInput/SerialInputEditor.cpp"/>
-          <FILE id="s0Nf1X" name="SerialInputEditor.h" compile="0" resource="0"
+          <FILE id="s0Nf1X" name="SerialInputEditor.h" compile="1" resource="0"
                 file="Source/Processors/SerialInput/SerialInputEditor.h"/>
         </GROUP>
         <GROUP id="{8E9594A3-D2B2-EAA3-9596-89923D59830A}" name="SignalGenerator">
-          <FILE id="mywzvE" name="SignalGenerator.cpp" compile="0" resource="0"
+          <FILE id="mywzvE" name="SignalGenerator.cpp" compile="1" resource="0"
                 file="Source/Processors/SignalGenerator/SignalGenerator.cpp"/>
-          <FILE id="iaP3u1" name="SignalGenerator.h" compile="0" resource="0"
+          <FILE id="iaP3u1" name="SignalGenerator.h" compile="1" resource="0"
                 file="Source/Processors/SignalGenerator/SignalGenerator.h"/>
-          <FILE id="xZoFAy" name="SignalGeneratorEditor.cpp" compile="0" resource="0"
+          <FILE id="xZoFAy" name="SignalGeneratorEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/SignalGenerator/SignalGeneratorEditor.cpp"/>
-          <FILE id="svgwwG" name="SignalGeneratorEditor.h" compile="0" resource="0"
+          <FILE id="svgwwG" name="SignalGeneratorEditor.h" compile="1" resource="0"
                 file="Source/Processors/SignalGenerator/SignalGeneratorEditor.h"/>
         </GROUP>
         <GROUP id="{58E5BDC1-3523-0E4D-2402-72726098BA07}" name="SourceNode">
           <FILE id="bcB5hN" name="SourceNode.cpp" compile="1" resource="0" file="Source/Processors/SourceNode/SourceNode.cpp"/>
-          <FILE id="Dyas33" name="SourceNode.h" compile="0" resource="0" file="Source/Processors/SourceNode/SourceNode.h"/>
+          <FILE id="Dyas33" name="SourceNode.h" compile="1" resource="0" file="Source/Processors/SourceNode/SourceNode.h"/>
           <FILE id="KQM0Ls" name="SourceNodeEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/SourceNode/SourceNodeEditor.cpp"/>
-          <FILE id="EWFh9x" name="SourceNodeEditor.h" compile="0" resource="0"
+          <FILE id="EWFh9x" name="SourceNodeEditor.h" compile="1" resource="0"
                 file="Source/Processors/SourceNode/SourceNodeEditor.h"/>
         </GROUP>
         <GROUP id="{B1C68941-4E97-FD8E-00E8-70B1225B3EBD}" name="SpikeDetector">
-          <FILE id="LZxTYj" name="SpikeDetector.cpp" compile="0" resource="0"
+          <FILE id="LZxTYj" name="SpikeDetector.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeDetector/SpikeDetector.cpp"/>
-          <FILE id="A4LRql" name="SpikeDetector.h" compile="0" resource="0" file="Source/Processors/SpikeDetector/SpikeDetector.h"/>
-          <FILE id="dJHC68" name="SpikeDetectorEditor.cpp" compile="0" resource="0"
+          <FILE id="A4LRql" name="SpikeDetector.h" compile="1" resource="0" file="Source/Processors/SpikeDetector/SpikeDetector.h"/>
+          <FILE id="dJHC68" name="SpikeDetectorEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeDetector/SpikeDetectorEditor.cpp"/>
-          <FILE id="ek762r" name="SpikeDetectorEditor.h" compile="0" resource="0"
+          <FILE id="ek762r" name="SpikeDetectorEditor.h" compile="1" resource="0"
                 file="Source/Processors/SpikeDetector/SpikeDetectorEditor.h"/>
         </GROUP>
         <GROUP id="{3C98FCA3-673A-3E34-ABC6-D506EF05DDD4}" name="SpikeDisplayNode">
           <FILE id="Ak6yJU" name="SpikeDisplayCanvas.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeDisplayNode/SpikeDisplayCanvas.cpp"/>
-          <FILE id="Ivm1WE" name="SpikeDisplayCanvas.h" compile="0" resource="0"
+          <FILE id="Ivm1WE" name="SpikeDisplayCanvas.h" compile="1" resource="0"
                 file="Source/Processors/SpikeDisplayNode/SpikeDisplayCanvas.h"/>
           <FILE id="tzcDUJ" name="SpikeDisplayEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeDisplayNode/SpikeDisplayEditor.cpp"/>
-          <FILE id="qpnGQ2" name="SpikeDisplayEditor.h" compile="0" resource="0"
+          <FILE id="qpnGQ2" name="SpikeDisplayEditor.h" compile="1" resource="0"
                 file="Source/Processors/SpikeDisplayNode/SpikeDisplayEditor.h"/>
           <FILE id="Osx5Vs" name="SpikeDisplayNode.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeDisplayNode/SpikeDisplayNode.cpp"/>
-          <FILE id="EYFdq6" name="SpikeDisplayNode.h" compile="0" resource="0"
+          <FILE id="EYFdq6" name="SpikeDisplayNode.h" compile="1" resource="0"
                 file="Source/Processors/SpikeDisplayNode/SpikeDisplayNode.h"/>
         </GROUP>
         <GROUP id="{B65E315B-E451-52BB-C46B-DFC8CFE52512}" name="SpikeSorter">
-          <FILE id="IDfGJU" name="SpikeSortBoxes.cpp" compile="0" resource="0"
+          <FILE id="IDfGJU" name="SpikeSortBoxes.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeSorter/SpikeSortBoxes.cpp"/>
-          <FILE id="oKqHU5" name="SpikeSortBoxes.h" compile="0" resource="0"
+          <FILE id="oKqHU5" name="SpikeSortBoxes.h" compile="1" resource="0"
                 file="Source/Processors/SpikeSorter/SpikeSortBoxes.h"/>
-          <FILE id="ZvsSnb" name="SpikeSorter.cpp" compile="0" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.cpp"/>
-          <FILE id="iWFZ8N" name="SpikeSorter.h" compile="0" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.h"/>
-          <FILE id="AAjUyt" name="SpikeSorterCanvas.cpp" compile="0" resource="0"
+          <FILE id="ZvsSnb" name="SpikeSorter.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.cpp"/>
+          <FILE id="iWFZ8N" name="SpikeSorter.h" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.h"/>
+          <FILE id="AAjUyt" name="SpikeSorterCanvas.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeSorter/SpikeSorterCanvas.cpp"/>
-          <FILE id="vSwtHQ" name="SpikeSorterCanvas.h" compile="0" resource="0"
+          <FILE id="vSwtHQ" name="SpikeSorterCanvas.h" compile="1" resource="0"
                 file="Source/Processors/SpikeSorter/SpikeSorterCanvas.h"/>
-          <FILE id="eRXHEt" name="SpikeSorterEditor.cpp" compile="0" resource="0"
+          <FILE id="eRXHEt" name="SpikeSorterEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/SpikeSorter/SpikeSorterEditor.cpp"/>
-          <FILE id="seDqmg" name="SpikeSorterEditor.h" compile="0" resource="0"
+          <FILE id="seDqmg" name="SpikeSorterEditor.h" compile="1" resource="0"
                 file="Source/Processors/SpikeSorter/SpikeSorterEditor.h"/>
         </GROUP>
         <GROUP id="{393F8FA9-FA27-4F2D-8252-9AB2CAA871DA}" name="Splitter">
           <FILE id="xbkXa2" name="Splitter.cpp" compile="1" resource="0" file="Source/Processors/Splitter/Splitter.cpp"/>
-          <FILE id="kFiAO3" name="Splitter.h" compile="0" resource="0" file="Source/Processors/Splitter/Splitter.h"/>
+          <FILE id="kFiAO3" name="Splitter.h" compile="1" resource="0" file="Source/Processors/Splitter/Splitter.h"/>
           <FILE id="mY47Gn" name="SplitterEditor.cpp" compile="1" resource="0"
                 file="Source/Processors/Splitter/SplitterEditor.cpp"/>
-          <FILE id="KyMfuL" name="SplitterEditor.h" compile="0" resource="0"
+          <FILE id="KyMfuL" name="SplitterEditor.h" compile="1" resource="0"
                 file="Source/Processors/Splitter/SplitterEditor.h"/>
         </GROUP>
         <GROUP id="W4eqkOy" name="Visualization">
           <FILE id="Akiup9" name="Visualizer.cpp" compile="1" resource="0" file="Source/Processors/Visualization/Visualizer.cpp"/>
           <FILE id="ETLsfY" name="DataWindow.cpp" compile="1" resource="0" file="Source/Processors/Visualization/DataWindow.cpp"/>
-          <FILE id="qDfeYR" name="DataWindow.h" compile="0" resource="0" file="Source/Processors/Visualization/DataWindow.h"/>
+          <FILE id="qDfeYR" name="DataWindow.h" compile="1" resource="0" file="Source/Processors/Visualization/DataWindow.h"/>
           <FILE id="tuQVXY" name="SpikeObject.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.cpp"/>
-          <FILE id="KyhGmE" name="SpikeObject.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/>
-          <FILE id="MsSuwS" name="Visualizer.h" compile="0" resource="0" file="Source/Processors/Visualization/Visualizer.h"/>
+          <FILE id="KyhGmE" name="SpikeObject.h" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/>
+          <FILE id="MsSuwS" name="Visualizer.h" compile="1" resource="0" file="Source/Processors/Visualization/Visualizer.h"/>
           <FILE id="KQJVIp" name="MatlabLikePlot.cpp" compile="1" resource="0"
                 file="Source/Processors/Visualization/MatlabLikePlot.cpp"/>
-          <FILE id="EH2pAq" name="MatlabLikePlot.h" compile="0" resource="0"
+          <FILE id="EH2pAq" name="MatlabLikePlot.h" compile="1" resource="0"
                 file="Source/Processors/Visualization/MatlabLikePlot.h"/>
         </GROUP>
       </GROUP>
       <GROUP id="RNGb1yR" name="UI">
         <FILE id="PBkkUW" name="EcubeDialogComponent.cpp" compile="1" resource="0"
               file="Source/UI/EcubeDialogComponent.cpp"/>
-        <FILE id="MFmxar" name="EcubeDialogComponent.h" compile="0" resource="0"
+        <FILE id="MFmxar" name="EcubeDialogComponent.h" compile="1" resource="0"
               file="Source/UI/EcubeDialogComponent.h"/>
         <FILE id="gXswXJ" name="CustomArrowButton.cpp" compile="1" resource="0"
               file="Source/UI/CustomArrowButton.cpp"/>
-        <FILE id="ECOEoc" name="CustomArrowButton.h" compile="0" resource="0"
+        <FILE id="ECOEoc" name="CustomArrowButton.h" compile="1" resource="0"
               file="Source/UI/CustomArrowButton.h"/>
         <FILE id="aHMWGl" name="GraphViewer.cpp" compile="1" resource="0" file="Source/UI/GraphViewer.cpp"/>
-        <FILE id="EOJ8RU" name="GraphViewer.h" compile="0" resource="0" file="Source/UI/GraphViewer.h"/>
+        <FILE id="EOJ8RU" name="GraphViewer.h" compile="1" resource="0" file="Source/UI/GraphViewer.h"/>
         <FILE id="sWZ22HN" name="EditorViewportButtons.cpp" compile="1" resource="0"
               file="Source/UI/EditorViewportButtons.cpp"/>
-        <FILE id="WwXnCHj" name="EditorViewportButtons.h" compile="0" resource="0"
+        <FILE id="WwXnCHj" name="EditorViewportButtons.h" compile="1" resource="0"
               file="Source/UI/EditorViewportButtons.h"/>
         <FILE id="lPimHJv" name="SignalChainManager.cpp" compile="1" resource="0"
               file="Source/UI/SignalChainManager.cpp"/>
-        <FILE id="0PVPDKZ" name="SignalChainManager.h" compile="0" resource="0"
+        <FILE id="0PVPDKZ" name="SignalChainManager.h" compile="1" resource="0"
               file="Source/UI/SignalChainManager.h"/>
         <FILE id="WgUx2Vj" name="EditorViewport.cpp" compile="1" resource="0"
               file="Source/UI/EditorViewport.cpp"/>
-        <FILE id="8npqLFq" name="EditorViewport.h" compile="0" resource="0"
+        <FILE id="8npqLFq" name="EditorViewport.h" compile="1" resource="0"
               file="Source/UI/EditorViewport.h"/>
         <FILE id="Rn2yUfU" name="ProcessorList.cpp" compile="1" resource="0"
               file="Source/UI/ProcessorList.cpp"/>
-        <FILE id="lOTMfMY" name="ProcessorList.h" compile="0" resource="0"
+        <FILE id="lOTMfMY" name="ProcessorList.h" compile="1" resource="0"
               file="Source/UI/ProcessorList.h"/>
         <FILE id="sxXKhY" name="CustomLookAndFeel.cpp" compile="1" resource="0"
               file="Source/UI/CustomLookAndFeel.cpp"/>
-        <FILE id="VLEIXYc" name="CustomLookAndFeel.h" compile="0" resource="0"
+        <FILE id="VLEIXYc" name="CustomLookAndFeel.h" compile="1" resource="0"
               file="Source/UI/CustomLookAndFeel.h"/>
         <FILE id="MuFSLOI" name="InfoLabel.cpp" compile="1" resource="0" file="Source/UI/InfoLabel.cpp"/>
-        <FILE id="aCcIvXz" name="InfoLabel.h" compile="0" resource="0" file="Source/UI/InfoLabel.h"/>
+        <FILE id="aCcIvXz" name="InfoLabel.h" compile="1" resource="0" file="Source/UI/InfoLabel.h"/>
         <FILE id="bWElQSS" name="DataViewport.cpp" compile="1" resource="0"
               file="Source/UI/DataViewport.cpp"/>
-        <FILE id="mMoQ3ls" name="DataViewport.h" compile="0" resource="0" file="Source/UI/DataViewport.h"/>
+        <FILE id="mMoQ3ls" name="DataViewport.h" compile="1" resource="0" file="Source/UI/DataViewport.h"/>
         <FILE id="we1JIPz" name="ControlPanel.cpp" compile="1" resource="0"
               file="Source/UI/ControlPanel.cpp"/>
-        <FILE id="rCft9Ec" name="ControlPanel.h" compile="0" resource="0" file="Source/UI/ControlPanel.h"/>
+        <FILE id="rCft9Ec" name="ControlPanel.h" compile="1" resource="0" file="Source/UI/ControlPanel.h"/>
         <FILE id="Ih10hsN" name="UIComponent.cpp" compile="1" resource="0"
               file="Source/UI/UIComponent.cpp"/>
-        <FILE id="BMY9oVw" name="UIComponent.h" compile="0" resource="0" file="Source/UI/UIComponent.h"/>
+        <FILE id="BMY9oVw" name="UIComponent.h" compile="1" resource="0" file="Source/UI/UIComponent.h"/>
       </GROUP>
       <FILE id="YFtK48" name="MainWindow.cpp" compile="1" resource="0" file="Source/MainWindow.cpp"/>
-      <FILE id="JiA1GET" name="MainWindow.h" compile="0" resource="0" file="Source/MainWindow.h"/>
+      <FILE id="JiA1GET" name="MainWindow.h" compile="1" resource="0" file="Source/MainWindow.h"/>
       <FILE id="z41Hy7g" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/>
     </GROUP>
   </MAINGROUP>
-- 
GitLab