Added source code.

This commit is contained in:
Tiberiu Chibici 2018-02-06 01:24:46 +02:00
parent 1d9f2990c8
commit 8b28da5b80
367 changed files with 22964 additions and 0 deletions

BIN
Docs/documentation-ro.pdf Normal file

Binary file not shown.

BIN
Docs/proiect.doc Normal file

Binary file not shown.

BIN
Docs/screen0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
Docs/screen1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
Docs/screen2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
Docs/screen3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
Docs/screen4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
Resources/promotional.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
Resources/promotional.psd Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,8 @@
<Application x:Class="Calculator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace Calculator
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D0040DA8-5B61-4B40-AF35-1320C1CC7121}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Calculator</RootNamespace>
<AssemblyName>Calculator</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>calculator-logo.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release %28Publish%29|x86'">
<OutputPath>bin\x86\Release %28Publish%29\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release - Publish|x86'">
<OutputPath>..\..\TibisMathematicsSuite - Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Styles\Buttons.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\Display.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="MathHelper.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Resource Include="ASTRONAU.TTF" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Launcher\DynamicLink.csproj">
<Project>{A04B247B-6A95-462B-9E07-3337A1C158F1}</Project>
<Name>DynamicLink</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Resource Include="Images\calculator-logo.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="calculator-logo.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -0,0 +1,298 @@
<Window x:Class="Calculator.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Calculator" Height="330" Width="555"
MinHeight="290" MinWidth="455"
MaxHeight="360" MaxWidth="700"
WindowStyle="SingleBorderWindow" KeyDown="Window_KeyDown"
Icon="/Calculator;component/Images/calculator-logo.png">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<Style x:Key="Calc2ndF" TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="0,2,0,0" />
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Foreground" Value="Gray" />
</Style>
</ResourceDictionary>
<ResourceDictionary Source="Styles\Buttons.xaml" />
<ResourceDictionary Source="Styles\Display.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.Background>
<RadialGradientBrush GradientOrigin=".5, 1"
Center=".5, .6">
<GradientStop Color="#606060" Offset="0" />
<GradientStop Color="#333" Offset="1" />
</RadialGradientBrush>
</Window.Background>
<Grid Margin="2">
<Grid.RowDefinitions>
<RowDefinition Tag="Input" Height="Auto" />
<RowDefinition Tag="Mods" Height="Auto" />
<RowDefinition Tag="Secondf" Height="Auto" />
<RowDefinition Tag="Buttons" />
<RowDefinition Tag="Secondf" Height="Auto" />
<RowDefinition Tag="Buttons" />
<RowDefinition Tag="Secondf" Height="Auto" />
<RowDefinition Tag="Buttons" />
<RowDefinition Tag="Secondf" Height="Auto" />
<RowDefinition Tag="Buttons" />
<RowDefinition Tag="Secondf" Height="Auto" />
<RowDefinition Tag="Buttons" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition Width="10" Tag="Separator"/>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<!-- Menu strip -->
<!-- Display -->
<TextBox Name="Display" Grid.Column="0"
Grid.ColumnSpan="100"
Height="44" Text="0"
Focusable="False"
Style="{StaticResource DisplayStyle}" />
<StackPanel HorizontalAlignment="Left" Width="30"
Margin="2">
<Border Style="{StaticResource DisplayIndicatorStyle}" Margin="1"
Name="Indicator2ndf">
<TextBlock HorizontalAlignment="Center" Foreground="#555" FontSize="9">2ndf</TextBlock>
</Border>
<Border Style="{StaticResource DisplayIndicatorStyle}" Margin="1,0,1,1"
Name="IndicatorMem">
<TextBlock HorizontalAlignment="Center" Foreground="#555" FontSize="9">Mem</TextBlock>
</Border>
<Border Style="{StaticResource DisplayIndicatorStyle}" Margin="1,0,1,1"
Name="IndicatorError">
<TextBlock HorizontalAlignment="Center" Foreground="#555" FontSize="9">Error</TextBlock>
</Border>
</StackPanel>
<!-- Column 1 (scientific) functionality -->
<Button Name="B2ndf" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="0"
ToolTip="Activates second function.">2ndf
</Button>
<TextBlock Grid.Row="4" Grid.Column="0"
Style="{StaticResource Calc2ndF}">{x}</TextBlock>
<Button Name="BInt" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="5" Grid.Column="0"
ToolTip="Integral portion&#x0a;2ndf: Fractional portion">[x]</Button>
<TextBlock Grid.Row="6" Grid.Column="0"
Style="{StaticResource Calc2ndF}">arcsin</TextBlock>
<Button Name="BSin" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="7" Grid.Column="0"
ToolTip="Sine&#x0a;2ndf: arcsin">sin</Button>
<TextBlock Grid.Row="8" Grid.Column="0"
Style="{StaticResource Calc2ndF}">arcsinh</TextBlock>
<Button Name="BSinh" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="9" Grid.Column="0"
ToolTip="Hyperbolic sine&#x0a;2ndf: Hyperbolic arcsin">sinh</Button>
<TextBlock Grid.Row="10" Grid.Column="0"
Style="{StaticResource Calc2ndF}">2π</TextBlock>
<Button Name="BPi" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="11" Grid.Column="0"
ToolTip="Pi constant&#x0a;2ndf: 2Pi constant">π</Button>
<!-- Column 2 (scientific) functionality -->
<TextBlock Grid.Row="2" Grid.Column="1"
Style="{StaticResource Calc2ndF}">eⁿ</TextBlock>
<Button Name="BLn" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="1"
ToolTip="Natural logarithm&#x0a;2ndf: e at nth power">ln</Button>
<TextBlock Grid.Row="4" Grid.Column="1"
Style="{StaticResource Calc2ndF}">-Abs</TextBlock>
<Button Name="BAbs" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="5" Grid.Column="1"
ToolTip="Absolute&#x0a;2ndf: Reverse absolute">Abs</Button>
<TextBlock Grid.Row="6" Grid.Column="1"
Style="{StaticResource Calc2ndF}">arccos</TextBlock>
<Button Name="BCos" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="7" Grid.Column="1"
ToolTip="Cosine&#x0a;2ndf: arccos">cos</Button>
<TextBlock Grid.Row="8" Grid.Column="1"
Style="{StaticResource Calc2ndF}">arccosh</TextBlock>
<Button Name="BCosh" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="9" Grid.Column="1"
ToolTip="Hyperbolic cosine&#x0a;2ndf: Hyperbolic arccos">cosh</Button>
<Button Name="BE" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="11" Grid.Column="1"
ToolTip="e constant">e</Button>
<!-- Column 3 (scientific) functionality -->
<TextBlock Grid.Row="2" Grid.Column="2"
Style="{StaticResource Calc2ndF}">10ⁿ</TextBlock>
<Button Name="BLog" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="2"
ToolTip="Decimal logarithm&#x0a;2ndf: 10 at nth power">log</Button>
<Button Name="BInverse" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="5" Grid.Column="2"
ToolTip="Inverse">1/x</Button>
<TextBlock Grid.Row="6" Grid.Column="2"
Style="{StaticResource Calc2ndF}">arctan</TextBlock>
<Button Name="BTan" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="7" Grid.Column="2"
ToolTip="Tangent&#x0a;2ndf: arctan">tan</Button>
<TextBlock Grid.Row="8" Grid.Column="2"
Style="{StaticResource Calc2ndF}">arctanh</TextBlock>
<Button Name="BTanh" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="9" Grid.Column="2"
ToolTip="Hyperbolic tangent&#x0a;2ndf: Hyperbolic arctan">tanh</Button>
<TextBlock Grid.Row="10" Grid.Column="2"
Style="{StaticResource Calc2ndF}">xPy</TextBlock>
<Button Name="BCombinations" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="11" Grid.Column="2"
ToolTip="Combinations of y items from x&#x0a;2ndf: Permutations of y items from x">xCy</Button>
<!-- Column 4 (scientific) functionality -->
<Button Name="BLogn" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="3"
ToolTip="Logarithm with base n">
<TextBlock>log<Run BaselineAlignment="Subscript">n</Run> x</TextBlock>
</Button>
<TextBlock Grid.Row="4" Grid.Column="3"
Style="{StaticResource Calc2ndF}">ⁿ√x</TextBlock>
<Button Name="BPown" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="5" Grid.Column="3"
ToolTip="nth power&#x0a;2ndf: nth root">xⁿ</Button>
<TextBlock Grid.Row="6" Grid.Column="3"
Style="{StaticResource Calc2ndF}">√x</TextBlock>
<Button Name="BSquare" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="7" Grid.Column="3"
ToolTip="Square&#x0a;2ndf: Square root">x²</Button>
<TextBlock Grid.Row="8" Grid.Column="3"
Style="{StaticResource Calc2ndF}">∛x</TextBlock>
<Button Name="BCube" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="9" Grid.Column="3"
ToolTip="Cube&#x0a;2ndf: Cube root">x³</Button>
<Button Name="BFact" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="11" Grid.Column="3"
ToolTip="Factorial">x!</Button>
<!-- Column 5 (Memory ops) -->
<TextBlock Grid.Row="2" Grid.Column="5" Style="{StaticResource Calc2ndF}">Add</TextBlock>
<Button Name="BMemAdd" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="5"
ToolTip="Adds to memory">M+</Button>
<TextBlock Grid.Row="4" Grid.Column="5" Style="{StaticResource Calc2ndF}">Subtract</TextBlock>
<Button Name="BMemSub" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="5" Grid.Column="5"
ToolTip="Subtracts from memory">M-</Button>
<TextBlock Grid.Row="6" Grid.Column="5" Style="{StaticResource Calc2ndF}">Clear</TextBlock>
<Button Name="BMemClear" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="7" Grid.Column="5"
ToolTip="Clears the memory">MC</Button>
<TextBlock Grid.Row="8" Grid.Column="5" Style="{StaticResource Calc2ndF}">Set</TextBlock>
<Button Name="BMemSet" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="9" Grid.Column="5"
ToolTip="Replace the memory content">MS</Button>
<TextBlock Grid.Row="10" Grid.Column="5" Style="{StaticResource Calc2ndF}">Recall</TextBlock>
<Button Name="BMemRecall" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="11" Grid.Column="5"
ToolTip="Displays number from memory">MR</Button>
<!-- Column 6 (Numbers) -->
<Button Name="BNum7" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="4" Grid.Column="6" Grid.RowSpan="2"
Style="{StaticResource BigButton}">7</Button>
<Button Name="BNum4" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="6" Grid.Column="6" Grid.RowSpan="2"
Style="{StaticResource BigButton}">4</Button>
<Button Name="BNum1" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="8" Grid.Column="6" Grid.RowSpan="2"
Style="{StaticResource BigButton}">1</Button>
<Button Name="BNum0" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="10" Grid.Column="6" Grid.RowSpan="2" Grid.ColumnSpan="2"
Style="{StaticResource BigButton}">0</Button>
<!-- Column 7 (Numbers) -->
<Button Name="BHelp" Grid.Row="3" Grid.Column="7"
Margin="6,4,6,4"
Style="{StaticResource BigButton}"
FontSize="11" Click="BHelp_Click"
ToolTip="Get help using the application. (Keyboard shortcut: F1)">Help</Button>
<Button Name="BNum8" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="4" Grid.Column="7" Grid.RowSpan="2"
Style="{StaticResource BigButton}">8</Button>
<Button Name="BNum5" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="6" Grid.Column="7" Grid.RowSpan="2"
Style="{StaticResource BigButton}">5</Button>
<Button Name="BNum2" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="8" Grid.Column="7" Grid.RowSpan="2"
Style="{StaticResource BigButton}">2</Button>
<!-- Column 8 (Numbers) -->
<Button Name="BBackspace" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="8"
ToolTip="Backspace" >Back</Button>
<Button Name="BNum9" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="4" Grid.RowSpan="2" Grid.Column="8" Style="{StaticResource BigButton}">9</Button>
<Button Name="BNum6" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="6" Grid.RowSpan="2" Grid.Column="8" Style="{StaticResource BigButton}">6</Button>
<Button Name="BNum3" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="8" Grid.RowSpan="2" Grid.Column="8" Style="{StaticResource BigButton}">3</Button>
<Button Name="BPeriod" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="10" Grid.RowSpan="2" Grid.Column="8" Style="{StaticResource BigButton}">.</Button>
<!-- Column 9 (Operations) -->
<Button Name="BClear" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="9"
ToolTip="Clears the current number">Clear</Button>
<Button Name="BOpDivide" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="4" Grid.RowSpan="2" Grid.Column="9" Style="{StaticResource BigButton}">/</Button>
<Button Name="BOpMultiply" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="6" Grid.RowSpan="2" Grid.Column="9" Style="{StaticResource BigButton}">*</Button>
<Button Name="BOpSub" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="8" Grid.RowSpan="2" Grid.Column="9" Style="{StaticResource BigButton}">-</Button>
<Button Name="BOpAdd" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="10" Grid.RowSpan="2" Grid.Column="9" Style="{StaticResource BigButton}">+</Button>
<!-- Column 10 (Operations) -->
<Button Name="BClearAC" MouseUp="Button_MouseUp" Click="Button_Click"
Grid.Row="3" Grid.Column="10"
ToolTip="Clears the entire calculation">AC</Button>
<Button Name="BOpMod" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="4" Grid.RowSpan="2" Grid.Column="10" Style="{StaticResource BigButton}">MOD</Button>
<Button Name="BOpSign" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="6" Grid.RowSpan="2" Grid.Column="10" Style="{StaticResource BigButton}">±</Button>
<Button Name="BEqual" MouseUp="Button_MouseUp" Click="Button_Click" Grid.Row="8" Grid.Column="10" Grid.RowSpan="4" Style="{StaticResource BigButton}">=</Button>
</Grid>
</Window>

View File

@ -0,0 +1,378 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Calculator
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
enum Operator
{
None, Sum, Subtraction, Multiplication, Division, Mod, Logn, Pown, NRoot, Combinations, Arrangements
};
enum Stages
{
First, FirstDisplay, Second
};
#region Variables
double memory = 0;
bool is2ndOn = false, error = false;
double first = 0, second = 0;
Stages stage = Stages.First;
Operator oper = Operator.None;
Brush IndicatorColor = (Brushes.Orange);
#endregion
#region Properties
public bool Is2ndOn
{
get { return is2ndOn; }
set
{
is2ndOn = value;
Indicator2ndf.Background = (value) ? (IndicatorColor) : (Brushes.Transparent);
}
}
public bool Error
{
get { return error; }
set
{
error = value;
IndicatorError.Background = (value) ? (IndicatorColor) : (Brushes.Transparent);
}
}
public double DisplayValue
{
set { Display.Text = value.ToString(); }
get
{
double val;
string temp = Display.Text;
if (temp.EndsWith(".") || temp.Length == 0) temp += '0';
if (!Double.TryParse(temp, out val))
{
Error = true;
val = 0;
}
return val;
}
}
public string DisplayText
{
get { return Display.Text; }
set { Display.Text = value; }
}
public double Memory
{
get { return memory; }
set
{
memory = value;
IndicatorMem.Background = (value != 0) ? (IndicatorColor) : (Brushes.Transparent);
}
}
#endregion
#region Calculator logics
public MainWindow()
{
InitializeComponent();
}
void BinaryOperatorPressed(bool isEqual = false)
{
if (stage == Stages.First)
{
first = DisplayValue; stage = Stages.FirstDisplay;
}
else if (stage == Stages.Second)
{
second = DisplayValue;
DisplayValue = Calculate();
if (isEqual) stage = Stages.First;
else
{
first = DisplayValue;
stage = Stages.FirstDisplay;
}
}
}
double Calculate()
{
switch (oper)
{
case Operator.Sum: return first + second;
case Operator.Subtraction: return first - second;
case Operator.Multiplication: return first * second;
case Operator.Division: return first / second;
case Operator.Mod: return first % second;
case Operator.Logn: return Math.Log(first, second);
case Operator.Pown: return Math.Pow(first, second);
case Operator.NRoot: return Math.Pow(first, 1.0 / second);
case Operator.Combinations: return MathHelper.Combinations(first, second);
case Operator.Arrangements: return MathHelper.Arrangements(first, second);
}
return 0;
}
void AddDigit(char digit)
{
if (stage == Stages.FirstDisplay) { DisplayText = ""; stage = Stages.Second; }
DisplayText += digit;
}
void SetValue(double value)
{
if (stage == Stages.FirstDisplay) stage = Stages.Second;
DisplayValue = value;
}
private void Handle_Click(object sender, bool is2nd)
{
var s = sender as Button;
if (s == null) return;
is2nd = is2nd || Is2ndOn;
if (s.Name != "B2ndf") Is2ndOn = false;
double val = DisplayValue;
if (DisplayText == "0") DisplayText = "";
switch (s.Name)
{
// Column 1
case "B2ndf": Is2ndOn = !Is2ndOn; break;
case "BInt":
if (!is2nd) SetValue(Math.Floor(val));
else SetValue(val - Math.Floor(val));
break;
case "BSin":
if (!is2nd) SetValue(Math.Sin(val));
else SetValue(Math.Asin(val));
break;
case "BSinh":
if (!is2nd) SetValue(Math.Sinh(val));
else SetValue(Math.Log(val + Math.Sqrt(val * val + 1)));
break;
case "BPi":
if (!is2nd) SetValue(Math.PI);
else SetValue(2 * Math.PI);
break;
// Column 2
case "BLn":
if (!is2nd) SetValue(Math.Log(val));
else SetValue(Math.Exp(val));
break;
case "BAbs":
if (!is2nd) SetValue(Math.Abs(val));
else SetValue(-Math.Abs(val));
break;
case "BCos":
if (!is2nd) SetValue(Math.Cos(val));
else SetValue(Math.Acos(val));
break;
case "BCosh":
if (!is2nd) SetValue(Math.Cosh(val));
else SetValue(Math.Log(val + Math.Sqrt(val * val - 1)));
break;
case "BE": SetValue(Math.E); break;
// Column 3
case "BLog":
if (!is2nd) SetValue(Math.Log10(val));
else SetValue(Math.Pow(10, val));
break;
case "BInverse": SetValue(1 / val);
break;
case "BTan":
if (!is2nd) SetValue(Math.Tan(val));
else SetValue(Math.Atan(val));
break;
case "BTanh":
if (!is2nd) SetValue(Math.Tanh(val));
else SetValue(Math.Log((1+val) * (1-val))/2);
break;
case "BCombinations":
if (!is2nd) oper = Operator.Combinations;
else oper = Operator.Arrangements;
BinaryOperatorPressed();
break;
// Column 4
case "BLogn":
oper = Operator.Logn;
BinaryOperatorPressed();
break;
case "BPown":
if (!is2nd) oper = Operator.Pown;
else oper = Operator.NRoot;
BinaryOperatorPressed();
break;
case "BSquare":
if (!is2nd) SetValue(val * val);
else SetValue(Math.Pow(val, 1.0 / 2.0));
break;
case "BCube":
if (!is2nd) SetValue(val * val * val);
else SetValue(Math.Pow(val, 1.0 / 3.0));
break;
case "BFact":
SetValue(MathHelper.Factorial(val));
break;
// Memory operations
case "BMemAdd": Memory += val; break;
case "BMemSub": Memory -= val; break;
case "BMemClear": Memory = 0; break;
case "BMemSet": Memory = val; break;
case "BMemRecall": SetValue(Memory); break;
// Numbers
case "BNum7": AddDigit('7'); break;
case "BNum4": AddDigit('4'); break;
case "BNum1": AddDigit('1'); break;
case "BNum0": AddDigit('0'); break;
// Numbers
case "BNum8": AddDigit('8'); break;
case "BNum5": AddDigit('5'); break;
case "BNum2": AddDigit('2'); break;
// Numbers
case "BBackspace": if (DisplayText.Length >= 1) DisplayText = DisplayText.Substring(0, DisplayText.Length - 1); break;
case "BNum9": AddDigit('9'); break;
case "BNum6": AddDigit('6'); break;
case "BNum3": AddDigit('3'); break;
case "BPeriod": if (!DisplayText.Contains('.')) AddDigit('.'); break;
// Ops
case "BClear": SetValue(0); break;
case "BOpDivide": oper = Operator.Division; BinaryOperatorPressed(); break;
case "BOpMultiply": oper = Operator.Multiplication; BinaryOperatorPressed(); break;
case "BOpSub": oper = Operator.Subtraction; BinaryOperatorPressed(); break;
case "BOpAdd": oper = Operator.Sum; BinaryOperatorPressed(); break;
// Ops
case "BClearAC": stage = Stages.First; oper = Operator.None; DisplayValue = 0; break;
case "BOpMod": oper = Operator.Mod; BinaryOperatorPressed(); break;
case "BOpSign": SetValue(val * -1); break;
case "BEqual":
if (stage == Stages.Second) BinaryOperatorPressed(true);
break;
}
Error = (DisplayText == "NaN");
if (DisplayText == "") DisplayText = "0";
}
#endregion
#region User input
private void Button_Click(object sender, RoutedEventArgs e)
{
Handle_Click(sender, false);
}
private void Button_MouseUp(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left) Handle_Click(sender, false);
else if (e.ChangedButton == MouseButton.Right) Handle_Click(sender, true);
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
if (Keyboard.Modifiers == ModifierKeys.Shift) switch (e.Key)
{
case Key.D6: Handle_Click(BPown, false); break;
case Key.D8: Handle_Click(BOpMultiply, false); break;
case Key.D5: Handle_Click(BOpMod, false); break;
}
if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Q)
this.Close();
else if (Keyboard.Modifiers == ModifierKeys.None) switch (e.Key)
{
// Numeric keys
case Key.D0:
case Key.NumPad0: Handle_Click(BNum0, false); break;
case Key.D1:
case Key.NumPad1: Handle_Click(BNum1, false); break;
case Key.D2:
case Key.NumPad2: Handle_Click(BNum2, false); break;
case Key.D3:
case Key.NumPad3: Handle_Click(BNum3, false); break;
case Key.D4:
case Key.NumPad4: Handle_Click(BNum4, false); break;
case Key.D5:
case Key.NumPad5: Handle_Click(BNum5, false); break;
case Key.D6:
case Key.NumPad6: Handle_Click(BNum6, false); break;
case Key.D7:
case Key.NumPad7: Handle_Click(BNum7, false); break;
case Key.D8:
case Key.NumPad8: Handle_Click(BNum8, false); break;
case Key.D9:
case Key.NumPad9: Handle_Click(BNum9, false); break;
case Key.OemPeriod:
case Key.Decimal: Handle_Click(BPeriod, false); break;
// Binary Operators
case Key.Add:
case Key.OemPlus: Handle_Click(BOpAdd, false); break;
case Key.Subtract:
case Key.OemMinus: Handle_Click(BOpSub, false); break;
case Key.Multiply: Handle_Click(BOpMultiply, false); break;
case Key.OemBackslash:
case Key.Divide: Handle_Click(BOpDivide, false); break;
// Others
case Key.Return: Handle_Click(BEqual, false); break;
case Key.Escape: Handle_Click(BClearAC, false); break;
case Key.Back: Handle_Click(BBackspace, false); break;
case Key.Delete: Handle_Click(BClear, false); break;
case Key.F1: BHelp_Click(this, new RoutedEventArgs()); break;
}
}
private void BHelp_Click(object sender, RoutedEventArgs e)
{
DynamicLink.Launcher.StartModule("Help", "Calculator");
}
#endregion
}
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Calculator
{
public static class MathHelper
{
#region Combinations
public static double Combinations(double n, double k)
{
k = Math.Min(k, n - k);
double a = 1, b = 1;
for (int i = 1; i <= k; i++)
{
a *= n - i + 1;
b *= i;
}
return a / b;
}
#endregion
public static double Arrangements(double n, double k)
{
double a = 1;
for (int i = 0; i < k; i++) a *= n - i;
return a;
}
public static double Factorial(double n)
{
double a = 1;
for (int i = 1; i <= n; i++) a *= i;
return a;
}
}
}

View File

@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Scientific Calculator")]
[assembly: AssemblyDescription("A calculator with various functions.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Tibi Software")]
[assembly: AssemblyProduct("Tibi's Mathematics Suite")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Calculator.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Calculator.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Calculator.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,102 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ControlTemplate x:Key="CalcButton" TargetType="{x:Type Button}">
<Grid>
<Border Background="{TemplateBinding Background}" CornerRadius="5" BorderThickness="1"/>
<Border Name="BorderHover" CornerRadius="5" Opacity="0">
<Border.Background>
<RadialGradientBrush GradientOrigin=".5,1" Center=".5, .8">
<GradientStop Color="Orange" Offset="0" />
<GradientStop Color="OrangeRed" Offset="1" />
</RadialGradientBrush>
</Border.Background>
<Border.BitmapEffect>
<DropShadowBitmapEffect Color="Orange" ShadowDepth="1" Softness=".3"/>
</Border.BitmapEffect>
</Border>
<Border Name="BorderDown" CornerRadius="5" Opacity="0"
Background="DarkRed" />
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
<Border CornerRadius="5" >
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#40FFFFFF" Offset="0" />
<GradientStop Color="#70FFFFFF" Offset=".5" />
<GradientStop Color="#40FFFFFF" Offset=".5" />
<GradientStop Color="Transparent" Offset="1" />
</LinearGradientBrush>
</Border.Background>
</Border>
</Grid>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="BorderHover"
Storyboard.TargetProperty="Opacity"
To="1" Duration="0:0:0.5"
AccelerationRatio=".02" DecelerationRatio=".2"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="BorderHover"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:0.7"
AccelerationRatio=".1" DecelerationRatio=".03"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="BorderDown" Property="Opacity" Value=".3" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style TargetType="{x:Type Button}">
<Setter Property="Margin" Value="2,0,2,2" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Background" >
<Setter.Value>
<RadialGradientBrush GradientOrigin=".5,1" Center=".5, .8">
<GradientStop Color="LightBlue" Offset="0" />
<GradientStop Color="#62B1D0" Offset="1" />
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Focusable" Value="False" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template" Value="{StaticResource CalcButton}" />
</Style>
<Style x:Key="BigButton" TargetType="{x:Type Button}">
<Setter Property="Margin" Value="2,4,2,2" />
<Setter Property="FontSize" Value="18" />
<Setter Property="Background" >
<Setter.Value>
<RadialGradientBrush GradientOrigin=".5,1" Center=".5, .8" RadiusX=".5">
<GradientStop Color="#C0F0D0" Offset="0" />
<GradientStop Color="#60d6A7" Offset="1" />
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Focusable" Value="False" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template" Value="{StaticResource CalcButton}" />
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,26 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="DisplayStyle" TargetType="{x:Type TextBox}">
<Setter Property="TextAlignment" Value="Right"/>
<Setter Property="FontFamily" Value="/#Astronaut" />
<Setter Property="FontSize" Value="40" />
<Setter Property="Foreground" Value="#FFC94A" />
<Setter Property="Background" Value="#20FFFFFF" />
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="BitmapEffect">
<Setter.Value>
<DropShadowBitmapEffect Color="Orange"
ShadowDepth="1" Opacity=".6"
/>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="DisplayIndicatorStyle" TargetType="{x:Type Border}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Padding" Value="3,0,3,0" />
<Setter Property="CornerRadius" Value="3" />
</Style>
</ResourceDictionary>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,8 @@
<Application x:Class="Factorizator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace Factorizator
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View File

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Factorizator
{
public class DecimalPair
{
public decimal First { get; set; }
public decimal Second { get; set; }
public string FirstString { get { return First.ToString(); } }
public string SecondString
{
get
{
if (Second == 0) return "";
else return Second.ToString();
}
}
public DecimalPair() { First = Second = 0; }
public DecimalPair(decimal a, decimal b)
{
First = a; Second = b;
}
}
}

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{FB3CFDCE-C816-4F4A-AEF4-5C0240396C60}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Factorizator</RootNamespace>
<AssemblyName>Factorizator</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release - Publish|x86'">
<OutputPath>..\..\TibisMathematicsSuite - Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>factorizator-logo.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="DecimalPair.cs" />
<Compile Include="FactorizatorAlgorithm.cs" />
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Styles\ButtonStyle.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\GroupBoxStyle.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Launcher\DynamicLink.csproj">
<Project>{A04B247B-6A95-462B-9E07-3337A1C158F1}</Project>
<Name>DynamicLink</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Resource Include="factorizator-logo.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Factorizator
{
static class FactorizatorAlgorithm
{
public static bool Abort { get; set; }
public static void Factorize(decimal number, out decimal[] fact, out decimal[] num)
{
Abort = false;
bool negative = (number < 0);
number = Math.Abs(number);
List<decimal> resultFact = new List<decimal>();
List<decimal> resultNum = new List<decimal>();
for (decimal i = 2; i * i <= number && !Abort; i++)
{
while (number % i == 0)
{
resultFact.Add(i);
if (negative) resultNum.Add(-number);
else resultNum.Add(number);
number /= i;
}
}
if (negative) resultNum.Add(-number);
else resultNum.Add(number);
if (number > 1)
{
if (negative) resultNum.Add(-1);
else resultNum.Add(1);
resultFact.Add(number);
}
fact = resultFact.ToArray();
num = resultNum.ToArray();
}
}
}

View File

@ -0,0 +1,111 @@
<Window x:Class="Factorizator.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Factorizator" Height="355" Width="365"
KeyDown="Window_KeyDown" Icon="/Factorizator;component/factorizator-logo.ico">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/ButtonStyle.xaml" />
<ResourceDictionary Source="/Styles/GroupBoxStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint=".5,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Window.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<GroupBox Header="Input number">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Name="inputNumber" Grid.Column="0" TextChanged="inputNumber_TextChanged" />
<Button Name="buttonCalculate" Grid.Column="1" Width="64" Click="buttonCalculate_Click">Calculate</Button>
</Grid>
</GroupBox>
<GroupBox Header="Factorization" Grid.Row="1">
<ListView Name="factorizationDisplay" BorderBrush="#ABC" HorizontalContentAlignment="Stretch">
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn Header="Remainder" DisplayMemberBinding="{Binding FirstString}" Width="165"/>
<GridViewColumn Header="Divisor" DisplayMemberBinding="{Binding SecondString}" Width="140"/>
</GridView>
</ListView.View>
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Name="contextCopyRem" Header="Copy remainder" InputGestureText="Ctrl+C" Click="contextCopyRem_Click"/>
<MenuItem Name="contextCopyDiv" Header="Copy divisor" InputGestureText="Ctrl+Shift+C" Click="contextCopyDiv_Click"/>
<Separator />
<MenuItem Name="contextClear" Header="Clear" Click="contextClear_Click"/>
</ContextMenu>
</ListView.ContextMenu>
</ListView>
</GroupBox>
<StatusBar Grid.Row="2">
<StatusBar.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#80FFFFFF" Offset="0" />
<GradientStop Color="#30FFFFFF" Offset="1" />
</LinearGradientBrush>
</StatusBar.Background>
<StatusBar.ItemsPanel>
<ItemsPanelTemplate>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
</Grid>
</ItemsPanelTemplate>
</StatusBar.ItemsPanel>
<StatusBarItem>
<TextBlock Name="statusMessage" Grid.Column="0">Ready</TextBlock>
</StatusBarItem>
<StatusBarItem Grid.Column="1">
<ProgressBar Name="statusProgress"
Height="12" Width="60"
IsIndeterminate="True"
Visibility="Hidden" />
</StatusBarItem>
<StatusBarItem Grid.Column="2">
<Button Name="statusCancel" Click="statusCancel_Click"
Style="{StaticResource ButtonSmallStyle}"
Width="50"
Visibility="Hidden" >Cancel</Button>
</StatusBarItem>
<StatusBarItem Grid.Column="3">
<TextBlock Foreground="Blue" TextDecorations="Underline"
MouseUp="TextBlock_MouseUp" >Help</TextBlock>
</StatusBarItem>
</StatusBar>
</Grid>
</Window>

View File

@ -0,0 +1,179 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
namespace Factorizator
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
#region Error variable
private bool error = false;
private bool Error
{
get { return error; }
set
{
error = value;
inputNumber.Background = (value) ? (Brushes.Pink) : (Brushes.White);
}
}
#endregion
#region Vars
Thread worker = null;
#endregion
#region Constructor
public MainWindow()
{
InitializeComponent();
}
#endregion
#region Keyboard handler
private void Window_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
var text = Keyboard.FocusedElement as TextBox;
if (e.KeyboardDevice.Modifiers == ModifierKeys.None)
{
switch (e.Key)
{
case Key.Enter: buttonCalculate_Click(this, new RoutedEventArgs()); break;
case Key.Escape: statusCancel_Click(this, new RoutedEventArgs()); break;
case Key.F1: DynamicLink.Launcher.StartModule("Help", "factorizator"); break;
default: e.Handled = false; break;
}
}
else if (text == null && e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.C)
contextCopyRem_Click(this, new RoutedEventArgs());
else if (text == null && e.KeyboardDevice.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.C)
contextCopyDiv_Click(this, new RoutedEventArgs());
else e.Handled = false;
}
#endregion
#region UI handlers
private void inputNumber_TextChanged(object sender, TextChangedEventArgs e)
{
if (Error)
{
Error = false;
statusMessage.Text = "Ready";
}
}
private void buttonCalculate_Click(object sender, RoutedEventArgs e)
{
if (inputNumber.Text == "") return;
decimal d;
if (!decimal.TryParse(inputNumber.Text, out d))
{
Error = true;
statusMessage.Text = "Bad number.";
}
else BeginWork(d);
}
private void contextCopyRem_Click(object sender, RoutedEventArgs e)
{
DecimalPair pair = factorizationDisplay.SelectedItem as DecimalPair;
if (pair == null) return;
Clipboard.SetText(pair.First.ToString());
}
private void contextCopyDiv_Click(object sender, RoutedEventArgs e)
{
DecimalPair pair = factorizationDisplay.SelectedItem as DecimalPair;
if (pair == null) return;
Clipboard.SetText(pair.Second.ToString());
}
private void contextClear_Click(object sender, RoutedEventArgs e)
{
factorizationDisplay.Items.Clear();
}
private void statusCancel_Click(object sender, RoutedEventArgs e)
{
FactorizatorAlgorithm.Abort = true;
}
private void TextBlock_MouseUp(object sender, MouseButtonEventArgs e)
{
DynamicLink.Launcher.StartModule("Help", "factorizator");
}
#endregion
#region Worker
void BeginWork(decimal num)
{
num = Math.Truncate(num);
// Visual stuff
statusMessage.Text = "Calculating...";
statusProgress.Visibility = System.Windows.Visibility.Visible;
statusCancel.Visibility = System.Windows.Visibility.Visible;
// Start thread
worker = new Thread(new ParameterizedThreadStart(DoWork));
worker.Start(num);
}
delegate void FinishWorkDelegate(decimal[] resultFact, decimal[] resultNum);
void DoWork(object param)
{
decimal number = (decimal)param;
decimal[] resultFact, resultNum;
FactorizatorAlgorithm.Factorize(number, out resultFact, out resultNum);
Dispatcher.Invoke(new FinishWorkDelegate(FinishWork), resultFact, resultNum);
}
void FinishWork(decimal[] resultFact, decimal[] resultNum)
{
factorizationDisplay.Items.Clear();
// Show results
for (int i = 0; i < resultNum.Length; i++)
{
if (i < resultFact.Length)
factorizationDisplay.Items.Add(new DecimalPair(resultNum[i], resultFact[i]));
else factorizationDisplay.Items.Add(new DecimalPair(resultNum[i], 0));
}
// Update visual stuff
statusMessage.Text = "Ready";
statusProgress.Visibility = System.Windows.Visibility.Hidden;
statusCancel.Visibility = System.Windows.Visibility.Hidden;
}
#endregion
}
}

View File

@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Factorizator")]
[assembly: AssemblyDescription("Displays the factorization of a number.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Tibi Software")]
[assembly: AssemblyProduct("Tibi's Mathematics Suite")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Factorizator.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Factorizator.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Factorizator.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,107 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="Button">
<Setter Property="Margin" Value="1" />
<Setter Property="MinHeight" Value="22" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="border" Padding="2" CornerRadius="4"
BorderBrush="Gray" BorderThickness="1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFF" Offset="0" />
<GradientStop Color="#C8C8C8" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#BBB" Offset="0" />
<GradientStop Color="#DDD" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ButtonSmallStyle" TargetType="Button">
<Setter Property="Margin" Value="-1" />
<Setter Property="MinHeight" Value="18" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="FontSize" Value="8.5pt" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="border" Padding="0" CornerRadius="3"
BorderBrush="Gray" BorderThickness="1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFF" Offset="0" />
<GradientStop Color="#C8C8C8" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#BBB" Offset="0" />
<GradientStop Color="#DDD" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,40 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="GroupBox">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GroupBox">
<Border Background="#FAF8F8"
BorderBrush="White"
BorderThickness="1"
CornerRadius="5"
Margin="4">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<ContentPresenter Margin="3,0,0,0" ContentSource="Header" >
<ContentPresenter.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Gray" />
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
<ContentPresenter HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Margin="4" Grid.Row="1" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,8 @@
<Application x:Class="GraphingCalculator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace GraphingCalculator
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Log.LogEvent("Session started!");
}
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
Log.LogEvent("Session finished! Exit code: {0}", e.ApplicationExitCode);
Log.LogEvent("-----------------");
try {
if (!System.IO.Directory.Exists("logs")) System.IO.Directory.CreateDirectory("logs");
if (System.IO.File.Exists("logs\\graphingcalc.log"))
System.IO.File.AppendAllLines("logs\\graphingcalc.log", Log.Entries.ToArray());
else System.IO.File.WriteAllLines("logs\\graphingcalc.log", Log.Entries.ToArray());
}
catch { }
// Save settings
GraphingCalculator.Properties.Settings.Default.Save();
}
}
}

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GraphingCalculator
{
public class Bounds
{
private double left, right, top, bottom;
#region Public properties
public double Left
{
get { return left; }
set { left = value; if (BoundsChanged != null) BoundsChanged(this, new EventArgs()); }
}
public double Right
{
get { return right; }
set { right = value; if (BoundsChanged != null) BoundsChanged(this, new EventArgs()); }
}
public double Top
{
get { return top; }
set { top = value; if (BoundsChanged != null) BoundsChanged(this, new EventArgs()); }
}
public double Bottom
{
get { return bottom; }
set { bottom = value; if (BoundsChanged != null) BoundsChanged(this, new EventArgs()); }
}
public double Width
{
get { return Right - Left; }
set { Right = Left + value; }
}
public double Height
{
get { return Top - Bottom; }
set { Top = Bottom + Height; }
}
#endregion
public event EventHandler BoundsChanged;
#region Constructors
public Bounds()
{
Left = Right = Top = Bottom = 0;
}
public Bounds(double w, double h)
{
Left = Bottom = 0;
Width = w; Height = h;
}
public Bounds(double l, double t, double r, double b)
{
Left = l; Top = t; Right = r; Bottom = b;
}
#endregion
#region IsInBounds
public bool IsInBounds(double x, double y)
{
return (x >= Math.Min(Left, Right) && x <= Math.Max(Left, Right) &&
y >= Math.Min(Top, Bottom) && y <= Math.Max(Top, Bottom));
}
public bool IsInBounds(System.Windows.Point point)
{
return IsInBounds(point.X, point.Y);
}
#endregion
}
}

View File

@ -0,0 +1,101 @@
<Window x:Class="GraphingCalculator.EvaluateWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Evaluate expression" Height="251" Width="471" WindowStartupLocation="CenterScreen"
WindowStyle="ToolWindow" SnapsToDevicePixels="True"
KeyUp="Window_KeyUp">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/GroupBoxStyle.xaml" />
<ResourceDictionary Source="/Styles/ButtonStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint=".5,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Window.Background>
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="5"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<GridSplitter Grid.Column="1" Grid.Row="0" Background="Transparent"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
<GroupBox Header="Input expression" Margin="0,0,-3,0">
<TextBox Name="inputExpression" TextWrapping="Wrap"/>
</GroupBox>
<GroupBox Grid.Column="2" Header="Variables" Margin="-3,0,0,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox Name="listVars" Grid.ColumnSpan="100" Margin="0,0,0,2">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit" Click="contextEdit_Click"/>
<MenuItem Header="Delete" Click="contextDelete_Click" />
<MenuItem Header="Clear list" Click="contextClear_Click" />
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
<TextBlock Grid.Row="1" Grid.Column="0" VerticalAlignment="Center">Name:</TextBlock>
<TextBox Name="inputVarName" Grid.Row="1" Grid.Column="1" />
<TextBlock Grid.Row="1" Grid.Column="2" VerticalAlignment="Center" Margin="3,0,0,0">Value:</TextBlock>
<TextBox Name="inputVarValue" Grid.Row="1" Grid.Column="3" />
<Button VerticalAlignment="Center" Name="buttonAdd"
Grid.Row="1" Grid.Column="4" Margin="3,0,0,0"
Click="buttonAdd_Click">Add</Button>
</Grid>
</GroupBox>
<GroupBox Grid.Row="1" Grid.ColumnSpan="3" Header="Result">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Name="outputResult" Grid.ColumnSpan="2" IsReadOnly="True" Background="White"
Margin="0,0,0,2"/>
<Button Name="buttonClose" Grid.Row="1" Grid.Column="1" Width="80" Margin="2"
HorizontalAlignment="Left" Click="buttonClose_Click">Close</Button>
<Button Name="buttonEval" Grid.Row="1" Width="80" Margin="2"
HorizontalAlignment="Right" Click="buttonEval_Click">Evaluate</Button>
</Grid>
</GroupBox>
</Grid>
</Window>

View File

@ -0,0 +1,216 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace GraphingCalculator
{
/// <summary>
/// Interaction logic for EvaluateWindow.xaml
/// </summary>
public partial class EvaluateWindow : Window
{
private Dictionary<string, double> variables = new Dictionary<string, double>();
#region Properties
public string InputExpression
{
get { return inputExpression.Text; }
set { inputExpression.Text = value; }
}
#endregion
#region Constructors
public EvaluateWindow()
{
InitializeComponent();
}
public EvaluateWindow(string txt)
{
InitializeComponent();
InputExpression = txt;
// Convenience: evaluate already
buttonEval_Click(this, new RoutedEventArgs());
}
#endregion
#region User input
private void buttonAdd_Click(object sender, RoutedEventArgs e)
{
string errorMessage = "";
double val = 0;
outputResult.Clear();
// Verify boxes are not empty
if (inputVarName.Text == "" || inputVarValue.Text == "")
errorMessage = "Name or value cannot be empty!";
// Get number
if (errorMessage == "" && !double.TryParse(inputVarValue.Text, out val))
{
try {
Expression expr = new Expression(inputVarValue.Text);
val = expr.Evaluate();
}
catch { errorMessage = "Value must be a number!"; }
}
// Verify name is unique
if (errorMessage == "" && variables.ContainsKey(inputVarName.Text))
{
var res = MessageBox.Show("A variable with the same name already exists. Replace it with the new value?", "Warning", MessageBoxButton.YesNo);
if (res != MessageBoxResult.Yes) errorMessage = "A variable with the same name already exists!";
}
// Verify name doesn't contain forbidden characters
if (errorMessage == "")
{
bool ok = char.IsLetter (inputVarName.Text.First());
foreach (var i in inputVarName.Text)
if (!char.IsLetterOrDigit(i)) ok = false;
if (!ok) errorMessage = "Forbidden variable name, it can only contain letters or digits!";
}
// Add variable
if (errorMessage == "")
{
variables[inputVarName.Text] = val;
// Remove if it exists already
for (int i = 0; i < listVars.Items.Count; i++)
{
string str = listVars.Items[i] as string;
if (str != null && str.StartsWith(inputVarName.Text + " = ")) listVars.Items.RemoveAt(i);
}
// Add variable
listVars.Items.Add(inputVarName.Text + " = " + inputVarValue.Text);
// Clear text boxes
inputVarName.Clear();
inputVarValue.Clear();
}
else
{
outputResult.Foreground = Brushes.DarkRed;
outputResult.Text = "Error adding variable: " + errorMessage;
}
}
private void buttonEval_Click(object sender, RoutedEventArgs e)
{
// Create expression
Expression expression = new Expression(inputExpression.Text);
double result = 0;
// Add variables
foreach (var i in variables)
expression.Variables.Add(i.Key, i.Value);
// Try to evaluate
try {
result = expression.Evaluate();
}
catch (Exception ex) {
outputResult.Text = "Error evaluating: " + ex.Message;
outputResult.Foreground = Brushes.DarkRed;
#region Log
Log.LogEvent("Failed to evaluate expression '{0}'. Message: {1}", inputExpression.Text, ex.Message);
Log.LogEvent("> Stack trace: {0}", ex.StackTrace);
if (listVars.Items.Count > 0) Log.LogEvent("> Variables: ");
foreach (var i in listVars.Items)
Log.LogEvent(">> {0}", i.ToString());
#endregion
return;
}
// Output results
outputResult.Text = Math.Round(result, 15).ToString();
outputResult.Foreground = Brushes.Black;
#region Log
// Log what happened here
Log.LogEvent("Evaluated expression '{0}' result={1}", inputExpression.Text, outputResult.Text);
if (listVars.Items.Count > 0) Log.LogEvent("> WHERE: ");
foreach (var i in listVars.Items)
Log.LogEvent(">> {0}", i.ToString());
#endregion
}
private void buttonClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void contextEdit_Click(object sender, RoutedEventArgs e)
{
// Make sure we have 1 selected item
if (listVars.SelectedItems.Count != 1) return;
// Get key
var item = listVars.SelectedItem as string;
if (item == null) return;
string key = item.Substring(0, item.IndexOf(" = "));
// Place in input boxes
inputVarName.Text = key;
inputVarValue.Text = variables[key].ToString();
// Remove item
listVars.Items.Remove(listVars.SelectedItem);
variables.Remove(key);
}
private void contextDelete_Click(object sender, RoutedEventArgs e)
{
// Make sure we have 1 selected item
if (listVars.SelectedItems.Count != 1) return;
// Get key
var item = listVars.SelectedItem as string;
if (item == null) return;
string key = item.Substring(0, item.IndexOf(" = "));
// Remove
listVars.Items.Remove(listVars.SelectedItem);
variables.Remove(key);
}
private void contextClear_Click(object sender, RoutedEventArgs e)
{
listVars.Items.Clear();
variables.Clear();
}
private void Window_KeyUp(object sender, KeyEventArgs e)
{
e.Handled = true;
if (e.Key == Key.Escape) buttonClose_Click(this, new RoutedEventArgs());
else if (e.Key == Key.Enter) buttonEval_Click(this, new RoutedEventArgs());
else if (e.Key == Key.Insert) buttonAdd_Click(this, new RoutedEventArgs());
else e.Handled = false;
}
#endregion
}
}

View File

@ -0,0 +1,137 @@
<Canvas x:Class="GraphingCalculator.GraphingCanvas"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignHeight="234" d:DesignWidth="348"
ClipToBounds="True"
SizeChanged="Canvas_SizeChanged"
MouseWheel="Canvas_MouseWheel"
>
<Canvas.Resources>
<Style TargetType="Button">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid Name="grid">
<Border Name="border" CornerRadius="4" Visibility="Collapsed"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
BorderBrush="Orange"
BorderThickness="1">
<Border.Background>
<RadialGradientBrush Center=".5, .5" GradientOrigin=".5,1" RadiusX="1" RadiusY=".7">
<GradientStop Color="#FFBF6A" Offset="0" />
<GradientStop Color="#FFF6E2" Offset="1" />
</RadialGradientBrush>
</Border.Background>
</Border>
<Border Name="blackness" CornerRadius="4" Background="Brown" Opacity="0" />
<ContentPresenter VerticalAlignment="Center" Margin="3"
HorizontalAlignment="Center" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="blackness" Property="Opacity" Value=".3" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="RepeatButton">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RepeatButton">
<Grid Name="grid">
<Border Name="border" CornerRadius="4" Visibility="Collapsed"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
BorderBrush="Orange"
BorderThickness="1">
<Border.Background>
<RadialGradientBrush Center=".5, .5" GradientOrigin=".5,1" RadiusX="1" RadiusY=".7">
<GradientStop Color="#FFBF6A" Offset="0" />
<GradientStop Color="#FFF6E2" Offset="1" />
</RadialGradientBrush>
</Border.Background>
</Border>
<Border Name="blackness" CornerRadius="4" Background="Brown" Opacity="0" />
<ContentPresenter VerticalAlignment="Center" Margin="3"
HorizontalAlignment="Center" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="blackness" Property="Opacity" Value=".3" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Canvas.Resources>
<RepeatButton Name="buttonUp" Canvas.Right="25" Canvas.Top="5"
Width="20" Height="20" Click="buttonUp_Click">
<Path Height="12" Stretch="Fill" Fill="Gray"
Data="F1 M 190.792,238.149L 182.688,252.184L 198.895,252.184L 190.792,238.149 Z "/>
</RepeatButton>
<RepeatButton Name="buttonLeft" Canvas.Right="45" Canvas.Top="25"
Width="20" Height="20" Click="buttonLeft_Click" >
<Path Width="12" Stretch="Fill" Fill="Gray" Data="F1 M 204.774,246.729L 218.809,254.833L 218.809,238.626L 204.774,246.729 Z "/>
</RepeatButton>
<Button Name="buttonReset"
Canvas.Right="25" Canvas.Top="25"
Width="20" Height="20"
Click="buttonReset_Click"
ToolTip="Reset" >
<Ellipse Width="12" Height="12" Fill="Gray"/>
</Button>
<RepeatButton Name="buttonRight"
Canvas.Right="5" Canvas.Top="25"
Width="20" Height="20" Click="buttonRight_Click" >
<Path Width="12" Stretch="Fill" Fill="Gray" Data="F1 M 214.722,227.667L 200.686,219.563L 200.686,235.77L 214.722,227.667 Z "/>
</RepeatButton>
<RepeatButton Name="buttonBottom" Canvas.Right="25" Canvas.Top="45"
Width="20" Height="20" Click="buttonBottom_Click" >
<Path Height="12" Stretch="Fill" Fill="Gray" Data="F1 M 188.333,235.024L 196.437,220.988L 180.23,220.988L 188.333,235.024 Z "/>
</RepeatButton>
<!-- Zoom buttons -->
<RepeatButton Name="buttonZoomIn" Canvas.Right="5" Canvas.Bottom="5"
Width="25" Height="20" Click="buttonZoomIn_Click">
<Path Width="12" Height="12" Stretch="Fill" Fill="Gray" Data="M 139.292,225.542L 147.292,225.542L 147.292,233.542L 155.292,233.542L 155.292,241.542L 147.292,241.542L 147.292,249.542L 139.292,249.542L 139.292,241.542L 131.292,241.542L 131.292,233.542L 139.292,233.542L 139.292,225.542 Z "/>
</RepeatButton>
<RepeatButton Name="buttonZoomOut" Canvas.Right="30" Canvas.Bottom="5"
Width="25" Height="20" Click="buttonZoomOut_Click">
<Rectangle Width="12" Height="4.32" Stretch="Fill" Fill="Gray"/>
</RepeatButton>
</Canvas>

View File

@ -0,0 +1,466 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GraphingCalculator
{
/// <summary>
/// Interaction logic for GraphingCanvas.xaml
/// </summary>
public partial class GraphingCanvas : Canvas
{
#region Settings
private double PlotPrecision
{
get { return GraphingCalculator.Properties.Settings.Default.PlotPrecision; }
set { GraphingCalculator.Properties.Settings.Default.PlotPrecision = value; }
}
private double GridDensity
{
get { return GraphingCalculator.Properties.Settings.Default.GridDensity; }
set { GraphingCalculator.Properties.Settings.Default.GridDensity = value; }
}
private int RoundDoublesGraph
{
get { return GraphingCalculator.Properties.Settings.Default.RoundDoublesGraph; }
set { GraphingCalculator.Properties.Settings.Default.RoundDoublesGraph = value; }
}
private double NavigationSens
{
get { return GraphingCalculator.Properties.Settings.Default.NavigationSensitivity; }
set { GraphingCalculator.Properties.Settings.Default.NavigationSensitivity = value; }
}
private double ZoomSens
{
get { return GraphingCalculator.Properties.Settings.Default.ZoomSensitivity; }
set { GraphingCalculator.Properties.Settings.Default.ZoomSensitivity = value; }
}
#endregion
#region Constants
private Point specialSeparator = new Point(double.MaxValue, double.MaxValue);
private Point specialVisibleTrue = new Point(0, double.MaxValue);
private Point specialVisibleFalse = new Point(0, double.MinValue);
#endregion
#region Expressions
private List<VisualExpression> expressions = new List<VisualExpression>();
public List<VisualExpression> Expressions { get { return expressions; } }
/// <summary>
/// Adds an expression to be plotted
/// </summary>
public void AddExpression(VisualExpression ex)
{
this.Expressions.Add(ex);
EvaluateExpression(ex);
Redraw();
#region Log
Log.LogEvent("Plotted expression '{0}'", ex.ExpressionString);
#endregion
}
public void SetExpressionVisibility(int index, bool visibility)
{
if (Expressions[index].IsVisible == visibility) return;
if (queuedPoints.Count != 0) {
int i, ci;
for (i = 0, ci = -1; i < queuedPoints.Count && ci < index; i++)
if (queuedPoints[i] == specialSeparator) ci++;
queuedPoints[i] = (visibility) ? specialVisibleTrue : specialVisibleFalse;
}
Expressions[index].IsVisible = visibility;
Redraw();
}
#endregion
#region Canvas and screen bounds
public Bounds CanvasBounds { get; set; }
public Bounds ScreenBounds { get; set; }
public double CoordXToCanvas(double x)
{
double scrX = x - ScreenBounds.Left;
return CanvasBounds.Left + (CanvasBounds.Width * (scrX / ScreenBounds.Width));
}
public double CoordXToScreen(double x)
{
double canX = x - CanvasBounds.Left;
return ScreenBounds.Left + (ScreenBounds.Width * (canX / CanvasBounds.Width));
}
public double CoordYToCanvas(double y)
{
double scrY = y - ScreenBounds.Bottom;
return CanvasBounds.Bottom + (CanvasBounds.Height * (scrY / ScreenBounds.Height));
}
public double CoordYToScreen(double y)
{
double canY = y - CanvasBounds.Bottom;
return ScreenBounds.Bottom + (ScreenBounds.Height * (canY / CanvasBounds.Height));
}
public Point CoordToCanvas(double x, double y)
{
return new Point(CoordXToCanvas(x), CoordYToCanvas(y));
}
public Point CoordToCanvas(Point p)
{
return new Point(CoordXToCanvas(p.X), CoordYToCanvas(p.Y));
}
public Point CoordToScreen(double x, double y)
{
return new Point(CoordXToScreen(x), CoordYToScreen(y));
}
public Point CoordToScreen(Point p)
{
return new Point(CoordXToScreen(p.X), CoordYToScreen(p.Y));
}
public void SetCanvasBounds(Bounds b)
{
if (b.Width <= 0 || b.Height <= 0) return;
CanvasBounds.Top = b.Top;
CanvasBounds.Bottom = b.Bottom;
CanvasBounds.Left = b.Left;
CanvasBounds.Right = b.Right;
EvaluateExpressions();
Redraw();
}
#endregion
#region Constructor
public GraphingCanvas()
{
InitializeComponent();
CanvasBounds = new Bounds(-5, 5, 5, -5);
ScreenBounds = new Bounds(0, 0, this.ActualWidth, this.ActualHeight);
}
#endregion
#region UI Events
private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
ScreenBounds.Right = e.NewSize.Width;
ScreenBounds.Bottom = e.NewSize.Height;
Redraw();
}
private void buttonReset_Click(object sender, RoutedEventArgs e)
{
CanvasBounds.Left = -5;
CanvasBounds.Right = 5;
CanvasBounds.Bottom = -5;
CanvasBounds.Top = 5;
EvaluateExpressions();
Redraw();
}
private void buttonUp_Click(object sender, RoutedEventArgs e)
{
double h = CanvasBounds.Height * NavigationSens;
CanvasBounds.Top += h;
CanvasBounds.Bottom += h;
EvaluateExpressions();
Redraw();
}
private void buttonLeft_Click(object sender, RoutedEventArgs e)
{
double w = CanvasBounds.Width * NavigationSens;
CanvasBounds.Left -= w;
CanvasBounds.Right -= w;
EvaluateExpressions();
Redraw();
}
private void buttonRight_Click(object sender, RoutedEventArgs e)
{
double w = CanvasBounds.Width * NavigationSens;
CanvasBounds.Left += w;
CanvasBounds.Right += w;
EvaluateExpressions();
Redraw();
}
private void buttonBottom_Click(object sender, RoutedEventArgs e)
{
double h = CanvasBounds.Height * NavigationSens;
CanvasBounds.Top -= h;
CanvasBounds.Bottom -= h;
EvaluateExpressions();
Redraw();
}
private void buttonZoomIn_Click(object sender, RoutedEventArgs e)
{
double new_w = CanvasBounds.Width / ZoomSens;
double new_h = CanvasBounds.Height / ZoomSens;
double diff_w = (CanvasBounds.Width - new_w) / 2 ;
double diff_h = (CanvasBounds.Height - new_h) / 2;
CanvasBounds.Left += diff_w;
CanvasBounds.Right -= diff_w;
CanvasBounds.Bottom += diff_h;
CanvasBounds.Top -= diff_h;
EvaluateExpressions();
Redraw();
}
private void buttonZoomOut_Click(object sender, RoutedEventArgs e)
{
double new_w = CanvasBounds.Width * ZoomSens;
double new_h = CanvasBounds.Height * ZoomSens;
double diff_w = (CanvasBounds.Width - new_w) / 2;
double diff_h = (CanvasBounds.Height - new_h) / 2;
CanvasBounds.Left += diff_w;
CanvasBounds.Right -= diff_w;
CanvasBounds.Bottom += diff_h;
CanvasBounds.Top -= diff_h;
EvaluateExpressions();
Redraw();
}
#endregion
#region Expression evaluation
List<Point> queuedPoints = new List<Point>();
public void EvaluateExpression(VisualExpression expr)
{
queuedPoints.Add(specialSeparator);
queuedPoints.Add((expr.IsVisible) ? specialVisibleTrue : specialVisibleFalse);
for (double x = CanvasBounds.Left; x <= CanvasBounds.Right; x += CanvasBounds.Width / PlotPrecision)
{
expr.Variables["x"] = expr.Variables["X"] = x;
queuedPoints.Add(new Point(x, expr.Evaluate()));
}
}
public void EvaluateExpressions()
{
queuedPoints.Clear();
foreach (var expr in Expressions)
EvaluateExpression(expr);
}
#endregion
#region Rendering
public void Redraw()
{
this.InvalidateVisual();
}
private void RenderDouble(DrawingContext dc, double n, Point pos, bool center)
{
FormattedText text = new FormattedText(Math.Round(n, RoundDoublesGraph).ToString(),
new System.Globalization.CultureInfo("en-US"), FlowDirection.LeftToRight,
new Typeface("Arial"), 8.0, Brushes.Black);
if (center) dc.DrawText(text, new Point(pos.X - (text.Width / 2), pos.Y + 10));
else dc.DrawText(text, new Point(pos.X + 2, pos.Y));
}
private void RenderGridVertical(DrawingContext dc, Pen pen, double from, double to, double interv)
{
if (from > to) interv *= -1;
// Draw vertical grid
for (double i = from; (from < to && i < to) || (from > to && i > to); i += interv)
{
Point text = CoordToScreen(i, 0);
Point f = CoordToScreen(i, CanvasBounds.Bottom);
Point t = CoordToScreen(i, CanvasBounds.Top);
dc.DrawLine(pen, f, t);
RenderDouble(dc, i, text, true);
}
}
private void RenderGridHorizontal(DrawingContext dc, Pen pen, double from, double to, double interv)
{
if (from > to) interv *= -1;
// Draw vertical grid
for (double i = from; (from < to && i < to) || (from > to && i > to); i += interv)
{
Point text = CoordToScreen(0, i);
Point f = CoordToScreen(CanvasBounds.Left, i);
Point t = CoordToScreen(CanvasBounds.Right, i);
dc.DrawLine(pen, f, t);
RenderDouble(dc, i, text, false);
}
}
private void RenderGrid(DrawingContext dc)
{
Pen pen = new Pen(new SolidColorBrush(Color.FromRgb(0xa6, 0xdd, 0xe2)), 1);
pen.DashStyle = DashStyles.Dash;
double w_div = Math.Truncate(this.ActualWidth / GridDensity);
double h_div = Math.Truncate(this.ActualHeight / GridDensity);
if (Convert.ToInt32(w_div) % 2 == 1) w_div += 1;
if (Convert.ToInt32(h_div) % 2 == 1) h_div += 1;
double w_int = CanvasBounds.Width / w_div;
double h_int = CanvasBounds.Height / h_div;
RenderGridVertical(dc, pen, 0, CanvasBounds.Right, w_int);
RenderGridVertical(dc, pen, 0, CanvasBounds.Left, w_int);
RenderGridHorizontal(dc, pen, 0, CanvasBounds.Top, h_int);
RenderGridHorizontal(dc, pen, 0, CanvasBounds.Bottom, h_int);
}
private void RenderAxis(DrawingContext dc)
{
Point dst;
Pen lines = new Pen(Brushes.Coral, 1.5);
// Draw X axis
dst = CoordToScreen(CanvasBounds.Right, 0);
dc.DrawLine(lines, CoordToScreen(CanvasBounds.Left, 0), dst);
dc.DrawLine(lines, dst, new Point(dst.X - 5, dst.Y + 2));
dc.DrawLine(lines, dst, new Point(dst.X - 5, dst.Y - 2));
// Draw Y axis
dst = CoordToScreen(0, CanvasBounds.Top);
dc.DrawLine(lines, CoordToScreen(0, CanvasBounds.Bottom), dst);
dc.DrawLine(lines, dst, new Point(dst.X - 2, dst.Y + 5));
dc.DrawLine(lines, dst, new Point(dst.X + 2, dst.Y + 5));
}
private void RenderFunctions(DrawingContext dc)
{
if (Expressions.Count == 0) return;
int exprIndex = -1;
bool visible = true;
Pen pen = new Pen();
for (int i = 0; i < queuedPoints.Count - 1; i++)
{
if (queuedPoints[i] == specialSeparator)
{
exprIndex++; i++;
pen = new Pen(new SolidColorBrush(Expressions[exprIndex].Color), Expressions[exprIndex].Thickness);
visible = (queuedPoints[i] == specialVisibleTrue);
}
else if (visible && queuedPoints[i + 1] != specialSeparator)
{
Point src = CoordToScreen(queuedPoints[i]);
Point dst = CoordToScreen(queuedPoints[i + 1]);
if (ScreenBounds.IsInBounds(src) || ScreenBounds.IsInBounds(dst))
dc.DrawLine(pen, src, dst);
}
}
}
protected override void OnRender(DrawingContext dc)
{
// Reduce garbage collector intrusions
var latency = System.Runtime.GCSettings.LatencyMode;
System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.LowLatency;
// Draw grid
RenderGrid(dc);
RenderAxis(dc);
// Render functions
RenderFunctions(dc);
// Base render
base.OnRender(dc);
// Restore previous garbage collector setting
System.Runtime.GCSettings.LatencyMode = latency;
}
#endregion
private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (e.Delta > 0) buttonZoomIn_Click(this, new RoutedEventArgs());
else buttonZoomOut_Click(this, new RoutedEventArgs());
}
#region Navigation control
public void PeformMouseWheelChange(MouseWheelEventArgs e)
{
Canvas_MouseWheel(this, e);
}
public void PerformMoveLeft()
{
buttonLeft_Click(this, new RoutedEventArgs());
}
public void PerformMoveRight()
{
buttonRight_Click(this, new RoutedEventArgs());
}
public void PerformMoveUp()
{
buttonUp_Click(this, new RoutedEventArgs());
}
public void PerformMoveDown()
{
buttonBottom_Click(this, new RoutedEventArgs());
}
public void PerformReset()
{
buttonReset_Click(this, new RoutedEventArgs());
}
public void PerformZoomIn()
{
buttonZoomIn_Click(this, new RoutedEventArgs());
}
public void PerformZoomOut()
{
buttonZoomOut_Click(this, new RoutedEventArgs());
}
#endregion
}
}

View File

@ -0,0 +1,80 @@
<Window x:Class="GraphingCalculator.Controls.IntegralWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Integral" Height="331" Width="261" WindowStyle="ToolWindow" WindowStartupLocation="CenterScreen">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/ButtonStyle.xaml" />
<ResourceDictionary Source="/Styles/RadioButtonStyle.xaml" />
<ResourceDictionary Source="/Styles/GroupBoxStyle.xaml" />
<ResourceDictionary Source="/Styles/WarningGroupBoxStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint=".5,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#999" Offset="1" />
</LinearGradientBrush>
</Window.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<GroupBox Style="{StaticResource WarningGroupBox}"
Grid.Row="0" Grid.ColumnSpan="2" Margin="8,5,8,2"
HorizontalContentAlignment="Stretch"
Header="Warning" TextBlock.TextAlignment="Center" >
<TextBlock TextWrapping="Wrap">This feature is experimental, so the given results may not fully be accurate.</TextBlock>
</GroupBox>
<GroupBox Header="Expression" Grid.Row="1">
<TextBox Name="inputExpression" TextWrapping="Wrap" />
</GroupBox>
<GroupBox Header="Interval" Grid.Row="2">
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32" />
<ColumnDefinition />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="32" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" VerticalAlignment="Center">From:</TextBlock>
<TextBox Name="inputIntervalBeg" Grid.Column="1" VerticalAlignment="Center">-1</TextBox>
<TextBlock Grid.Column="3" VerticalAlignment="Center">To:</TextBlock>
<TextBox Name="inputIntervalEnd" Grid.Column="4" VerticalAlignment="Center">1</TextBox>
</Grid>
</StackPanel>
</GroupBox>
<GroupBox Header="Result" Grid.Row="3">
<TextBox Name="outputResult" IsReadOnly="True" Background="White"/>
</GroupBox>
<Grid Grid.Row="4">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Name="buttonCalculate" Grid.Column="0" HorizontalAlignment="Right" Width="80" Click="buttonCalculate_Click">Calculate</Button>
<Button Name="buttonClose" Grid.Column="1" HorizontalAlignment="Left" Width="80" Click="buttonClose_Click">Close</Button>
</Grid>
</Grid>
</Window>

View File

@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace GraphingCalculator.Controls
{
/// <summary>
/// Interaction logic for LimitWindow.xaml
/// </summary>
public partial class IntegralWindow : Window
{
#region Properties
public string ExpressionString
{
get { return inputExpression.Text; }
set { inputExpression.Text = value; }
}
#endregion
#region Constructors
public IntegralWindow()
{
InitializeComponent();
ExpressionString = "";
}
public IntegralWindow(string expression)
{
InitializeComponent();
ExpressionString = expression;
}
#endregion
#region Other routines
private void Result (string result, bool error = false)
{
outputResult.Text = result;
if (error) outputResult.Foreground = Brushes.DarkRed;
else outputResult.Foreground = Brushes.Black;
}
#endregion
#region Button handlers
private void buttonClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void buttonCalculate_Click(object sender, RoutedEventArgs e)
{
double val_beg, val_end, integr_res;
Expression beg, end, expr;
beg = new Expression(inputIntervalBeg.Text);
end = new Expression(inputIntervalEnd.Text);
expr = new Expression(inputExpression.Text);
// Try to evaluate interval ends
try { val_beg = beg.Evaluate(); }
catch { Result("Failed to evaluate interval start.", true); return; }
try { val_end = end.Evaluate(); }
catch { Result("Failed to evaluate interval end.", true); return; }
// Try to calculate the integral
try { integr_res = Integrator.Integrate(expr, val_beg, val_end, "x"); }
catch (Exception ex)
{
Result("Failed to evaluate expression. Message: " + ex.Message, true);
Log.LogEvent("Failed to integrate expression: {0}", expr.ExpressionString);
Log.LogEvent("> Interval: [{0}, {1}] = [{2}, {3}]", beg.ExpressionString, end.ExpressionString, val_beg, val_end);
Log.LogEvent("> Message: {0}", ex.Message);
Log.LogEvent("> Stack trace: {0}", ex.StackTrace);
return;
}
// Show result
Result(Math.Round(integr_res, 14).ToString());
Log.LogEvent("Integrated expression: {0}", expr.ExpressionString);
Log.LogEvent("> Interval: [{0}, {1}] = [{2}, {3}]", beg.ExpressionString, end.ExpressionString, val_beg, val_end);
Log.LogEvent("> Result: {0}", integr_res);
}
#endregion
}
}

View File

@ -0,0 +1,44 @@
<Window x:Class="GraphingCalculator.LogWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Log" Height="379" Width="543" WindowStartupLocation="CenterScreen" ShowInTaskbar="True">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/ButtonStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ListBox Name="listEntries" Grid.Row="0" Grid.ColumnSpan="10"
ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Name="buttonCopy" Grid.Row="1" Grid.Column="1" Width="60" Click="buttonCopy_Click">Copy</Button>
<Button Name="buttonSave" Grid.Row="1" Grid.Column="2" Width="60" Click="buttonSave_Click">Save...</Button>
<Button Name="buttonClear" Grid.Row="1" Grid.Column="3" Width="60" Click="buttonClear_Click">Clear</Button>
<Button Name="buttonRefresh" Grid.Row="1" Grid.Column="0" Width="60" Click="buttonRefresh_Click">Refresh</Button>
<Button Name="buttonClose" Grid.Row="1" Grid.Column="5" Width="60" Click="buttonClose_Click">Close</Button>
</Grid>
</Window>

View File

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace GraphingCalculator
{
/// <summary>
/// Interaction logic for LogWindow.xaml
/// </summary>
public partial class LogWindow : Window
{
public LogWindow()
{
InitializeComponent();
buttonRefresh_Click(this, new RoutedEventArgs());
}
private void buttonCopy_Click(object sender, RoutedEventArgs e)
{
if (listEntries.SelectedIndex != -1)
Clipboard.SetText(listEntries.SelectedItem.ToString());
}
private void buttonClear_Click(object sender, RoutedEventArgs e)
{
listEntries.Items.Clear();
Log.Entries.Clear();
}
private void buttonRefresh_Click(object sender, RoutedEventArgs e)
{
listEntries.Items.Clear();
foreach (var i in Log.Entries)
listEntries.Items.Add(i);
}
private void buttonClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void buttonSave_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.SaveFileDialog dialog = new Microsoft.Win32.SaveFileDialog();
dialog.Title = "Save log...";
dialog.Filter = "Text file|*.txt|Log file|*.log|All files|*.*";
bool? res = dialog.ShowDialog();
if (!res.HasValue && !res.Value) return;
try
{
System.IO.File.WriteAllLines(dialog.FileName, Log.Entries.ToArray());
}
catch (Exception ex)
{
Log.LogEvent("Failed to save log to file {0}: {1}", dialog.FileName, ex.Message);
MessageBox.Show("Error: " + ex.Message, "Failed to save log file!");
}
}
}
}

View File

@ -0,0 +1,165 @@
<Window x:Class="GraphingCalculator.SettingsWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Settings" Height="320" Width="562"
ShowInTaskbar="False" WindowStartupLocation="CenterScreen"
WindowStyle="ToolWindow">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/GroupBoxStyle.xaml" />
<ResourceDictionary Source="/Styles/ButtonStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint=".5,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Window.Background>
<Grid Margin="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<GroupBox Header="Graph precision" Grid.Row="0">
<StackPanel>
<Slider Name="sliderGraphPrecision"
Minimum="50" Maximum="2000" TickFrequency="150"
SmallChange="10" LargeChange="50"
TickPlacement="BottomRight"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock>Minimum</TextBlock>
<TextBlock Grid.Column="2">Maximum</TextBlock>
</Grid>
<TextBlock TextWrapping="Wrap" FontSize="11"
Foreground="#444" Margin="2,4,2,2">
A higher precision means that drawing takes longer to render, making the application slower.</TextBlock>
</StackPanel>
</GroupBox>
<GroupBox Header="Grid density" Grid.Column="1" Grid.Row="0">
<StackPanel>
<Slider Name="sliderGridDensity"
Minimum="10" Maximum="100" TickFrequency="5"
SmallChange="2" LargeChange="5"
TickPlacement="BottomRight"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock>Higher</TextBlock>
<TextBlock Grid.Column="2">Lower</TextBlock>
</Grid>
<TextBlock TextWrapping="Wrap" FontSize="11"
Foreground="#444" Margin="2,4,2,2">
A higher density means that more grid lines are drawn.</TextBlock>
</StackPanel>
</GroupBox>
<GroupBox Header="Grid numbers precision" Grid.Row="2" Grid.RowSpan="2">
<StackPanel>
<Slider Name="sliderDoublePrecision"
Minimum="0" Maximum="15" TickFrequency="1"
SmallChange="1" LargeChange="1" ValueChanged="sliderDoublePrecision_ValueChanged"
TickPlacement="BottomRight" IsSnapToTickEnabled="True"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock>0</TextBlock>
<TextBlock Name="outputDoublePrecision" Grid.Column="1" HorizontalAlignment="Center">? decimals</TextBlock>
<TextBlock Grid.Column="2">15</TextBlock>
</Grid>
<TextBlock TextWrapping="Wrap" FontSize="11"
Foreground="#444" Margin="2,4,2,2">
A higher precision means that more decimals appear in the graph. If the value is too high, values may overlap each other.</TextBlock>
</StackPanel>
</GroupBox>
<GroupBox Header="Navigation sensitivity"
Grid.Column="1" Grid.Row="2">
<StackPanel>
<Slider Name="sliderNavigationSensitivity"
Minimum=".01" Maximum="1.5" TickFrequency=".1"
SmallChange=".01" LargeChange=".05" ValueChanged="sliderNavigationSensitivity_ValueChanged"
TickPlacement="BottomRight"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock>1%</TextBlock>
<TextBlock Name="outputNavigationSensitivity" Grid.Column="1" HorizontalAlignment="Center">?% of screen</TextBlock>
<TextBlock Grid.Column="2">150%</TextBlock>
</Grid>
</StackPanel>
</GroupBox>
<GroupBox Header="Zoom sensitivity"
Grid.Column="1" Grid.Row="3">
<StackPanel>
<Slider Name="sliderZoomSensitivity"
Minimum="1.01" Maximum="2.5" TickFrequency=".1"
SmallChange=".01" LargeChange=".05" ValueChanged="sliderZoomSensitivity_ValueChanged"
TickPlacement="BottomRight"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock>1%</TextBlock>
<TextBlock Name="outputZoomSensitivity" Grid.Column="1" HorizontalAlignment="Center">?% of screen</TextBlock>
<TextBlock Grid.Column="2">150%</TextBlock>
</Grid>
</StackPanel>
</GroupBox>
<Grid Grid.Row="5" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button Name="buttonDefaults" Width="80" Click="buttonDefaults_Click">Defaults</Button>
<Button Name="buttonCancel" Width="80" Grid.Column="2" Click="buttonCancel_Click">Cancel</Button>
<Button Name="buttonAccept" Width="80" Grid.Column="3" Click="buttonAccept_Click">Accept</Button>
</Grid>
</Grid>
</Window>

View File

@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace GraphingCalculator
{
/// <summary>
/// Interaction logic for SettingsWindow.xaml
/// </summary>
public partial class SettingsWindow : Window
{
public SettingsWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(SettingsWindow_Loaded);
}
void SettingsWindow_Loaded(object sender, RoutedEventArgs e)
{
Update();
}
private void Update()
{
sliderGraphPrecision.Value = GraphingCalculator.Properties.Settings.Default.PlotPrecision;
sliderGridDensity.Value = GraphingCalculator.Properties.Settings.Default.GridDensity;
sliderDoublePrecision.Value = GraphingCalculator.Properties.Settings.Default.RoundDoublesGraph;
sliderNavigationSensitivity.Value = GraphingCalculator.Properties.Settings.Default.NavigationSensitivity;
sliderZoomSensitivity.Value = GraphingCalculator.Properties.Settings.Default.ZoomSensitivity;
}
private void Save()
{
GraphingCalculator.Properties.Settings.Default.PlotPrecision = sliderGraphPrecision.Value;
GraphingCalculator.Properties.Settings.Default.GridDensity = sliderGridDensity.Value;
GraphingCalculator.Properties.Settings.Default.RoundDoublesGraph = Convert.ToInt32(sliderDoublePrecision.Value);
GraphingCalculator.Properties.Settings.Default.NavigationSensitivity = sliderNavigationSensitivity.Value;
GraphingCalculator.Properties.Settings.Default.ZoomSensitivity = sliderZoomSensitivity.Value;
}
private void buttonDefaults_Click(object sender, RoutedEventArgs e)
{
sliderGraphPrecision.Value = 600;
sliderGridDensity.Value = 41;
sliderDoublePrecision.Value = 4;
sliderNavigationSensitivity.Value = 0.1;
sliderZoomSensitivity.Value = 1.075;
}
private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void buttonAccept_Click(object sender, RoutedEventArgs e)
{
Save();
this.Close();
}
private void sliderDoublePrecision_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (outputDoublePrecision != null)
outputDoublePrecision.Text = e.NewValue.ToString() + " decimals";
}
private void sliderNavigationSensitivity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (outputNavigationSensitivity != null)
outputNavigationSensitivity.Text = Math.Round(e.NewValue * 100, 0).ToString() + "% of screen";
}
private void sliderZoomSensitivity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (outputZoomSensitivity != null)
outputZoomSensitivity.Text = Math.Round((e.NewValue-1) * 100, 0).ToString() + "% of screen";
}
}
}

View File

@ -0,0 +1,361 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GraphingCalculator
{
public class Expression
{
#region Token type
public enum Token
{
None, Literal, Variable, Operator, Function, FunctionArgumentSeparator,
LeftParanthesis, RightParanthesis
};
#endregion
#region Variables, properties
private string expressionString;
private bool isProcessed = false;
private List<KeyValuePair<Token, string>> tokens = new List<KeyValuePair<Token, string>>();
private List<KeyValuePair<Token, string>> output = new List<KeyValuePair<Token, string>>();
private Dictionary<string, double> variables = new Dictionary<string, double>();
protected List<KeyValuePair<Token, string>> Tokens { get { return tokens; } }
protected List<KeyValuePair<Token, string>> Output { get { return output; } }
public Dictionary<string, double> Variables { get { return variables; } }
public string ExpressionString
{
get { return expressionString; }
set
{
expressionString = value;
isProcessed = false;
}
}
#endregion
#region Other stuff
public void AddVariable(string name, double value)
{
variables[name] = value;
}
#endregion
#region Constructor
public Expression()
{
Variables.Add("pi", Math.PI);
Variables.Add("e", Math.E);
}
public Expression(string expr)
: this()
{
expressionString = expr;
}
#endregion
#region Processor
private void Tokenize()
{
tokens.Clear();
for (int i = 0; i < ExpressionString.Length; i++)
{
if (char.IsWhiteSpace(ExpressionString[i])) continue;
if (IsOperator(ExpressionString[i]))
{
// Unary minus
if (ExpressionString[i] == '-' && (tokens.Count == 0 || tokens.Last().Key == Token.LeftParanthesis || tokens.Last().Key == Token.Operator || tokens.Last().Key == Token.FunctionArgumentSeparator))
tokens.Add(new KeyValuePair<Token, string>(Token.Operator, "!-"));
// Any other operator
else tokens.Add(new KeyValuePair<Token, string>(Token.Operator, ExpressionString[i].ToString()));
}
else if (ExpressionString[i] == '(')
tokens.Add(new KeyValuePair<Token, string>(Token.LeftParanthesis, ExpressionString[i].ToString()));
else if (ExpressionString[i] == ')')
tokens.Add(new KeyValuePair<Token, string>(Token.RightParanthesis, ExpressionString[i].ToString()));
else if (ExpressionString[i] == ',')
tokens.Add(new KeyValuePair<Token, string>(Token.FunctionArgumentSeparator, ExpressionString[i].ToString()));
else if (Char.IsDigit(ExpressionString[i]))
tokens.Add(new KeyValuePair<Token, string>(Token.Literal, GetLiteral(ExpressionString, ref i)));
else if (Char.IsLetter(ExpressionString[i]))
{
if (IsFunction(ExpressionString, i)) tokens.Add(new KeyValuePair<Token, string>(Token.Function, GetVariable(ExpressionString, ref i)));
else tokens.Add(new KeyValuePair<Token, string>(Token.Variable, GetVariable(ExpressionString, ref i)));
}
else throw new Exception("Unrecognized character found!");
}
}
private void ShuntingYard()
{
Stack<KeyValuePair<Token, string>> stack = new Stack<KeyValuePair<Token, string>>();
foreach (var i in Tokens) switch (i.Key)
{
case Token.Variable:
case Token.Literal: output.Add(i); break;
case Token.Function: stack.Push(i); break;
case Token.FunctionArgumentSeparator:
while (stack.Peek().Key != Token.LeftParanthesis)
{
output.Add(stack.Pop());
if (stack.Count == 0) throw new Exception("Syntax error!");
}
break;
case Token.Operator:
if (IsLeftAssociative(i.Value))
{
while (stack.Count != 0 && Precedence(i.Value) <= Precedence(stack.Peek().Value))
output.Add(stack.Pop());
}
else
{
while (stack.Count != 0 && Precedence(i.Value) < Precedence(stack.Peek().Value))
output.Add(stack.Pop());
}
stack.Push(i);
break;
case Token.LeftParanthesis: stack.Push(i); break;
case Token.RightParanthesis:
while (stack.Peek().Key != Token.LeftParanthesis)
{
output.Add(stack.Pop());
if (stack.Count == 0) throw new Exception("Mismatched parantheses!");
}
stack.Pop(); // Pop paranthesis
if (stack.Count > 0 && stack.Peek().Key == Token.Function) output.Add(stack.Pop()); // Pop function
break;
}
while (stack.Count > 0)
{
if (stack.Peek().Key == Token.LeftParanthesis) throw new Exception("Mismatched parantheses!");
output.Add(stack.Pop());
}
}
public void Process()
{
if (!isProcessed)
{
tokens.Clear();
output.Clear();
Tokenize();
ShuntingYard();
}
}
public double Evaluate()
{
Process();
if (Output.Count == 0) return 0;
Stack<double> stack = new Stack<double>();
foreach (var i in Output)
switch (i.Key)
{
case Token.Variable:
if (!Variables.ContainsKey(i.Value)) throw new Exception("Undefined variable '" + i.Value + "'.");
stack.Push(Variables[i.Value]);
break;
case Token.Literal: stack.Push(double.Parse(i.Value)); break;
case Token.Operator:
switch (i.Value)
{
case "!-": stack.Push(stack.Pop() * -1); break;
case "+": stack.Push(stack.Pop() + stack.Pop()); break;
case "-":
{
double b = stack.Pop();
double a = stack.Pop();
stack.Push(a - b);
} break;
case "*": stack.Push(stack.Pop() * stack.Pop()); break;
case "/":
{
double b = stack.Pop();
double a = stack.Pop();
stack.Push(a / b);
} break;
case "%":
{
double b = stack.Pop();
double a = stack.Pop();
stack.Push(a % b);
} break;
case "^":
{
double b = stack.Pop();
double a = stack.Pop();
stack.Push(Math.Pow(a, b));
} break;
}
break;
case Token.Function:
EvaluateFunction(i.Value, ref stack);
break;
}
return stack.Pop();
}
#endregion
#region Helper routines
private void EvaluateFunction(string func, ref Stack<double> stack)
{
switch (func)
{
case "sin": stack.Push(Math.Sin(stack.Pop())); break;
case "sinh": stack.Push(Math.Sinh(stack.Pop())); break;
case "cos": stack.Push(Math.Cos(stack.Pop())); break;
case "cosh": stack.Push(Math.Cosh(stack.Pop())); break;
case "tan": stack.Push(Math.Tan(stack.Pop())); break;
case "tanh": stack.Push(Math.Tanh(stack.Pop())); break;
case "ctan": stack.Push(1 / Math.Tan(stack.Pop())); break;
case "arcsin": stack.Push(Math.Asin(stack.Pop())); break;
case "asin": stack.Push(Math.Asin(stack.Pop())); break;
case "arccos": stack.Push(Math.Acos(stack.Pop())); break;
case "acos": stack.Push(Math.Acos(stack.Pop())); break;
case "arctan": stack.Push(Math.Atan(stack.Pop())); break;
case "atan": stack.Push(Math.Atan(stack.Pop())); break;
case "truncate":
case "int": stack.Push(Math.Truncate(stack.Pop())); break;
case "floor": stack.Push(Math.Floor(stack.Pop())); break;
case "ceil":
case "ceiling": stack.Push(Math.Ceiling(stack.Pop())); break;
case "sqrt": stack.Push(Math.Sqrt(stack.Pop())); break;
case "cbrt": stack.Push(Math.Pow(stack.Pop(), 1.0 / 3.0)); break;
case "root": stack.Push(Math.Pow(stack.Pop(), 1 / stack.Pop())); break;
case "abs": stack.Push(Math.Abs(stack.Pop())); break;
case "max": stack.Push(Math.Max(stack.Pop(), stack.Pop())); break;
case "min": stack.Push(Math.Min(stack.Pop(), stack.Pop())); break;
case "round": {
double dec = stack.Pop(), val = stack.Pop();
dec = Math.Max(0, dec);
dec = Math.Min(15, dec);
stack.Push(Math.Round(val, Convert.ToInt32(dec)));
break;
}
case "lg": stack.Push(Math.Log10(stack.Pop())); break;
case "log": stack.Push(Math.Log(stack.Pop(), stack.Pop())); break;
case "ln": stack.Push(Math.Log(stack.Pop(), Math.E)); break;
default: throw new Exception("Undefined function '" + func + "'.");
}
}
private static bool IsLeftAssociative(string op)
{
return (op != "^");
}
private static int Precedence(string op)
{
switch (op)
{
case "+":
case "-": return 1;
case "*":
case "/":
case "%": return 2;
case "^": return 3;
case "!-": return 10;
default: return 0;
}
}
private static bool IsOperator(char c)
{
const string operators = "+-*/%^";
return operators.Contains(c);
}
private static bool IsFunction(string s, int index)
{
// Skip function/variable name
while (index < s.Length && char.IsLetterOrDigit(s[index])) index++;
while (index < s.Length && char.IsWhiteSpace(s[index])) index++;
// End of string? Than it's a variable
if (index >= s.Length) return false;
// If an operator, function separator, or ), variable
if (s[index] == '(') return true;
return false;
}
private static string GetVariable(string s, ref int index)
{
StringBuilder str = new StringBuilder();
while (index < s.Length && (char.IsLetterOrDigit(s[index])))
str.Append(s[index++]);
index -= 1;
return str.ToString();
}
private static string GetLiteral(string s, ref int index)
{
StringBuilder str = new StringBuilder();
while (index < s.Length && (char.IsDigit(s[index]) || s[index] == '.'))
str.Append(s[index++]);
index -= 1;
return str.ToString();
}
#endregion
}
}

View File

@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GraphingCalculator
{
public static class Integrator
{
#region Settings
private static int maximumRecursionDepth = 16;
public static int MaximumRecursionDepth
{
get { return maximumRecursionDepth; }
set { maximumRecursionDepth = value; }
}
private static double initialEpsilon = 1e-10;
public static double InitialEpsilon
{
get { return initialEpsilon; }
set { initialEpsilon = value; }
}
#endregion
#region Some variables
private static string variable = "x";
private static Expression expression;
private static Dictionary<double, double> results = new Dictionary<double, double>();
#endregion
#region Swap function
private static void Swap(ref double a, ref double b)
{
double c = a;
a = b;
b = c;
}
#endregion
private static double EvaluateCache(double x)
{
if (!results.ContainsKey(x))
{
expression.Variables[variable] = x;
results[x] = expression.Evaluate();
}
return results[x];
}
private static double CalculateIntegralAux(double xA, double xB, double epsilon, double S, double yA, double yB, double yC, int depth)
{
double xC = (xA + xB) / 2;
double width = (xB - xA);
double xD = (xA + xC) / 2;
double xE = (xC + xB) / 2;
double yD = EvaluateCache(xD);
double yE = EvaluateCache(xE);
double Sleft = (width / 12) * (yA + 4 * yD + yC);
double Sright = (width / 12) * (yC + 4 * yE + yB);
double S2 = Sleft + Sright;
if (depth <= 0 || Math.Abs(S2 - S) <= 15 * epsilon)
return S2 + (S2 - S) / 15;
return CalculateIntegralAux(xA, xC, epsilon / 2, Sleft, yA, yC, yD, depth - 1) +
CalculateIntegralAux(xC, xB, epsilon / 2, Sright, yC, yB, yE, depth - 1);
}
private static double CalculateIntegral(double xA, double xB, double epsilon, int maxDepth)
{
double xC = (xA + xB) / 2;
double width = xB - xA;
double yA = EvaluateCache(xA);
double yC = EvaluateCache(xC);
double yB = EvaluateCache(xB);
double S = (width / 6) * (yA + 4 * yC + yB);
return CalculateIntegralAux(xA, xB, epsilon, S, yA, yB, yC, maxDepth);
}
/// <summary>
/// Calculates a definite integral (the area between the function graph and the X axis, where x ranges between beg and end.
/// </summary>
/// <param name="expr">An expression to integrate.</param>
/// <param name="beg">Beginning of the interval</param>
/// <param name="end">End of the interval</param>
/// <param name="var">The name of the variable, by default is 'x'</param>
public static double Integrate(Expression expr, double beg, double end, string var = "x")
{
double result = 0;
bool changeSign = false;
// Make sure beg < end
if (beg > end)
{
Swap(ref beg, ref end);
changeSign = true;
}
// Initialization
results.Clear();
variable = var;
expression = expr;
// Calculation
result = CalculateIntegral(beg, end, initialEpsilon, maximumRecursionDepth);
if (changeSign) return -result;
return result;
}
}
}

View File

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;
namespace GraphingCalculator
{
public class VisualExpression : Expression
{
private static int rand_seed = 0x250D;
#region Variables
private Color color = Colors.Blue;
public Color Color { get { return color; } set { color = value; } }
private double thickness = 2;
public double Thickness { get { return thickness; } set { thickness = value; } }
public bool IsVisible { get; set; }
#endregion
#region Constructors
public VisualExpression() : base()
{
SetRandomColor();
IsVisible = true;
}
public VisualExpression(string expr) : base(expr)
{
SetRandomColor();
IsVisible = true;
}
public VisualExpression(string expr, Color color, double thickness = 2) : base(expr)
{
this.Color = color;
this.Thickness = thickness;
IsVisible = true;
}
#endregion
public void SetRandomColor()
{
Random random = new Random(rand_seed);
rand_seed = 0x51 * (random.Next() - 0xA82F90) * random.Next() - 0x513511;
int r, g, b;
r = random.Next(256);
g = random.Next(256);
b = random.Next(256);
int avg = (r + g + b) / 3;
int min = Math.Min(r, Math.Min(g, b));
if (avg >= 182) {
r -= min; g -= min; b -= min;
}
this.Color = Color.FromRgb(Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));
}
}
}

View File

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{A1B63EB2-82CF-4589-8AE2-18FAAF51B662}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>GraphingCalculator</RootNamespace>
<AssemblyName>GraphingCalculator</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release - Publish|x86'">
<OutputPath>..\..\TibisMathematicsSuite - Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>graphing-logo.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Controls\IntegralWindow.xaml.cs">
<DependentUpon>IntegralWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Controls\EvaluateWindow.xaml.cs">
<DependentUpon>EvaluateWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Expression\Integrator.cs" />
<Compile Include="Expression\VisualExpression.cs" />
<Compile Include="Controls\SettingsWindow.xaml.cs">
<DependentUpon>SettingsWindow.xaml</DependentUpon>
</Compile>
<Page Include="Controls\IntegralWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Controls\EvaluateWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Controls\GraphingCanvas.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Controls\LogWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Bounds.cs" />
<Compile Include="Expression\Expression.cs" />
<Compile Include="Controls\GraphingCanvas.xaml.cs">
<DependentUpon>GraphingCanvas.xaml</DependentUpon>
</Compile>
<Compile Include="IO\ExpressionFile.cs" />
<Compile Include="Log.cs" />
<Compile Include="Controls\LogWindow.xaml.cs">
<DependentUpon>LogWindow.xaml</DependentUpon>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Controls\SettingsWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\ButtonStyle.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\GroupBoxStyle.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\RadioButtonStyle.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\WarningGroupBoxStyle.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Launcher\DynamicLink.csproj">
<Project>{A04B247B-6A95-462B-9E07-3337A1C158F1}</Project>
<Name>Launcher</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Resource Include="graphing-logo.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GraphingCalculator.IO
{
public class ExpressionFile
{
private List<VisualExpression> expressions = new List<VisualExpression>();
public List<VisualExpression> Expressions { get { return expressions; } }
public void SaveToFile(string filename)
{
System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(filename, new System.Xml.XmlWriterSettings() { Indent = true });
writer.WriteStartDocument();
writer.WriteStartElement("Document");
// Write expressions
writer.WriteStartElement("ExpressionList");
foreach (var i in Expressions)
{
writer.WriteStartElement("Expression");
writer.WriteAttributeString("String", i.ExpressionString);
writer.WriteAttributeString("IsVisible", i.IsVisible.ToString());
writer.WriteAttributeString("Color", i.Color.ToString());
foreach (var j in i.Variables)
{
writer.WriteStartElement("Variable");
writer.WriteAttributeString("Key", j.Key);
writer.WriteAttributeString("Value", j.Value.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
}
writer.WriteEndElement();
// Finish
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
}
public void LoadFromFile(string filename)
{
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(filename);
string varKey = "", varVal = "";
VisualExpression expr;
while (reader.Read())
switch (reader.NodeType)
{
case System.Xml.XmlNodeType.Element:
// Read an expression
if (reader.Name == "Expression")
{
expr = new VisualExpression();
while (reader.MoveToNextAttribute()) {
if (reader.Name == "String") expr.ExpressionString = reader.Value;
else if (reader.Name == "IsVisible") expr.IsVisible = bool.Parse(reader.Value);
else if (reader.Name == "Color") expr.Color = (System.Windows.Media.Color) System.Windows.Media.ColorConverter.ConvertFromString(reader.Value);
}
this.Expressions.Add(expr);
}
// A variable
else if (reader.Name == "Variable")
{
while (reader.MoveToNextAttribute()) {
if (reader.Name == "Key") varKey = reader.Value;
else if (reader.Name == "Value") varVal = reader.Value;
}
if (varKey != "")
this.Expressions.Last().Variables[varKey] = double.Parse(varVal);
}
break;
}
reader.Close();
}
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GraphingCalculator
{
public static class Log
{
private static List<string> entries = new List<string>();
public static List<string> Entries { get { return entries; } }
public static void LogEvent (string format, params object[] p)
{
entries.Add(DateTime.Now + ": " + String.Format(format, p));
}
}
}

View File

@ -0,0 +1,163 @@
<Window x:Class="GraphingCalculator.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:GraphingCalculator"
Title="Graphing Calculator" Height="526" Width="891"
MouseWheel="Window_MouseWheel"
KeyDown="Window_KeyDown" Icon="/GraphingCalculator;component/graphing-logo.ico">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles\GroupBoxStyle.xaml" />
<ResourceDictionary Source="Styles\ButtonStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200px" />
<ColumnDefinition Width="5px" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Menu Grid.ColumnSpan="100">
<MenuItem Header="_File">
<MenuItem Name="menuFileSave" Header="Save plotted expressions..."
Click="menuFileSave_Click" InputGestureText="Ctrl+S"/>
<MenuItem Name="menuFileImport" Header="Import..."
Click="menuFileImport_Click" InputGestureText="Ctrl+O"/>
<Separator />
<MenuItem Name="menuFileExit" Header="Exit" Click="menuFileExit_Click"
InputGestureText="Ctrl+Q"/>
</MenuItem>
<MenuItem Header="_Application">
<MenuItem Name="menuAppLog" Header="View log..." Click="menuAppLog_Click"/>
<MenuItem Name="menuAppPref" Header="Preferences" Click="menuAppPref_Click" />
</MenuItem>
<MenuItem Header="_Help">
<MenuItem Name="menuAbout" Header="_About" Click="menuAbout_Click"
InputGestureText="Ctrl+F1"/>
<MenuItem Name="menuHelp" Header="_Help" Click="menuHelp_Click"
InputGestureText="F1"/>
</MenuItem>
</Menu>
<Border Grid.Row="2" Grid.Column="0">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint=".5,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Input box -->
<GroupBox Header="Input" Grid.Row="0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Name="inputExpression"
TextWrapping="Wrap" Height="50px"
Grid.ColumnSpan="10" Margin="0,0,0,1" />
<Button Name="buttonPlot" Grid.Row="1" Grid.Column="0" Click="buttonPlot_Click">Plot</Button>
<Button Name="buttonEvaluate" Grid.Row="1" Grid.Column="1" Click="buttonEvaluate_Click">Evaluate</Button>
<Button Name="buttonIntegrate" Grid.Row="1" Grid.Column="2" Click="buttonIntegrate_Click">Integrate</Button>
</Grid>
</GroupBox>
<!-- Plotted functions list -->
<GroupBox Header="Plotted expressions" Grid.Row="1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox Name="listExpressions" Grid.ColumnSpan="10" Margin="0,0,0,1"/>
<Button Name="buttonDelete" Grid.Row="1" Grid.Column="0" Click="buttonDelete_Click">Delete</Button>
<Button Name="buttonClear" Grid.Row="1" Grid.Column="1" Click="buttonClear_Click">Clear</Button>
<Button Name="buttonHideAll" Grid.Row="1" Grid.Column="2" Click="buttonHideAll_Click">Hide all</Button>
</Grid>
</GroupBox>
<!-- Range box -->
<GroupBox Header="Range" Grid.Row="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" VerticalAlignment="Center">Bottom:</TextBlock>
<TextBlock Grid.Row="1" VerticalAlignment="Center">Left:</TextBlock>
<TextBlock Grid.Row="2" VerticalAlignment="Center">Top:</TextBlock>
<TextBlock Grid.Row="3" VerticalAlignment="Center">Right:</TextBlock>
<TextBox Name="inputBoundsBottom" Grid.Column="1" Grid.Row="0" />
<TextBox Name="inputBoundsLeft" Grid.Column="1" Grid.Row="1" />
<TextBox Name="inputBoundsTop" Grid.Column="1" Grid.Row="2" />
<TextBox Name="inputBoundsRight" Grid.Column="1" Grid.Row="3" />
<Button Name="buttonChangeBounds" Margin="1,2,1,1"
Grid.Row="4" Grid.ColumnSpan="10"
Click="buttonChangeBounds_Click">Change</Button>
</Grid>
</GroupBox>
</Grid>
</Border>
<GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<my:GraphingCanvas x:Name="graphingCanvas" Grid.Column="2" Grid.Row="2" />
</Grid>
</Window>

View File

@ -0,0 +1,389 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GraphingCalculator
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
#region Constructor
public MainWindow()
{
InitializeComponent();
// Update textboxes
graphingCanvas.CanvasBounds.BoundsChanged += new EventHandler(CanvasBounds_BoundsChanged);
graphingCanvas.CanvasBounds.Right = graphingCanvas.CanvasBounds.Right;
}
#endregion
#region Function list
private void updateList()
{
listExpressions.Items.Clear();
foreach (var i in graphingCanvas.Expressions)
{
CheckBox chk = new CheckBox();
chk.Content = i.ExpressionString;
chk.IsChecked = i.IsVisible;
chk.Foreground = new SolidColorBrush(i.Color);
chk.FontWeight = FontWeights.Bold;
chk.Click += new RoutedEventHandler(Visibility_Checked);
listExpressions.Items.Add(chk);
}
}
void Visibility_Checked(object sender, RoutedEventArgs e)
{
int index = listExpressions.Items.IndexOf(sender);
CheckBox c = sender as CheckBox;
if (index < 0 || c == null || !c.IsChecked.HasValue) return;
graphingCanvas.SetExpressionVisibility(index, c.IsChecked.Value);
}
private void buttonDelete_Click(object sender, RoutedEventArgs e)
{
int index = listExpressions.SelectedIndex;
if (index == -1) return;
listExpressions.Items.RemoveAt(index);
graphingCanvas.Expressions.RemoveAt(index);
graphingCanvas.EvaluateExpressions();
graphingCanvas.Redraw();
}
private void buttonClear_Click(object sender, RoutedEventArgs e)
{
listExpressions.Items.Clear();
graphingCanvas.Expressions.Clear();
graphingCanvas.EvaluateExpressions();
graphingCanvas.Redraw();
}
private void buttonHideAll_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < listExpressions.Items.Count; i++)
{
CheckBox c = listExpressions.Items[i] as CheckBox;
if (c != null) c.IsChecked = false;
graphingCanvas.SetExpressionVisibility(i, false);
}
}
#endregion
#region Keyboard/mouse input
private void Window_MouseWheel(object sender, MouseWheelEventArgs e)
{
graphingCanvas.PeformMouseWheelChange(e);
}
private bool EditingTextbox()
{
TextBox box = Keyboard.FocusedElement as TextBox;
return (box != null);
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
if (e.KeyboardDevice.Modifiers == ModifierKeys.None)
{
switch (e.Key)
{
case Key.F1: menuHelp_Click(this, new RoutedEventArgs()); break;
case Key.NumPad8:
case Key.Up:
if (!EditingTextbox()) graphingCanvas.PerformMoveUp();
else e.Handled = false;
break;
case Key.NumPad4:
case Key.Left:
if (!EditingTextbox()) graphingCanvas.PerformMoveLeft();
else e.Handled = false;
break;
case Key.NumPad6:
case Key.Right:
if (!EditingTextbox()) graphingCanvas.PerformMoveRight();
else e.Handled = false;
break;
case Key.NumPad2:
case Key.Down:
if (!EditingTextbox()) graphingCanvas.PerformMoveDown();
else e.Handled = false;
break;
case Key.NumPad5:
if (!EditingTextbox()) graphingCanvas.PerformReset();
else e.Handled = false;
break;
case Key.Add:
if (!EditingTextbox()) graphingCanvas.PerformZoomIn();
else e.Handled = false;
break;
case Key.Subtract:
if (!EditingTextbox()) graphingCanvas.PerformZoomOut();
else e.Handled = false;
break;
case Key.Enter: buttonPlot_Click(this, new RoutedEventArgs()); break;
default: e.Handled = false; break;
}
}
else if (Keyboard.Modifiers == ModifierKeys.Control)
{
if (e.Key == Key.F1) menuAbout_Click(this, new RoutedEventArgs());
else if (e.Key == Key.S) menuFileSave_Click(this, new RoutedEventArgs());
else if (e.Key == Key.O) menuFileImport_Click(this, new RoutedEventArgs());
else if (e.Key == Key.Q) menuFileExit_Click(this, new RoutedEventArgs());
else e.Handled = false;
}
else e.Handled = false;
}
#endregion
#region Buttons
private void buttonPlot_Click(object sender, RoutedEventArgs e)
{
if (inputExpression.Text == "") return;
VisualExpression expr = new VisualExpression();
try
{
expr.ExpressionString = inputExpression.Text;
expr.Process();
expr.Variables["x"] = expr.Variables["X"] = 0;
expr.Evaluate();
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message, "Error!");
#region Log
Log.LogEvent("Failed to plot expression '{0}'. Message: {1}", expr.ExpressionString, ex.Message);
Log.LogEvent("> Stack trace: {0}", ex.StackTrace);
#endregion
return;
}
graphingCanvas.AddExpression(expr);
updateList();
}
private void buttonEvaluate_Click(object sender, RoutedEventArgs e)
{
EvaluateWindow window = new EvaluateWindow(inputExpression.Text);
window.Show();
}
private void buttonIntegrate_Click(object sender, RoutedEventArgs e)
{
Controls.IntegralWindow window = new Controls.IntegralWindow(inputExpression.Text);
window.Show();
}
private bool IsNanInf (params double[] items)
{
bool result = false;
foreach (var i in items)
result = result || double.IsNaN(i) || double.IsInfinity(i);
return result;
}
private void buttonChangeBounds_Click(object sender, RoutedEventArgs e)
{
Expression el, er, et, eb;
double l, r, t, b;
bool ok = true;
// Initialize stuff
el = new Expression(inputBoundsLeft.Text);
er = new Expression(inputBoundsRight.Text);
et = new Expression(inputBoundsTop.Text);
eb = new Expression(inputBoundsBottom.Text);
l = r = t = b = 0;
// Initialize visuals
inputBoundsLeft.Background = SystemColors.WindowBrush;
inputBoundsTop.Background = SystemColors.WindowBrush;
inputBoundsRight.Background = SystemColors.WindowBrush;
inputBoundsBottom.Background = SystemColors.WindowBrush;
// Evaluate left
try { l = el.Evaluate(); }
catch {
if (!double.TryParse(el.ExpressionString, out l)) {
inputBoundsLeft.Background = Brushes.Pink; ok = false;
}
}
// Evaluate top
try { t = et.Evaluate(); }
catch {
if (!double.TryParse(et.ExpressionString, out t)) {
inputBoundsTop.Background = Brushes.Pink; ok = false;
}
}
// Evaluate right
try { r = er.Evaluate(); }
catch {
if (!double.TryParse(er.ExpressionString, out r)) {
inputBoundsRight.Background = Brushes.Pink; ok = false;
}
}
// Evaluate bottom
try { b = eb.Evaluate(); }
catch {
if (!double.TryParse(eb.ExpressionString, out b)) {
inputBoundsBottom.Background = Brushes.Pink; ok = false;
}
}
// Preview results
inputBoundsTop.Text = Math.Round(t, 15).ToString();
inputBoundsLeft.Text = Math.Round(l, 15).ToString();
inputBoundsRight.Text = Math.Round(r, 15).ToString();
inputBoundsBottom.Text = Math.Round(b, 15).ToString();
// Verify
if (ok)
{
if (l >= r || b >= t || IsNanInf(l, r, b, t)) MessageBox.Show("Invalid interval! Make sure left is smaller than right, bottom is smaller than top, and the intervals are finite.", "Error");
else graphingCanvas.SetCanvasBounds(new Bounds(l, t, r, b));
}
}
#endregion
#region Menu items
private void menuFileSave_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.SaveFileDialog save = new Microsoft.Win32.SaveFileDialog();
save.Filter = "XML Expression list|*.xml|All files|*.*";
save.Title = "Save expression list...";
bool? result = save.ShowDialog();
if (!result.HasValue || !result.Value) return;
IO.ExpressionFile file = new IO.ExpressionFile();
file.Expressions.AddRange(graphingCanvas.Expressions);
try { file.SaveToFile(save.FileName); }
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message, "Error!");
Log.LogEvent("Failed to save to file '{0}': {1}", save.FileName, ex.Message);
Log.LogEvent("> Stack trace: {0}", ex.StackTrace);
}
}
private void menuFileImport_Click(object sender, RoutedEventArgs e)
{
IO.ExpressionFile file = new IO.ExpressionFile();
Microsoft.Win32.OpenFileDialog open = new Microsoft.Win32.OpenFileDialog();
bool? res;
// Show dialog
open.Filter = "XML Expression list|*.xml|All files|*.*";
open.Title = "Import expression list";
res = open.ShowDialog();
if (!res.HasValue || !res.Value) return;
// Try to load data
try {
file.LoadFromFile(open.FileName);
}
catch (Exception ex) {
MessageBox.Show("Error: " + ex.Message, "Error!");
Log.LogEvent("Failed to import from file '{0}': {1}", open.FileName, ex.Message);
Log.LogEvent("> Stack trace: {0}", ex.StackTrace);
}
// Add expressions to our list
foreach (var i in file.Expressions)
this.graphingCanvas.AddExpression(i);
updateList();
}
private void menuFileExit_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void menuAppLog_Click(object sender, RoutedEventArgs e)
{
new LogWindow().Show();
}
private void menuAppPref_Click(object sender, RoutedEventArgs e)
{
new SettingsWindow().ShowDialog();
graphingCanvas.SetCanvasBounds(graphingCanvas.CanvasBounds);
}
private void menuHelp_Click(object sender, RoutedEventArgs e)
{
DynamicLink.Launcher.StartModule("Help", "graphingcalc");
}
private void menuAbout_Click(object sender, RoutedEventArgs e)
{
DynamicLink.Launcher.About();
}
#endregion
#region Misc
void CanvasBounds_BoundsChanged(object sender, EventArgs e)
{
int p = GraphingCalculator.Properties.Settings.Default.RoundDoublesGraph;
this.inputBoundsBottom.Text = Math.Round(graphingCanvas.CanvasBounds.Bottom, p).ToString();
this.inputBoundsLeft.Text = Math.Round(graphingCanvas.CanvasBounds.Left, p).ToString();
this.inputBoundsTop.Text = Math.Round(graphingCanvas.CanvasBounds.Top, p).ToString();
this.inputBoundsRight.Text = Math.Round(graphingCanvas.CanvasBounds.Right, p).ToString();
#region Log
Log.LogEvent("Canvas bounds changed: left={0}; top={1}; right={2}; bottom={3}", this.inputBoundsLeft.Text,
this.inputBoundsTop.Text, this.inputBoundsRight.Text, this.inputBoundsBottom.Text);
#endregion
}
#endregion
}
}

View File

@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Graphing Calculator")]
[assembly: AssemblyDescription("Plots expressions, and calculates integrals and limits.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Tibi Software")]
[assembly: AssemblyProduct("Tibi's Mathematics Suite")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GraphingCalculator.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GraphingCalculator.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,86 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GraphingCalculator.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("600")]
public double PlotPrecision {
get {
return ((double)(this["PlotPrecision"]));
}
set {
this["PlotPrecision"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("41")]
public double GridDensity {
get {
return ((double)(this["GridDensity"]));
}
set {
this["GridDensity"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("4")]
public int RoundDoublesGraph {
get {
return ((int)(this["RoundDoublesGraph"]));
}
set {
this["RoundDoublesGraph"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0.1")]
public double NavigationSensitivity {
get {
return ((double)(this["NavigationSensitivity"]));
}
set {
this["NavigationSensitivity"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("1.075")]
public double ZoomSensitivity {
get {
return ((double)(this["ZoomSensitivity"]));
}
set {
this["ZoomSensitivity"] = value;
}
}
}
}

View File

@ -0,0 +1,21 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="GraphingCalculator.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="PlotPrecision" Type="System.Double" Scope="User">
<Value Profile="(Default)">600</Value>
</Setting>
<Setting Name="GridDensity" Type="System.Double" Scope="User">
<Value Profile="(Default)">41</Value>
</Setting>
<Setting Name="RoundDoublesGraph" Type="System.Int32" Scope="User">
<Value Profile="(Default)">4</Value>
</Setting>
<Setting Name="NavigationSensitivity" Type="System.Double" Scope="User">
<Value Profile="(Default)">0.1</Value>
</Setting>
<Setting Name="ZoomSensitivity" Type="System.Double" Scope="User">
<Value Profile="(Default)">1.075</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -0,0 +1,55 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="Button">
<Setter Property="Margin" Value="1" />
<Setter Property="MinHeight" Value="22" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="border" Padding="2" CornerRadius="4"
BorderBrush="Gray" BorderThickness="1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFF" Offset="0" />
<GradientStop Color="#C8C8C8" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#BBB" Offset="0" />
<GradientStop Color="#DDD" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,40 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="GroupBox">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GroupBox">
<Border Background="#FAF8F8"
BorderBrush="White"
BorderThickness="1"
CornerRadius="5"
Margin="4">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<ContentPresenter Margin="3,0,0,0" ContentSource="Header" >
<ContentPresenter.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Gray" />
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
<ContentPresenter HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Margin="4" Grid.Row="1" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,63 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="RadioButton">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid>
<Border Name="border" BorderBrush="Gray" BorderThickness="1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#EEE" Offset="0" />
<GradientStop Color="#BBB" Offset="1" />
</LinearGradientBrush>
</Border.Background>
</Border>
<ContentPresenter Margin="4,1,4,1" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Background" Value="White">
<Setter TargetName="border" Property="CornerRadius" Value="5,0,0,5" />
<Setter TargetName="border" Property="BorderThickness" Value="1,1,0,1" />
</Trigger>
<Trigger Property="Background" Value="Black">
<Setter TargetName="border" Property="CornerRadius" Value="0,5,5,0" />
<Setter TargetName="border" Property="BorderThickness" Value="1,1,1,1" />
</Trigger>
<Trigger Property="Background" Value="Gray">
<Setter TargetName="border" Property="CornerRadius" Value="0" />
<Setter TargetName="border" Property="BorderThickness" Value="1,1,0,1" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FFF" Offset="0" />
<GradientStop Color="#C8C8C8" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="border" Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#BBB" Offset="0" />
<GradientStop Color="#DDD" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,58 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="WarningGroupBox" TargetType="{x:Type GroupBox}">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupBox}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Border Grid.RowSpan="2" BorderBrush="Yellow"
BorderThickness="1" CornerRadius="5" >
<Border.Background>
<LinearGradientBrush MappingMode="Absolute"
SpreadMethod="Repeat"
StartPoint="0,0"
EndPoint="5,5">
<GradientStop Color="#fde245" Offset=".5" />
<GradientStop Color="#caae65" Offset=".5" />
</LinearGradientBrush>
</Border.Background>
</Border>
<Border Grid.RowSpan="2" CornerRadius="5">
<Border.Background>
<RadialGradientBrush GradientOrigin=".5,0" Center=".5,.1"
RadiusX=".9" RadiusY=".8" >
<GradientStop Color="#e0FFFFFF" Offset="0" />
<GradientStop Color="#10FFFFFF" Offset="1" />
</RadialGradientBrush>
</Border.Background>
</Border>
<ContentPresenter Margin="7,4,4,0" ContentSource="Header" >
<ContentPresenter.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="#835f01" />
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
<ContentPresenter HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Margin="5" Grid.Row="1" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="GraphingCalculator.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<GraphingCalculator.Properties.Settings>
<setting name="PlotPrecision" serializeAs="String">
<value>600</value>
</setting>
<setting name="GridDensity" serializeAs="String">
<value>41</value>
</setting>
<setting name="RoundDoublesGraph" serializeAs="String">
<value>4</value>
</setting>
<setting name="NavigationSensitivity" serializeAs="String">
<value>0.1</value>
</setting>
<setting name="ZoomSensitivity" serializeAs="String">
<value>1.075</value>
</setting>
</GraphingCalculator.Properties.Settings>
</userSettings>
</configuration>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

8
Source/Help/App.xaml Normal file
View File

@ -0,0 +1,8 @@
<Application x:Class="Help.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

42
Source/Help/App.xaml.cs Normal file
View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace Help
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// We need to initialize the help system now
try
{
string file = DynamicLink.Launcher.FindHelpFiles();
if (System.IO.File.Exists(file))
HelpSystem.HelpManager.Load(file);
else Properties["ERROR"] = new Exception("Could not find index file documentation\\index.xml.");
}
catch (Exception ex)
{
Properties["ERROR"] = ex;
}
// Check if we were asked to load anything
if (e.Args.Length != 0)
{
Properties["APPLICATION"] = e.Args[0];
}
// Continue
base.OnStartup(e);
}
}
}

733
Source/Help/Help.csproj Normal file
View File

@ -0,0 +1,733 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{5BF4AB9C-9AE0-44ED-B49E-09ACE92C8D89}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Help</RootNamespace>
<AssemblyName>Help</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>help-logo.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release - Publish|x86'">
<OutputPath>..\..\TibisMathematicsSuite - Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="HelpSystem\HelpChapter.cs" />
<Compile Include="HelpSystem\HelpHtmlWrapper.cs" />
<Compile Include="HelpSystem\HelpManager.cs" />
<Compile Include="HelpSystem\HelpTopic.cs" />
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Styles\SearchTextbox.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="documentation\apps\factorizator\index.bak">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\integrate.bak">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\language.bak">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\troubleshooting.bak">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\index.bak">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\index.bak">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\help-logo-small.png.old">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\matrixcalc-logo-2.ico.old">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\matrixcalc-logo-2.png.old">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\matrixcalc-logo.png.old">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\printable-new.indd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\printable-old.odt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\printable.pdf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\banner.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\factorizator-logo.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\graphing-logo.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\help-home.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\help-icons.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\help-logo.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\icon-calculator.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\matrixcalc-logo.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\suite.psd">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Launcher\DynamicLink.csproj">
<Project>{A04B247B-6A95-462B-9E07-3337A1C158F1}</Project>
<Name>Launcher</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<COMReference Include="MSHTML">
<Guid>{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}</Guid>
<VersionMajor>4</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>primary</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-back.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-clear.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-forward.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-home.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-logo-small.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-search.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\help-searchopt.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="help-logo.ico" />
</ItemGroup>
<ItemGroup>
<None Include="documentation\apps\calculator\2ndf.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\abs.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\buttons.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\combinatorics.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\constants.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-2ndf0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-2ndf1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-abs-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-abs-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq2.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq3.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq4.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq5.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-combinatorics-eq6.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-constants-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-constants-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-constants-eq2.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-int-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-int-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-int-eq2.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-int-eq3.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-int-eq4.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-inverse-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\calc-ui.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\img\link.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\index.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\int.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\inverse.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\keyshortcuts.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\logexp.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\pow.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\calculator\trigonometric.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\factorizator\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\factorizator\img\interface.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\factorizator\img\link.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\factorizator\index.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\factorizator\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\evaluate.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\export-import.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\eval0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\eval1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\plot0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\plot1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\plot2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\plot3.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\plot4.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\pref0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\pref1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\img\pref2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\index.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\integrate.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\language.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\plot.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\preferences.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\graphing\troubleshooting.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\img\help-app-toolbar.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\img\help-nav.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\img\help-search.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\index.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\help\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\hotkeys.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\img\suite-hotkeys0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\img\suite0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\index.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\main\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\basic.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\buttons.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\calc.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\editor.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-basic0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-basic1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-basic2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-calc0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-calc1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-calc2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-calc3.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\img\matrix-editor0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\index.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\keyshortcuts.htm">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\apps\matrixcalc\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\calculator-logo.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\calculator-logo.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\factorizator-logo.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\factorizator-logo.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\graphing-logo.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\graphing-logo.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\help-logo.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\help-logo.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\matrixcalc-logo.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\matrixcalc-logo.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\suite.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\icons\suite.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\background.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-2ndf0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-2ndf1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-abs-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-abs-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq2.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq3.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq4.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq5.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-combinatorics-eq6.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-constants-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-constants-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-constants-eq2.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-int-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-int-eq1.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-int-eq2.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-int-eq3.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-int-eq4.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-inverse-eq0.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\calc-ui.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\help-back.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\help-clear.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\help-forward.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\help-home.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\help-search.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\help-searchopt.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\link.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-basic0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-basic1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-basic2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-calc0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-calc1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-calc2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-calc3.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\matrix-editor0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\suite-hotkeys0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\suite-updates0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\img\suite0.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\index.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\resources\banner-noback.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\resources\banner.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\style.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\banner-noback.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\banner.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\3.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\4.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\5.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\6.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\7.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\8.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\9.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\A.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\B.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\C.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\D.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\E.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\F.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\G.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\H.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\I.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\numbers\J.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="documentation\temp\suite.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Help.HelpSystem
{
public class HelpChapter
{
private List<HelpTopic> topics = new List<HelpTopic>();
public List<HelpTopic> Topics { get { return topics; } }
public string Application { get; set; }
public string Title { get; set; }
public string Filename { get; set; }
public HelpChapter(string app = "", string title = "", string filename = "")
{
Application = app; Title = title; Filename = filename;
}
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Help.HelpSystem
{
public static class HelpHtmlWrapper
{
public static void Find(object Document, string text)
{
var doc = Document as mshtml.IHTMLDocument2;
if (doc == null || doc.body == null || text == "") return;
string html = doc.body.innerHTML;
string temp = "";
int index = html.IndexOf(text, StringComparison.CurrentCultureIgnoreCase);
while (index != -1)
{
int min = html.IndexOf('<', index);
int max = html.IndexOf('>', index);
if (min <= max)
{
temp = "<span style=\"background: magenta;\">" + html.Substring(index, text.Length) + "</span>";
html = html.Substring(0, index) + temp + html.Substring(index + text.Length);
index += temp.Length - text.Length;
}
index = html.IndexOf(text, index + 1, StringComparison.CurrentCultureIgnoreCase);
}
doc.body.innerHTML = html;
}
public static string GetHtml(object document)
{
var doc = document as mshtml.IHTMLDocument2;
if (doc == null || doc.body == null) return "";
return doc.body.innerHTML;
}
public static void SetHtml(object document, string html)
{
var doc = document as mshtml.IHTMLDocument2;
if (doc == null || doc.body == null) return;
doc.body.innerHTML = html;
}
}
}

View File

@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace Help.HelpSystem
{
static class HelpManager
{
public static List<HelpChapter> Chapters = new List<HelpChapter>();
public static string DocumentationPath = "";
public static string GetFullPath(string relative)
{
return System.IO.Path.Combine(DocumentationPath, relative);
}
public static void Load(string indexfile)
{
XmlTextReader reader = new XmlTextReader(indexfile);
HelpChapter currentChapter = new HelpChapter();
HelpTopic currentTopic = new HelpTopic();
bool isTopic = false;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name == "chapter")
{
isTopic = false;
currentChapter = new HelpChapter();
}
else if (reader.Name == "topic")
{
isTopic = true;
currentTopic = new HelpTopic();
}
while (reader.MoveToNextAttribute())
{
switch (reader.Name)
{
case "application": if (!isTopic) currentChapter.Application = reader.Value; break;
case "title":
if (isTopic) currentTopic.Title = reader.Value;
else currentChapter.Title = reader.Value;
break;
case "filename":
if (isTopic) currentTopic.Filename = reader.Value;
else currentChapter.Filename = reader.Value;
break;
}
}
if (isTopic) currentChapter.Topics.Add(currentTopic);
break;
case XmlNodeType.EndElement:
if (reader.Name == "topic") currentChapter.Topics.Add(currentTopic);
else if (reader.Name == "chapter") Chapters.Add(currentChapter);
break;
}
}
reader.Close();
DocumentationPath = System.IO.Path.GetDirectoryName(indexfile);
}
private static string[] FindInFile(string file, string q)
{
int min, max;
string text = System.IO.File.ReadAllText(file);
List<string> ret = new List<string>();
// Remove html tags
min = text.IndexOf('<');
max = text.IndexOf('>');
while (min != -1 && max != -1 && min < max)
{
text = text.Remove(min, max - min + 1);
min = text.IndexOf('<');
max = text.IndexOf('>');
}
// Search each line
foreach (var line in text.Split('\n', '\r'))
if (line.ToLower().Contains(q.ToLower())) ret.Add(line.TrimStart(' ', '\t', '\n', '\r'));
return ret.ToArray();
}
public static HelpTopic[] SearchText(string text, HelpChapter chapter)
{
var list = new List<HelpTopic>();
// Make a list of files to be checked
var temp = new List<HelpTopic>();
temp.Add(new HelpTopic(chapter.Title, chapter.Filename));
temp.AddRange(chapter.Topics);
// Search
foreach (var top in temp)
{
string[] f = FindInFile(GetFullPath(top.Filename), text);
foreach (var i in f)
list.Add(new HelpTopic()
{
Title = top.Title,
Filename = top.Filename,
Context = i,
IsSearchResult = true
});
}
return list.ToArray();
}
public static HelpTopic[] SearchTitle(string text, HelpChapter chapter)
{
return chapter.Topics.Where(x => x.Title.ToLower().Contains(text.ToLower())).ToArray();
}
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Help.HelpSystem
{
public class HelpTopic
{
public string Title { get; set; }
public string Filename { get; set; }
public string Context { get; set; }
public bool IsSearchResult { get; set; }
public HelpTopic(string title = "", string filename = "", string context = "")
{
Title = title; Filename = filename;
Context = context;
IsSearchResult = (context != "");
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

137
Source/Help/MainWindow.xaml Normal file
View File

@ -0,0 +1,137 @@
<Window x:Class="Help.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Help" Height="550" Width="900" WindowStartupLocation="Manual"
Icon="/Help;component/help-logo.ico">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/SearchTextbox.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200px" Name="asdf"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ToolBarTray Grid.ColumnSpan="100">
<ToolBar Name="toolbarNavigation" >
<TextBlock VerticalAlignment="Center" Margin="2,0,5,0"
Foreground="Gray">Navigation:</TextBlock>
<Button Name="bBrowseBack" ToolTip="Back"
Click="bBrowseBack_Click"
IsEnabled="False"
IsEnabledChanged="Button_IsEnabledChanged">
<Image Width="16" Height="16" Source="/Help;component/Images/help-back.png" />
</Button>
<Button Name="bBrowseForward" ToolTip="Forward"
Click="bBrowseForward_Click"
IsEnabled="False"
IsEnabledChanged="Button_IsEnabledChanged">
<Image Width="16" Height="16" Source="/Help;component/Images/help-forward.png" />
</Button>
<Separator />
<Button Name="bBrowseHome" ToolTip="Home"
Click="bBrowseHome_Click">
<Image Width="16" Height="16" Source="/Help;component/Images/help-home.png" />
</Button>
</ToolBar>
<ToolBar Name="toolbarApplication">
<TextBlock VerticalAlignment="Center" Margin="2,0,5,0"
Foreground="Gray">Application:</TextBlock>
<ComboBox Name="listChapters" Width="130"
SelectionChanged="listChapters_SelectionChanged" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</ToolBar>
<ToolBar Name="toolbarSearch" >
<TextBox Name="textSearch" Style="{StaticResource SearchBoxStyle}"
Width="150" KeyDown="textSearch_KeyDown"
/>
<Button Name="bSearch"
ToolTip="Search"
IsEnabledChanged="Button_IsEnabledChanged"
Click="bSearch_Click">
<Image Width="16" Height="16" Source="/Help;component/Images/help-search.png" />
</Button>
<Button Name="bClear" Visibility="Collapsed"
ToolTip="Clear search"
IsEnabledChanged="Button_IsEnabledChanged"
Click="bClear_Click">
<Image Width="16" Height="16" Source="/Help;component/Images/help-clear.png" />
</Button>
<Button Name="bSearchOptions" ToolTip="Search options"
Click="bSearchOptions_Click"
IsEnabledChanged="Button_IsEnabledChanged">
<Image Width="16" Height="16" Source="/Help;component/Images/help-searchopt.png" />
<Button.ContextMenu>
<ContextMenu>
<RadioButton Name="searchTitleOnly" IsChecked="True">Search title</RadioButton>
<RadioButton Name="searchContent">Search content</RadioButton>
<RadioButton Name="searchPage" >Search in current page</RadioButton>
</ContextMenu>
</Button.ContextMenu>
</Button>
</ToolBar>
</ToolBarTray>
<ListView
Name="listTopics"
Grid.Row="2" Grid.Column="0"
SelectionChanged="listTopics_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Title}" />
<TextBlock Name="context" Foreground="DarkGray"
FontSize="10"
Margin="0,0,0,5" Text="{Binding Context}"
Visibility="Collapsed"/>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSearchResult}" Value="True">
<Setter TargetName="context" Property="Visibility" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<GridSplitter Grid.Row="1" Grid.RowSpan="2" Grid.Column="1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"></GridSplitter>
<WebBrowser Name="webBrowser" Grid.Row="2" Grid.Column="2"
Navigated="webBrowser_Navigated" />
</Grid>
</Window>

View File

@ -0,0 +1,219 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Help
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
string searchSavedHtml = string.Empty;
int searchLastType = -1;
public MainWindow()
{
InitializeComponent();
PopulateChapters();
if (HelpSystem.HelpManager.Chapters.Count != 0)
PopulateTopics();
// Check for errors, exceptions
if (Application.Current.Properties.Contains("ERROR"))
{
var ex = Application.Current.Properties["ERROR"] as Exception;
if (ex != null) MessageBox.Show(ex.Message, "Could not load the help documents.", MessageBoxButton.OK, MessageBoxImage.Error);
}
// Check for arguments
if (Application.Current.Properties.Contains("APPLICATION"))
SetApplication(Application.Current.Properties["APPLICATION"].ToString());
}
public void SetApplication(string application)
{
int item = HelpSystem.HelpManager.Chapters.FindIndex(x => x.Application == application);
if (item != -1) this.listChapters.SelectedItem = HelpSystem.HelpManager.Chapters[item];
}
#region Populate routines
public void PopulateChapters()
{
foreach (var i in HelpSystem.HelpManager.Chapters)
listChapters.Items.Add(i);
listChapters.SelectedIndex = 0;
}
public void PopulateTopics()
{
var chapter = listChapters.SelectedItem as HelpSystem.HelpChapter;
if (chapter == null) return;
this.listTopics.Items.Clear();
// Populate
foreach (var i in chapter.Topics)
listTopics.Items.Add(i);
}
public void PopulateTopics(IEnumerable<HelpSystem.HelpTopic> topics)
{
this.listTopics.Items.Clear();
foreach (var i in topics) listTopics.Items.Add(i);
}
#endregion
#region User input
private void Button_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Button b = sender as Button;
if (b == null) return;
b.Opacity = (b.IsEnabled) ? 1.0 : .5;
}
#region Search function
private void bSearchOptions_Click(object sender, RoutedEventArgs e)
{
bSearchOptions.ContextMenu.IsOpen = true;
}
private void bSearchHandler()
{
if (textSearch.Text == "") return;
// Hide search button, and show clear button
bClear.Visibility = System.Windows.Visibility.Visible;
bSearch.Visibility = System.Windows.Visibility.Collapsed;
// Clear previous searches
if (searchLastType != -1) clearSearchCommon();
// Search title only
if (searchTitleOnly.IsChecked.HasValue && searchTitleOnly.IsChecked.Value)
{
var temp = listChapters.SelectedItem as HelpSystem.HelpChapter;
if (temp == null) return;
listTopics.Items.Clear();
PopulateTopics(HelpSystem.HelpManager.SearchTitle(textSearch.Text, temp));
}
else if (searchContent.IsChecked.HasValue && searchContent.IsChecked.Value)
{
var temp = listChapters.SelectedItem as HelpSystem.HelpChapter;
if (temp == null) return;
listTopics.Items.Clear();
PopulateTopics(HelpSystem.HelpManager.SearchText(textSearch.Text, temp));
}
else if (searchPage.IsChecked.HasValue && searchPage.IsChecked.Value)
{
searchSavedHtml = HelpSystem.HelpHtmlWrapper.GetHtml(webBrowser.Document);
HelpSystem.HelpHtmlWrapper.Find(webBrowser.Document, textSearch.Text);
searchLastType = 3;
}
}
private void clearSearchCommon()
{
if (searchLastType == 3) HelpSystem.HelpHtmlWrapper.SetHtml(webBrowser.Document, searchSavedHtml);
else PopulateTopics();
searchLastType = -1;
}
private void bClear_Click(object sender, RoutedEventArgs e)
{
bClear.Visibility = System.Windows.Visibility.Collapsed;
bSearch.Visibility = System.Windows.Visibility.Visible;
textSearch.Clear();
clearSearchCommon();
}
private void bSearch_Click(object sender, RoutedEventArgs e)
{
bSearchHandler();
}
private void textSearch_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
e.Handled = true;
bSearchHandler();
}
}
#endregion
#region Web Browser
private void bBrowseBack_Click(object sender, RoutedEventArgs e)
{
webBrowser.GoBack();
}
private void bBrowseForward_Click(object sender, RoutedEventArgs e)
{
webBrowser.GoForward();
}
private void bBrowseHome_Click(object sender, RoutedEventArgs e)
{
var item = listChapters.SelectedItem as HelpSystem.HelpChapter;
if (item != null) webBrowser.Navigate(new Uri(HelpSystem.HelpManager.GetFullPath(item.Filename)));
}
private void webBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
if (searchLastType == 3) bClear_Click(this, new RoutedEventArgs());
bBrowseBack.IsEnabled = webBrowser.CanGoBack;
bBrowseForward.IsEnabled = webBrowser.CanGoForward;
}
#endregion
#region Navigation
private void listTopics_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var sel = listTopics.SelectedItem as HelpSystem.HelpTopic;
if (sel != null) webBrowser.Navigate(new Uri(HelpSystem.HelpManager.GetFullPath(sel.Filename)));
}
private void listChapters_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var sel = listChapters.SelectedItem as HelpSystem.HelpChapter;
if (sel != null)
{
webBrowser.Navigate(new Uri(HelpSystem.HelpManager.GetFullPath(sel.Filename)));
PopulateTopics();
}
}
#endregion
#endregion
}
}

View File

@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Help")]
[assembly: AssemblyDescription("Displays help content.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Tibi Software")]
[assembly: AssemblyProduct("Tibi's Mathematics Suite")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Help.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Help.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.261
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Help.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,43 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="SearchBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="MinHeight" Value="20" />
<Setter Property="MinWidth" Value="100" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border Name="border"
Background="White"
BorderBrush="White" BorderThickness="1"
Padding="4,2,4,2">
<Grid>
<TextBlock Name="text" Visibility="Hidden"
VerticalAlignment="Center"
Foreground="Gray"
FontStyle="Italic">Search</TextBlock>
<ScrollViewer VerticalAlignment="Center" x:Name="PART_ContentHost" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Text" Value="">
<Setter TargetName="text" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="text" Property="Visibility" Value="Hidden" />
<Setter TargetName="border" Property="BorderBrush" Value="DodgerBlue" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="DodgerBlue" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -0,0 +1,50 @@
<!-- saved from url=(0014)about:internet -->
<html>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<head>
<title>Scientific Calculator: 2nd function button</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Scientific Calculator: 2nd function button</h1>
<div class="section">
<h2>Content</h2>
<ul>
<li><a href="#description">Description</a></li>
<li><a href="#example">Example</a></li>
</ul>
</div>
<div class="section">
<div class="captioned_image_right" >
<img class="shadow" src="img/calc-2ndf0.png"/><br>
<span style="font-size: 10pt"> When activated, an indicator shows up on the display. </span>
</div>
<a name="description"></a>
<h2>Description</h2>
<p>The 2nd function button is used to <strong>change the function of a button</strong> when clicked.</p>
<p>Usually, the 2nd function is the inverse of the function the button is assigned to. The exact function is displayed in <strong>gray above each button</strong>. You can find more information about the function and 2nd function of a button when hovering over the button with the mouse.</p>
<p>You can also use the 2nd function of a button using the <strong>right mouse button</strong>.</p>
</div>
<div class="section">
<a name="description"></a>
<h2>Example</h2>
<img class="shadow" src="img/calc-2ndf1.png" style="float:left; margin-right:10px; margin-bottom:10px; "/>
<p>To calculate the square root of a number, you have to press <i>2ndf</i> and then the <i>x<sup>2</sup></i> button. </p>
<p><strong>Note: </strong>You can also right click the <i>x<sup>2</sup></i> button.</p>
</div>
<div class="footer">
Software created by Chibici Tiberiu.
Contact: <a href="mailto:chibicitiberiu@gmail.com">chibicitiberiu@gmail.com</a>
</div>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!-- saved from url=(0014)about:internet -->
<html>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<head>
<title>Scientific Calculator: Absolute</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Scientific Calculator: Absolute</h1>
<div class="section">
<h2>Content</h2>
<ul>
<li><a href="#description">Description</a></li>
<li><a href="#example">Example</a></li>
</ul>
</div>
<div class="section">
<a name="description"></a>
<h2>Description</h2>
<p>In mathematics, the absolute (modulus) of a number, denoted by <strong>|n|</strong>, is equal to the number without regard to its sign. </p>
</div>
<div class="section">
<a name="description"></a>
<h2>Examples</h2>
<img class="maths" src="img/calc-abs-eq0.gif"><br />
<img class="maths" src="img/calc-abs-eq1.gif">
</div>
<div class="footer">
Software created by Chibici Tiberiu.
Contact: <a href="mailto:chibicitiberiu@gmail.com">chibicitiberiu@gmail.com</a>
</div>
</body>
</html>

View File

@ -0,0 +1,377 @@
<!-- saved from url=(0014)about:internet -->
<html>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<head>
<title>Scientific Calculator: Buttons</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<style type="text/css">
td.but {
border: 1px solid black;
border-radius: 5px;
padding: 2px;
margin: -2px;
font-size: 10pt;
text-align: center;
}
td.but2 {
margin-top: 5px;
font-size: 9pt;
text-align: center;
color:gray;
padding: 0;
}
th {
text-align: left;
font-size: 9pt;
}
th#main {
width: 100%;
padding-left: 10px;
}
td {
font-size: 11pt;
padding-left: 10px;
}
td.r {
text-align: right;
}
</style>
</head>
<body>
<h1>Scientific Calculator: Buttons</h1>
<div class="section">
<h2>Buttons</h2>
<table>
<tr>
<th>Button </th> <th id="main">Description </th> <th>Article</th>
</tr>
<tr>
<td class="but">+</td>
<td>Adds a number to another.</td>
</tr>
<tr>
<td class="but">-</td>
<td>Subtracts a number from another.</td>
</tr>
<tr>
<td class="but">*</td>
<td>Multiplies 2 numbers.</td>
</tr>
<tr>
<td class="but">/</td>
<td>Divide a number by another.</td>
</tr>
<tr>
<td class="but">±</td>
<td>Toggle sign.</td>
</tr>
<tr>
<td class="but">MOD</td>
<td>Calculates the remainder of division between 2 numbers.</td>
</tr>
<tr>
<td class="but">AC</td>
<td>Resets any calculation.</td>
</tr>
<tr>
<td class="but">Clear</td>
<td>Deletes the current number.</td>
</tr>
<tr>
<td class="but">&#9003;</td>
<td>Removes the last inserted number.</td>
</tr>
<tr> <td>&nbsp;</td></tr>
<tr>
<td class="but">Help</td>
<td>Opens help for the application.</td>
</tr>
<tr>
<td class="but">M+</td>
<td>Adds the number on the display to memory.</td>
</tr>
<tr>
<td class="but">M-</td>
<td>Subtracts the number on the display from memory.</td>
</tr>
<tr>
<td class="but">MC</td>
<td><em>Memory Clear:</em> Clears the memory content.</td>
</tr>
<tr>
<td class="but">MS</td>
<td><em>Memory Set:</em> Sets the memory content to the number on the display.</td>
</tr>
<tr>
<td class="but">MR</td>
<td><em>Memory Recall:</em> Displays the memory content on the display.</td>
</tr>
<tr> <td>&nbsp;</td></tr>
<tr>
<td class="but">2ndf</td>
<td>Activates alternative function for the next button pressed.</td>
<td class="r"><a href="2ndf.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but2">e<sup>n</sup></td>
<td>Exponential function.</td>
<!-- <td class="r"><a href="logexp.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">ln</td>
<td>Calculates natural logarithm.</td>
<!-- <td class="r"><a href="logexp.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2">10<sup>n</sup></td>
<td>Calculates 10 at nth power.</td>
<!-- <td class="r"><a href="logexp.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">log</td>
<td>Calculates decimal logarithm.</td>
<!-- <td class="r"><a href="logexp.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">log<sub>n</sub> x</td>
<td>Calculates logarithm of x in base n.</td>
<!-- <td class="r"><a href="logexp.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr> <td>&nbsp;</td></tr>
<tr>
<td class="but2">{x}</td>
<td>Calculates fractional part of a number.</td>
<td class="r"><a href="int.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but">[x]</td>
<td>Calculates integer part of a number.</td>
<td class="r"><a href="int.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but2">-Abs</td>
<td>Calculates negative absolute of a number.</td>
<td class="r"><a href="abs.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but">Abs</td>
<td>Calculates absolute of a number.</td>
<td class="r"><a href="abs.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but">1/x</td>
<td>Calculates the multiplicative inverse of a number.</td>
<td class="r"><a href="inverse.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but2"><sup>n</sup>&#8730;x</td>
<td>Calculates nth root of a number.</td>
<!-- <td class="r"><a href="pow.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">x<sup>n</sup></td>
<td>Calculates x at nth power.</td>
<!-- <td class="r"><a href="pow.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr> <td>&nbsp;</td></tr>
<tr>
<td class="but2">arcsin</td>
<td>Calculates arcsine of a number (result is in radians).</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">sin</td>
<td>Calculates sine of a number (in radians).</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2">arccos</td>
<td>Calculates arccosine of a number (result is in radians).</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">cos</td>
<td>Calculates cosine of a number (in radians).</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2">arctan</td>
<td>Calculates arctangent of a number (result is in radians).</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">tan</td>
<td>Calculates tangent of a number (in radians).</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2">&#8730;x</td>
<td>Calculates square root of a number.</td>
<!-- <td class="r"><a href="pow.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">x<sup>2</sup></td>
<td>Calculates x squared.</td>
<!-- <td class="r"><a href="pow.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr> <td>&nbsp;</td></tr>
<tr>
<td class="but2">arcsinh</td>
<td>Calculates hyperbolic arcsine of a number.</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">sinh</td>
<td>Calculates hyperbolic sine of a number.</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2">arccosh</td>
<td>Calculates hyperbolic arccosine of a number.</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">cosh</td>
<td>Calculates hyperbolic cosine of a number.</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2">arctanh</td>
<td>Calculates hyperbolic arctangent of a number.</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">tanh</td>
<td>Calculates hyperbolic tangent of a number.</td>
<!-- <td class="r"><a href="trigonometric.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but2"><sup>3</sup>&#8730;x</td>
<td>Calculates cube root of a number.</td>
<!-- <td class="r"><a href="pow.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr>
<td class="but">x<sup>3</sup></td>
<td>Calculates cube of x.</td>
<!-- <td class="r"><a href="pow.htm"><img src="img/link.png" /></a></td> -->
</tr>
<tr> <td>&nbsp;</td></tr>
<tr>
<td class="but2" style="font-family: serif;">2&pi;</td>
<td>Displays double value of pi.</td>
<td class="r"><a href="constants.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but" style="font-family: serif;">2&pi;</td>
<td>Displays pi constant.</td>
<td class="r"><a href="constants.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but">e</td>
<td>Displays e constant.</td>
<td class="r"><a href="constants.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but2">xPy</td>
<td>Calculates arrangements of y items from x.</td>
<td class="r"><a href="combinatorics.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but">xCy</td>
<td>Calculates combinations of y items from x.</td>
<td class="r"><a href="combinatorics.htm"><img src="img/link.png" /></a></td>
</tr>
<tr>
<td class="but">x!</td>
<td>Calculates factorial of x.</td>
<td class="r"><a href="combinatorics.htm"><img src="img/link.png" /></a></td>
</tr>
</table>
<br />
</div>
<div class="footer">
Software created by Chibici Tiberiu.
Contact: <a href="mailto:chibicitiberiu@gmail.com">chibicitiberiu@gmail.com</a>
</div>
</body>
</html>

View File

@ -0,0 +1,90 @@
<!-- saved from url=(0014)about:internet -->
<html>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<head>
<title>Scientific Calculator: Combinatorics</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Scientific Calculator: Combinatorics</h1>
<div class="section">
<h2>Content</h2>
<ul>
<li><a href="#fact">Factorial</a></li>
<li><a href="#perm">Permutations</a></li>
<li><a href="#permk">Permutations of k objects</a></li>
<li><a href="#comb">Combinations</a></li>
</ul>
</div>
<div class="section">
<a name="fact"></a>
<h2>Factorial</h2>
<p>In mathematics, the <em>factorial</em> of a natural number, denoted by <strong>n!</strong>, is the <em>product of all natural numbers smaller or equal to <strong>n</strong></em>.</p>
<img class="maths" src="img/calc-combinatorics-eq0.gif" />
<p>This can also be written as:</p>
<img class="maths" src="img/calc-combinatorics-eq1.gif" />
<p>By convention, <strong>0! = 1</strong>.</p>
<p>Example:</p>
<img class="maths" src="img/calc-combinatorics-eq2.gif" />
<br /> <br />
</div>
<div class="section">
<a name="perm"></a>
<h2>Permutations</h2>
<p>In mathematics, a <em>permutation</em> of a set of objects is defined as <em>a particular order</em> of the items.</p>
<p>For example, the permutations of the set <strong>{1, 2, 3}</strong> are:<br /> (1, 2, 3); (1, 3, 2); (2, 1, 3); (2, 3, 1); (3, 1, 2); (3, 2, 1);</p>
<p>The number of permutations for a set is given by <strong>n!</strong>.</p>
<br />
</div>
<div class="section">
<a name="permk"></a>
<h2>Permutations of k objects</h2>
<p>Example: the permutations of 2 items from the set <strong>{1, 2, 3}</strong> are:<br />
(1, 2); (2, 1); (1, 3); (3, 1); (2, 3); (3, 2); </p>
<p>The number of permutations of k objects is given by the formula:</p>
<img class="maths" src="img/calc-combinatorics-eq5.gif" />
<p> After making the simplifications, we get:</p>
<img class="maths" src="img/calc-combinatorics-eq6.gif" />
<br /> <br />
</div>
<div class="section">
<a name="comb"></a>
<h2>Combinations</h2>
<p>In mathematics, a <em>combination</em> is a method of selecting a number of objects from a larger set, where order doesn't matter.</p>
<p>For example, the combinations of 2 items from the set <strong>{1, 2, 3}</strong> are:<br />
{1, 2}; {1, 3}; {2, 3}; </p>
<p> The number of combinations is given by the formula:</p>
<img class="maths" src="img/calc-combinatorics-eq3.gif" />
<p> After making the simplifications, we get:</p>
<img class="maths" src="img/calc-combinatorics-eq4.gif" />
<br /><br />
</div>
<div class="footer">
Software created by Chibici Tiberiu.
Contact: <a href="mailto:chibicitiberiu@gmail.com">chibicitiberiu@gmail.com</a>
</div>
</body>
</html>

View File

@ -0,0 +1,53 @@
<!-- saved from url=(0014)about:internet -->
<html>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<head>
<title>Scientific Calculator: Constants</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Scientific Calculator: Constants</h1>
<div class="section">
<h2>Content</h2>
<ul>
<li><a href="#pi"><span style="font-family:serif;"/>&pi;</span> (pi)</a></li>
<li><a href="#e"><em>e</em></a></li>
</ul>
</div>
<div class="section">
<a name="pi"> </a>
<h2><span style="font-family:serif;"/>&pi;</span></h2>
<p><span style="font-family:serif;"/><strong>&pi;</strong></span> (sometimes written <strong>pi</strong>) is a mathematical constant that is the ratio of any Euclidian circle's circumference to its diameter.</p>
<p>The approximate value of pi is:</p>
<img class="maths" src="img/calc-constants-eq0.gif" />
<p>Pi has many uses in mathematics, science and engineering, making it one of the most important constants. <!-- For some additional information about pi in mathematics (geometry), you can check the <a href="calculator-trigonometric.htm">trigonometry</a> section. --></p>
</div>
<div class="section">
<a name="pi"> </a>
<h2><em>e</em></h2>
<p><em><strong>e</strong></em> is an important mathematical constant that is the base of <!--<a href="calculator-logexp.htm">--> natural logarithms<!--</a>-->.</p>
<p>The constant is the result of the following limit:</p>
<img class="maths" src="img/calc-constants-eq1.gif" />
<p>The approximate value of <em>e</em> is:</p>
<img class="maths" src="img/calc-constants-eq2.gif" />
</div>
<div class="footer">
Software created by Chibici Tiberiu.
Contact: <a href="mailto:chibicitiberiu@gmail.com">chibicitiberiu@gmail.com</a>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

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