SDRSharp Build 1632 Full Source (VS2017)

This commit is contained in:
SDRSharpR 2018-03-24 23:01:41 -07:00
parent c0fc5d4af0
commit bce56796eb
246 changed files with 31983 additions and 0 deletions

6
Build Order.txt Normal file
View file

@ -0,0 +1,6 @@
Radio
PanView
Common
CollaspiblePanel
FrequencyEdit
SDRSharp

View file

@ -0,0 +1,95 @@
<?xml version="1.0"?>
<!-- This file is brought to you courtesy of Henry Forte atouk@atouk.com -->
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!-- -->
<!-- Each RangeEntry for a band must be the first line of a group, and may be the only one. -->
<!-- -->
<!-- If desired, each band can be broken down into individual areas with distinct coloring -->
<!-- or operating modes. The mode entry used in the RangeEntry section will be the default -->
<!-- mode unless a subrange overrides it. This rule applies to band color, also. -->
<!-- -->
<!-- Color can be defined as YRGB, where Y=transparency, R=Red, G=Green, B=Blue in 2 digit -->
<!-- hexadecimal values, or as a colorname http://www.w3schools.com/colors/colors_names.asp -->
<!-- Using a colorname forces Y to be FF. Colornames are not case sensitive. -->
<!-- -->
<!-- Step will set the Step Size in the Radio section to the desired value for each band -->
<!-- so that Snap to Grid works properly. This is an optional value. -->
<!-- -->
<!-- Mode can be preset to WFM, NFM, AM, USB, LSB, CW or AM. -->
<!-- The Mode in the Radio section of SDR# will automatically change to the selected one in -->
<!-- either the RangeEntry, or subrange entry. This allows dividing allocation bands into -->
<!-- designated modes of operation. Some bands with multiple allocations of operating modes -->
<!-- make preselecting the proper mode impractical. (http://www.arrl.org/band-plan e.g. 6m). -->
<!-- -->
<!-- NOTE: Operating mode may not change to the one preselected in Free Tuning, until an -->
<!-- operation that causes the Frequency Display to change readout. To override the -->
<!-- default operating mode, uncheck "Auto update radio settings" in the Band Plan panel. -->
<!-- -->
<!-- Band Range labels are optional. Comments must be single line only. -->
<!-- Some special characters will break XML parsing, so only alphanumeric are recommended. -->
<!-- RangeEntry definitions do not have to be in order of frequency (see Air Band below). -->
<!-- Any formatting or character errors will simply stop the Band Plan plugin from loading -->
<!-- and are non fatal to SDR#. -->
<!-- The order of variables in each RangeEntry is optional. -->
<!-- -->
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<ArrayOfRangeEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<RangeEntry minFrequency="148500" maxFrequency="283500" mode="AM" step="9000" color="900000FF">Long Wave</RangeEntry>
<RangeEntry minFrequency="526500" maxFrequency="1606500" mode="AM" step="1000" color="900000FF">Medium Wave</RangeEntry>
<RangeEntry minFrequency="2300000" maxFrequency="2468000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="3200000" maxFrequency="3400000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="3950000" maxFrequency="4000000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="4750000" maxFrequency="4995000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="5005000" maxFrequency="5060000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="5900000" maxFrequency="6200000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="7200000" maxFrequency="7450000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="9400000" maxFrequency="9900000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="11600000" maxFrequency="12100000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="13570000" maxFrequency="13870000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="15100000" maxFrequency="15800000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="17480000" maxFrequency="17900000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="18900000" maxFrequency="19020000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="21450000" maxFrequency="21850000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="25670000" maxFrequency="26100000" mode="AM" step="5000" color="900000FF">Shortwave Broadcast</RangeEntry>
<RangeEntry minFrequency="87500000" maxFrequency="108000000" mode="WFM" step="100000" color="red">FM Broadcast</RangeEntry>
<RangeEntry minFrequency="108000000" maxFrequency="118000000" mode="AM" step="5000" color="900000FF">Air Band VOR/ILS</RangeEntry>
<RangeEntry minFrequency="118000000" maxFrequency="137000000" mode="AM" step="5000" color="900000FF">Air Band Voice</RangeEntry>
<RangeEntry minFrequency="1800000" maxFrequency="2000000" mode="CW" step="10" color="50AAAAAA">160m Ham Band</RangeEntry>
<RangeEntry minFrequency="3500000" maxFrequency="3950000" mode="AM" step="10" color="red">80m Ham Band</RangeEntry>
<RangeEntry minFrequency="5351500" maxFrequency="5366500" mode="USB" step="10" color="blue">60m Ham Band</RangeEntry>
<RangeEntry minFrequency="7000000" maxFrequency="7200000" mode="LSB" step="10" color="green">40m Ham Band</RangeEntry>
<RangeEntry minFrequency="7000000" maxFrequency="7100000" mode="CW" step="10" color="50AAAAAA"/>
<RangeEntry minFrequency="10100000" maxFrequency="10150000" mode="USB" step="5000" color="red">30m Ham Band</RangeEntry>
<RangeEntry minFrequency="14000000" maxFrequency="14350000" mode="USB" step="10" color="red">20m Ham Band</RangeEntry>
<RangeEntry minFrequency="18068000" maxFrequency="18168000" mode="USB" step="10" color="red">17m Ham Band</RangeEntry>
<RangeEntry minFrequency="21000000" maxFrequency="21450000" mode="USB" step="10" color="red">15m Ham Band</RangeEntry>
<RangeEntry minFrequency="24890000" maxFrequency="24990000" mode="USB" step="10" color="red">12m Ham Band</RangeEntry>
<RangeEntry minFrequency="26960000" maxFrequency="27410000" mode="AM" step="5000" color="red">CB</RangeEntry>
<RangeEntry minFrequency="28000000" maxFrequency="29750000" mode="USB" step="10" color="red">10m Ham Band</RangeEntry>
<RangeEntry minFrequency="50000000" maxFrequency="54000000" mode="USB" step="10" color="red">6m Ham Band</RangeEntry>
<RangeEntry minFrequency="144000000" maxFrequency="148000000" mode="NFM" step="12500" color="red">2m Ham Band</RangeEntry>
<RangeEntry minFrequency="144000000" maxFrequency="144100000" mode="CW" step="10" color="50AAAAAA"/>
<RangeEntry minFrequency="144100000" maxFrequency="144200000" mode="USB" step="10" color="blue"/>
<RangeEntry minFrequency="144200000" maxFrequency="144200000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="144200000" maxFrequency="144275000" mode="USB" step="10" color="blue"/>
<RangeEntry minFrequency="144275000" maxFrequency="148000000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="156000000" maxFrequency="162025000" mode="NFM" step="12500" color="navy">Marine</RangeEntry>
<RangeEntry minFrequency="222000000" maxFrequency="225000000" mode="NFM" step="12500" color="red">1.25m Ham Band</RangeEntry>
<RangeEntry minFrequency="225000000" maxFrequency="380000000" mode="NFM" step="12500" color="red">Military Air</RangeEntry>
<RangeEntry minFrequency="240000000" maxFrequency="270000000" mode="NFM" step="12500" color="red">Mil Sat</RangeEntry>
<RangeEntry minFrequency="420000000" maxFrequency="450000000" mode="NFM" step="12500" color="red">70cm Ham Band</RangeEntry>
<RangeEntry minFrequency="420000000" maxFrequency="432070000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="432070000" maxFrequency="432100000" mode="CW" step="10" color="50AAAAAA"/>
<RangeEntry minFrequency="432100000" maxFrequency="450000000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="446000000" maxFrequency="446200000" mode="NFM" step="6250" color="green">PMR446</RangeEntry>
<RangeEntry minFrequency="902000000" maxFrequency="928000000" mode="NFM" step="12500" color="red">33cm Ham Band</RangeEntry>
<RangeEntry minFrequency="902000000" maxFrequency="902075000" mode="USB" step="10" color="blue"/>
<RangeEntry minFrequency="902075000" maxFrequency="902125000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="902125000" maxFrequency="903400000" mode="USB" step="10" color="blue"/>
<RangeEntry minFrequency="903400000" maxFrequency="928000000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="1240000000" maxFrequency="1300000000" mode="NFM" step="12500" color="red">23cm Ham Band</RangeEntry>
<RangeEntry minFrequency="1240000000" maxFrequency="1296200000" mode="USB" step="10" color="blue"/>
<RangeEntry minFrequency="1296200000" maxFrequency="1300000000" mode="NFM" step="12500" color="red"/>
<RangeEntry minFrequency="2300000000" maxFrequency="2310000000" mode="NFM" step="12500" color="red">13cm Ham Band</RangeEntry>
<RangeEntry minFrequency="2390000000" maxFrequency="2450000000" mode="NFM" step="12500" color="red">13cm Ham Band</RangeEntry>
</ArrayOfRangeEntry>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<frontendPlugins>
<add key="UHD / USRP" value="SDRSharp.USRP.UsrpIO,SDRSharp.USRP" />
<add key="HackRF" value="SDRSharp.HackRF.HackRFIO,SDRSharp.HackRF" />
<add key="RTL-SDR (USB)" value="SDRSharp.RTLSDR.RtlSdrIO,SDRSharp.RTLSDR" />
<add key="RTL-SDR (TCP)" value="SDRSharp.RTLTCP.RtlTcpIO,SDRSharp.RTLTCP"/>
<add key="FUNcube Dongle Pro" value="SDRSharp.FUNcube.FunCubeIO,SDRSharp.FUNcube" />
<add key="FUNcube Dongle Pro+" value="SDRSharp.FUNcubeProPlus.FunCubeProPlusIO,SDRSharp.FUNcubeProPlus" />
<add key="SoftRock (Si570)" value="SDRSharp.SoftRock.SoftRockIO,SDRSharp.SoftRock" />
<add key="RFSPACE SDR-IQ (USB)" value="SDRSharp.SDRIQ.SdrIqIO,SDRSharp.SDRIQ" />
<add key="RFSPACE Networked Radios" value="SDRSharp.SDRIP.SdrIpIO,SDRSharp.SDRIP" />
<add key="Afedri SDR-Net" value="SDRSharp.AfedriSDRNet.AfedriSdrNetIO,SDRSharp.AfedriSDRNet" />
</frontendPlugins>

BIN
Core Includes/NDde.dll Normal file

Binary file not shown.

22
Core Includes/Plugins.xml Normal file
View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<sharpPlugins>
<!-- add key="AF DNR" value="SDRSharp.DNR.AFNoiseReductionPlugin,SDRSharp.DNR" /> -->
<!-- add key="IF DNR" value="SDRSharp.DNR.IFNoiseReductionPlugin,SDRSharp.DNR" /> -->
<!-- add key="Baseband Noise Blanker" value="SDRSharp.NoiseBlanker.BasebandNoiseBlankerPlugin,SDRSharp.NoiseBlanker" /> -->
<!-- add key="Demodulator Noise Blanker" value="SDRSharp.NoiseBlanker.DemodulatorNoiseBlankerPlugin,SDRSharp.NoiseBlanker" /> -->
<add key="Wave Recorder" value="SDRSharp.WavRecorder.WavRecorderPlugin,SDRSharp.WavRecorder" />
<add key="Zoom FFT" value="SDRSharp.ZoomFFT.ZoomFFTPlugin,SDRSharp.ZoomFFT" />
<!-- add key="Band Plan" value="SDRSharp.BandPlan.BandPlanPlugin,SDRSharp.BandPlan" /> -->
<add key="Frequency Manager" value="SDRSharp.FrequencyManager.FrequencyManagerPlugin,SDRSharp.FrequencyManager" />
<add key="Signal Diagnostics" value="SDRSharp.Diagnostics.DiagnosticsPlugin,SDRSharp.Diagnostics" />
<!-- add key="DDE Tracking Client" value="SDRSharp.DDETracker.DdeTrackingPlugin,SDRSharp.DDETracker" /> -->
<add key="Trunker" value="SDRSharp.Trunker.TrunkerPlugin,SDRSharp.Trunker" />
<add key="DSD" value="SDRSharp.DSD.DSDPlugin,SDRSharp.DSD" />
<add key="Frequency Scanner" value="SDRSharp.FrequencyScanner.FrequencyScannerPlugin,SDRSharp.FrequencyScanner" />
<!-- add key="TimeShift" value="SDRSharp.TimeShift.TimeShiftPlugin,SDRSharp.TimeShift" /> -->
<!-- add key="TV" value="SDRSharp.TV.TVPlugin,SDRSharp.TV" /> -->
<!-- add key="DCSDecoder" value="SDRSharp.DCSDecoder.DCSDecoderPlugin,SDRSharp.DCSDecoder" /> -->
<!-- add key="DAP" value="SDRSharp.DAP.DAPPlugin,SDRSharp.DAP" /> -->
<add key="CTCSSDecoder" value="SDRSharp.CTCSSDecoder.CTCSSDecoderPlugin,SDRSharp.CTCSSDecoder" />
<!-- add key="JarodCalc" value="SDRSharp.JarodCalc.JarodCalcPlugin,SDRSharp.JarodCalc" /> -->
</sharpPlugins>

BIN
Core Includes/PortAudio.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Core Includes/SRDLL.dll Normal file

Binary file not shown.

BIN
Core Includes/airspy.dll Normal file

Binary file not shown.

BIN
Core Includes/airspyhf.dll Normal file

Binary file not shown.

View file

@ -0,0 +1,2 @@
<?xml version="1.0"?>
<ArrayOfDigitalEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

View file

@ -0,0 +1,57 @@
<?xml version="1.0"?>
<ArrayOfMemoryEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MemoryEntry>
<IsFavourite>true</IsFavourite>
<Name>Santa Ana</Name>
<GroupName>CHP</GroupName>
<Frequency>39440000</Frequency>
<DetectorType>WFM</DetectorType>
<Shift>0</Shift>
<FilterBandwidth>10</FilterBandwidth>
</MemoryEntry>
<MemoryEntry>
<IsFavourite>true</IsFavourite>
<Name>NPR Radio</Name>
<GroupName>FM Radio</GroupName>
<Frequency>89300000</Frequency>
<DetectorType>WFM</DetectorType>
<Shift>0</Shift>
<FilterBandwidth>75330</FilterBandwidth>
</MemoryEntry>
<MemoryEntry>
<IsFavourite>true</IsFavourite>
<Name>KFI AM</Name>
<GroupName>Misc</GroupName>
<Frequency>115840000</Frequency>
<DetectorType>AM</DetectorType>
<Shift>0</Shift>
<FilterBandwidth>11130</FilterBandwidth>
</MemoryEntry>
<MemoryEntry>
<IsFavourite>true</IsFavourite>
<Name>Air</Name>
<GroupName>CHP</GroupName>
<Frequency>122850000</Frequency>
<DetectorType>AM</DetectorType>
<Shift>0</Shift>
<FilterBandwidth>4240</FilterBandwidth>
</MemoryEntry>
<MemoryEntry>
<IsFavourite>true</IsFavourite>
<Name>NOAA - Oxnard</Name>
<GroupName>Weather</GroupName>
<Frequency>162550000</Frequency>
<DetectorType>NFM</DetectorType>
<Shift>0</Shift>
<FilterBandwidth>24390</FilterBandwidth>
</MemoryEntry>
<MemoryEntry>
<IsFavourite>true</IsFavourite>
<Name>Conv. Center Security</Name>
<GroupName>Anaheim</GroupName>
<Frequency>453225000</Frequency>
<DetectorType>NFM</DetectorType>
<Shift>0</Shift>
<FilterBandwidth>5000</FilterBandwidth>
</MemoryEntry>
</ArrayOfMemoryEntry>

BIN
Core Includes/hackrf.dll Normal file

Binary file not shown.

View file

@ -0,0 +1,17 @@
@echo off
mkdir tmp
echo Downloading RTLSDR Driver
httpget http://osmocom.org/attachments/download/2242/RelWithDebInfo.zip tmp\RelWithDebInfo.zip
echo Downloading Zadig
set zadig_exe=zadig.exe
ver | findstr /l "5.1." > NUL
if %errorlevel% equ 0 set zadig_exe=zadig_xp.exe
httpget http://zadig.akeo.ie/downloads/%zadig_exe% %zadig_exe%
unzip -o tmp\RelWithDebInfo.zip -d tmp
move tmp\rtl-sdr-release\x32\rtlsdr.dll .
rmdir tmp /S /Q

View file

@ -0,0 +1,2 @@
<?xml version="1.0"?>
<ArrayOfInvertorEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

Binary file not shown.

Binary file not shown.

BIN
Core Includes/msvcr100.dll Normal file

Binary file not shown.

Binary file not shown.

BIN
Core Includes/rtlsdr.dll Normal file

Binary file not shown.

BIN
Core Includes/sdriq.dll Normal file

Binary file not shown.

BIN
Core Includes/shark.dll Normal file

Binary file not shown.

View file

@ -0,0 +1,15 @@
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Collapsible Panel")]
[assembly: AssemblyDescription("Collapsible Panel Component")]
[assembly: AssemblyProduct("SDR#")]
[assembly: AssemblyCopyright("Copyright © Youssef TOUIL 2012")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]

View file

@ -0,0 +1,82 @@
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.Resources;
using System.Runtime.CompilerServices;
namespace SDRSharp.CollapsiblePanel.Properties
{
[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[DebuggerNonUserCode]
[CompilerGenerated]
internal class Resources
{
private static ResourceManager resourceMan;
private static CultureInfo resourceCulture;
[EditorBrowsable(EditorBrowsableState.Advanced)]
internal static ResourceManager ResourceManager
{
get
{
if (Resources.resourceMan == null)
{
Resources.resourceMan = new ResourceManager("SDRSharp.CollapsiblePanel.Properties.Resources", typeof(Resources).Assembly);
}
return Resources.resourceMan;
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
internal static CultureInfo Culture
{
get
{
return Resources.resourceCulture;
}
set
{
Resources.resourceCulture = value;
}
}
internal static Bitmap CollapsedIcon
{
get
{
return (Bitmap)Resources.ResourceManager.GetObject("CollapsedIcon", Resources.resourceCulture);
}
}
internal static string ExpandedHeigth
{
get
{
return Resources.ResourceManager.GetString("ExpandedHeigth", Resources.resourceCulture);
}
}
internal static Bitmap ExpandedIcon
{
get
{
return (Bitmap)Resources.ResourceManager.GetObject("ExpandedIcon", Resources.resourceCulture);
}
}
internal static Bitmap titleBackground
{
get
{
return (Bitmap)Resources.ResourceManager.GetObject("titleBackground", Resources.resourceCulture);
}
}
internal Resources()
{
}
}
}

View file

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ExpandedIcon" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAMCAYAAAC9QufkAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN
1gAADdYBkG95nAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACdSURBVChTlZGx
DcIwEEUtalZIBmEYZiGLULMAtUsGYICQNi0VEpL5D9nWRbYs50tP1t29X9mFELxYxGsH+J7yKGaxJ/gj
ZZjEV/QED9+l8kE8RE/w8HMZTmIVrXDH+3dsGa6iFe7Zt0U4iqeohT337Nti4izewoaZ/cbdDIa7sGEu
vGIRGUT6e17mwisWhov4xLd2b5b5y1t8K/fgfhf9ch0fZsVEAAAAAElFTkSuQmCC
</value>
</data>
<data name="titleBackground" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBD
AAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0M
DgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDAz/wAARCAARALkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF
BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAk
M2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx
8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQA
AQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5
OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq
srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDz
f/hd6/3ovzH+FH/C71/vRfmP8K+Sv+F4v/z0lo/4Xi//AD0lrp9mZ859a/8AC71/vRfmP8KP+F3r/ei/
Mf4V8lf8Lxf/AJ6S0f8AC8X/AOektHsw5z61/wCF3r/ei/Mf4Uf8LvX+9F+Y/wAK+Sv+F4v/AM9JaP8A
heL/APPSWj2Yc59a/wDC71/vRfmP8KP+F3r/AHovzH+FfJX/AAvF/wDnpLR/wvF/+ektHsw5z61/4Xev
96L8x/hR/wALvX+9F+Y/wr5K/wCF4v8A89JaP+F4v/z0lo9mHOfWv/C71/vRfmP8KP8Ahd6/3ovzH+Ff
JX/C8X/56S0f8Lxf/npLR7MOc+tf+F3r/ei/Mf4Uf8LvX+9F+Y/wr5K/4Xi//PSWj/heL/8APSWj2Yc5
9a/8LvX+9F+Y/wAKP+F3r/ei/Mf4V8lf8Lxf/npLR/wvF/8AnpLR7MOc+tf+F3r/AHovzH+FH/C71/vR
fmP8K+Sv+F4v/wA9JaP+F4v/AM9JaPZhzn1r/wALvX+9F+Y/wo/4Xev96L8x/hXyV/wvF/8AnpLR/wAL
xf8A56S0ezDnPrX/AIXev96L8x/hR/wu9f70X5j/AAr5K/4Xi/8Az0lo/wCF4v8A89JaPZhzn1r/AMLv
X+9F+Y/wo/4Xev8Aei/Mf4V8lf8AC8X/AOektH/C8X/56S0ezDnPJKKKK5jQKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/2Q==
</value>
</data>
<data name="ExpandedHeigth" xml:space="preserve">
<value>0</value>
</data>
<data name="CollapsedIcon" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAAwAAAAPCAYAAADQ4S5JAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN
1gAADdYBkG95nAAAAHRJREFUKFNj+P///z4GBgaZAwcOMBCDQRoeA/F9IG7CpgAdgzSAFIPAbyA+BsSW
2BTCMLIGGHgNxPOAzuQhVgMMXALiWFI0gMBnIN6GHCiENMAASA04UIjVAAKgQFlFdRtI8gPRoUR0PBAd
0ySnJRJS6wEGAICmKADl6upOAAAAAElFTkSuQmCC
</value>
</data>
</root>

View file

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ExpandedIcon" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAMCAYAAAC9QufkAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN
1gAADdYBkG95nAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACdSURBVChTlZGx
DcIwEEUtalZIBmEYZiGLULMAtUsGYICQNi0VEpL5D9nWRbYs50tP1t29X9mFELxYxGsH+J7yKGaxJ/gj
ZZjEV/QED9+l8kE8RE/w8HMZTmIVrXDH+3dsGa6iFe7Zt0U4iqeohT337Nti4izewoaZ/cbdDIa7sGEu
vGIRGUT6e17mwisWhov4xLd2b5b5y1t8K/fgfhf9ch0fZsVEAAAAAElFTkSuQmCC
</value>
</data>
<data name="titleBackground" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBD
AAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0M
DgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDAz/wAARCAARALkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF
BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAk
M2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx
8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQA
AQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5
OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq
srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDz
f/hd6/3ovzH+FH/C71/vRfmP8K+Sv+F4v/z0lo/4Xi//AD0lrp9mZ859a/8AC71/vRfmP8KP+F3r/ei/
Mf4V8lf8Lxf/AJ6S0f8AC8X/AOektHsw5z61/wCF3r/ei/Mf4Uf8LvX+9F+Y/wAK+Sv+F4v/AM9JaP8A
heL/APPSWj2Yc59a/wDC71/vRfmP8KP+F3r/AHovzH+FfJX/AAvF/wDnpLR/wvF/+ektHsw5z61/4Xev
96L8x/hR/wALvX+9F+Y/wr5K/wCF4v8A89JaP+F4v/z0lo9mHOfWv/C71/vRfmP8KP8Ahd6/3ovzH+Ff
JX/C8X/56S0f8Lxf/npLR7MOc+tf+F3r/ei/Mf4Uf8LvX+9F+Y/wr5K/4Xi//PSWj/heL/8APSWj2Yc5
9a/8LvX+9F+Y/wAKP+F3r/ei/Mf4V8lf8Lxf/npLR/wvF/8AnpLR7MOc+tf+F3r/AHovzH+FH/C71/vR
fmP8K+Sv+F4v/wA9JaP+F4v/AM9JaPZhzn1r/wALvX+9F+Y/wo/4Xev96L8x/hXyV/wvF/8AnpLR/wAL
xf8A56S0ezDnPrX/AIXev96L8x/hR/wu9f70X5j/AAr5K/4Xi/8Az0lo/wCF4v8A89JaPZhzn1r/AMLv
X+9F+Y/wo/4Xev8Aei/Mf4V8lf8AC8X/AOektH/C8X/56S0ezDnPJKKKK5jQKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/2Q==
</value>
</data>
<data name="ExpandedHeigth" xml:space="preserve">
<value>0</value>
</data>
<data name="CollapsedIcon" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAAwAAAAPCAYAAADQ4S5JAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN
1gAADdYBkG95nAAAAHRJREFUKFNj+P///z4GBgaZAwcOMBCDQRoeA/F9IG7CpgAdgzSAFIPAbyA+BsSW
2BTCMLIGGHgNxPOAzuQhVgMMXALiWFI0gMBnIN6GHCiENMAASA04UIjVAAKgQFlFdRtI8gPRoUR0PBAd
0ySnJRJS6wEGAICmKADl6upOAAAAAElFTkSuQmCC
</value>
</data>
</root>

View file

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{A5EFB9F9-6F99-4EBD-B5C9-3F68EFEFC823}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Library</OutputType>
<AssemblyName>SDRSharp.CollapsiblePanel</AssemblyName>
<TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
</PropertyGroup>
<ItemGroup>
<Reference Include="System">
<HintPath>C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll</HintPath>
</Reference>
<Reference Include="System.Drawing">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll</HintPath>
</Reference>
<Reference Include="System.Design">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Design\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Design.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SDRSharp.CollapsiblePanel.Properties\Resources.cs" />
<Compile Include="SDRSharp.CollapsiblePanel\CollapsiblePanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="SDRSharp.CollapsiblePanel\CollapsiblePanelDesigner.cs" />
<Compile Include="SDRSharp.CollapsiblePanel\ContentPanel.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="SDRSharp.CollapsiblePanel\ContentPanelDesigner.cs" />
<Compile Include="SDRSharp.CollapsiblePanel\PanelStateOptions.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SDRSharp.CollapsiblePanel.Properties\Resources.resx">
<DependentUpon>Resources.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SDRSharp.CollapsiblePanel\CollapsiblePanel.resx">
<DependentUpon>CollapsiblePanel.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.2015
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDRSharp.CollapsiblePanel", "SDRSharp.CollapsiblePanel.csproj", "{A5EFB9F9-6F99-4EBD-B5C9-3F68EFEFC823}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A5EFB9F9-6F99-4EBD-B5C9-3F68EFEFC823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A5EFB9F9-6F99-4EBD-B5C9-3F68EFEFC823}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A5EFB9F9-6F99-4EBD-B5C9-3F68EFEFC823}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A5EFB9F9-6F99-4EBD-B5C9-3F68EFEFC823}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AF25AAAB-B38C-48F7-A7D7-0D815C0D1E47}
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,271 @@
using SDRSharp.CollapsiblePanel.Properties;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace SDRSharp.CollapsiblePanel
{
[DesignTimeVisible(true)]
[Category("Containers")]
[Description("Visual Studio like Collapsible Panel")]
[Designer(typeof(CollapsiblePanelDesigner))]
public class CollapsiblePanel : UserControl
{
private bool _autoHeight;
private PanelStateOptions _panelState = PanelStateOptions.Expanded;
private CollapsiblePanel _nextPanel;
private IContainer components;
private Panel titlePanel;
private PictureBox togglingImage;
private ImageList collapsiblePanelImageList;
private Label lblPanelTitle;
private ContentPanel contentPanel;
private TableLayoutPanel titleTableLayoutPanel;
[Description("Gets or sets panel title")]
[DisplayName("Panel Title")]
[Category("Collapsible Panel")]
public string PanelTitle
{
get
{
return this.lblPanelTitle.Text;
}
set
{
this.lblPanelTitle.Text = value;
}
}
[DefaultValue(typeof(PanelStateOptions), "Expanded")]
[Description("Gets or sets current panel state")]
[DisplayName("Panel State")]
[Category("Collapsible Panel")]
public PanelStateOptions PanelState
{
get
{
return this._panelState;
}
set
{
this._panelState = value;
this.UpdateState();
}
}
[Category("Collapsible Panel")]
[Description("Gets or sets the panel to be located beneath this panel")]
public CollapsiblePanel NextPanel
{
get
{
return this._nextPanel;
}
set
{
this._nextPanel = value;
this.MoveNextPanel();
}
}
[Category("Appearance")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ContentPanel Content
{
get
{
return this.contentPanel;
}
}
public bool AutoHeight
{
get
{
return this._autoHeight;
}
set
{
if (this._autoHeight != value)
{
this._autoHeight = value;
this.UpdateState();
}
}
}
public CollapsiblePanel()
{
this.InitializeComponent();
base.Load += this.CollapsiblePanel_Load;
base.SizeChanged += this.CollapsiblePanel_SizeChanged;
base.LocationChanged += this.CollapsiblePanel_LocationChanged;
}
private void CollapsiblePanel_Load(object sender, EventArgs e)
{
if (this._panelState == PanelStateOptions.Collapsed)
{
this.togglingImage.Image = Resources.CollapsedIcon;
}
else
{
this.togglingImage.Image = Resources.ExpandedIcon;
}
}
private void CollapsiblePanel_SizeChanged(object sender, EventArgs e)
{
this.MoveNextPanel();
}
private void CollapsiblePanel_LocationChanged(object sender, EventArgs e)
{
this.MoveNextPanel();
}
private void ToggleState(object sender, EventArgs e)
{
this._panelState = ((this._panelState == PanelStateOptions.Collapsed) ? PanelStateOptions.Expanded : PanelStateOptions.Collapsed);
this.UpdateState();
}
internal void UpdateState()
{
if (this._panelState == PanelStateOptions.Collapsed)
{
this.contentPanel.Visible = false;
base.Height = this.titlePanel.Height;
this.togglingImage.Image = Resources.CollapsedIcon;
}
else
{
int num = (this.contentPanel.Controls.Count != 1 || !this._autoHeight) ? this.contentPanel.Height : this.contentPanel.Controls[0].Height;
base.Height = this.titlePanel.Height + num;
this.contentPanel.Visible = true;
this.togglingImage.Image = Resources.ExpandedIcon;
Panel panel = base.Parent as Panel;
while (panel != null && panel.AutoSize)
{
panel = (panel.Parent as Panel);
}
if (panel != null)
{
panel.ScrollControlIntoView(this);
}
}
}
private void MoveNextPanel()
{
if (this._nextPanel != null)
{
CollapsiblePanel nextPanel = this._nextPanel;
Point location = base.Location;
int x = location.X;
location = base.Location;
nextPanel.Location = new Point(x, location.Y + base.Size.Height);
}
}
protected override void Dispose(bool disposing)
{
if (disposing && this.components != null)
{
this.components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = new Container();
ComponentResourceManager componentResourceManager = new ComponentResourceManager(typeof(CollapsiblePanel));
this.collapsiblePanelImageList = new ImageList(this.components);
this.titlePanel = new Panel();
this.titleTableLayoutPanel = new TableLayoutPanel();
this.togglingImage = new PictureBox();
this.lblPanelTitle = new Label();
this.contentPanel = new ContentPanel();
this.titlePanel.SuspendLayout();
this.titleTableLayoutPanel.SuspendLayout();
((ISupportInitialize)this.togglingImage).BeginInit();
base.SuspendLayout();
this.collapsiblePanelImageList.ImageStream = (ImageListStreamer)componentResourceManager.GetObject("collapsiblePanelImageList.ImageStream");
this.collapsiblePanelImageList.TransparentColor = Color.Transparent;
this.collapsiblePanelImageList.Images.SetKeyName(0, "ExpandIcon.jpg");
this.titlePanel.BackColor = Color.DarkGray;
this.titlePanel.BackgroundImage = Resources.titleBackground;
this.titlePanel.BackgroundImageLayout = ImageLayout.Stretch;
this.titlePanel.Controls.Add(this.titleTableLayoutPanel);
this.titlePanel.Dock = DockStyle.Top;
this.titlePanel.Location = new Point(0, 0);
this.titlePanel.Name = "titlePanel";
this.titlePanel.Size = new Size(150, 24);
this.titlePanel.TabIndex = 0;
this.titleTableLayoutPanel.BackColor = Color.Transparent;
this.titleTableLayoutPanel.ColumnCount = 2;
this.titleTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 24f));
this.titleTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f));
this.titleTableLayoutPanel.Controls.Add(this.togglingImage, 0, 0);
this.titleTableLayoutPanel.Controls.Add(this.lblPanelTitle, 1, 0);
this.titleTableLayoutPanel.Dock = DockStyle.Fill;
this.titleTableLayoutPanel.Location = new Point(0, 0);
this.titleTableLayoutPanel.Name = "titleTableLayoutPanel";
this.titleTableLayoutPanel.RowCount = 1;
this.titleTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100f));
this.titleTableLayoutPanel.Size = new Size(150, 24);
this.titleTableLayoutPanel.TabIndex = 2;
this.titleTableLayoutPanel.Click += this.ToggleState;
this.togglingImage.Anchor = AnchorStyles.None;
this.togglingImage.BackColor = Color.Transparent;
this.togglingImage.Image = Resources.ExpandedIcon;
this.togglingImage.Location = new Point(7, 7);
this.togglingImage.Name = "togglingImage";
this.togglingImage.Size = new Size(10, 10);
this.togglingImage.SizeMode = PictureBoxSizeMode.StretchImage;
this.togglingImage.TabIndex = 0;
this.togglingImage.TabStop = false;
this.togglingImage.Click += this.ToggleState;
this.lblPanelTitle.Anchor = AnchorStyles.Left;
this.lblPanelTitle.AutoEllipsis = true;
this.lblPanelTitle.AutoSize = true;
this.lblPanelTitle.BackColor = Color.Transparent;
this.lblPanelTitle.Font = new Font("Segoe UI Semibold", 9f, FontStyle.Regular, GraphicsUnit.Point, 0);
this.lblPanelTitle.ForeColor = Color.WhiteSmoke;
this.lblPanelTitle.Location = new Point(27, 4);
this.lblPanelTitle.Name = "lblPanelTitle";
this.lblPanelTitle.Size = new Size(59, 15);
this.lblPanelTitle.TabIndex = 1;
this.lblPanelTitle.Text = "Panel title";
this.lblPanelTitle.Click += this.ToggleState;
this.contentPanel.Location = new Point(0, 24);
this.contentPanel.Margin = new Padding(2);
this.contentPanel.Name = "contentPanel";
this.contentPanel.Size = new Size(150, 126);
this.contentPanel.TabIndex = 1;
base.AutoScaleDimensions = new SizeF(96f, 96f);
base.AutoScaleMode = AutoScaleMode.Dpi;
base.Controls.Add(this.contentPanel);
base.Controls.Add(this.titlePanel);
base.Name = "CollapsiblePanel";
this.titlePanel.ResumeLayout(false);
this.titleTableLayoutPanel.ResumeLayout(false);
this.titleTableLayoutPanel.PerformLayout();
((ISupportInitialize)this.togglingImage).EndInit();
base.ResumeLayout(false);
base.PerformLayout();
}
}
}

View file

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="collapsiblePanelImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABe
CAAAAk1TRnQBSQFMAwEBAAHEAQABxAEAARABAAEQAQAE/wEJARAI/wFCAU0BNgEEBgABNgEEAgABKAMA
AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BAAHyAfALvAHwAfEB9DAA
AQcBkgvsAe0B7wHxMAAB7QH3B+8B9wPvAfcB7QHwMAAB7AH3BAcB7wGSAe8EBwHvAewBvDAAAewB9wIH
Au8B7AFDAesB7wEHAbwBBwHvAewBvDAAAewB7wHxAvABvAHsAQ4BbQHwAwcB7wHsAbwwAAHsAQcD/wH0
AZIBDgHsAfQBvAHvAQcB7wHsAbwwAAHsAbwB8wHvAuwBEgEOARQB7AFtAesB9wHvAewBvDAAAewBBwHy
AeoDDgEAAg4BDwEVAe0B7wHsAbwwAAHsAQcB8wEHAvcBbQEOARMB7QH3Ae8B8AEHAewBvDAAAewBBwT/
AfcBDgHsAfQD/wHwAe0BvDAAAewBvAL/AfQB/wGSAQ4B7AT/AfAB7AG8MAAB7AG8Av8B9AH/AQcB6gHv
BP8B8AHsAbwwAAHsAQcE/wH0AfIB8wH/AfQB8wH/AfEB7QG8MAAB7QHvArwKBwH3AfAwAAEHAZIL7AHt
Ae8B8jAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/+XAAs=
</value>
</data>
</root>

View file

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="collapsiblePanelImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABe
CAAAAk1TRnQBSQFMAwEBAAHEAQABxAEAARABAAEQAQAE/wEJARAI/wFCAU0BNgEEBgABNgEEAgABKAMA
AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BAAHyAfALvAHwAfEB9DAA
AQcBkgvsAe0B7wHxMAAB7QH3B+8B9wPvAfcB7QHwMAAB7AH3BAcB7wGSAe8EBwHvAewBvDAAAewB9wIH
Au8B7AFDAesB7wEHAbwBBwHvAewBvDAAAewB7wHxAvABvAHsAQ4BbQHwAwcB7wHsAbwwAAHsAQcD/wH0
AZIBDgHsAfQBvAHvAQcB7wHsAbwwAAHsAbwB8wHvAuwBEgEOARQB7AFtAesB9wHvAewBvDAAAewBBwHy
AeoDDgEAAg4BDwEVAe0B7wHsAbwwAAHsAQcB8wEHAvcBbQEOARMB7QH3Ae8B8AEHAewBvDAAAewBBwT/
AfcBDgHsAfQD/wHwAe0BvDAAAewBvAL/AfQB/wGSAQ4B7AT/AfAB7AG8MAAB7AG8Av8B9AH/AQcB6gHv
BP8B8AHsAbwwAAHsAQcE/wH0AfIB8wH/AfQB8wH/AfEB7QG8MAAB7QHvArwKBwH3AfAwAAEHAZIL7AHt
Ae8B8jAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/+XAAs=
</value>
</data>
</root>

View file

@ -0,0 +1,17 @@
using System.ComponentModel;
using System.Windows.Forms.Design;
namespace SDRSharp.CollapsiblePanel
{
public class CollapsiblePanelDesigner : ParentControlDesigner
{
public override void Initialize(IComponent component)
{
base.Initialize(component);
if (this.Control is CollapsiblePanel)
{
base.EnableDesignMode(((CollapsiblePanel)this.Control).Content, "Content");
}
}
}
}

View file

@ -0,0 +1,32 @@
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace SDRSharp.CollapsiblePanel
{
[Designer(typeof(ContentPanelDesigner))]
public class ContentPanel : Panel
{
public ContentPanel()
{
base.Dock = DockStyle.Fill;
}
protected override void OnControlAdded(ControlEventArgs e)
{
e.Control.Resize += this.sourceControlPanel_Resize;
base.OnControlAdded(e);
}
protected override void OnControlRemoved(ControlEventArgs e)
{
e.Control.Resize -= this.sourceControlPanel_Resize;
base.OnControlRemoved(e);
}
private void sourceControlPanel_Resize(object sender, EventArgs e)
{
((CollapsiblePanel)base.Parent).UpdateState();
}
}
}

View file

@ -0,0 +1,16 @@
using System.Collections;
using System.Windows.Forms.Design;
namespace SDRSharp.CollapsiblePanel
{
public class ContentPanelDesigner : ScrollableControlDesigner
{
protected override void PreFilterProperties(IDictionary properties)
{
properties.Remove("Dock");
properties.Remove("AutoSize");
properties.Remove("AutoSizeMode");
base.PreFilterProperties(properties);
}
}
}

View file

@ -0,0 +1,8 @@
namespace SDRSharp.CollapsiblePanel
{
public enum PanelStateOptions
{
Collapsed,
Expanded
}
}

View file

@ -0,0 +1,17 @@
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityRules(SecurityRuleSet.Level1)]
[assembly: AssemblyTitle("SDR Sharp")]
[assembly: AssemblyDescription("Software Defined Radio")]
[assembly: AssemblyProduct("SDR#")]
[assembly: AssemblyCopyright("Copyright © Youssef TOUIL 2012")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]

View file

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{E8BB1EAC-ED6B-4D5E-AA88-6A6CD961F37E}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Library</OutputType>
<AssemblyName>SDRSharp.Common</AssemblyName>
<TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
</PropertyGroup>
<ItemGroup>
<Reference Include="SDRSharp.PanView">
<HintPath>..\SDRSharp.PanView\bin\Debug\SDRSharp.PanView.dll</HintPath>
</Reference>
<Reference Include="SDRSharp.Radio">
<HintPath>..\SDRSharp.Radio\bin\Debug\SDRSharp.Radio.dll</HintPath>
</Reference>
<Reference Include="System">
<HintPath>C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll</HintPath>
</Reference>
<Reference Include="System.Drawing">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SDRSharp.Common\ByteSamplesEventArgs.cs" />
<Compile Include="SDRSharp.Common\ComplexSamplesEventArgs.cs" />
<Compile Include="SDRSharp.Common\IFFTSource.cs" />
<Compile Include="SDRSharp.Common\ISharpControl.cs" />
<Compile Include="SDRSharp.Common\ISharpPlugin.cs" />
<Compile Include="SDRSharp.Common\IVFOSource.cs" />
<Compile Include="SDRSharp.Common\PluginPosition.cs" />
<Compile Include="SDRSharp.Common\RealSamplesEventArgs.cs" />
<Compile Include="SDRSharp.Common\SamplesAvailableDelegate.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.2015
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDRSharp.Common", "SDRSharp.Common.csproj", "{E8BB1EAC-ED6B-4D5E-AA88-6A6CD961F37E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E8BB1EAC-ED6B-4D5E-AA88-6A6CD961F37E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8BB1EAC-ED6B-4D5E-AA88-6A6CD961F37E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E8BB1EAC-ED6B-4D5E-AA88-6A6CD961F37E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8BB1EAC-ED6B-4D5E-AA88-6A6CD961F37E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0AE04AD9-F937-4F9E-9BEC-85735408578C}
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,19 @@
using System;
namespace SDRSharp.Common
{
public sealed class ByteSamplesEventArgs : EventArgs
{
public int Length
{
get;
set;
}
public unsafe byte* Buffer
{
get;
set;
}
}
}

View file

@ -0,0 +1,26 @@
using SDRSharp.Radio;
using System;
namespace SDRSharp.Common
{
public sealed class ComplexSamplesEventArgs : EventArgs
{
public int Length
{
get;
set;
}
public ulong DroppedSamples
{
get;
set;
}
public unsafe Complex* Buffer
{
get;
set;
}
}
}

View file

@ -0,0 +1,36 @@
namespace SDRSharp.Common
{
public interface IFFTSource
{
bool FFTEnabled
{
get;
set;
}
int FFTRange
{
get;
set;
}
int FFTOffset
{
get;
set;
}
int DisplayBandwidth
{
get;
}
int DisplayPixels
{
get;
set;
}
event SamplesAvailableDelegate<ByteSamplesEventArgs> FFTAvailable;
}
}

View file

@ -0,0 +1,371 @@
using SDRSharp.PanView;
using SDRSharp.Radio;
using System;
using System.ComponentModel;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace SDRSharp.Common
{
public interface ISharpControl
{
DetectorType DetectorType
{
get;
set;
}
WindowType FilterType
{
get;
set;
}
int AudioGain
{
get;
set;
}
long CenterFrequency
{
get;
set;
}
int CWShift
{
get;
set;
}
bool FilterAudio
{
get;
set;
}
bool UnityGain
{
get;
set;
}
int FilterBandwidth
{
get;
set;
}
int FilterOrder
{
get;
set;
}
bool FmStereo
{
get;
set;
}
long Frequency
{
get;
set;
}
long FrequencyShift
{
get;
set;
}
bool FrequencyShiftEnabled
{
get;
set;
}
bool MarkPeaks
{
get;
set;
}
bool SnapToGrid
{
get;
set;
}
bool SquelchEnabled
{
get;
set;
}
int SquelchThreshold
{
get;
set;
}
bool IsSquelchOpen
{
get;
}
bool SwapIq
{
get;
set;
}
bool UseAgc
{
get;
set;
}
bool AgcHang
{
get;
set;
}
int AgcThreshold
{
get;
set;
}
int AgcDecay
{
get;
set;
}
int AgcSlope
{
get;
set;
}
int FFTResolution
{
get;
}
float FFTRange
{
get;
}
float FFTOffset
{
get;
}
int FFTContrast
{
get;
}
float VisualSNR
{
get;
}
int IFOffset
{
get;
}
ColorBlend Gradient
{
get;
}
SpectrumStyle FFTSpectrumStyle
{
get;
}
int StepSize
{
get;
set;
}
int Zoom
{
get;
set;
}
bool IsPlaying
{
get;
}
float SAttack
{
get;
set;
}
float SDecay
{
get;
set;
}
float WAttack
{
get;
set;
}
float WDecay
{
get;
set;
}
bool UseTimeMarkers
{
get;
set;
}
string RdsProgramService
{
get;
}
string RdsRadioText
{
get;
}
bool RdsUseFEC
{
get;
set;
}
int RFBandwidth
{
get;
}
int RFDisplayBandwidth
{
get;
}
int TunableBandwidth
{
get;
}
float TuningLimit
{
get;
set;
}
TuningStyle TuningStyle
{
get;
set;
}
bool TuningStyleFreezed
{
get;
set;
}
bool SourceIsSoundCard
{
get;
}
bool SourceIsWaveFile
{
get;
}
bool SourceIsTunable
{
get;
}
object Source
{
get;
}
bool AudioIsMuted
{
get;
set;
}
bool BypassDemodulation
{
get;
set;
}
Type SourceType
{
get;
}
string SourceName
{
get;
}
double AudioSampleRate
{
get;
}
event PropertyChangedEventHandler PropertyChanged;
event CustomPaintEventHandler WaterfallCustomPaint;
event CustomPaintEventHandler SpectrumAnalyzerCustomPaint;
event CustomPaintEventHandler SpectrumAnalyzerBackgroundCustomPaint;
void SetFrequency(long frequency, bool onlyMoveCenterFrequency);
void ResetFrequency(long frequency);
void ResetFrequency(long frequency, long centerFrequency);
[Obsolete("Use GetSpectrumSnapshot(float[], float, float) instead")]
void GetSpectrumSnapshot(byte[] destArray);
void GetSpectrumSnapshot(float[] destArray, float scale = 1f, float offset = 0f);
void StartRadio();
void StopRadio();
void RegisterStreamHook(object streamHook, ProcessorType processorType);
void UnregisterStreamHook(object streamHook);
void RegisterFrontControl(UserControl control, PluginPosition preferredPosition);
void Perform();
void RefreshSource(bool reload);
}
}

View file

@ -0,0 +1,21 @@
using System.Windows.Forms;
namespace SDRSharp.Common
{
public interface ISharpPlugin
{
UserControl Gui
{
get;
}
string DisplayName
{
get;
}
void Initialize(ISharpControl control);
void Close();
}
}

View file

@ -0,0 +1,27 @@
namespace SDRSharp.Common
{
public interface IVFOSource
{
long VFOFrequency
{
get;
set;
}
int VFODecimation
{
get;
set;
}
int VFOMinIQDecimation
{
get;
}
double VFOMaxSampleRate
{
get;
}
}
}

View file

@ -0,0 +1,10 @@
namespace SDRSharp.Common
{
public enum PluginPosition
{
Top,
Bottom,
Left,
Right
}
}

View file

@ -0,0 +1,25 @@
using System;
namespace SDRSharp.Common
{
public sealed class RealSamplesEventArgs : EventArgs
{
public int Length
{
get;
set;
}
public ulong DroppedSamples
{
get;
set;
}
public unsafe float* Buffer
{
get;
set;
}
}
}

View file

@ -0,0 +1,4 @@
namespace SDRSharp.Common
{
public delegate void SamplesAvailableDelegate<ArgsType>(object sender, ArgsType e);
}

View file

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26228.4
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDRSharp.FrequencyEdit", "SDRSharp.FrequencyEdit\SDRSharp.FrequencyEdit.csproj", "{A50690CF-7A7A-4B31-9A03-B3A2AF0AF0E0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A50690CF-7A7A-4B31-9A03-B3A2AF0AF0E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A50690CF-7A7A-4B31-9A03-B3A2AF0AF0E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A50690CF-7A7A-4B31-9A03-B3A2AF0AF0E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A50690CF-7A7A-4B31-9A03-B3A2AF0AF0E0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,11 @@
using System;
namespace SDRSharp.FrequencyEdit
{
public enum EntryMode
{
None,
Direct,
Arrow
}
}

View file

@ -0,0 +1,15 @@
using System;
namespace SDRSharp.FrequencyEdit
{
public class FrequencyChangingEventArgs : EventArgs
{
public long Frequency { get; set; }
public bool Accept { get; set; }
public FrequencyChangingEventArgs()
{
}
}
}

View file

@ -0,0 +1,749 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using SDRSharp.FrequencyEdit.Properties;
namespace SDRSharp.FrequencyEdit
{
public sealed class FrequencyEdit : UserControl
{
public event EventHandler FrequencyChanged;
public event EventHandler<FrequencyChangingEventArgs> FrequencyChanging;
public int StepSize
{
get
{
return this._stepSize;
}
set
{
this._stepSize = value;
}
}
public bool DisableFrequencyEvents
{
get
{
return this._disableFrequencyEvents;
}
set
{
this._disableFrequencyEvents = value;
}
}
public bool EntryModeActive
{
get
{
return this._currentEntryMode > EntryMode.None;
}
}
public long Frequency
{
get
{
return this._frequency;
}
set
{
this._frequencyChangingEventArgs.Accept = true;
this._frequencyChangingEventArgs.Frequency = value;
if (!this._disableFrequencyEvents && this.FrequencyChanging != null)
{
this.FrequencyChanging(this, this._frequencyChangingEventArgs);
}
if (this._frequencyChangingEventArgs.Accept)
{
this._frequency = this._frequencyChangingEventArgs.Frequency;
this.UpdateDigitsValues();
if (!this._disableFrequencyEvents && this.FrequencyChanged != null)
{
this.FrequencyChanged(this, EventArgs.Empty);
}
}
}
}
public FrequencyEdit()
{
this.DoubleBuffered = true;
this.AutoSize = true;
base.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this._digitImages = Resources.Numbers;
this._renderTimer.Interval = 30;
this._renderTimer.Tick += this.renderTimer_Tick;
this._renderTimer.Enabled = true;
this.ConfigureComponent();
}
private void renderTimer_Tick(object sender, EventArgs e)
{
for (int i = 0; i < base.Controls.Count; i++)
{
if (base.Controls[i] is IRenderable)
{
((IRenderable)base.Controls[i]).Render();
}
}
}
private void ConfigureComponent()
{
this.BackColor = Color.Transparent;
if (this._digitImages != null)
{
for (int i = 0; i < 12; i++)
{
if (this._digitControls[i] != null && base.Controls.Contains(this._digitControls[i]))
{
base.Controls.Remove(this._digitControls[i]);
this._digitControls[i] = null;
}
}
for (int j = 0; j < 12; j++)
{
if (this._separatorControls[j] != null && base.Controls.Contains(this._separatorControls[j]))
{
base.Controls.Remove(this._separatorControls[j]);
this._separatorControls[j] = null;
}
}
this.SplitDigitImages();
}
if (this._imageList.Images.Count == 0)
{
return;
}
int num = 0;
int y = 0;
int width = this._imageList.ImageSize.Width;
int height = this._imageList.ImageSize.Height;
for (int k = 11; k >= 0; k--)
{
if ((k + 1) % 3 == 0 && k != 11)
{
FrequencyEditSeparator frequencyEditSeparator = new FrequencyEditSeparator();
int num2 = width / 2;
int num3 = k / 3;
frequencyEditSeparator.Image = this._imageList.Images[11];
frequencyEditSeparator.Width = num2;
frequencyEditSeparator.Height = height;
frequencyEditSeparator.Location = new Point(num, y);
base.Controls.Add(frequencyEditSeparator);
this._separatorControls[num3] = frequencyEditSeparator;
num += num2 + 2;
}
FrequencyEditDigit frequencyEditDigit = new FrequencyEditDigit(k);
frequencyEditDigit.Location = new Point(num, y);
frequencyEditDigit.OnDigitClick += this.DigitClickHandler;
frequencyEditDigit.MouseLeave += this.DigitMouseLeave;
frequencyEditDigit.Width = width;
frequencyEditDigit.Height = height;
frequencyEditDigit.ImageList = this._imageList;
base.Controls.Add(frequencyEditDigit);
this._digitControls[k] = frequencyEditDigit;
num += width + 2;
}
long num4 = 1L;
for (int l = 0; l < 12; l++)
{
this._digitControls[l].Weight = num4;
num4 *= 10L;
}
base.Height = height;
this.UpdateDigitMask();
}
private void SplitDigitImages()
{
int height = this._digitImages.Height;
int num = (int)Math.Round((double)((float)this._digitImages.Width / 11.5f));
this._imageList.Images.Clear();
this._imageList.ImageSize = new Size(num, height);
int num2 = 0;
Bitmap bitmap;
for (int i = 0; i < 11; i++)
{
bitmap = new Bitmap(num, height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.DrawImage(this._digitImages, new Rectangle(0, 0, num, height), new Rectangle(num2, 0, num, height), GraphicsUnit.Pixel);
}
num2 += num;
this._imageList.Images.Add(bitmap);
}
bitmap = new Bitmap(num, height);
using (Graphics graphics2 = Graphics.FromImage(bitmap))
{
graphics2.DrawImage(this._digitImages, new Rectangle(0, 0, num, height), new Rectangle(num2, 0, num / 2, height), GraphicsUnit.Pixel);
}
this._imageList.Images.Add(bitmap);
}
private void DigitClickHandler(object sender, FrequencyEditDigitClickEventArgs args)
{
if (this._currentEntryMode != EntryMode.None)
{
this.LeaveEntryMode();
return;
}
FrequencyEditDigit frequencyEditDigit = (FrequencyEditDigit)sender;
if (frequencyEditDigit != null)
{
this._newFrequency = this._frequency;
if (args.Button == MouseButtons.Right)
{
this.ZeroDigits(frequencyEditDigit.DigitIndex);
}
else if (args.IsUpperHalf && this._frequency >= 0L)
{
this.IncrementDigit(frequencyEditDigit.DigitIndex, true);
}
else
{
this.DecrementDigit(frequencyEditDigit.DigitIndex, true);
}
if (this._newFrequency != this._frequency)
{
this._frequencyChangingEventArgs.Accept = true;
this._frequencyChangingEventArgs.Frequency = this._newFrequency;
if (!this._disableFrequencyEvents && this.FrequencyChanging != null)
{
this.FrequencyChanging(this, this._frequencyChangingEventArgs);
}
if (this._frequencyChangingEventArgs.Accept)
{
this._frequency = this._frequencyChangingEventArgs.Frequency;
this.UpdateDigitsValues();
if (!this._disableFrequencyEvents && this.FrequencyChanged != null)
{
this.FrequencyChanged(this, EventArgs.Empty);
return;
}
}
else
{
this.UpdateDigitsValues();
}
}
}
}
private void IncrementDigit(int index, bool updateDigit)
{
FrequencyEditDigit frequencyEditDigit = this._digitControls[index];
if (frequencyEditDigit != null)
{
int displayedDigit = frequencyEditDigit.DisplayedDigit;
int num = (frequencyEditDigit.DisplayedDigit == 9) ? 0 : (frequencyEditDigit.DisplayedDigit + 1);
long newFrequency = this._newFrequency - (long)displayedDigit * frequencyEditDigit.Weight + (long)num * frequencyEditDigit.Weight;
if (updateDigit)
{
frequencyEditDigit.DisplayedDigit = num;
}
this._newFrequency = newFrequency;
if (displayedDigit == 9 && index < 11)
{
this.IncrementDigit(index + 1, updateDigit);
}
}
}
private void DecrementDigit(int index, bool updateDigit)
{
FrequencyEditDigit frequencyEditDigit = this._digitControls[index];
if (frequencyEditDigit != null)
{
int displayedDigit = frequencyEditDigit.DisplayedDigit;
int num = (frequencyEditDigit.DisplayedDigit == 0) ? 9 : (frequencyEditDigit.DisplayedDigit - 1);
long newFrequency = this._newFrequency - (long)displayedDigit * frequencyEditDigit.Weight + (long)num * frequencyEditDigit.Weight;
if (updateDigit)
{
frequencyEditDigit.DisplayedDigit = num;
}
this._newFrequency = newFrequency;
if (displayedDigit == 0 && index < 11 && (double)this._newFrequency > Math.Pow(10.0, (double)(index + 1)))
{
this.DecrementDigit(index + 1, updateDigit);
}
}
}
private void ZeroDigits(int index)
{
for (int i = 0; i <= index; i++)
{
this._digitControls[i].DisplayedDigit = 0;
}
long num = (long)Math.Pow(10.0, (double)(index + 1));
this._newFrequency = this._newFrequency / num * num;
}
private void UpdateDigitsValues()
{
if (this._digitControls[0] == null)
{
return;
}
long num = this._frequency;
for (int i = 11; i >= 0; i--)
{
long num2 = num / this._digitControls[i].Weight;
this._digitControls[i].DisplayedDigit = (int)num2;
num -= (long)this._digitControls[i].DisplayedDigit * this._digitControls[i].Weight;
}
this.UpdateDigitMask();
}
private void UpdateDigitMask()
{
long frequency = this._frequency;
if (frequency >= 0L)
{
for (int i = 1; i < 12; i++)
{
if ((i + 1) % 3 == 0 && i != 11)
{
int num = i / 3;
if (this._separatorControls[num] != null)
{
this._separatorControls[num].Masked = (this._digitControls[i + 1].Weight > frequency);
}
}
if (this._digitControls[i] != null)
{
this._digitControls[i].Masked = (this._digitControls[i].Weight > frequency);
}
}
}
}
private void DigitMouseLeave(object sender, EventArgs e)
{
if (!base.ClientRectangle.Contains(base.PointToClient(Control.MousePosition)) && this._currentEntryMode != EntryMode.None)
{
this.AbortEntryMode();
}
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
if (!base.ClientRectangle.Contains(base.PointToClient(Control.MousePosition)) && this._currentEntryMode != EntryMode.None)
{
this.AbortEntryMode();
}
}
private long GetFrequencyValue()
{
long num = 0L;
for (int i = 0; i < this._digitControls.Length; i++)
{
num += this._digitControls[i].Weight * (long)this._digitControls[i].DisplayedDigit;
}
return num;
}
private void SetFrequencyValue(long newFrequency)
{
if (newFrequency != this._frequency)
{
this._frequencyChangingEventArgs.Accept = true;
this._frequencyChangingEventArgs.Frequency = newFrequency;
if (!this._disableFrequencyEvents && this.FrequencyChanging != null)
{
this.FrequencyChanging(this, this._frequencyChangingEventArgs);
}
if (this._frequencyChangingEventArgs.Accept)
{
this._frequency = this._frequencyChangingEventArgs.Frequency;
this.UpdateDigitsValues();
if (!this._disableFrequencyEvents && this.FrequencyChanged != null)
{
this.FrequencyChanged(this, EventArgs.Empty);
}
}
}
}
private void EnterDirectMode()
{
if (this._changingEntryMode)
{
return;
}
this._changingEntryMode = true;
for (int i = 0; i < this._digitControls.Length; i++)
{
if (this._digitControls[i] != null)
{
this._digitControls[i].Masked = false;
if (this._digitControls[i].CursorInside)
{
this._editModePosition = i;
this._digitControls[i].Highlight = true;
}
}
}
this.ZeroDigits(this._digitControls.Length - 1);
this._currentEntryMode = EntryMode.Direct;
this._changingEntryMode = false;
}
private void DirectModeHandler(KeyEventArgs args)
{
Keys keyCode = args.KeyCode;
if (keyCode <= Keys.Return)
{
if (keyCode != Keys.Back)
{
if (keyCode != Keys.Tab)
{
if (keyCode != Keys.Return)
{
return;
}
this.LeaveEntryMode();
return;
}
}
else
{
this._digitControls[this._editModePosition].DisplayedDigit = 0;
if (this._editModePosition < this._digitControls.Length - 1)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition++;
this._digitControls[this._editModePosition].Highlight = true;
return;
}
return;
}
}
else
{
if (keyCode <= Keys.D9)
{
if (keyCode == Keys.Escape)
{
this.AbortEntryMode();
return;
}
switch (keyCode)
{
case Keys.Left:
if (this._editModePosition < this._digitControls.Length - 1)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition++;
this._digitControls[this._editModePosition].Highlight = true;
return;
}
return;
case Keys.Up:
case Keys.Down:
case Keys.Select:
case Keys.Print:
case Keys.Execute:
case Keys.Snapshot:
case Keys.Insert:
case Keys.Delete:
case Keys.Help:
return;
case Keys.Right:
if (this._editModePosition > 0)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition--;
this._digitControls[this._editModePosition].Highlight = true;
return;
}
return;
case Keys.D0:
case Keys.D1:
case Keys.D2:
case Keys.D3:
case Keys.D4:
case Keys.D5:
case Keys.D6:
case Keys.D7:
case Keys.D8:
case Keys.D9:
break;
default:
return;
}
}
else
{
switch (keyCode)
{
case Keys.NumPad0:
case Keys.NumPad1:
case Keys.NumPad2:
case Keys.NumPad3:
case Keys.NumPad4:
case Keys.NumPad5:
case Keys.NumPad6:
case Keys.NumPad7:
case Keys.NumPad8:
case Keys.NumPad9:
break;
case Keys.Multiply:
case Keys.Add:
case Keys.Separator:
case Keys.Subtract:
return;
case Keys.Decimal:
goto IL_249;
default:
if (keyCode != Keys.OemPeriod)
{
return;
}
goto IL_249;
}
}
int displayedDigit = (args.KeyCode >= Keys.D0 && args.KeyCode <= Keys.D9) ? (args.KeyCode - Keys.D0) : (args.KeyCode - Keys.NumPad0);
this._digitControls[this._editModePosition].DisplayedDigit = displayedDigit;
if (this._editModePosition > 0)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition--;
this._digitControls[this._editModePosition].Highlight = true;
return;
}
this.LeaveEntryMode();
return;
}
IL_249:
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition -= this._editModePosition % 3 + 1;
if (this._editModePosition < 2)
{
if (args.KeyCode != Keys.Tab)
{
this._editModePosition = 0;
this.LeaveEntryMode();
return;
}
this._editModePosition = this._digitControls.Length - 1;
}
this._digitControls[this._editModePosition].Highlight = true;
}
private void EnterArrowMode()
{
if (this._changingEntryMode)
{
return;
}
this._changingEntryMode = true;
for (int i = 0; i < this._digitControls.Length; i++)
{
if (this._digitControls[i] != null)
{
this._digitControls[i].Masked = false;
if (this._digitControls[i].CursorInside)
{
this._editModePosition = i;
this._digitControls[i].Highlight = true;
}
}
}
this._currentEntryMode = EntryMode.Arrow;
this._changingEntryMode = false;
}
private void ArrowModeHandler(KeyEventArgs args)
{
Keys keyCode = args.KeyCode;
if (keyCode <= Keys.Return)
{
if (keyCode == Keys.Tab)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition -= this._editModePosition % 3 + 1;
if (this._editModePosition < 2)
{
this._editModePosition = this._digitControls.Length - 1;
}
this._digitControls[this._editModePosition].Highlight = true;
return;
}
if (keyCode != Keys.Return)
{
return;
}
}
else if (keyCode != Keys.Escape)
{
switch (keyCode)
{
case Keys.Left:
if (this._editModePosition < this._digitControls.Length - 1)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition++;
this._digitControls[this._editModePosition].Highlight = true;
return;
}
return;
case Keys.Up:
this._newFrequency = this._frequency;
this.IncrementDigit(this._editModePosition, false);
this.SetFrequencyValue(this._newFrequency);
return;
case Keys.Right:
if (this._editModePosition > 0)
{
this._digitControls[this._editModePosition].Highlight = false;
this._editModePosition--;
this._digitControls[this._editModePosition].Highlight = true;
return;
}
return;
case Keys.Down:
this._newFrequency = this._frequency;
this.DecrementDigit(this._editModePosition, false);
this.SetFrequencyValue(this._newFrequency);
return;
default:
return;
}
}
this.AbortEntryMode();
}
private void AbortEntryMode()
{
if (this._changingEntryMode)
{
return;
}
this._changingEntryMode = true;
this._digitControls[this._editModePosition].Highlight = false;
this.UpdateDigitsValues();
this._currentEntryMode = EntryMode.None;
this._changingEntryMode = false;
}
private void LeaveEntryMode()
{
if (this._changingEntryMode)
{
return;
}
this._changingEntryMode = true;
this._digitControls[this._editModePosition].Highlight = false;
if (this._currentEntryMode == EntryMode.Direct)
{
long frequencyValue = this.GetFrequencyValue();
this.SetFrequencyValue(frequencyValue);
}
this._currentEntryMode = EntryMode.None;
this._changingEntryMode = false;
}
private bool DigitKeyHandler(KeyEventArgs args)
{
if (!base.ClientRectangle.Contains(base.PointToClient(Control.MousePosition)) || this._changingEntryMode)
{
return false;
}
if (this._currentEntryMode != EntryMode.None)
{
EntryMode currentEntryMode = this._currentEntryMode;
if (currentEntryMode != EntryMode.Direct)
{
if (currentEntryMode == EntryMode.Arrow)
{
this.ArrowModeHandler(args);
}
}
else
{
this.DirectModeHandler(args);
}
return true;
}
if ((args.KeyCode >= Keys.D0 && args.KeyCode <= Keys.D9) || (args.KeyCode >= Keys.NumPad0 && args.KeyCode <= Keys.NumPad9))
{
this.EnterDirectMode();
this.DirectModeHandler(args);
return true;
}
if (args.KeyCode == Keys.Up || args.KeyCode == Keys.Down || args.KeyCode == Keys.Left || args.KeyCode == Keys.Right)
{
this.EnterArrowMode();
this.ArrowModeHandler(args);
return true;
}
if (args.Modifiers == Keys.Control)
{
if (args.KeyCode == Keys.C)
{
Clipboard.SetText(string.Format("{0}", this.GetFrequencyValue()), TextDataFormat.Text);
return true;
}
if (args.KeyCode == Keys.V)
{
long frequencyValue = 0L;
if (long.TryParse(Clipboard.GetText(), out frequencyValue))
{
this.SetFrequencyValue(frequencyValue);
}
return true;
}
}
return false;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (msg.Msg == 256 || msg.Msg == 260)
{
return this.DigitKeyHandler(new KeyEventArgs(keyData));
}
return base.ProcessCmdKey(ref msg, keyData);
}
private const int DigitCount = 12;
private const int DigitImageSplitCount = 12;
private const int DigitSeperatorCount = 12;
private readonly FrequencyEditDigit[] _digitControls = new FrequencyEditDigit[12];
private readonly FrequencyEditSeparator[] _separatorControls = new FrequencyEditSeparator[12];
private readonly ImageList _imageList = new ImageList();
private readonly Image _digitImages;
private readonly Timer _renderTimer = new Timer();
private readonly FrequencyChangingEventArgs _frequencyChangingEventArgs = new FrequencyChangingEventArgs();
private long _frequency;
private long _newFrequency;
private int _stepSize;
private int _editModePosition;
private bool _changingEntryMode;
private bool _disableFrequencyEvents;
private EntryMode _currentEntryMode;
}
}

View file

@ -0,0 +1,271 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
namespace SDRSharp.FrequencyEdit
{
internal sealed class FrequencyEditDigit : UserControl, IRenderable
{
public event OnDigitClickDelegate OnDigitClick;
public ImageList ImageList
{
get
{
return this._imageList;
}
set
{
this._imageList = value;
}
}
public bool Highlight
{
get
{
return this._highlight;
}
set
{
this._highlight = value;
this._renderNeeded = true;
}
}
public bool CursorInside
{
get
{
return this._cursorInside;
}
}
public int DisplayedDigit
{
get
{
return this._displayedDigit;
}
set
{
if (value >= 0 && value <= 9 && this._displayedDigit != value)
{
this._displayedDigit = value;
this._renderNeeded = true;
}
}
}
public int DigitIndex
{
get
{
return this._digitIndex;
}
}
public bool Masked
{
get
{
return this._masked;
}
set
{
if (this._masked != value)
{
this._masked = value;
this._renderNeeded = true;
}
}
}
public long Weight
{
get
{
return this._weight;
}
set
{
this._weight = value;
}
}
public FrequencyEditDigit(int digitIndex)
{
this.DoubleBuffered = true;
this.BackColor = Color.Transparent;
this._tickTimer.Tick += this.timer_Tick;
base.UpdateStyles();
this._digitIndex = digitIndex;
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.Matrix33 = 0.3f;
this._maskedAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
}
protected override void OnPaint(PaintEventArgs e)
{
if (this._imageList != null && this._displayedDigit < this._imageList.Images.Count)
{
Image image = this._imageList.Images[this._displayedDigit];
ImageAttributes imageAttrs = ((this._masked && !this._cursorInside) || !base.Parent.Enabled) ? this._maskedAttributes : null;
e.Graphics.DrawImage(image, new Rectangle(0, 0, base.Width, base.Height), 0f, 0f, (float)image.Width, (float)image.Height, GraphicsUnit.Pixel, imageAttrs);
}
if (this._cursorInside && !((FrequencyEdit)base.Parent).EntryModeActive)
{
bool flag = this._lastMouseY <= base.ClientRectangle.Height / 2;
using (SolidBrush solidBrush = new SolidBrush(Color.FromArgb(100, flag ? Color.Red : Color.Blue)))
{
if (flag)
{
e.Graphics.FillRectangle(solidBrush, new Rectangle(0, 0, base.ClientRectangle.Width, base.ClientRectangle.Height / 2));
}
else
{
e.Graphics.FillRectangle(solidBrush, new Rectangle(0, base.ClientRectangle.Height / 2, base.ClientRectangle.Width, base.ClientRectangle.Height));
}
}
}
if (this._highlight)
{
SolidBrush brush = new SolidBrush(Color.FromArgb(25, Color.Red));
e.Graphics.FillRectangle(brush, new Rectangle(0, 0, base.ClientRectangle.Width, base.ClientRectangle.Height));
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
this._isUpperHalf = (e.Y <= base.ClientRectangle.Height / 2);
this._lastMouseY = e.Y;
if (this._isUpperHalf != this._lastIsUpperHalf)
{
this._renderNeeded = true;
this._tickCount = 0;
}
this._lastIsUpperHalf = this._isUpperHalf;
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
this._cursorInside = true;
this._renderNeeded = true;
base.Focus();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
this._cursorInside = false;
this._renderNeeded = true;
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
this._isUpperHalf = (e.Y <= base.ClientRectangle.Height / 2);
if (this.OnDigitClick != null)
{
this.OnDigitClick(this, new FrequencyEditDigitClickEventArgs(this._isUpperHalf, e.Button));
}
this._tickCount = 1;
this._tickTimer.Interval = 300;
this._tickTimer.Enabled = true;
}
protected override void OnMouseUp(MouseEventArgs e)
{
this._tickTimer.Enabled = false;
}
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
if (this.OnDigitClick != null)
{
this.OnDigitClick(this, new FrequencyEditDigitClickEventArgs(e.Delta > 0, e.Button));
}
}
public void Render()
{
if (this._renderNeeded)
{
base.Invalidate();
this._renderNeeded = false;
}
}
private void timer_Tick(object sender, EventArgs e)
{
if (this.OnDigitClick != null)
{
this.OnDigitClick(this, new FrequencyEditDigitClickEventArgs(this._isUpperHalf, MouseButtons.Left));
}
this._tickCount++;
int tickCount = this._tickCount;
if (tickCount <= 20)
{
if (tickCount == 10)
{
this._tickTimer.Interval = 200;
return;
}
if (tickCount != 20)
{
return;
}
this._tickTimer.Interval = 100;
return;
}
else
{
if (tickCount == 50)
{
this._tickTimer.Interval = 50;
return;
}
if (tickCount != 100)
{
return;
}
this._tickTimer.Interval = 20;
return;
}
}
private const float MaskedDigitTransparency = 0.3f;
private bool _masked;
private int _displayedDigit;
private long _weight;
private bool _renderNeeded;
private bool _cursorInside;
private bool _highlight;
private int _lastMouseY;
private bool _lastIsUpperHalf;
private bool _isUpperHalf;
private int _tickCount;
private ImageList _imageList;
private readonly int _digitIndex;
private readonly Timer _tickTimer = new Timer();
private readonly ImageAttributes _maskedAttributes = new ImageAttributes();
}
}

View file

@ -0,0 +1,18 @@
using System;
using System.Windows.Forms;
namespace SDRSharp.FrequencyEdit
{
public class FrequencyEditDigitClickEventArgs
{
public FrequencyEditDigitClickEventArgs(bool isUpperHalf, MouseButtons button)
{
this.IsUpperHalf = isUpperHalf;
this.Button = button;
}
public bool IsUpperHalf;
public MouseButtons Button;
}
}

View file

@ -0,0 +1,75 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
namespace SDRSharp.FrequencyEdit
{
internal sealed class FrequencyEditSeparator : UserControl, IRenderable
{
public Image Image
{
get
{
return this._image;
}
set
{
this._image = value;
}
}
public bool Masked
{
get
{
return this._masked;
}
set
{
if (this._masked != value)
{
this._masked = value;
this._renderNeeded = true;
}
}
}
public FrequencyEditSeparator()
{
this.DoubleBuffered = true;
base.UpdateStyles();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.Matrix33 = 0.3f;
this._maskedAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
}
public void Render()
{
if (this._renderNeeded)
{
base.Invalidate();
this._renderNeeded = false;
}
}
protected override void OnPaint(PaintEventArgs e)
{
if (this._image != null)
{
ImageAttributes imageAttrs = (this._masked || !base.Parent.Enabled) ? this._maskedAttributes : null;
e.Graphics.DrawImage(this._image, new Rectangle(0, 0, base.Width, base.Height), 0f, 0f, (float)this._image.Width, (float)this._image.Height, GraphicsUnit.Pixel, imageAttrs);
}
}
private const float MaskedDigitTransparency = 0.3f;
private Image _image;
private bool _masked;
private bool _renderNeeded;
private readonly ImageAttributes _maskedAttributes = new ImageAttributes();
}
}

View file

@ -0,0 +1,9 @@
using System;
namespace SDRSharp.FrequencyEdit
{
internal interface IRenderable
{
void Render();
}
}

View file

@ -0,0 +1,6 @@
using System;
namespace SDRSharp.FrequencyEdit
{
public delegate void OnDigitClickDelegate(object sender, FrequencyEditDigitClickEventArgs args);
}

View file

@ -0,0 +1,24 @@
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Frequency Edit Control")]
[assembly: AssemblyDescription("Frequency Edit Control")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SDR#")]
[assembly: AssemblyCopyright("Copyright © 2012 Youssef Touil, Ian Gilmour")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("300880ef-fb6f-41ec-b607-d468751fe0ad")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]

View file

@ -0,0 +1,59 @@
using System;
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.Resources;
using System.Runtime.CompilerServices;
namespace SDRSharp.FrequencyEdit.Properties
{
[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[DebuggerNonUserCode]
[CompilerGenerated]
internal class Resources
{
internal Resources()
{
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
internal static ResourceManager ResourceManager
{
get
{
if (Resources.resourceMan == null)
{
Resources.resourceMan = new ResourceManager("SDRSharp.FrequencyEdit.Properties.Resources", typeof(Resources).Assembly);
}
return Resources.resourceMan;
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
internal static CultureInfo Culture
{
get
{
return Resources.resourceCulture;
}
set
{
Resources.resourceCulture = value;
}
}
internal static Bitmap Numbers
{
get
{
return (Bitmap)Resources.ResourceManager.GetObject("Numbers", Resources.resourceCulture);
}
}
private static ResourceManager resourceMan;
private static CultureInfo resourceCulture;
}
}

View file

@ -0,0 +1,177 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="Numbers" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAM8AAAAWCAYAAABnsMi4AAAABGdBTUEAALGPC/xhBQAAABp0RVh0U29m
dHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAALqklEQVR4XtXcBawluRGF4QkzMzMzKszMzMykMEeh
DSqkMDMzMyjMzMzMzDA532pKcloN7vvenVWO9Gtn+7rdbttll8vut2dExwnXD08O7w179/GF8Oxwy3DK
cPDQq8OEk4Q7hEeG04Qeue884d7Bsz8Wqjz+7drdw+nDVHkOFy4V7hm80xvDH0Ll877wtOC9ThTW6B5B
Hj8Op3ahQ8cO9exenhF6dKrwqfD9cEUXFnSk8KYw9swlLhnGVP1HnarbSv+b8OLw4HDBcOgwp6OGq4dH
hdeGX4XK5/lBnzhDWNMPt6ZDhWuHj4a/hHrpIX8Lnw8MQcdc0sXDu8LXgvt/GM4clnSsoNJ0zHr2H8PP
ws/DP/ddw3fCAWGsPAxdhVda5Xe/fPCPUNc/E24UehqEEXw6uPepYakzlHRw9/wr6BBVjjkeHZZ0/PDu
IO/fh2uGJTEeHXrsmWOof/njEmGo84UPhLn+g5+Gx4Sp/nOm8M5Qz2vrqtoLXw63DfruQaZDhNuEKhRe
Hx4Y7rIPI7fRpE3zoHD4MCf5viF8JLin13hOG6T/bXhuuF+4SjhHOHdQaRqgNS4zwSFDK/l4pjyMejcO
7pcPbh3MSJUHLhqWdPNQneR0LnSq3utH4cqhyjGHWXtOOs8zgwFA3jcIw3oYkzS8gLFnjvHyIH+dWAdv
ZTAxiPkd+s/9Q/UfbfPE0LbXvcKw48uHl1NpDKDuvVBQBu1lMGnzuVU4yGag8wajgYJ8NVw1GEkPFlqp
bB2vDMHorxPNyT3yulxwT6/x6DA3CUZUeQzLQozezGK0kzd3xVTeinEfLchjqoLlww35SZCPmfLoYUre
58NB2teFsbJNSSdw39fDCVzYoXS+Owaj85/DfcM2OtJJgzIr+9MDl7rkeZ7rNwZskBrrP+r5bOGzQdpv
BTNx6bDhhcFvZp07hbl8PhGk5dXoB/tdCvzmUC9u1Fqq/PMHRuCeTwZ+7pJ0Tul7jUdn79XVgs4j/xu6
sIG88yOCPDTcWcKULhCk4x7xy0s6sk6FKYOqeuByzBlor7jFvwzytAY8QtiG7hz+HjzHANrKMw0ifvtm
OHGYE6OQFq37d/LwjeA6T2FpWXCNUGXatN13pHOFmnVMtUcMS9JJHhLcY7S7TljSWuNZIwv9LwX5cxU2
lUW2PKC8YzKTcSWk+WKwbiB1wpV8QbDIPUYYU3UcrklPXc/pKOE9QX48ht6gxVrpxIzdc6zzhmoDD2YV
s8Wcqi+gXZu119tBaUrHDBWUeI0L+1v3Cf8OCtAToSmJcNWLPsmFBW3TeMx8Ah3yf7ULG+pKod5pbEFM
FsW1tuB/l3SYlwTXuTfczTGJnEmjE65x98ZkzVCBk8uGneY3JnlWvfw13CwM1c48nwu8mTkpq7RoB6nr
hrpuUF+SAetFQXpBrG3NupMqHxPHdaFT3KqKfDCIJW3TeKxzKpRpcbqJdBIDiTwsiM8YhpLGrCINP5ub
UeoxHq7hc4I0Hw98dx3AvcXc2qyVDqou5WWNZnZo8/Jv+e/UoMxubw2eY3Yfc9GVt4JJggbtOmYo5dFG
0lqjtsEWIW7XITjQoxqMlM3adr/qK8HDf3Hg/63Tq0K97JK2aTzCy1UOgYlNxFi+G+Qx5b7qFJXmoUHn
LOmwS8bTpvlQeHzg5olGFs8KDPRaQeRpSq2LKaxr9n9eqHz8W/4iURb7bVnXqNoNd3VhQicLbXmm1nNm
MVsF0ilzG3jgqlUe1tU9KuPhttre2K+qwqrwtfLydf+StmU8Kqw2T0XApmZPIzEDEVlsuUzgiiiXoIP1
n1FvbMQWmq+olg7Zqsd4dJSXhaqzOTyDC2QdJe9W1l0vDWP3DeFi6ljWgmvXWGZBRigfgYC5NZXZ5wGh
wvfSGwRuug8urg3qXwd1aK02rCMGUy7x7VxYkPLZMJV+N9aQq+XBMIus1eNC3b+kbRmP/Se+uLyFtqdc
nnZdNIUGndrj4U/XPob9jqF6jEfj6kD8dHsV1iy3D8L90MHsnJcfXzhF0RqQaFYFSH4XlMeelyCO+hA2
fmyoYELxsLAUwWplsPlBcC+jb2eJMfndXk77zDHkKdQ81PFChZ8NhHMzLx05VKTYBvems+vGqhf6fzMe
RmI/qp4vAjYnbgQ35i2BD++/sGfVHv24WzBLtTIL6dzSONojND5Uj/Eoc28I/qyh9q+UzyxZukhwHTZa
5ySsXPlgTVDIyYm6b24dQwYX67maebhm7wgCOK8I6rpOZEAdCQq0g51/q/9K46iRNlaXInoGH56Gslwv
8JYqrY3U/a56uGjJWj0h1P1L2k3j0ZlFverIj/DocHN0KA2jASyAW7h53DSBE3sGFXpvG1VI9P3Bsyz0
GSIDa9F5yiWzV3HCsFOJ+P0pyNNMUq6k9ZBrAjbndGFB3KHvBfc4iTDmkg5lpq5jTQabuVHdjFOBFG4X
V+rswfk0M53fzRLqhHfQhr2duGhVLmnt39hLk97MIj33zOaqdvJ7PfNiYUza0Uytf4xhtttYFTDQqdeq
9d+XtJvGo7PXKPbt0I7Km0pDW+jK094Bgyk5yFjvyVAt6ocYdTWqNFwp+zlLR5eW1O6fCMWWy1VRKR2p
5zBrG0ruCenqcFxK6W0YCyHPiXtXpzMMQkvvfeEgoin9w10YiKF5vraVZgxn8mpz+INhKljQ1uEYvYdu
R9WGqteE+oxEtQboMbzdMB7PNBqb8v8TjKZG1Z6RtEe3CMpoQes0d6nKvgazggW/0W1Tta6gQa46SBmP
+m/D5VNq8xE8WFpLOBrFyKQXFTRDz4kbKy2u4MKC2g6tjsYW+gyYkTNM9e80weWDgVM9+He527YYpvrA
Vo2n3SR17qpXok1VADH+Je3UeKwVnPquEYsBOZqym6rzd1DekjCsmWQOvjof3b3C/iJPrrt3U3F3Kqom
QGB2pHYzt2czsTUepyKWjMF6ovJ3bm5J7f5MO+hMaa0xD8VNtoZyv0Fl7n30Gy7kpSew2b+x2uM5Gmop
okJmgDoIyPdU2UvaifEok47IHZIHH7in06xVO4K2xtOjnoDBWjGWtwd5tsde6mwdeo6xGNntXQ3zGZOR
2qartGa2nm+v2nrrOZHO/XxlkH5tiFnfE8Z2L5dSGPwgkxd5W1AYx+R7Xt4izwjmnm0dDC2dIjwlCEdD
5MZp5N1y1UpGqPo0wWcQwyP3S9qG8XBNat/D5yElbktF0ISplwY8YWFtK/3S2T9uVwUKBCnmDK1ktqlv
bxwgbYMtY2rdQi7VmrYUaazwubD/0vpt62IwNfsI3fIzxyrAS+oUFSLs+SShtNZ4PF+YtfYqGI59jCWX
YyiL16VPEvzGZWsPyBqB16jXeLgoGtwzpzqN0dUAZb0hP65qG1Xzu91+vwmd2x+aai+GVsEC78eFmZL0
lda6bxgJm5LoYwVbrGG071RdG6ztW9UzuOK9EjWrqOdO15Oz2rt374HsEzdREAPq/n+kIWsqhA+NHM/n
HhglRHSMXkYVha50PR/DldYYj8Kajus5sDZrP2KbYvhhmg7gmWMfw/mvTcr2Iz/rlbkONqVe47FAFejw
TLOAIIVoYZXHiQL7UUsfjTFuLk+l0V6CJ9oK6lhebXtpY209JXVXaUVS18jso+7cq+zquu0/9mZsAfAc
ai9Im/QOUu0m96Zt1K2B8SyeudM4w8+whQI1NIxadRDUmqP3M+zSGuMZi5C0n07PYWOu1dxn2P5bp5K9
s3fnKk2NmnPqNR6zZ7tHoU51hmF5lJNrM1fPXEvrk7H2EjqWB6xzzE5DA2zF9fORm3zUl5PPa6TOfOlr
H2ysPFytuu5dhfZ7v2cyW9dnICJsQuebtFG31hpPiYVLPPUHQJyInfuDG1PaqfH0IuLVSsfr+QMgDpfu
5MvOXuPhRvmGRTROZx2Wp/6wSe8fWvHdkPbyDu0fSGn/sMnwHN6YuOo127WRvbVSh+rSs+f+AEhPYKrE
eGo96m9VzA0Cu6Jl49mz578LaXeu1eI/rQAAAABJRU5ErkJggg==
</value>
</data>
</root>

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{A50690CF-7A7A-4B31-9A03-B3A2AF0AF0E0}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>SDRSharp.FrequencyEdit</RootNamespace>
<AssemblyName>SDRSharp.FrequencyEdit</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Drawing" />
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<Compile Include="EntryMode.cs" />
<Compile Include="FrequencyChangingEventArgs.cs" />
<Compile Include="FrequencyEdit.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="FrequencyEditDigit.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="FrequencyEditDigitClickEventArgs.cs" />
<Compile Include="FrequencyEditSeparator.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="IRenderable.cs" />
<Compile Include="OnDigitClickDelegate.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<DependentUpon>Resources.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -0,0 +1,15 @@
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Panoramic Spectrum Viewer")]
[assembly: AssemblyDescription("Panoramic Spectrum Viewer")]
[assembly: AssemblyProduct("SDR#")]
[assembly: AssemblyCopyright("Copyright © Youssef TOUIL 2012")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{040E3622-194B-4FA6-9CBB-1A22BD52A13D}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Library</OutputType>
<AssemblyName>SDRSharp.PanView</AssemblyName>
<TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<DebugSymbols>true</DebugSymbols>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
</PropertyGroup>
<ItemGroup>
<Reference Include="SDRSharp.Radio">
<HintPath>..\SDRSharp.Radio\bin\Debug\SDRSharp.Radio.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll</HintPath>
</Reference>
<Reference Include="System">
<HintPath>C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll</HintPath>
</Reference>
<Reference Include="System.Drawing">
<HintPath>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SDRSharp.PanView\BandType.cs" />
<Compile Include="SDRSharp.PanView\BandwidthEventArgs.cs" />
<Compile Include="SDRSharp.PanView\CustomPaintEventArgs.cs" />
<Compile Include="SDRSharp.PanView\CustomPaintEventHandler.cs" />
<Compile Include="SDRSharp.PanView\FrequencyChangeSource.cs" />
<Compile Include="SDRSharp.PanView\FrequencyEventArgs.cs" />
<Compile Include="SDRSharp.PanView\GradientDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SDRSharp.PanView\LineInsertEventArgs.cs" />
<Compile Include="SDRSharp.PanView\LineInsertEventHandler.cs" />
<Compile Include="SDRSharp.PanView\ManualBandwidthChangeEventHandler.cs" />
<Compile Include="SDRSharp.PanView\ManualFrequencyChangeEventHandler.cs" />
<Compile Include="SDRSharp.PanView\PeakDetector.cs" />
<Compile Include="SDRSharp.PanView\SpectrumAnalyzer.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="SDRSharp.PanView\SpectrumStyle.cs" />
<Compile Include="SDRSharp.PanView\Waterfall.cs">
<SubType>UserControl</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SDRSharp.PanView\GradientDialog.resx">
<DependentUpon>GradientDialog.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.2015
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDRSharp.PanView", "SDRSharp.PanView.csproj", "{040E3622-194B-4FA6-9CBB-1A22BD52A13D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{040E3622-194B-4FA6-9CBB-1A22BD52A13D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{040E3622-194B-4FA6-9CBB-1A22BD52A13D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{040E3622-194B-4FA6-9CBB-1A22BD52A13D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{040E3622-194B-4FA6-9CBB-1A22BD52A13D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A133AD22-210D-4E51-898D-75EF97AE9732}
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,9 @@
namespace SDRSharp.PanView
{
public enum BandType
{
Lower,
Upper,
Center
}
}

View file

@ -0,0 +1,38 @@
using System;
namespace SDRSharp.PanView
{
public class BandwidthEventArgs : EventArgs
{
public int Bandwidth
{
get;
set;
}
public int Offset
{
get;
set;
}
public bool Cancel
{
get;
set;
}
public BandType Side
{
get;
private set;
}
public BandwidthEventArgs(int bandwidth, int offset, BandType side)
{
this.Bandwidth = bandwidth;
this.Offset = offset;
this.Side = side;
}
}
}

View file

@ -0,0 +1,38 @@
using System;
using System.Drawing;
namespace SDRSharp.PanView
{
public class CustomPaintEventArgs : EventArgs
{
public Graphics Graphics
{
get;
private set;
}
public Point CursorPosition
{
get;
private set;
}
public string CustomTitle
{
get;
set;
}
public bool Cancel
{
get;
set;
}
public CustomPaintEventArgs(Graphics graphics, Point cursorPosition)
{
this.Graphics = graphics;
this.CursorPosition = cursorPosition;
}
}
}

View file

@ -0,0 +1,4 @@
namespace SDRSharp.PanView
{
public delegate void CustomPaintEventHandler(object sender, CustomPaintEventArgs e);
}

View file

@ -0,0 +1,9 @@
namespace SDRSharp.PanView
{
public enum FrequencyChangeSource
{
Scroll,
Drag,
Click
}
}

View file

@ -0,0 +1,31 @@
using System;
namespace SDRSharp.PanView
{
public class FrequencyEventArgs : EventArgs
{
public long Frequency
{
get;
set;
}
public FrequencyChangeSource Source
{
get;
set;
}
public bool Cancel
{
get;
set;
}
public FrequencyEventArgs(long frequency, FrequencyChangeSource source)
{
this.Frequency = frequency;
this.Source = source;
}
}
}

View file

@ -0,0 +1,269 @@
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace SDRSharp.PanView
{
public class GradientDialog : Form
{
private IContainer components;
private ListBox colorListBox;
private Button upButton;
private Button downButton;
private PictureBox gradientPictureBox;
private Button addButton;
private Button deleteButton;
private Button cancelButton;
private Button okButton;
private ColorDialog colorDialog;
private GradientDialog()
{
this.InitializeComponent();
}
public static ColorBlend GetGradient(ColorBlend originalBlend)
{
using (GradientDialog gradientDialog = new GradientDialog())
{
gradientDialog.SetColorBlend(originalBlend);
if (gradientDialog.ShowDialog() == DialogResult.OK)
{
return gradientDialog.GetColorBlend();
}
}
return null;
}
private ColorBlend GetColorBlend()
{
ColorBlend colorBlend = new ColorBlend(this.colorListBox.Items.Count);
float num = 1f / (float)(colorBlend.Positions.Length - 1);
for (int i = 0; i < colorBlend.Positions.Length; i++)
{
colorBlend.Positions[i] = (float)i * num;
colorBlend.Colors[i] = (Color)this.colorListBox.Items[i];
}
return colorBlend;
}
private void SetColorBlend(ColorBlend colorBlend)
{
for (int i = 0; i < colorBlend.Positions.Length; i++)
{
this.colorListBox.Items.Add(colorBlend.Colors[i]);
}
}
private void colorListBox_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index >= 0)
{
Color color = (Color)this.colorListBox.Items[e.Index];
Rectangle bounds;
if ((e.State & DrawItemState.Selected) == DrawItemState.None)
{
using (SolidBrush solidBrush = new SolidBrush(color))
{
Graphics graphics = e.Graphics;
SolidBrush brush = solidBrush;
bounds = e.Bounds;
int x = bounds.Left + 1;
bounds = e.Bounds;
int y = bounds.Top + 1;
bounds = e.Bounds;
int width = bounds.Width - 2;
bounds = e.Bounds;
graphics.FillRectangle(brush, x, y, width, bounds.Height - 1);
}
}
else
{
using (HatchBrush hatchBrush = new HatchBrush(HatchStyle.Percent70, color, Color.Gray))
{
Graphics graphics2 = e.Graphics;
HatchBrush brush2 = hatchBrush;
bounds = e.Bounds;
int x2 = bounds.Left + 1;
bounds = e.Bounds;
int y2 = bounds.Top + 1;
bounds = e.Bounds;
int width2 = bounds.Width - 2;
bounds = e.Bounds;
graphics2.FillRectangle(brush2, x2, y2, width2, bounds.Height - 1);
}
}
}
}
private void upButton_Click(object sender, EventArgs e)
{
int selectedIndex = this.colorListBox.SelectedIndex;
if (selectedIndex > 0)
{
object item = this.colorListBox.Items[selectedIndex];
this.colorListBox.Items.RemoveAt(selectedIndex);
this.colorListBox.Items.Insert(selectedIndex - 1, item);
this.colorListBox.SelectedIndex = selectedIndex - 1;
this.gradientPictureBox.Invalidate();
}
}
private void downButton_Click(object sender, EventArgs e)
{
int selectedIndex = this.colorListBox.SelectedIndex;
if (selectedIndex >= 0 && selectedIndex < this.colorListBox.Items.Count - 1)
{
object item = this.colorListBox.Items[selectedIndex];
this.colorListBox.Items.RemoveAt(selectedIndex);
this.colorListBox.Items.Insert(selectedIndex + 1, item);
this.colorListBox.SelectedIndex = selectedIndex + 1;
this.gradientPictureBox.Invalidate();
}
}
private void addButton_Click(object sender, EventArgs e)
{
if (this.colorDialog.ShowDialog(this) == DialogResult.OK)
{
this.colorListBox.Items.Add(this.colorDialog.Color);
this.gradientPictureBox.Invalidate();
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
int selectedIndex = this.colorListBox.SelectedIndex;
if (selectedIndex >= 0 && this.colorListBox.Items.Count > 2)
{
this.colorListBox.Items.RemoveAt(selectedIndex);
this.gradientPictureBox.Invalidate();
}
}
private void gradientPictureBox_Paint(object sender, PaintEventArgs e)
{
ColorBlend colorBlend = this.GetColorBlend();
using (LinearGradientBrush linearGradientBrush = new LinearGradientBrush(this.gradientPictureBox.ClientRectangle, Color.White, Color.Black, LinearGradientMode.Vertical))
{
linearGradientBrush.InterpolationColors = colorBlend;
e.Graphics.FillRectangle(linearGradientBrush, e.ClipRectangle);
}
}
protected override void Dispose(bool disposing)
{
if (disposing && this.components != null)
{
this.components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.colorListBox = new ListBox();
this.upButton = new Button();
this.downButton = new Button();
this.gradientPictureBox = new PictureBox();
this.addButton = new Button();
this.deleteButton = new Button();
this.cancelButton = new Button();
this.okButton = new Button();
this.colorDialog = new ColorDialog();
((ISupportInitialize)this.gradientPictureBox).BeginInit();
base.SuspendLayout();
this.colorListBox.DrawMode = DrawMode.OwnerDrawVariable;
this.colorListBox.FormattingEnabled = true;
this.colorListBox.Location = new Point(12, 12);
this.colorListBox.Name = "colorListBox";
this.colorListBox.Size = new Size(107, 238);
this.colorListBox.TabIndex = 0;
this.colorListBox.DrawItem += this.colorListBox_DrawItem;
this.upButton.Location = new Point(164, 12);
this.upButton.Name = "upButton";
this.upButton.Size = new Size(75, 23);
this.upButton.TabIndex = 1;
this.upButton.Text = "Up";
this.upButton.UseVisualStyleBackColor = true;
this.upButton.Click += this.upButton_Click;
this.downButton.Location = new Point(164, 41);
this.downButton.Name = "downButton";
this.downButton.Size = new Size(75, 23);
this.downButton.TabIndex = 2;
this.downButton.Text = "Down";
this.downButton.UseVisualStyleBackColor = true;
this.downButton.Click += this.downButton_Click;
this.gradientPictureBox.BorderStyle = BorderStyle.FixedSingle;
this.gradientPictureBox.Location = new Point(125, 12);
this.gradientPictureBox.Name = "gradientPictureBox";
this.gradientPictureBox.Size = new Size(33, 238);
this.gradientPictureBox.TabIndex = 3;
this.gradientPictureBox.TabStop = false;
this.gradientPictureBox.Paint += this.gradientPictureBox_Paint;
this.addButton.Location = new Point(164, 70);
this.addButton.Name = "addButton";
this.addButton.Size = new Size(75, 23);
this.addButton.TabIndex = 3;
this.addButton.Text = "Add";
this.addButton.UseVisualStyleBackColor = true;
this.addButton.Click += this.addButton_Click;
this.deleteButton.Location = new Point(164, 99);
this.deleteButton.Name = "deleteButton";
this.deleteButton.Size = new Size(75, 23);
this.deleteButton.TabIndex = 4;
this.deleteButton.Text = "Delete";
this.deleteButton.UseVisualStyleBackColor = true;
this.deleteButton.Click += this.deleteButton_Click;
this.cancelButton.DialogResult = DialogResult.Cancel;
this.cancelButton.Location = new Point(164, 227);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new Size(75, 23);
this.cancelButton.TabIndex = 6;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
this.okButton.DialogResult = DialogResult.OK;
this.okButton.Location = new Point(164, 198);
this.okButton.Name = "okButton";
this.okButton.Size = new Size(75, 23);
this.okButton.TabIndex = 5;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.colorDialog.AnyColor = true;
this.colorDialog.FullOpen = true;
base.AcceptButton = this.okButton;
base.AutoScaleDimensions = new SizeF(6f, 13f);
base.AutoScaleMode = AutoScaleMode.Font;
base.CancelButton = this.cancelButton;
base.ClientSize = new Size(251, 262);
base.Controls.Add(this.okButton);
base.Controls.Add(this.cancelButton);
base.Controls.Add(this.deleteButton);
base.Controls.Add(this.addButton);
base.Controls.Add(this.gradientPictureBox);
base.Controls.Add(this.downButton);
base.Controls.Add(this.upButton);
base.Controls.Add(this.colorListBox);
base.FormBorderStyle = FormBorderStyle.FixedDialog;
base.MaximizeBox = false;
base.MinimizeBox = false;
base.Name = "GradientDialog";
base.ShowInTaskbar = false;
base.StartPosition = FormStartPosition.CenterParent;
this.Text = "Gradient Editor";
((ISupportInitialize)this.gradientPictureBox).EndInit();
base.ResumeLayout(false);
}
}
}

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -0,0 +1,25 @@
using System;
namespace SDRSharp.PanView
{
public class LineInsertEventArgs : EventArgs
{
public unsafe int* RgbBuffer
{
get;
private set;
}
public int Length
{
get;
private set;
}
public unsafe LineInsertEventArgs(int* rgbBuffer, int length)
{
rgbBuffer = this.RgbBuffer;
this.Length = length;
}
}
}

View file

@ -0,0 +1,4 @@
namespace SDRSharp.PanView
{
public delegate void LineInsertEventHandler(object sender, LineInsertEventArgs e);
}

View file

@ -0,0 +1,4 @@
namespace SDRSharp.PanView
{
public delegate void ManualBandwidthChangeEventHandler(object sender, BandwidthEventArgs e);
}

View file

@ -0,0 +1,4 @@
namespace SDRSharp.PanView
{
public delegate void ManualFrequencyChangeEventHandler(object sender, FrequencyEventArgs e);
}

View file

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
namespace SDRSharp.PanView
{
public sealed class PeakDetector
{
private const byte Threshold = 20;
public static void GetPeaks(byte[] buffer, List<int> peaks, int windowSize)
{
windowSize |= 1;
int halfSize = windowSize / 2;
float num = 1f / (float)windowSize;
peaks.Clear();
for (int i = 0; i < buffer.Length; i++)
{
int num2 = 0;
int max_index = i;
for (int j = 0; j < windowSize; j++)
{
int num3 = i + j - halfSize;
if (num3 < 0)
{
num3 = 0;
}
if (num3 >= buffer.Length)
{
num3 = buffer.Length - 1;
}
if (buffer[num3] >= buffer[max_index])
{
max_index = num3;
}
num2 += buffer[num3];
}
float num4 = (float)num2 * num;
if ((float)(int)buffer[max_index] - num4 > 20f && !peaks.Exists(delegate(int x)
{
if (Math.Abs(max_index - x) <= halfSize)
{
return buffer[x] > buffer[max_index];
}
return false;
}))
{
peaks.RemoveAll((int x) => Math.Abs(max_index - x) <= halfSize);
peaks.Add(max_index);
}
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,12 @@
namespace SDRSharp.PanView
{
public enum SpectrumStyle
{
Dots,
SimpleCurve,
SolidFill,
StaticGradient,
DynamicGradient,
MinMax
}
}

File diff suppressed because it is too large Load diff

View file

View file

@ -0,0 +1,8 @@
namespace PortAudioSharp
{
internal enum PaDeviceIndex
{
PaNoDevice = -1,
PaUseHostApiSpecificDeviceSpecification = -2
}
}

View file

@ -0,0 +1,33 @@
using System.Runtime.InteropServices;
namespace PortAudioSharp
{
internal struct PaDeviceInfo
{
public int structVersion;
[MarshalAs(UnmanagedType.LPStr)]
public string name;
public int hostApi;
public int maxInputChannels;
public int maxOutputChannels;
public double defaultLowInputLatency;
public double defaultLowOutputLatency;
public double defaultHighInputLatency;
public double defaultHighOutputLatency;
public double defaultSampleRate;
public override string ToString()
{
return "[" + ((object)this).GetType().Name + "]\nname: " + this.name + "\nhostApi: " + this.hostApi + "\nmaxInputChannels: " + this.maxInputChannels + "\nmaxOutputChannels: " + this.maxOutputChannels + "\ndefaultLowInputLatency: " + this.defaultLowInputLatency + "\ndefaultLowOutputLatency: " + this.defaultLowOutputLatency + "\ndefaultHighInputLatency: " + this.defaultHighInputLatency + "\ndefaultHighOutputLatency: " + this.defaultHighOutputLatency + "\ndefaultSampleRate: " + this.defaultSampleRate;
}
}
}

View file

@ -0,0 +1,36 @@
namespace PortAudioSharp
{
internal enum PaError
{
paNoError,
paNotInitialized = -10000,
paUnanticipatedHostError,
paInvalidChannelCount,
paInvalidSampleRate,
paInvalidDevice,
paInvalidFlag,
paSampleFormatNotSupported,
paBadIODeviceCombination,
paInsufficientMemory,
paBufferTooBig,
paBufferTooSmall,
paNullCallback,
paBadStreamPtr,
paTimedOut,
paInternalError,
paDeviceUnavailable,
paIncompatibleHostApiSpecificStreamInfo,
paStreamIsStopped,
paStreamIsNotStopped,
paInputOverflowed,
paOutputUnderflowed,
paHostApiNotFound,
paInvalidHostApi,
paCanNotReadFromACallbackStream,
paCanNotWriteToACallbackStream,
paCanNotReadFromAnOutputOnlyStream,
paCanNotWriteToAnInputOnlyStream,
paIncompatibleStreamHostApi,
paBadBufferPtr
}
}

View file

@ -0,0 +1,25 @@
using System.Runtime.InteropServices;
namespace PortAudioSharp
{
internal struct PaHostApiInfo
{
public int structVersion;
public PaHostApiTypeId type;
[MarshalAs(UnmanagedType.LPStr)]
public string name;
public int deviceCount;
public int defaultInputDevice;
public int defaultOutputDevice;
public override string ToString()
{
return "[" + ((object)this).GetType().Name + "]\nstructVersion: " + this.structVersion + "\ntype: " + this.type + "\nname: " + this.name + "\ndeviceCount: " + this.deviceCount + "\ndefaultInputDevice: " + this.defaultInputDevice + "\ndefaultOutputDevice: " + this.defaultOutputDevice;
}
}
}

View file

@ -0,0 +1,20 @@
namespace PortAudioSharp
{
internal enum PaHostApiTypeId : uint
{
paInDevelopment,
paDirectSound,
paMME,
paASIO,
paSoundManager,
paCoreAudio,
paOSS = 7u,
paALSA,
paAL,
paBeOS,
paWDMKS,
paJACK,
paWASAPI,
paAudioScienceHPI
}
}

View file

@ -0,0 +1,19 @@
using System.Runtime.InteropServices;
namespace PortAudioSharp
{
internal struct PaHostErrorInfo
{
public PaHostApiTypeId hostApiType;
public int errorCode;
[MarshalAs(UnmanagedType.LPStr)]
public string errorText;
public override string ToString()
{
return "[" + ((object)this).GetType().Name + "]\nhostApiType: " + this.hostApiType + "\nerrorCode: " + this.errorCode + "\nerrorText: " + this.errorText;
}
}
}

View file

@ -0,0 +1,14 @@
namespace PortAudioSharp
{
internal enum PaSampleFormat : uint
{
PaFloat32 = 1u,
PaInt32,
PaInt24 = 4u,
PaInt16 = 8u,
PaInt8 = 0x10,
PaUInt8 = 0x20,
PaCustomFormat = 0x10000,
PaNonInterleaved = 0x80000000
}
}

View file

@ -0,0 +1,8 @@
using System;
using System.Runtime.InteropServices;
namespace PortAudioSharp
{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal unsafe delegate PaStreamCallbackResult PaStreamCallbackDelegate(float* input, float* output, uint frameCount, ref PaStreamCallbackTimeInfo timeInfo, PaStreamCallbackFlags statusFlags, IntPtr userData);
}

View file

@ -0,0 +1,11 @@
namespace PortAudioSharp
{
internal enum PaStreamCallbackFlags : uint
{
PaInputUnderflow = 1u,
PaInputOverflow,
PaOutputUnderflow = 4u,
PaOutputOverflow = 8u,
PaPrimingOutput = 0x10
}
}

View file

@ -0,0 +1,9 @@
namespace PortAudioSharp
{
internal enum PaStreamCallbackResult : uint
{
PaContinue,
PaComplete,
PaAbort
}
}

View file

@ -0,0 +1,16 @@
namespace PortAudioSharp
{
internal struct PaStreamCallbackTimeInfo
{
public double inputBufferAdcTime;
public double currentTime;
public double outputBufferDacTime;
public override string ToString()
{
return "[" + ((object)this).GetType().Name + "]\ncurrentTime: " + this.currentTime + "\ninputBufferAdcTime: " + this.inputBufferAdcTime + "\noutputBufferDacTime: " + this.outputBufferDacTime;
}
}
}

Some files were not shown because too many files have changed in this diff Show more