Ignore:
Timestamp:
Mar 10, 2009, 7:38:39 PM (13 years ago)
Author:
Timo Eckhardt
Message:

ModPow:

  • Changed Databindiung
  • Rotate Cirlce via Mouse MOvement
Location:
trunk/CrypPlugins/Primes/Primes
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/Primes/Primes/Library/ControlHandler.cs

    r4 r234  
    455455    }
    456456
     457      public static object ExecuteMethod(object obj, string methodname, object parameter)
     458    {
     459        return ExecuteMethod(m_Dispatcher, obj, methodname, new object[] { parameter });
     460    }
     461
    457462    public static object ExecuteMethod(Dispatcher dispatcher, object obj, string methodname, object[] parameters)
    458463    {
    459464      return dispatcher.Invoke(DispatcherPriority.Send, new ExecuteMethodDelegate(DoExecuteMethod), obj, new object[] { methodname, parameters });
    460465    }
     466
     467    public static object ExecuteMethod(Dispatcher dispatcher, object obj, string methodname, object[] parameters, Type[] types)
     468    {
     469        return dispatcher.Invoke(DispatcherPriority.Send, new ExecuteMethodDelegate(DoExecuteMethod), obj, new object[] { methodname, parameters, types });
     470    }
     471
     472
    461473    private static object DoExecuteMethod(object obj, string methodname, object[] parameters)
    462474    {
    463       MethodInfo mi = obj.GetType().GetMethod(methodname);
    464      
    465       if (mi == null)
    466       {
    467 
    468         foreach (Type t in obj.GetType().GetInterfaces())
    469         {
    470           mi =  t.GetMethod(methodname);
    471           if (mi != null) break;
    472         }
    473       }
    474       try
    475       {
    476         if (mi != null)
    477           return mi.Invoke(obj, parameters);
    478       }
    479       catch
    480       {
    481       }
    482       return null;
    483     }
    484 
     475        Type[] types = null;
     476        List<object> _parameters = new List<object>();
     477        foreach (object o in parameters)
     478        {
     479            if (o.GetType() == typeof(Type[]))
     480                types = (Type[])o;
     481            else
     482                _parameters.Add(o);
     483        }
     484        MethodInfo mi = null;
     485       
     486        if (types != null)
     487        {
     488            mi = obj.GetType().GetMethod(methodname, types);
     489        }
     490        else
     491        {
     492            mi = obj.GetType().GetMethod(methodname);
     493        }
     494        if (mi == null)
     495        {
     496
     497            foreach (Type t in obj.GetType().GetInterfaces())
     498            {
     499                if (types != null)
     500                {
     501                    mi = t.GetType().GetMethod(methodname, types);
     502                }
     503                else
     504                {
     505                    mi = t.GetType().GetMethod(methodname);
     506                }
     507                if (mi != null) break;
     508            }
     509        }
     510        try
     511        {
     512            if (mi != null)
     513                return mi.Invoke(obj, _parameters.ToArray());
     514        }
     515        catch
     516        {
     517        }
     518        return null;
     519    }
    485520    #endregion
    486521
  • trunk/CrypPlugins/Primes/Primes/Primes.csproj

    r193 r234  
    44    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    55    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    6     <ProductVersion>9.0.21022</ProductVersion>
     6    <ProductVersion>9.0.30729</ProductVersion>
    77    <SchemaVersion>2.0</SchemaVersion>
    88    <ProjectGuid>{2830F337-A7A3-4A68-87AC-64F3AA79C70B}</ProjectGuid>
     
    7575    <Compile Include="CalculatorLib\CalcToken.cs" />
    7676    <Compile Include="CalculatorLib\CalcVariables.cs" />
     77    <Compile Include="Library\Pair.cs" />
    7778    <Compile Include="Options\OptionVersionInfo.xaml.cs">
    7879      <DependentUpon>OptionVersionInfo.xaml</DependentUpon>
  • trunk/CrypPlugins/Primes/Primes/WpfControls/Components/Arrows/ArrowLine.cs

    r4 r234  
    309309            }
    310310        }
     311
     312
     313
    311314    }
    312315}
  • trunk/CrypPlugins/Primes/Primes/WpfControls/Components/Arrows/ArrowLineBase.cs

    r4 r234  
    209209using System.Windows.Media;
    210210using System.Windows.Shapes;
     211using System.Windows.Data;
    211212
    212213namespace Primes.WpfControls.Components.Arrows
  • trunk/CrypPlugins/Primes/Primes/WpfControls/NumberTheory/PowerMod/PowerModControl.xaml

    r4 r234  
    77             >
    88
    9   <UserControl.Resources>
    10     <ResourceDictionary>
    11       <ResourceDictionary.MergedDictionaries>
    12         <ResourceDictionary Source="../../Resources/Shared.xaml"/>
    13       </ResourceDictionary.MergedDictionaries>
    14     </ResourceDictionary>
     9    <UserControl.Resources>
     10        <ResourceDictionary>
     11            <ResourceDictionary.MergedDictionaries>
     12                <ResourceDictionary Source="../../Resources/Shared.xaml"/>
     13            </ResourceDictionary.MergedDictionaries>
     14        </ResourceDictionary>
    1515
    16   </UserControl.Resources>
    17   <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Name="test">
    18     <Grid.RowDefinitions>
    19       <RowDefinition Height="Auto" />
    20       <RowDefinition Height="Auto" />
    21       <RowDefinition Height="*" />
    22     </Grid.RowDefinitions>
    23     <GroupBox Grid.Row="0" Margin="7"   Header="{x:Static lang:Numbertheory.powermod_inputgroupbox}">
    24     <StackPanel >
    25      
    26       <DockPanel HorizontalAlignment="Left">
    27         <Button Name="btnExecute" Click="btnExecute_Click" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btnexecute}" Width="100"/>
    28         <Button Name="btnCancel" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btncancel}" Width="100" IsEnabled="False" Click="btnCancel_Click"/>
    29       </DockPanel>
    30         <Grid Height="43">
    31           <Grid.ColumnDefinitions>
    32             <ColumnDefinition Width="Auto"/>
    33             <ColumnDefinition Width="Auto"/>
    34             <ColumnDefinition Width="Auto"/>
    35           </Grid.ColumnDefinitions>
    36           <RadioButton Name="rbAutomatic" Grid.Column="0" Content="{x:Static lang:Numbertheory.powermod_rbautomatic}" Margin="7" VerticalAlignment="Center" />
    37           <RadioButton Name="rbStepwise" Grid.Column="1" Content="{x:Static lang:Numbertheory.powermod_stepwise}" IsChecked="True" Margin="7" VerticalAlignment="Center" />
    38           <DockPanel Name="dpStepwiseButtons" Grid.Column="2" Visibility="Collapsed">
    39             <Button Name="btnNextStep" Click="btnNextStep_Click" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btnnextstep}" Width="100" VerticalAlignment="Top"/>
    40             <Button Name="btnResumeAutomatic" Click="btnResumeAutomatic_Click" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btnresume}" Width="210" VerticalAlignment="Top"/>
    41           </DockPanel>
    42         </Grid>
    43         <Grid>
    44         <Grid.ColumnDefinitions>
    45           <ColumnDefinition Width="Auto"/>
    46           <ColumnDefinition Width="Auto"/>
    47           <ColumnDefinition Width="*"/>
    48         </Grid.ColumnDefinitions>
     16    </UserControl.Resources>
     17    <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Name="test">
    4918        <Grid.RowDefinitions>
    50           <RowDefinition Height="Auto"/>
    51           <RowDefinition Height="Auto"/>
    52           <RowDefinition Height="Auto"/>
    53           <RowDefinition Height="Auto"/>
    54     </Grid.RowDefinitions>
    55     <TextBlock Text="Basis" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" Margin="5"/>
    56         <comps:InputSingleControl x:Name="iscBase" InputRangeControlType="Horizontal" ShowCalcInput="False" ShowButtons="False" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" Margin="5"/>
    57         <TextBlock Text="Exponent" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" Margin="5"/>
    58         <comps:InputSingleControl x:Name="iscExp" InputRangeControlType="Horizontal" ShowCalcInput="False" ShowButtons="False" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Margin="5"/>
    59         <TextBlock Text="Modulus" Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" Margin="5"/>
    60         <comps:InputSingleControl x:Name="iscMod" InputRangeControlType="Horizontal" ShowCalcInput="False" ShowButtons="False" Grid.Column="1" Grid.Row="2" Margin="5"/>
    61         <Slider Name="slidermodulus" Grid.Row="2" Grid.Column="2" VerticalAlignment="Center" Minimum="2" Maximum="150" Value="2" ValueChanged="slidermodulus_ValueChanged" Margin="5"/>
    62          
    63           <TextBlock Grid.Row="3" Grid.Column="0" Text="Anordnung der Punkte"/>
    64           <DockPanel Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2">
    65             <RadioButton Name="rbOne" Margin="5" Command="this:PowerModCommands.ReOrderPointsCommand" IsChecked="True">im Uhrzeigersinn</RadioButton>
    66             <RadioButton Name="rbTwo" Margin="5" Command="this:PowerModCommands.ReOrderPointsCommand">gegen den Uhrzeigersinn</RadioButton>
    67           </DockPanel>
    68       </Grid>
    69     </StackPanel>
    70 </GroupBox>     
    71     <ScrollViewer Grid.Row="1" Grid.ColumnSpan="2" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">   
    72 </ScrollViewer>     
    73     <Grid Grid.Row="2" Margin="7">
    74       <Grid.ColumnDefinitions>
    75         <ColumnDefinition Width="0.7*"/>
    76         <ColumnDefinition Width="0.3*"/>
    77       </Grid.ColumnDefinitions>
    78       <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Column="0" Name="PaintPanel" >
    79         <GroupBox HorizontalAlignment="Stretch" DockPanel.Dock="Bottom" Name="spslider" Margin="10" Header="{x:Static lang:Numbertheory.powermod_zoom}">
    80           <Slider  Name="slider" Maximum="3" Minimum="0.1"  HorizontalAlignment="Stretch" VerticalAlignment="Top" Value="1" />
     19            <RowDefinition Height="Auto" />
     20            <RowDefinition Height="Auto" />
     21            <RowDefinition Height="*" />
     22        </Grid.RowDefinitions>
     23        <GroupBox Grid.Row="0" Margin="7"       Header="{x:Static lang:Numbertheory.powermod_inputgroupbox}">
     24            <StackPanel >
     25
     26                <DockPanel HorizontalAlignment="Left">
     27                    <Button Name="btnExecute" Click="btnExecute_Click" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btnexecute}" Width="100"/>
     28                    <Button Name="btnCancel" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btncancel}" Width="100" IsEnabled="False" Click="btnCancel_Click"/>
     29                </DockPanel>
     30                <Grid Height="43">
     31                    <Grid.ColumnDefinitions>
     32                        <ColumnDefinition Width="Auto"/>
     33                        <ColumnDefinition Width="Auto"/>
     34                        <ColumnDefinition Width="Auto"/>
     35                    </Grid.ColumnDefinitions>
     36                    <RadioButton Name="rbAutomatic" Grid.Column="0" Content="{x:Static lang:Numbertheory.powermod_rbautomatic}" Margin="7" VerticalAlignment="Center" />
     37                    <RadioButton Name="rbStepwise" Grid.Column="1" Content="{x:Static lang:Numbertheory.powermod_stepwise}" IsChecked="True" Margin="7" VerticalAlignment="Center" />
     38                    <DockPanel Name="dpStepwiseButtons" Grid.Column="2" Visibility="Collapsed">
     39                        <Button Name="btnNextStep" Click="btnNextStep_Click" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btnnextstep}" Width="100" VerticalAlignment="Top"/>
     40                        <Button Name="btnResumeAutomatic" Click="btnResumeAutomatic_Click" Margin="7" Content="{x:Static lang:Numbertheory.powermod_btnresume}" Width="210" VerticalAlignment="Top"/>
     41                    </DockPanel>
     42                </Grid>
     43                <Grid>
     44                    <Grid.ColumnDefinitions>
     45                        <ColumnDefinition Width="Auto"/>
     46                        <ColumnDefinition Width="Auto"/>
     47                        <ColumnDefinition Width="*"/>
     48                    </Grid.ColumnDefinitions>
     49                    <Grid.RowDefinitions>
     50                        <RowDefinition Height="Auto"/>
     51                        <RowDefinition Height="Auto"/>
     52                        <RowDefinition Height="Auto"/>
     53                        <RowDefinition Height="Auto"/>
     54                    </Grid.RowDefinitions>
     55                    <TextBlock Text="Basis" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" Margin="5"/>
     56                    <comps:InputSingleControl x:Name="iscBase" InputRangeControlType="Horizontal" ShowCalcInput="False" ShowButtons="False" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" Margin="5"/>
     57                    <TextBlock Text="Exponent" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" Margin="5"/>
     58                    <comps:InputSingleControl x:Name="iscExp" InputRangeControlType="Horizontal" ShowCalcInput="False" ShowButtons="False" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Margin="5"/>
     59                    <TextBlock Text="Modulus" Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" Margin="5"/>
     60                    <comps:InputSingleControl x:Name="iscMod" InputRangeControlType="Horizontal" ShowCalcInput="False" ShowButtons="False" Grid.Column="1" Grid.Row="2" Margin="5"/>
     61                    <Slider Name="slidermodulus" Grid.Row="2" Grid.Column="2" VerticalAlignment="Center" Minimum="2" Maximum="150" Value="2" ValueChanged="slidermodulus_ValueChanged" Margin="5"/>
     62
     63                    <TextBlock Grid.Row="3" Grid.Column="0" Text="Anordnung der Punkte"/>
     64                    <DockPanel Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2">
     65                        <RadioButton Name="rbOne" Margin="5" Command="this:PowerModCommands.ReOrderPointsCommand" IsChecked="True">im Uhrzeigersinn</RadioButton>
     66                        <RadioButton Name="rbTwo" Margin="5" Command="this:PowerModCommands.ReOrderPointsCommand">gegen den Uhrzeigersinn</RadioButton>
     67                    </DockPanel>
     68                </Grid>
     69            </StackPanel>
    8170        </GroupBox>
    82         <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" Name="sv" Margin="5">
    83           <Viewbox Stretch="Uniform" HorizontalAlignment="Left" VerticalAlignment="Top" Name="vb">
    84             <Viewbox.LayoutTransform>
    85               <ScaleTransform ScaleX="{Binding ElementName=slider, Path=Value}" ScaleY="{Binding ElementName=slider, Path=Value}"/>
    86             </Viewbox.LayoutTransform>
    87             <Canvas Name="ContentArea" >
    88               <Canvas Name="PaintArea"  Background="Transparent"  />
    89               <Canvas Name="CircleArea" Background="Transparent" />
    90               <Canvas Name="ArrowArea" Background="Transparent"
    91                       PreviewMouseDown="PaintArea_PreviewMouseDown"
    92                       AllowDrop="True"
    93                       MouseLeave="ArrowArea_MouseLeave"
    94                       PreviewMouseUp="ArrowArea_PreviewMouseUp"
    95                       PreviewDragOver="ArrowArea_PreviewDragOver"
    96                       MouseMove="ArrowArea_MouseMove"/>
    97             </Canvas>
    98           </Viewbox>
     71        <ScrollViewer Grid.Row="1" Grid.ColumnSpan="2" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    9972        </ScrollViewer>
     73        <Grid Grid.Row="2" Margin="7">
     74            <Grid.ColumnDefinitions>
     75                <ColumnDefinition Width="0.7*"/>
     76                <ColumnDefinition Width="0.3*"/>
     77            </Grid.ColumnDefinitions>
     78            <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Column="0" Name="PaintPanel" >
     79                <GroupBox HorizontalAlignment="Stretch" DockPanel.Dock="Bottom" Name="spslider" Margin="10" Header="{x:Static lang:Numbertheory.powermod_zoom}">
     80                    <Slider  Name="slider" Maximum="3" Minimum="0.1"  HorizontalAlignment="Stretch" VerticalAlignment="Top" Value="1" />
     81                </GroupBox>
     82                <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" Name="sv" Margin="5">
     83                    <Viewbox Stretch="Uniform" HorizontalAlignment="Left" VerticalAlignment="Top" Name="vb">
     84                        <Viewbox.LayoutTransform>
     85                            <ScaleTransform ScaleX="{Binding ElementName=slider, Path=Value}" ScaleY="{Binding ElementName=slider, Path=Value}"/>
     86                        </Viewbox.LayoutTransform>
     87                        <Canvas Name="ContentArea" >
     88                            <Canvas Name="CircleArea" Background="Transparent" />
     89                            <Canvas Name="ArrowArea" Background="Transparent"/>
     90                            <Canvas Name="LabelArea" Background="Transparent"/>
     91                            <Canvas Name="PaintArea"  Background="Transparent" 
     92                                  PreviewMouseDown="PaintArea_PreviewMouseDown"
     93                                  AllowDrop="True"
     94                                  MouseLeave="ArrowArea_MouseLeave"
     95                                  PreviewMouseUp="ArrowArea_PreviewMouseUp"
     96                                  PreviewDragOver="ArrowArea_PreviewDragOver"
     97                                  MouseMove="ArrowArea_MouseMove" />
     98                        </Canvas>
     99                    </Viewbox>
     100                </ScrollViewer>
    100101
    101         <!--<StackPanel HorizontalAlignment="Stretch" DockPanel.Dock="Bottom" Name="spslider">
     102                <!--<StackPanel HorizontalAlignment="Stretch" DockPanel.Dock="Bottom" Name="spslider">
    102103          <Slider  Name="theslider" Maximum="3" Minimum="0.1"  HorizontalAlignment="Stretch" VerticalAlignment="Top" Value="2" />
    103104        </StackPanel>
     
    115116          </Viewbox>
    116117        </ScrollViewer>-->
    117       </DockPanel>
    118       <GroupBox Header="Fortschritt" Grid.Column="1">
    119       <comps:LogControl x:Name="log" Title=""  />
    120         </GroupBox>
    121     </Grid>
     118            </DockPanel>
     119            <GroupBox Header="Fortschritt" Grid.Column="1">
     120                <comps:LogControl x:Name="log" Title=""  />
     121            </GroupBox>
     122        </Grid>
    122123    </Grid>
    123124</UserControl>
  • trunk/CrypPlugins/Primes/Primes/WpfControls/NumberTheory/PowerMod/PowerModControl.xaml.cs

    r4 r234  
    226226namespace Primes.WpfControls.NumberTheory.PowerMod
    227227{
    228   /// <summary>
    229   /// Interaction logic for TestOfFermatControl.xaml
    230   /// </summary>
    231   public partial class PowerModControl : UserControl
    232   {
    233     #region initializing
    234 
    235     private Thread m_Thread;
    236     private bool m_Initialized;
    237     private bool m_Resume = false;
    238 
    239     public PowerModControl()
     228    /// <summary>
     229    /// Interaction logic for TestOfFermatControl.xaml
     230    /// </summary>
     231    public partial class PowerModControl : UserControl
    240232    {
    241       InitializeComponent();
    242       initBindings();
    243       ConfigureIntegerInputs();
    244       m_Points = new Dictionary<int, Point>();
    245       m_Arrows = new List<ArrowLine>();
    246       m_ArrowsMark = new Dictionary<GmpBigInteger, ArrowLine>();
    247       m_Circles = new List<Polyline>();
    248       m_CirclesMark = new Dictionary<GmpBigInteger, Polyline>();
    249       m_RunningLockObject = new object();
    250       m_Initialized = true;
    251       m_StepWiseEvent = new ManualResetEvent(false);
    252       log.RowMouseOver += new ExecuteIntegerDelegate(log_RowMouseOver);
     233        #region initializing
     234
     235        private Thread m_Thread;
     236        private bool m_Initialized;
     237        private bool m_Resume = false;
     238
     239        public PowerModControl()
     240        {
     241            InitializeComponent();
     242            initBindings();
     243            ConfigureIntegerInputs();
     244            m_Points = new Dictionary<int, Point>();
     245            //m_Ellipses = new Dictionary<int, Ellipse>();
     246            m_SourceDestination = new List<Pair<Ellipse, Ellipse>>();
     247            m_CirclesSource = new Dictionary<Ellipse, Polyline>();
     248            m_ArrowsWithSourceAndDestination = new Dictionary<Pair<Ellipse, Ellipse>, ArrowLine>();
     249            //m_Arrows = new List<ArrowLine>();
     250            m_ArrowsMark = new Dictionary<GmpBigInteger, ArrowLine>();
     251            //m_Circles = new List<Polyline>();
     252            m_CirclesMark = new Dictionary<GmpBigInteger, Polyline>();
     253            m_RunningLockObject = new object();
     254            m_Initialized = true;
     255            m_StepWiseEvent = new ManualResetEvent(false);
     256            log.RowMouseOver += new ExecuteIntegerDelegate(log_RowMouseOver);
     257
     258        }
     259
     260        void log_RowMouseOver(GmpBigInteger value)
     261        {
     262            ArrowLine al = null;
     263            Polyline pl = null;
     264            if (m_ArrowsMark.TryGetValue(value, out al))
     265            {
     266                foreach (ArrowLine alTmp in m_ArrowsWithSourceAndDestination.Values)
     267                {
     268                    alTmp.Stroke = Brushes.Black;
     269                }
     270                al.Stroke = Brushes.Red;
     271            }
     272            else if (m_CirclesMark.TryGetValue(value, out pl))
     273            {
     274                foreach (Polyline plTmp in m_CirclesSource.Values)
     275                {
     276                    plTmp.Stroke = Brushes.Black;
     277                }
     278                pl.Stroke = Brushes.Red;
     279            }
     280
     281        }
     282
     283        private void ConfigureIntegerInputs()
     284        {
     285            iscBase.Execute += new ExecuteSingleDelegate(iscBase_Execute);
     286            iscBase.SetText(InputSingleControl.Free, "2");
     287            InputValidator<LibGmpWrapper.GmpBigInteger> ivBase = new InputValidator<LibGmpWrapper.GmpBigInteger>();
     288            ivBase.Validator = new BigIntegerMinValueValidator(null, LibGmpWrapper.GmpBigInteger.Two);
     289            iscBase.AddInputValidator(
     290              Primes.WpfControls.Components.InputSingleControl.Free,
     291              ivBase);
     292
     293
     294            iscExp.Execute += new ExecuteSingleDelegate(iscExp_Execute);
     295            iscExp.SetText(InputSingleControl.Free, "28");
     296            InputValidator<LibGmpWrapper.GmpBigInteger> ivExp = new InputValidator<LibGmpWrapper.GmpBigInteger>();
     297            ivExp.Validator = new BigIntegerMinValueValidator(null, LibGmpWrapper.GmpBigInteger.One);
     298            iscExp.AddInputValidator(
     299              Primes.WpfControls.Components.InputSingleControl.Free,
     300              ivExp);
     301
     302            iscMod.Execute += new ExecuteSingleDelegate(iscMod_Execute);
     303            iscMod.KeyDown += new ExecuteSingleDelegate(iscMod_KeyDown);
     304            iscMod.SetText(InputSingleControl.Free, "13");
     305            InputValidator<LibGmpWrapper.GmpBigInteger> ivMod = new InputValidator<LibGmpWrapper.GmpBigInteger>();
     306            ivMod.Validator = new BigIntegerMinValueMaxValueValidator(null, LibGmpWrapper.GmpBigInteger.Two, LibGmpWrapper.GmpBigInteger.ValueOf(150));
     307            iscMod.AddInputValidator(
     308              Primes.WpfControls.Components.InputSingleControl.Free,
     309              ivMod);
     310
     311            this.Start += new VoidDelegate(PowerModControl_Start);
     312            this.Stop += new VoidDelegate(PowerModControl_Stop);
     313            this.Cancel += new VoidDelegate(PowerModControl_Cancel);
     314            this.Exp = GmpBigInteger.ValueOf(28);
     315            this.Base = GmpBigInteger.ValueOf(2);
     316            this.Mod = GmpBigInteger.ValueOf(13);
     317
     318        }
     319
     320        void iscMod_KeyDown(GmpBigInteger value)
     321        {
     322            if (value != null)
     323                this.Mod = value;
     324        }
     325
     326
     327
     328        void iscMod_Execute(GmpBigInteger value)
     329        {
     330            this.Mod = value;
     331            StartThread();
     332        }
     333
     334        private void slidermodulus_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
     335        {
     336            this.Mod = GmpBigInteger.ValueOf((long)e.NewValue);
     337        }
     338
     339        void iscExp_Execute(GmpBigInteger value)
     340        {
     341            this.Exp = value;
     342            StartThread();
     343        }
     344
     345        void iscBase_Execute(GmpBigInteger value)
     346        {
     347            this.Base = value;
     348            StartThread();
     349        }
     350
     351        #endregion
     352        #region Properties
     353        private object m_RunningLockObject;
     354        private bool m_Running;
     355        private IDictionary<int, Point> m_Points;
     356        //private IDictionary<int, Ellipse> m_Ellipses;
     357        private IList<Pair<Ellipse, Ellipse>> m_SourceDestination;
     358        //private IList<Polyline> m_Circles;
     359        private IDictionary<Ellipse, Polyline> m_CirclesSource;
     360        private IDictionary<GmpBigInteger, Polyline> m_CirclesMark;
     361        //private IList<ArrowLine> m_Arrows;
     362        private IDictionary<Pair<Ellipse, Ellipse>, ArrowLine> m_ArrowsWithSourceAndDestination;
     363        private IDictionary<GmpBigInteger, ArrowLine> m_ArrowsMark;
     364
     365        double offset = 0;
     366
     367        private GmpBigInteger m_Base;
     368
     369        public GmpBigInteger Base
     370        {
     371            get { return m_Base; }
     372            set { m_Base = value; }
     373        }
     374        private GmpBigInteger m_Exp;
     375
     376        public GmpBigInteger Exp
     377        {
     378            get { return m_Exp; }
     379            set { m_Exp = value; }
     380        }
     381        private GmpBigInteger m_Mod;
     382
     383        public GmpBigInteger Mod
     384        {
     385            get { return m_Mod; }
     386            set
     387            {
     388                m_Mod = value;
     389                if (m_Mod != null)
     390                {
     391                    if (m_Mod.Equals(iscMod.GetValue()))
     392                    {
     393                        slidermodulus.Value = m_Mod.DoubleValue;
     394                    }
     395                    else
     396                    {
     397                        iscMod.SetText(InputSingleControl.Free, m_Mod.ToString());
     398                    }
     399                    if (m_Initialized)
     400                    {
     401                        Reset();
     402                        CreatePoints();
     403                    }
     404                }
     405            }
     406        }
     407        #endregion
     408        #region painting the points
     409
     410        private void Reset()
     411        {
     412            m_Points.Clear();
     413            //m_Ellipses.Clear();
     414            m_SourceDestination.Clear();
     415            m_CirclesSource.Clear();
     416            m_ArrowsWithSourceAndDestination.Clear();
     417            //m_Arrows.Clear();
     418            m_ArrowsMark.Clear();
     419            //m_Circles.Clear();
     420            m_CirclesMark.Clear();
     421            ControlHandler.ClearChildren(PaintArea);
     422            ControlHandler.ClearChildren(ArrowArea);
     423            ControlHandler.ClearChildren(LabelArea);
     424
     425        }
     426        private void CreatePoint(int value)
     427        {
     428            double pointsize = 6.0;
     429            double angle = (360.0 / (double)m_Mod.IntValue) * (value + diff) + ((offset % 360));
     430            double top = Radius + 25 + (Math.Sin((angle * 2 * Math.PI * ((!m_SortAsc) ? -1 : 1)) / 360.0) * Radius - (pointsize / 2.0));
     431            double left = Radius + 25 + (Math.Cos((angle * 2 * Math.PI * ((!m_SortAsc) ? -1 : 1)) / 360.0) * Radius - (pointsize / 2.0));
     432            Ellipse point = null;
     433            if (m_Points.ContainsKey(value))
     434            {
     435                point = GetEllipseAt(m_Points[value]);
     436
     437            }
     438            if (point == null)
     439            {
     440                point = ControlHandler.CreateObject(typeof(Ellipse)) as Ellipse;
     441                point.ToolTip = new ToolTip();
     442                (point.ToolTip as ToolTip).Content = value.ToString();
     443                ControlHandler.SetPropertyValue(point, "Width", pointsize);
     444                ControlHandler.SetPropertyValue(point, "Height", pointsize);
     445                ControlHandler.SetPropertyValue(point, "Fill", Brushes.Black);
     446                ControlHandler.SetPropertyValue(point, "Stroke", Brushes.Black);
     447                ControlHandler.SetPropertyValue(point, "StrokeThickness", 1.0);
     448                ControlHandler.AddChild(point, PaintArea);
     449            }
     450            ControlHandler.ExecuteMethod(PaintArea, "SetTop", new object[] { point, top });
     451            ControlHandler.ExecuteMethod(PaintArea, "SetLeft", new object[] { point, left });
     452
     453            Label lbl = ControlHandler.CreateLabel(value.ToString(), null);
     454            double _top = top;
     455            double _left = left - 5;
     456            _top += (top < Radius) ? -20 : 0;
     457            _left += (left < Radius) ? -7 + (-2 * (int)Math.Log(value)) : 2;
     458            ControlHandler.ExecuteMethod(PaintArea, "SetTop", new object[] { lbl, _top });
     459            ControlHandler.ExecuteMethod(PaintArea, "SetLeft", new object[] { lbl, _left });
     460            ControlHandler.AddChild(lbl, LabelArea);
     461
     462            //if (m_Ellipses.ContainsKey(value))
     463            //{
     464            //    m_Ellipses[value] = point;
     465            //}
     466            //else
     467            //{
     468            //    m_Ellipses.Add(value, point);
     469            //}
     470
     471            if (m_CirclesSource.ContainsKey(point))
     472            {
     473                MoveCircle(point);
     474            }
     475
     476            if (m_Points.ContainsKey(value))
     477            {
     478                m_Points[value] = new Point(left, top);
     479            }
     480            else
     481            {
     482                m_Points.Add(value, new Point(left, top));
     483            }
     484
     485        }
     486
     487        #endregion
     488
     489        #region Painting the Ellipse
     490        private void Paint()
     491        {
     492
     493            Ellipse el = ControlHandler.CreateObject(typeof(Ellipse)) as Ellipse;
     494            ControlHandler.SetPropertyValue(el, "Width", Aperture);
     495            ControlHandler.SetPropertyValue(el, "Height", Aperture);
     496            ControlHandler.ExecuteMethod(CircleArea, "SetTop", new object[] { el, 25 });
     497            ControlHandler.ExecuteMethod(CircleArea, "SetLeft", new object[] { el, 25 });
     498            ControlHandler.SetPropertyValue(el, "StrokeThickness", 1.0);
     499            ControlHandler.SetPropertyValue(el, "Stroke", Brushes.Black);
     500            ControlHandler.SetPropertyValue(el, "Name", "dontremove");
     501            ControlHandler.AddChild(el, CircleArea);
     502        }
     503
     504        private double Aperture
     505        {
     506            get { return Math.Max(Math.Min(PaintArea.Width, PaintArea.Height) - 50, 0); }
     507        }
     508
     509        private double _radius = -1;
     510        private double Radius
     511        {
     512            get
     513            {
     514                return Aperture / 2.0;
     515            }
     516            set { _radius = value; }
     517        }
     518
     519        private double Perimeter
     520        {
     521            get { return (2 * Math.PI * Aperture); }
     522        }
     523        protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
     524        {
     525            base.OnRenderSizeChanged(sizeInfo);
     526            if (m_Initialized)
     527            {
     528                //ClearArrows();
     529                log.RenderSize = sizeInfo.NewSize;
     530                ArrowArea.Width = PaintArea.Width = CircleArea.Width = LabelArea.Width = ContentArea.Width = PaintPanel.ActualWidth - 20;
     531                ArrowArea.Height = PaintArea.Height = CircleArea.Height = ContentArea.Height = LabelArea.Height = PaintPanel.ActualHeight - spslider.ActualHeight - 30;
     532                //ContentArea.Width = PaintPanel.ActualWidth;
     533
     534                //ContentArea.Height = PaintPanel.ActualHeight - spslider.ActualHeight;
     535
     536                //if (log.ActualWidth < 100)
     537                //{
     538                //  log.Width = this.ActualWidth - 5;
     539                //}
     540                if (sizeInfo.NewSize.Height != double.NaN && sizeInfo.NewSize.Height > 0 &&
     541                  sizeInfo.NewSize.Width != double.NaN && sizeInfo.NewSize.Width > 0)
     542                {
     543                    if (!m_Running)
     544                    {
     545                        if (CircleArea.Children.Count != 0)
     546                            CircleArea.Children.Clear();
     547                        Paint();
     548                        if (this.m_Mod != null)
     549                        {
     550                            //IDictionary<ArrowLine, int> m_StartPoints = new Dictionary<ArrowLine, int>();
     551                            //IDictionary<ArrowLine, int> m_EndPoints = new Dictionary<ArrowLine, int>();
     552
     553                            //foreach (ArrowLine al in m_Arrows)
     554                            //{
     555                            //    Point from = new Point(al.X1, al.Y1);
     556                            //    Point to = new Point(al.X2, al.Y2);
     557                            //    foreach (int key in m_Points.Keys)
     558                            //    {
     559                            //        Point p = m_Points[key];
     560                            //        if (from.X == p.X && from.Y == p.Y)
     561                            //        {
     562                            //            m_StartPoints.Add(al, key);
     563                            //        }
     564                            //        else if (to.X == p.X && to.Y == p.Y)
     565                            //        {
     566                            //            m_EndPoints.Add(al, key);
     567                            //        }
     568                            //    }
     569                            //}
     570                            CreatePoints();
     571                            foreach (Ellipse e in m_CirclesSource.Keys)
     572                            {
     573                                MoveCircle(e);
     574                            }
     575                            //foreach (ArrowLine al in m_StartPoints.Keys)
     576                            //{
     577                            //    al.X1 = m_Points[m_StartPoints[al]].X;
     578                            //    al.Y1 = m_Points[m_StartPoints[al]].Y;
     579
     580                            //}
     581                            //foreach (ArrowLine al in m_EndPoints.Keys)
     582                            //{
     583                            //    al.X2 = m_Points[m_EndPoints[al]].X;
     584                            //    al.Y2 = m_Points[m_EndPoints[al]].Y;
     585
     586                            //}
     587                        }
     588                    }
     589                }
     590            }
     591        }
     592
     593        private void ClearPoints()
     594        {
     595            UIElementCollection childs = ControlHandler.GetPropertyValue(PaintArea, "Children") as UIElementCollection;
     596            ControlHandler.ExecuteMethod(childs, "Clear");
     597        }
     598        private void ClearLabels()
     599        {
     600            UIElementCollection childs = ControlHandler.GetPropertyValue(LabelArea, "Children") as UIElementCollection;
     601            ControlHandler.ExecuteMethod(childs, "Clear");
     602        }
     603
     604        private void ClearArrows()
     605        {
     606            UIElementCollection childs = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
     607            ControlHandler.ExecuteMethod(childs, "Clear");
     608            //m_Arrows.Clear();
     609            //m_Circles.Clear();
     610            m_ArrowsWithSourceAndDestination.Clear();
     611            m_CirclesSource.Clear();
     612            m_ArrowsMark.Clear();
     613            m_CirclesMark.Clear();
     614
     615        }
     616        #endregion
     617
     618
     619        #region Events
     620        private event VoidDelegate Start;
     621
     622        private void FireStartEvent()
     623        {
     624            if (Start != null) Start();
     625        }
     626
     627        private event VoidDelegate Stop;
     628
     629        private void FireStopEvent()
     630        {
     631            if (Stop != null) Stop();
     632        }
     633
     634        private event VoidDelegate Cancel;
     635
     636        private void FireCancelEvent()
     637        {
     638            if (Cancel != null) Cancel();
     639        }
     640
     641        void PowerModControl_Cancel()
     642        {
     643            CancelThread();
     644            SetupStop();
     645        }
     646
     647        void PowerModControl_Stop()
     648        {
     649            SetupStop();
     650
     651        }
     652
     653        void PowerModControl_Start()
     654        {
     655            SetupStart();
     656        }
     657
     658        #endregion
     659
     660        #region SettingUpButtons
     661
     662        private void SetupStart()
     663        {
     664            ControlHandler.ExecuteMethod(this, "_SetupStart");
     665        }
     666
     667        public void _SetupStart()
     668        {
     669            btnCancel.IsEnabled = true;
     670            btnExecute.IsEnabled = false;
     671            dpStepwiseButtons.Visibility = (!rbAutomatic.IsChecked.Value) ? Visibility.Visible : Visibility.Collapsed;
     672            iscBase.LockControls();
     673            iscExp.LockControls();
     674            iscMod.LockControls();
     675            rbAutomatic.IsEnabled = false;
     676            rbStepwise.IsEnabled = false;
     677
     678        }
     679
     680        private void SetupStop()
     681        {
     682            ControlHandler.ExecuteMethod(this, "_SetupStop");
     683        }
     684
     685        public void _SetupStop()
     686        {
     687            btnCancel.IsEnabled = false;
     688            btnExecute.IsEnabled = true;
     689            dpStepwiseButtons.Visibility = Visibility.Collapsed;
     690            btnNextStep.IsEnabled = true;
     691            btnResumeAutomatic.IsEnabled = true;
     692            m_Resume = false;
     693            iscBase.UnLockControls();
     694            iscExp.UnLockControls();
     695            iscMod.UnLockControls();
     696            rbAutomatic.IsEnabled = true;
     697            rbStepwise.IsEnabled = true;
     698        }
     699
     700
     701        #endregion
     702        #region Execute
     703
     704        private void CancelThread()
     705        {
     706            if (m_Thread != null)
     707            {
     708                lock (m_RunningLockObject)
     709                {
     710                    m_Running = false;
     711                }
     712
     713                m_Thread.Abort();
     714                m_Thread = null;
     715            }
     716        }
     717
     718        private void StartThread()
     719        {
     720            m_Base = iscBase.GetValue();
     721            m_Exp = iscExp.GetValue();
     722            m_Mod = iscMod.GetValue();
     723            if (m_Base != null && m_Exp != null && m_Mod != null)
     724            {
     725
     726                m_Thread = new Thread(new ThreadStart(DoExecuteGraphic));
     727                m_Thread.Start();
     728                //rteDoExecuteGraphic();
     729            }
     730        }
     731        //public void Execute(GmpBigInteger value)
     732        //{
     733        //  tabItemGraphic.IsEnabled = true;
     734        //  tcStats.SelectedIndex = 0;
     735
     736        //  this.m_Value = value;
     737        //  m_Arrows.Clear();
     738        //  ArrowArea.Children.Clear();
     739        //  log.Columns = 1;
     740        //  log.Clear();
     741        //  if (value.CompareTo(GmpBigInteger.ValueOf(150))>0)
     742        //  {
     743        //    tcStats.SelectedIndex = 1;
     744        //    tabItemGraphic.IsEnabled = false;
     745        //  }
     746        //  else
     747        //  {
     748        //    CreatePoints();
     749        //  }
     750        //}
     751
     752
     753
     754        private bool m_SortAsc = true;
     755        private void CreatePoints()
     756        {
     757            //ClearArrows();
     758            //ClearPoints();
     759            ClearLabels();
     760            for (int i = 0; i < m_Mod.IntValue; i++)
     761            {
     762                CreatePoint(i);
     763            }
     764
     765        }
     766
     767        private void btnExecute_Click(object sender, RoutedEventArgs e)
     768        {
     769            StartThread();
     770        }
     771       
     772        private ManualResetEvent m_StepWiseEvent;
     773
     774        private void WaitStepWise()
     775        {
     776            if (m_StepWiseEvent != null && _ExecutionMethod == ExecutionMethod.stepwise && !m_Resume)
     777            {
     778                m_StepWiseEvent.Reset();
     779                m_StepWiseEvent.WaitOne();
     780            }
     781        }
     782
     783        private void DoExecuteGraphic()
     784        {
     785            FireStartEvent();
     786            ClearArrows();
     787            log.Clear();
     788            lock (m_RunningLockObject)
     789            {
     790                m_Running = true;
     791            }
     792            Point lastPoint = new Point(-1, -1);
     793            Ellipse lastEllipse = null;
     794            GmpBigInteger i = GmpBigInteger.One;
     795            GmpBigInteger result = null;
     796            GmpBigInteger tmp = m_Base.Mod(m_Mod);
     797            Ellipse e = this.GetEllipseAt(m_Points[tmp.IntValue]);
     798            if (e != null)
     799            {
     800                ControlHandler.SetPropertyValue(e, "Fill", Brushes.Red);
     801                ControlHandler.SetPropertyValue(e, "Stroke", Brushes.Red);
     802            }
     803
     804            while (i.CompareTo(m_Exp) <= 0)
     805            {
     806                Thread.Sleep(100);
     807                if (result == null)
     808                {
     809                    result = m_Base.Mod(m_Mod);
     810                    log.Info(string.Format(Primes.Resources.lang.Numbertheory.Numbertheory.powermod_executionfirst, new object[] { GmpBigInteger.One.ToString(), m_Base.ToString("D"), m_Mod.ToString("D"), result.ToString("D") }));
     811                }
     812                else
     813                {
     814                    GmpBigInteger tmpResult = result;
     815                    result = result.Multiply(m_Base).Mod(m_Mod);
     816                    log.Info(string.Format(Primes.Resources.lang.Numbertheory.Numbertheory.powermod_execution, new object[] { i.ToString("D"), tmpResult.ToString("D"), m_Base.ToString("D"), m_Mod.ToString("D"), result.ToString("D") }));
     817                }
     818                if (lastPoint.X == -1 && lastPoint.Y == -1)
     819                {
     820                    lastPoint = m_Points[result.IntValue];
     821                    lastEllipse = e;
     822                }
     823                else
     824                {
     825                    Ellipse _e = this.GetEllipseAt(m_Points[result.IntValue]);
     826                    Point newPoint = m_Points[result.IntValue];
     827                    //CreateArrow(i.Subtract(GmpBigInteger.One), lastPoint, newPoint);
     828                    CreateArrow(i.Subtract(GmpBigInteger.One), lastEllipse, _e);
     829                    lastPoint = newPoint;
     830                    lastEllipse = _e;
     831                }
     832                i = i.Add(GmpBigInteger.One);
     833                if (i.CompareTo(GmpBigInteger.Three) >= 0)
     834                    WaitStepWise();
     835            }
     836
     837            lock (m_RunningLockObject)
     838            {
     839                m_Running = false;
     840            }
     841            FireStopEvent();
     842        }
     843
     844        private Ellipse GetEllipseAt(Point p)
     845        {
     846            return (Ellipse)ControlHandler.ExecuteMethod(this, "_GetEllipseAt", new object[] { p });
     847        }
     848        public Ellipse _GetEllipseAt(Point p)
     849        {
     850            foreach (UIElement e in PaintArea.Children)
     851            {
     852                if (e.GetType() == typeof(Ellipse))
     853                {
     854                    if (Canvas.GetTop(e) == p.Y && Canvas.GetLeft(e) == p.X) return e as Ellipse;
     855                }
     856            }
     857            return null;
     858        }
     859
     860
     861
     862
     863        //private void CreateArrow(GmpBigInteger counter, Point from, Point to)
     864        //{
     865        //    ArrowLine l = null;
     866        //    if (from.X == to.X && from.Y == to.Y)
     867        //    {
     868        //        AddCircle(counter, from.X, from.Y);
     869        //    }
     870        //    else
     871        //    {
     872        //        l = ControlHandler.CreateObject(typeof(ArrowLine)) as ArrowLine;
     873        //        ControlHandler.SetPropertyValue(l, "Stroke", Brushes.Black);
     874        //        ControlHandler.SetPropertyValue(l, "StrokeThickness", 1.5);
     875        //        //ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.X1Property, new Binding("(Point.X)") { Source = from  }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     876        //        //ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.Y1Property, new Binding("(Point.Y)") { Source = from }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     877        //        //ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.X2Property, new Binding("(Point.X)") { Source = to }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     878        //        //ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.Y2Property, new Binding("(Point.Y)") { Source = to }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     879        //        //l.SetBinding(Line.X1Property, new Binding("(Point.X)") { Source = from, Converter = new myc() });
     880        //        //l.SetBinding(Line.Y1Property, new Binding("(Point.Y)") { Source = from, Converter = new myc() });
     881        //        //l.SetBinding(Line.X2Property, new Binding("(Point.X)") { Source = to, Converter = new myc() });
     882        //        //l.SetBinding(Line.Y2Property, new Binding("(Point.Y)") { Source = to, Converter = new myc() });
     883
     884        //        ControlHandler.SetPropertyValue(l, "X1", from.X);
     885        //        ControlHandler.SetPropertyValue(l, "Y1", from.Y);
     886        //        ControlHandler.SetPropertyValue(l, "X2", to.X);
     887        //        ControlHandler.SetPropertyValue(l, "Y2", to.Y);
     888        //        if (!ContainsLine(l))
     889        //        {
     890        //            ControlHandler.AddChild(l, ArrowArea);
     891        //            m_Arrows.Add(l);
     892        //            m_ArrowsMark.Add(counter, l);
     893        //        }
     894        //        else
     895        //        {
     896        //            ResetLine(counter, l);
     897        //        }
     898
     899        //    }
     900
     901        //}
     902
     903        private void CreateArrow(GmpBigInteger counter, Ellipse from, Ellipse to)
     904        {
     905           
     906            if (from==to)
     907            {
     908                AddCircle(counter, from);
     909            }
     910            else
     911            {
     912                ArrowLine l = ControlHandler.CreateObject(typeof(ArrowLine)) as ArrowLine;
     913                ControlHandler.SetPropertyValue(l, "Stroke", Brushes.Black);
     914                ControlHandler.SetPropertyValue(l, "StrokeThickness", 1.5);
     915                ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.X1Property, new Binding("(Canvas.Left)") { Source = from  }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     916                ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.Y1Property, new Binding("(Canvas.Top)") { Source = from }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     917                ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.X2Property, new Binding("(Canvas.Left)") { Source = to }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     918                ControlHandler.ExecuteMethod(l, "SetBinding", new object[] { ArrowLine.Y2Property, new Binding("(Canvas.Top)") { Source = to }, new Type[] { typeof(DependencyProperty), typeof(BindingBase) } });
     919
     920                Pair<Ellipse, Ellipse> pair = new Pair<Ellipse,Ellipse>(from, to);
     921                if (!m_SourceDestination.Contains(pair))
     922                {
     923                    m_SourceDestination.Add(pair);
     924                    m_ArrowsWithSourceAndDestination.Add(pair, l);
     925                    ControlHandler.AddChild(l, ArrowArea);
     926                    //m_Arrows.Add(l);
     927                    m_ArrowsMark.Add(counter, l);
     928                }
     929                else
     930                {
     931                    l = m_ArrowsWithSourceAndDestination[pair];
     932                    ResetLine(counter, l);
     933                }
     934
     935            }
     936
     937        }
     938
     939        //class myc : IValueConverter
     940        //{
     941        //    #region IValueConverter Members
     942
     943        //    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     944        //    {
     945        //        return value;
     946        //    }
     947
     948        //    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     949        //    {
     950        //        return value;
     951        //    }
     952
     953        //    #endregion
     954        //}
     955
     956        private void ResetLine(GmpBigInteger counter, ArrowLine l)
     957        {
     958            if (l != null)
     959            {
     960                m_ArrowsMark.Add(counter, l);
     961                UIElementCollection children = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
     962                ControlHandler.ExecuteMethod(children, "Remove", new object[] { l });
     963                Thread.Sleep(100);
     964                ControlHandler.ExecuteMethod(children, "Add", new object[] { l });
     965            }
     966        }
     967
     968        //private ArrowLine GetLine(ArrowLine l)
     969        //{
     970        //    foreach (ArrowLine line in m_Arrows)
     971        //    {
     972        //        double srcx1 = (double)ControlHandler.GetPropertyValue(line, "X1");
     973        //        double srcx2 = (double)ControlHandler.GetPropertyValue(line, "X2");
     974        //        double srcy1 = (double)ControlHandler.GetPropertyValue(line, "Y1");
     975        //        double srcy2 = (double)ControlHandler.GetPropertyValue(line, "Y2");
     976        //        double destx1 = (double)ControlHandler.GetPropertyValue(l, "X1");
     977        //        double destx2 = (double)ControlHandler.GetPropertyValue(l, "X2");
     978        //        double desty1 = (double)ControlHandler.GetPropertyValue(l, "Y1");
     979        //        double desty2 = (double)ControlHandler.GetPropertyValue(l, "Y2");
     980
     981        //        if (srcx1 == destx1 && srcx2 == destx2 && srcy1 == desty1 && srcy2 == desty2) return line;
     982        //    }
     983        //    return null;
     984        //}
     985
     986        //private bool ContainsLine(ArrowLine l)
     987        //{
     988        //    return GetLine(l) != null;
     989        //}
     990
     991        //public void AddCircle(GmpBigInteger counter, double x, double y)
     992        //{
     993        //    Polyline p = ControlHandler.CreateObject(typeof(Polyline)) as Polyline;
     994        //    ControlHandler.SetPropertyValue(p, "Stroke", Brushes.Black);
     995        //    ControlHandler.SetPropertyValue(p, "StrokeThickness", 1.5);
     996        //    PointCollection pc = ControlHandler.GetPropertyValue(p, "Points") as PointCollection;
     997        //    int c = 16;
     998        //    double radius = 25;
     999        //    for (int value = 0; value <= c; value++)
     1000        //    {
     1001        //        double angle = (360.0 / (double)c) * value;
     1002        //        double top = radius / 2 + (Math.Sin((angle * 2 * Math.PI) / 360.0) * radius / 2);
     1003        //        double left = radius / 2 + (Math.Cos((angle * 2 * Math.PI) / 360.0) * radius / 2);
     1004        //        ControlHandler.ExecuteMethod(pc, "Add", new object[] { new Point(top, left) });
     1005        //    }
     1006        //    if (!ContainsCircle(x, y))
     1007        //    {
     1008        //        m_Circles.Add(p);
     1009        //        m_CirclesMark.Add(counter, p);
     1010        //        ControlHandler.ExecuteMethod(ArrowArea, "SetLeft", new object[] { p, x });
     1011        //        ControlHandler.ExecuteMethod(ArrowArea, "SetTop", new object[] { p, y });
     1012        //        ControlHandler.AddChild(p, ArrowArea);
     1013        //    }
     1014        //    else
     1015        //    {
     1016        //        ResetCircle(counter, x, y);
     1017        //    }
     1018        //}
     1019
     1020        public void AddCircle(GmpBigInteger counter, Ellipse source)
     1021        {
     1022            Polyline p = ControlHandler.CreateObject(typeof(Polyline)) as Polyline;
     1023            ControlHandler.SetPropertyValue(p, "Stroke", Brushes.Black);
     1024            ControlHandler.SetPropertyValue(p, "StrokeThickness", 1.5);
     1025            PointCollection pc = ControlHandler.GetPropertyValue(p, "Points") as PointCollection;
     1026            int c = 16;
     1027            double radius = 25;
     1028            double x = (double)ControlHandler.ExecuteMethod(PaintArea, "GetLeft", source);
     1029            double y = (double)ControlHandler.ExecuteMethod(PaintArea, "GetTop", source);
     1030
     1031            for (int value = 0; value <= c; value++)
     1032            {
     1033                double angle = (360.0 / (double)c) * value;
     1034                double top = radius / 2 + (Math.Sin((angle * 2 * Math.PI) / 360.0) * radius / 2);
     1035                double left = radius / 2 + (Math.Cos((angle * 2 * Math.PI) / 360.0) * radius / 2);
     1036                ControlHandler.ExecuteMethod(pc, "Add", new object[] { new Point(top, left) });
     1037            }
     1038            if (!m_CirclesSource.ContainsKey(source))
     1039            {
     1040                m_CirclesSource.Add(source, p);
     1041                m_CirclesMark.Add(counter, p);
     1042                ControlHandler.ExecuteMethod(ArrowArea, "SetLeft", new object[] { p, x });
     1043                ControlHandler.ExecuteMethod(ArrowArea, "SetTop", new object[] { p, y });
     1044                ControlHandler.AddChild(p, ArrowArea);
     1045            }
     1046            else
     1047            {
     1048                p = m_CirclesSource[source];
     1049                ResetCircle(counter, p);
     1050            }
     1051        }
     1052
     1053        public void MoveCircle(Ellipse source)
     1054        {
     1055            Polyline pl = m_CirclesSource[source];
     1056            double x = (double)ControlHandler.ExecuteMethod(PaintArea, "GetLeft", source);
     1057            double y = (double)ControlHandler.ExecuteMethod(PaintArea, "GetTop", source);
     1058            ControlHandler.ExecuteMethod(ArrowArea, "SetLeft", new object[] { pl, x });
     1059            ControlHandler.ExecuteMethod(ArrowArea, "SetTop", new object[] { pl, y });
     1060
     1061        }
     1062
     1063        private void ResetCircle(GmpBigInteger counter, Polyline p)
     1064        {
     1065
     1066            if (p != null)
     1067            {
     1068                m_CirclesMark.Add(counter, p);
     1069
     1070                UIElementCollection children = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
     1071                ControlHandler.ExecuteMethod(children, "Remove", new object[] { p });
     1072                Thread.Sleep(100);
     1073                ControlHandler.ExecuteMethod(children, "Add", new object[] { p });
     1074            }
     1075        }
     1076
     1077        //private void ResetCircle(GmpBigInteger counter, double x, double y)
     1078        //{
     1079
     1080        //    Polyline ltmp = GetCircle(x, y);
     1081        //    if (ltmp != null)
     1082        //    {
     1083        //        m_CirclesMark.Add(counter, ltmp);
     1084
     1085        //        UIElementCollection children = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
     1086        //        ControlHandler.ExecuteMethod(children, "Remove", new object[] { ltmp });
     1087        //        Thread.Sleep(100);
     1088        //        ControlHandler.ExecuteMethod(children, "Add", new object[] { ltmp });
     1089        //    }
     1090        //}
     1091
     1092        //private Polyline GetCircle(double x, double y)
     1093        //{
     1094        //    foreach (Polyline line in m_Circles)
     1095        //    {
     1096        //        double _top = (double)ControlHandler.ExecuteMethod(ArrowArea, "GetTop", new object[] { line });
     1097        //        double _left = (double)ControlHandler.ExecuteMethod(ArrowArea, "GetLeft", new object[] { line });
     1098        //        if (y == _top && x == _left) return line;
     1099        //    }
     1100        //    return null;
     1101        //}
     1102
     1103        //private bool ContainsCircle(double x, double y)
     1104        //{
     1105        //    return GetCircle(x, y) != null;
     1106        //}
     1107        #endregion
     1108
     1109        private ExecutionMethod _ExecutionMethod
     1110        {
     1111            get
     1112            {
     1113                bool? ischecked = (bool?)ControlHandler.GetPropertyValue(rbAutomatic, "IsChecked");
     1114                return (ischecked.Value) ? ExecutionMethod.auto : ExecutionMethod.stepwise;
     1115            }
     1116        }
     1117        private enum ExecutionMethod { auto, stepwise }
     1118
     1119        private void btnNextStep_Click(object sender, RoutedEventArgs e)
     1120        {
     1121            m_StepWiseEvent.Set();
     1122        }
     1123
     1124
     1125        private void btnCancel_Click(object sender, RoutedEventArgs e)
     1126        {
     1127            FireCancelEvent();
     1128            CancelThread();
     1129        }
     1130
     1131
     1132        public void CleanUp()
     1133        {
     1134            CancelThread();
     1135        }
     1136
     1137        private void btnResumeAutomatic_Click(object sender, RoutedEventArgs e)
     1138        {
     1139            m_Resume = true;
     1140            m_StepWiseEvent.Set();
     1141            ControlHandler.SetPropertyValue(btnNextStep, "IsEnabled", false);
     1142            ControlHandler.SetPropertyValue(btnResumeAutomatic, "IsEnabled", false);
     1143
     1144        }
     1145
     1146        private void ContentArea_SizeChanged(object sender, SizeChangedEventArgs e)
     1147        {
     1148            ArrowArea.Width = PaintArea.Width = CircleArea.Width = e.NewSize.Width;
     1149            ArrowArea.Height = PaintArea.Height = CircleArea.Height = e.NewSize.Height;
     1150        }
     1151
     1152        bool rotate = false;
     1153        private void PaintArea_PreviewMouseDown(object sender, MouseButtonEventArgs e)
     1154        {
     1155            Debug.WriteLine(e.Source.ToString());
     1156            if (e.Source != null && e.Source==PaintArea)
     1157            {
     1158                rotate = true;
     1159            }
     1160            Cursor = Cursors.ScrollAll;
     1161        }
     1162
     1163        private void ArrowArea_MouseLeave(object sender, MouseEventArgs e)
     1164        {
     1165            releaseRotate();
     1166        }
     1167
     1168        private void ArrowArea_PreviewMouseUp(object sender, MouseButtonEventArgs e)
     1169        {
     1170            releaseRotate();
     1171        }
     1172
     1173        void releaseRotate()
     1174        {
     1175            lock (m_lockobject)
     1176            {
     1177                Cursor = Cursors.Arrow;
     1178                rotate = false;
     1179                diff = 0;
     1180            }
     1181
     1182        }
     1183        private void ArrowArea_PreviewDragOver(object sender, DragEventArgs e)
     1184        {
     1185        }
     1186
     1187        object m_lockobject = new object();
     1188        int diff = 0;
     1189        private Point previous = new Point(-10000, -10000);
     1190        private void ArrowArea_MouseMove(object sender, MouseEventArgs e)
     1191        {
     1192            lock (m_lockobject)
     1193            {
     1194                if (rotate)
     1195                {
     1196                    double centerY = Aperture / 2;
     1197                    double centerX = Aperture / 2;
     1198                    double diffx = 0;
     1199                    double diffy = 0;
     1200                    if (previous.X == -10000 && previous.Y == -10000)
     1201                    {
     1202                        previous = e.GetPosition(PaintArea);
     1203                    }
     1204                    else
     1205                    {
     1206                        Point actual = e.GetPosition(PaintArea);
     1207                        diffx = previous.X - actual.X;
     1208                        diffy = centerY - previous.Y;
     1209                        previous = actual;
     1210
     1211                    }
     1212                    Point currentPosition = e.GetPosition(CircleArea);
     1213                    double diffXp = Math.Abs(((centerX - currentPosition.X)) / 120);
     1214                    if ((diffx < 0 && diffy <= 0) || (diffx >= 0 && diffy >= 0))
     1215                    {
     1216                        diffXp *= -1;
     1217                    }
     1218                    diffXp *= (!m_SortAsc) ? -1 : 1;
     1219                    offset += diffXp;
     1220                    CreatePoints();
     1221                }
     1222            }
     1223        }
     1224
    2531225
    2541226    }
    255 
    256     void log_RowMouseOver(GmpBigInteger value)
    257     {
    258       ArrowLine al = null;
    259       Polyline pl = null;
    260       if (m_ArrowsMark.TryGetValue(value, out al))
    261       {
    262         foreach (ArrowLine alTmp in m_Arrows)
    263         {
    264           alTmp.Stroke = Brushes.Black;
    265         }
    266         al.Stroke = Brushes.Red;
    267       }
    268       else if (m_CirclesMark.TryGetValue(value, out pl))
    269       {
    270         foreach (Polyline plTmp in m_Circles)
    271         {
    272           plTmp.Stroke = Brushes.Black;
    273         }
    274         pl.Stroke = Brushes.Red;
    275       }
    276      
    277     }
    278 
    279     private void ConfigureIntegerInputs()
    280     {
    281       iscBase.Execute += new ExecuteSingleDelegate(iscBase_Execute);
    282       iscBase.SetText(InputSingleControl.Free, "2");
    283       InputValidator<LibGmpWrapper.GmpBigInteger> ivBase = new InputValidator<LibGmpWrapper.GmpBigInteger>();
    284       ivBase.Validator = new BigIntegerMinValueValidator(null, LibGmpWrapper.GmpBigInteger.Two);
    285       iscBase.AddInputValidator(
    286         Primes.WpfControls.Components.InputSingleControl.Free,
    287         ivBase);
    288 
    289 
    290       iscExp.Execute += new ExecuteSingleDelegate(iscExp_Execute);
    291       iscExp.SetText(InputSingleControl.Free, "28");
    292       InputValidator<LibGmpWrapper.GmpBigInteger> ivExp = new InputValidator<LibGmpWrapper.GmpBigInteger>();
    293       ivExp.Validator = new BigIntegerMinValueValidator(null, LibGmpWrapper.GmpBigInteger.One);
    294       iscExp.AddInputValidator(
    295         Primes.WpfControls.Components.InputSingleControl.Free,
    296         ivExp);
    297 
    298       iscMod.Execute += new ExecuteSingleDelegate(iscMod_Execute);
    299       iscMod.KeyDown += new ExecuteSingleDelegate(iscMod_KeyDown);
    300       iscMod.SetText(InputSingleControl.Free, "13");
    301       InputValidator<LibGmpWrapper.GmpBigInteger> ivMod = new InputValidator<LibGmpWrapper.GmpBigInteger>();
    302       ivMod.Validator = new BigIntegerMinValueMaxValueValidator(null, LibGmpWrapper.GmpBigInteger.Two, LibGmpWrapper.GmpBigInteger.ValueOf(150));
    303       iscMod.AddInputValidator(
    304         Primes.WpfControls.Components.InputSingleControl.Free,
    305         ivMod);
    306 
    307       this.Start += new VoidDelegate(PowerModControl_Start);
    308       this.Stop += new VoidDelegate(PowerModControl_Stop);
    309       this.Cancel += new VoidDelegate(PowerModControl_Cancel);
    310       this.Exp = GmpBigInteger.ValueOf(28);
    311       this.Base = GmpBigInteger.ValueOf(2);
    312       this.Mod = GmpBigInteger.ValueOf(13);
    313 
    314     }
    315 
    316     void iscMod_KeyDown(GmpBigInteger value)
    317     {
    318       if(value!=null)
    319         this.Mod = value;
    320     }
    321 
    322 
    323 
    324     void iscMod_Execute(GmpBigInteger value)
    325     {
    326       this.Mod = value;
    327       StartThread();
    328     }
    329 
    330     private void slidermodulus_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    331     {
    332       this.Mod = GmpBigInteger.ValueOf((long)e.NewValue);
    333     }
    334 
    335     void iscExp_Execute(GmpBigInteger value)
    336     {
    337       this.Exp = value;
    338       StartThread();
    339     }
    340 
    341     void iscBase_Execute(GmpBigInteger value)
    342     {
    343       this.Base = value;
    344       StartThread();
    345     }
    346 
    347     #endregion
    348     #region Properties
    349     private object m_RunningLockObject;
    350     private bool m_Running;
    351     private IDictionary<int, Point> m_Points;
    352 
    353     private GmpBigInteger m_Base;
    354 
    355     public GmpBigInteger Base
    356     {
    357       get { return m_Base; }
    358       set { m_Base = value; }
    359     }
    360     private GmpBigInteger m_Exp;
    361 
    362     public GmpBigInteger Exp
    363     {
    364       get { return m_Exp; }
    365       set { m_Exp = value; }
    366     }
    367     private GmpBigInteger m_Mod;
    368 
    369     public GmpBigInteger Mod
    370     {
    371       get { return m_Mod; }
    372       set
    373       {
    374         m_Mod = value;
    375         if (m_Mod != null)
    376         {
    377           if (m_Mod.Equals(iscMod.GetValue()))
    378           {
    379             slidermodulus.Value = m_Mod.DoubleValue;
    380           }
    381           else
    382           {
    383             iscMod.SetText(InputSingleControl.Free, m_Mod.ToString());
    384           }
    385           if (m_Initialized)
    386           {
    387             CreatePoints();
    388           }
    389         }
    390       }
    391     }
    392     #endregion
    393     #region painting the points
    394 
    395     private void CreatePoint(int value)
    396     {
    397       double pointsize = 6.0;
    398       double angle = (360.0 / (double)m_Mod.IntValue) * (value+diff);
    399       double top = Radius + 25 + (Math.Sin((angle * 2 * Math.PI * ((!m_SortAsc)?-1:1)) / 360.0) * Radius - (pointsize / 2.0));
    400       double left = Radius + 25 + (Math.Cos((angle * 2 * Math.PI * ((!m_SortAsc)?- 1:1)) / 360.0) * Radius - (pointsize / 2.0));
    401 
    402       Ellipse point = ControlHandler.CreateObject(typeof(Ellipse)) as Ellipse;
    403       point.ToolTip = new ToolTip();
    404       (point.ToolTip as ToolTip).Content = value.ToString();
    405       ControlHandler.SetPropertyValue(point, "Width", pointsize);
    406       ControlHandler.SetPropertyValue(point, "Height", pointsize);
    407       ControlHandler.ExecuteMethod(PaintArea, "SetTop", new object[] { point, top });
    408       ControlHandler.ExecuteMethod(PaintArea, "SetLeft", new object[] { point, left });
    409       ControlHandler.SetPropertyValue(point, "Fill", Brushes.Black);
    410       ControlHandler.SetPropertyValue(point, "Stroke", Brushes.Black);
    411       ControlHandler.SetPropertyValue(point, "StrokeThickness", 1.0);
    412       ControlHandler.AddChild(point, PaintArea);
    413 
    414       Label lbl = ControlHandler.CreateLabel(value.ToString(), null);
    415       double _top = top;
    416       double _left = left - 5;
    417       _top += (top < Radius) ? -20 : 0;
    418       _left += (left < Radius) ? -7 + (-2 * (int)Math.Log(value)) : 2;
    419       ControlHandler.ExecuteMethod(PaintArea, "SetTop", new object[] { lbl, _top });
    420       ControlHandler.ExecuteMethod(PaintArea, "SetLeft", new object[] { lbl, _left });
    421       ControlHandler.AddChild(lbl, PaintArea);
    422       if (m_Points.ContainsKey(value))
    423       {
    424         m_Points[value] = new Point(left, top);
    425       }
    426       else
    427       {
    428         m_Points.Add(value, new Point(left, top));
    429       }
    430 
    431     }
    432 
    433     #endregion
    434 
    435     #region Painting the Ellipse
    436     private void Paint()
    437     {
    438      
    439       Ellipse el = ControlHandler.CreateObject(typeof(Ellipse)) as Ellipse;
    440       ControlHandler.SetPropertyValue(el, "Width", Aperture);
    441       ControlHandler.SetPropertyValue(el, "Height", Aperture);
    442       ControlHandler.ExecuteMethod(CircleArea, "SetTop", new object[] { el, 25 });
    443       ControlHandler.ExecuteMethod(CircleArea, "SetLeft", new object[] { el, 25 });
    444       ControlHandler.SetPropertyValue(el, "StrokeThickness", 1.0);
    445       ControlHandler.SetPropertyValue(el, "Stroke", Brushes.Black);
    446       ControlHandler.SetPropertyValue(el, "Name", "dontremove");
    447       ControlHandler.AddChild(el, CircleArea);
    448     }
    449 
    450     private double Aperture
    451     {
    452       get { return Math.Max(Math.Min(PaintArea.Width, PaintArea.Height) - 50, 0); }
    453     }
    454 
    455     private double Radius
    456     {
    457       get { return Aperture / 2.0; }
    458     }
    459 
    460     private double Perimeter
    461     {
    462       get { return (2 * Math.PI * Aperture); }
    463     }
    464     protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
    465     {
    466       base.OnRenderSizeChanged(sizeInfo);
    467       if (m_Initialized)
    468       {
    469         ClearArrows();
    470         log.RenderSize = sizeInfo.NewSize;
    471         ArrowArea.Width = PaintArea.Width = CircleArea.Width = ContentArea.Width = PaintPanel.ActualWidth - 20;
    472         ArrowArea.Height = PaintArea.Height = CircleArea.Height = ContentArea.Height = PaintPanel.ActualHeight - spslider.ActualHeight-30;
    473         //ContentArea.Width = PaintPanel.ActualWidth;
    474 
    475         //ContentArea.Height = PaintPanel.ActualHeight - spslider.ActualHeight;
    476 
    477         //if (log.ActualWidth < 100)
    478         //{
    479         //  log.Width = this.ActualWidth - 5;
    480         //}
    481         if (sizeInfo.NewSize.Height != double.NaN && sizeInfo.NewSize.Height > 0 &&
    482           sizeInfo.NewSize.Width != double.NaN && sizeInfo.NewSize.Width > 0)
    483         {
    484           if (!m_Running)
    485           {
    486             if (CircleArea.Children.Count != 0)
    487               CircleArea.Children.Clear();
    488             Paint();
    489             if (this.m_Mod != null)
    490             {
    491               IDictionary<ArrowLine, int> m_StartPoints = new Dictionary<ArrowLine, int>();
    492               IDictionary<ArrowLine, int> m_EndPoints = new Dictionary<ArrowLine, int>();
    493 
    494               foreach (ArrowLine al in m_Arrows)
    495               {
    496                   Point from = new Point(al.X1, al.Y1);
    497                   Point to = new Point(al.X2, al.Y2);
    498                   foreach (int key in m_Points.Keys)
    499                   {
    500                     Point p = m_Points[key];
    501                     if (from.X == p.X && from.Y == p.Y)
    502                     {
    503                       m_StartPoints.Add(al, key);
    504                     }
    505                     else if (to.X == p.X && to.Y == p.Y)
    506                     {
    507                       m_EndPoints.Add(al, key);
    508                     }
    509                   }
    510               }
    511               CreatePoints();
    512               foreach (ArrowLine al in m_StartPoints.Keys)
    513               {
    514                 al.X1 = m_Points[m_StartPoints[al]].X;
    515                 al.Y1 = m_Points[m_StartPoints[al]].Y;
    516 
    517               }
    518               foreach (ArrowLine al in m_EndPoints.Keys)
    519               {
    520                 al.X2 = m_Points[m_EndPoints[al]].X;
    521                 al.Y2 = m_Points[m_EndPoints[al]].Y;
    522 
    523               }
    524             }
    525           }
    526         }
    527       }
    528     }
    529 
    530     private void ClearPoints()
    531     {
    532       UIElementCollection childs = ControlHandler.GetPropertyValue(PaintArea, "Children") as UIElementCollection;
    533       ControlHandler.ExecuteMethod(childs, "Clear");
    534     }
    535 
    536     private void ClearArrows()
    537     {
    538       UIElementCollection childs = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
    539       ControlHandler.ExecuteMethod(childs, "Clear");
    540       m_Arrows.Clear();
    541       m_Circles.Clear();
    542       m_ArrowsMark.Clear();
    543       m_CirclesMark.Clear();
    544      
    545     }
    546     #endregion
    547 
    548 
    549     #region Events
    550     private event VoidDelegate Start;
    551 
    552     private void FireStartEvent()
    553     {
    554       if (Start != null) Start();
    555     }
    556    
    557     private event VoidDelegate Stop;
    558 
    559     private void FireStopEvent()
    560     {
    561       if (Stop != null) Stop();
    562     }
    563 
    564     private event VoidDelegate Cancel;
    565    
    566     private void FireCancelEvent()
    567     {
    568       if (Cancel != null) Cancel();
    569     }
    570 
    571     void PowerModControl_Cancel()
    572     {
    573       CancelThread();
    574       SetupStop();
    575     }
    576 
    577     void PowerModControl_Stop()
    578     {
    579       SetupStop();
    580      
    581     }
    582 
    583     void PowerModControl_Start()
    584     {
    585       SetupStart();     
    586     }
    587 
    588     #endregion
    589 
    590     #region SettingUpButtons
    591 
    592     private void SetupStart()
    593     {
    594       ControlHandler.ExecuteMethod(this, "_SetupStart");     
    595     }
    596    
    597     public void _SetupStart()
    598     {
    599       btnCancel.IsEnabled = true;
    600       btnExecute.IsEnabled = false;
    601       dpStepwiseButtons.Visibility = (!rbAutomatic.IsChecked.Value) ? Visibility.Visible : Visibility.Collapsed;
    602       iscBase.LockControls();
    603       iscExp.LockControls();
    604       iscMod.LockControls();
    605       rbAutomatic.IsEnabled = false;
    606       rbStepwise.IsEnabled = false;
    607 
    608     }
    609    
    610     private void SetupStop()
    611     {
    612       ControlHandler.ExecuteMethod(this, "_SetupStop");
    613     }
    614 
    615     public void _SetupStop()
    616     {
    617       btnCancel.IsEnabled = false;
    618       btnExecute.IsEnabled = true;
    619       dpStepwiseButtons.Visibility = Visibility.Collapsed;
    620       btnNextStep.IsEnabled = true;
    621       btnResumeAutomatic.IsEnabled = true;
    622       m_Resume = false;
    623       iscBase.UnLockControls();
    624       iscExp.UnLockControls();
    625       iscMod.UnLockControls();
    626       rbAutomatic.IsEnabled = true;
    627       rbStepwise.IsEnabled = true;
    628     }
    629 
    630 
    631     #endregion
    632     #region Execute
    633 
    634     private void CancelThread()
    635     {
    636       if (m_Thread != null)
    637       {
    638         lock (m_RunningLockObject)
    639         {
    640           m_Running = false;
    641         }
    642 
    643         m_Thread.Abort();
    644         m_Thread = null;
    645       }
    646     }
    647 
    648     private void StartThread()
    649     {
    650       m_Base = iscBase.GetValue();
    651       m_Exp = iscExp.GetValue();
    652       m_Mod = iscMod.GetValue();
    653       if (m_Base != null && m_Exp != null && m_Mod != null)
    654       {
    655 
    656         m_Thread = new Thread(new ThreadStart(DoExecuteGraphic));
    657         m_Thread.Start();
    658       }
    659     }
    660     //public void Execute(GmpBigInteger value)
    661     //{
    662     //  tabItemGraphic.IsEnabled = true;
    663     //  tcStats.SelectedIndex = 0;
    664 
    665     //  this.m_Value = value;
    666     //  m_Arrows.Clear();
    667     //  ArrowArea.Children.Clear();
    668     //  log.Columns = 1;
    669     //  log.Clear();
    670     //  if (value.CompareTo(GmpBigInteger.ValueOf(150))>0)
    671     //  {
    672     //    tcStats.SelectedIndex = 1;
    673     //    tabItemGraphic.IsEnabled = false;
    674     //  }
    675     //  else
    676     //  {
    677     //    CreatePoints();
    678     //  }
    679     //}
    680 
    681 
    682 
    683     private bool m_SortAsc = true;
    684     private void CreatePoints()
    685     {
    686       ClearArrows();
    687       ClearPoints();
    688       for (int i = 0; i < m_Mod.IntValue; i++)
    689       {
    690         CreatePoint(i);
    691       }
    692 
    693     }
    694 
    695     private void btnExecute_Click(object sender, RoutedEventArgs e)
    696     {
    697       StartThread();
    698     }
    699 
    700     //private void DoExecuteGraphic()
    701     //{
    702     //  lock (m_RunningLockObject)
    703     //  {
    704     //    m_Running = true;
    705     //  }
    706     //  Point lastPoint = new Point(-1, -1);
    707     //  GmpBigInteger factor = null;
    708     //  GmpBigInteger i = GmpBigInteger.Two;
    709 
    710     //  GmpBigInteger result = null;
    711     //  while (i.CompareTo(m_Exp) <= 0)
    712     //  {
    713     //    Thread.Sleep(100);
    714     //    result = a.ModPow(i, m_Mod);
    715     //    log.Info(
    716     //      string.Format(
    717     //        "Berechne {0}^{1} mod {2} = {3}",
    718     //        new object[] { a.ToString(), i.ToString(), m_Mod.ToString(), result.ToString() }));
    719 
    720     //    if (factor == null)
    721     //      factor = result;
    722     //    else
    723     //      factor = factor.Multiply(result);
    724     //    //StringBuilder sbText = new StringBuilder();// new StringBuilder(ControlHandler.GetPropertyValue(lblCalc, "Text") as string);
    725     //    //sbText.Append(result.ToString());
    726     //    //if (i.CompareTo(m_Value.Subtract(GmpBigInteger.One)) < 0)
    727     //    //  sbText.Append(" * ");
    728     //    //ControlHandler.SetPropertyValue(lblCalc, "Text", sbText.ToString());
    729 
    730     //    if (lastPoint.X == -1 && lastPoint.Y == -1)
    731     //    {
    732     //      lastPoint = m_Points[result.IntValue];
    733     //    }
    734     //    else
    735     //    {
    736     //      Point newPoint = m_Points[result.IntValue];
    737     //      CreateArrow(lastPoint, newPoint);
    738     //      lastPoint = newPoint;
    739     //    }
    740     //    i = i.Add(GmpBigInteger.One);
    741     //  }
    742 
    743     //  lock (m_RunningLockObject)
    744     //  {
    745     //    m_Running = false;
    746     //  }
    747 
    748     //}
    749     private ManualResetEvent m_StepWiseEvent;
    750 
    751     private void WaitStepWise()
    752     {
    753       if (m_StepWiseEvent != null && _ExecutionMethod == ExecutionMethod.stepwise && !m_Resume)
    754       {
    755         m_StepWiseEvent.Reset();
    756         m_StepWiseEvent.WaitOne();
    757       }
    758     }
    759 
    760     private void DoExecuteGraphic()
    761     {
    762       FireStartEvent();
    763       ClearArrows();
    764       log.Clear();
    765       lock (m_RunningLockObject)
    766       {
    767         m_Running = true;
    768       }
    769       Point lastPoint = new Point(-1, -1);
    770       GmpBigInteger i = GmpBigInteger.One;
    771       GmpBigInteger result = null;
    772       GmpBigInteger tmp = m_Base.Mod(m_Mod);
    773       Ellipse e = this.GetEllipseAt(m_Points[tmp.IntValue]);
    774       if (e != null)
    775       {
    776         ControlHandler.SetPropertyValue(e, "Fill", Brushes.Red);
    777         ControlHandler.SetPropertyValue(e, "Stroke", Brushes.Red);
    778       }
    779 
    780       while (i.CompareTo(m_Exp) <= 0)
    781       {
    782         Thread.Sleep(100);
    783         if (result == null)
    784         {
    785           result = m_Base.Mod(m_Mod);
    786           log.Info(string.Format(Primes.Resources.lang.Numbertheory.Numbertheory.powermod_executionfirst, new object[] { GmpBigInteger.One.ToString(), m_Base.ToString("D"), m_Mod.ToString("D"), result.ToString("D") }));
    787         }
    788         else
    789         {
    790           GmpBigInteger tmpResult = result;
    791           result = result.Multiply(m_Base).Mod(m_Mod);
    792           log.Info(string.Format(Primes.Resources.lang.Numbertheory.Numbertheory.powermod_execution, new object[] { i.ToString("D"), tmpResult.ToString("D"), m_Base.ToString("D"), m_Mod.ToString("D"), result.ToString("D") }));
    793         }
    794         if (lastPoint.X == -1 && lastPoint.Y == -1)
    795         {
    796           lastPoint = m_Points[result.IntValue];
    797         }
    798         else
    799         {
    800           Point newPoint = m_Points[result.IntValue];
    801           CreateArrow(i.Subtract(GmpBigInteger.One), lastPoint, newPoint);
    802           lastPoint = newPoint;
    803         }
    804         i = i.Add(GmpBigInteger.One);
    805         if(i.CompareTo(GmpBigInteger.Three)>=0)
    806           WaitStepWise();
    807       }
    808 
    809       lock (m_RunningLockObject)
    810       {
    811         m_Running = false;
    812       }
    813       FireStopEvent();
    814     }
    815 
    816     private Ellipse GetEllipseAt(Point p)
    817     {
    818       return (Ellipse)ControlHandler.ExecuteMethod(this, "_GetEllipseAt", new object[] { p });
    819     }
    820     public Ellipse _GetEllipseAt(Point p)
    821     {
    822       foreach (UIElement e in PaintArea.Children)
    823       {
    824         if (e.GetType() == typeof(Ellipse))
    825         {
    826           if (Canvas.GetTop(e) == p.Y && Canvas.GetLeft(e) == p.X) return e as Ellipse;
    827         }
    828       }
    829       return null;
    830     }
    831 
    832 
    833     private IList<ArrowLine> m_Arrows;
    834     private IDictionary<GmpBigInteger, ArrowLine> m_ArrowsMark;
    835 
    836 
    837     private void CreateArrow(GmpBigInteger counter, Point from, Point to)
    838     {
    839       ArrowLine l = null;
    840       if (from.X == to.X && from.Y == to.Y)
    841       {
    842         AddCircle(counter, from.X, from.Y);
    843       }
    844       else
    845       {
    846         l = ControlHandler.CreateObject(typeof(ArrowLine)) as ArrowLine;
    847         ControlHandler.SetPropertyValue(l, "X1", from.X);
    848         ControlHandler.SetPropertyValue(l, "Y1", from.Y);
    849         ControlHandler.SetPropertyValue(l, "X2", to.X);
    850         ControlHandler.SetPropertyValue(l, "Y2", to.Y);
    851         ControlHandler.SetPropertyValue(l, "Stroke", Brushes.Black);
    852         ControlHandler.SetPropertyValue(l, "StrokeThickness", 1.5);
    853         if (!ContainsLine(l))
    854         {
    855           ControlHandler.AddChild(l, ArrowArea);
    856           m_Arrows.Add(l);
    857           m_ArrowsMark.Add(counter, l);
    858         }
    859         else
    860         {
    861           ResetLine(counter, l);
    862         }
    863 
    864       }
    865 
    866     }
    867    
    868     private void ResetLine(GmpBigInteger counter, ArrowLine l)
    869     {
    870       ArrowLine ltmp = GetLine(l);
    871       if (ltmp != null)
    872       {
    873         m_ArrowsMark.Add(counter, ltmp);
    874         UIElementCollection children = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
    875         ControlHandler.ExecuteMethod(children, "Remove", new object[] { ltmp });
    876         Thread.Sleep(100);
    877         ControlHandler.ExecuteMethod(children, "Add", new object[] { ltmp });
    878       }
    879     }
    880     private ArrowLine GetLine(ArrowLine l)
    881     {
    882       foreach (ArrowLine line in m_Arrows)
    883       {
    884         double srcx1 = (double)ControlHandler.GetPropertyValue(line, "X1");
    885         double srcx2 = (double)ControlHandler.GetPropertyValue(line, "X2");
    886         double srcy1 = (double)ControlHandler.GetPropertyValue(line, "Y1");
    887         double srcy2 = (double)ControlHandler.GetPropertyValue(line, "Y2");
    888         double destx1 = (double)ControlHandler.GetPropertyValue(l, "X1");
    889         double destx2 = (double)ControlHandler.GetPropertyValue(l, "X2");
    890         double desty1 = (double)ControlHandler.GetPropertyValue(l, "Y1");
    891         double desty2 = (double)ControlHandler.GetPropertyValue(l, "Y2");
    892 
    893         if (srcx1 == destx1 && srcx2 == destx2 && srcy1 == desty1 && srcy2 == desty2) return line;
    894       }
    895       return null;
    896     }
    897     private bool ContainsLine(ArrowLine l)
    898     {
    899       return GetLine(l) != null;
    900     }
    901 
    902 
    903     private IList<Polyline> m_Circles;
    904     private IDictionary<GmpBigInteger, Polyline> m_CirclesMark;
    905 
    906 
    907     public void AddCircle(GmpBigInteger counter, double x, double y)
    908     {
    909       Polyline p = ControlHandler.CreateObject(typeof(Polyline)) as Polyline;
    910       ControlHandler.SetPropertyValue(p,"Stroke",Brushes.Black);
    911       ControlHandler.SetPropertyValue(p,"StrokeThickness",1.5);
    912       PointCollection pc = ControlHandler.GetPropertyValue(p, "Points") as PointCollection;
    913       int c = 16;
    914       double radius = 25;
    915       for (int value = 0; value <= c; value++)
    916       {
    917         double angle = (360.0 / (double)c) * value;
    918         double top = radius / 2 + (Math.Sin((angle * 2 * Math.PI) / 360.0) * radius / 2);
    919         double left = radius / 2 + (Math.Cos((angle * 2 * Math.PI) / 360.0) * radius / 2);
    920         ControlHandler.ExecuteMethod(pc, "Add", new object[] { new Point(top, left) });
    921       }
    922       if (!ContainsCircle(x,y))
    923       {
    924         m_Circles.Add(p);
    925         m_CirclesMark.Add(counter, p);
    926         ControlHandler.ExecuteMethod(ArrowArea, "SetLeft", new object[] { p, x });
    927         ControlHandler.ExecuteMethod(ArrowArea, "SetTop", new object[] { p,y });
    928         ControlHandler.AddChild(p, ArrowArea);
    929       }
    930       else
    931       {
    932         ResetCircle(counter, x,y);
    933       }
    934 
    935     }
    936     private void ResetCircle(GmpBigInteger counter, double x, double y)
    937     {
    938 
    939       Polyline ltmp = GetCircle(x,y);
    940       if (ltmp != null)
    941       {
    942         m_CirclesMark.Add(counter, ltmp);
    943 
    944         UIElementCollection children = ControlHandler.GetPropertyValue(ArrowArea, "Children") as UIElementCollection;
    945         ControlHandler.ExecuteMethod(children, "Remove", new object[] { ltmp });
    946         Thread.Sleep(100);
    947         ControlHandler.ExecuteMethod(children, "Add", new object[] { ltmp });
    948       }
    949     }
    950     private Polyline GetCircle(double x, double y)
    951     {
    952       foreach (Polyline line in m_Circles)
    953       {
    954         double _top = (double)ControlHandler.ExecuteMethod(ArrowArea, "GetTop", new object[] { line });
    955         double _left = (double)ControlHandler.ExecuteMethod(ArrowArea, "GetLeft", new object[] { line });
    956         if (y == _top && x == _left) return line;
    957       }
    958       return null;
    959     }
    960 
    961     private bool ContainsCircle(double x, double y)
    962     {
    963       return GetCircle(x,y) != null;
    964     }
    965     #endregion
    966 
    967     private ExecutionMethod _ExecutionMethod
    968     {
    969       get
    970       {
    971         bool? ischecked = (bool?)ControlHandler.GetPropertyValue(rbAutomatic, "IsChecked");
    972         return (ischecked.Value) ? ExecutionMethod.auto : ExecutionMethod.stepwise;
    973       }
    974     }
    975     private enum ExecutionMethod { auto, stepwise }
    976 
    977     private void btnNextStep_Click(object sender, RoutedEventArgs e)
    978     {
    979       m_StepWiseEvent.Set();
    980     }
    981 
    982 
    983     private void btnCancel_Click(object sender, RoutedEventArgs e)
    984     {
    985       FireCancelEvent();
    986       CancelThread();
    987     }
    988 
    989 
    990     public void CleanUp()
    991     {
    992       CancelThread();
    993     }
    994 
    995     private void btnResumeAutomatic_Click(object sender, RoutedEventArgs e)
    996     {
    997       m_Resume = true;
    998       m_StepWiseEvent.Set();
    999       ControlHandler.SetPropertyValue(btnNextStep, "IsEnabled", false);
    1000       ControlHandler.SetPropertyValue(btnResumeAutomatic, "IsEnabled", false);
    1001 
    1002     }
    1003 
    1004     private void ContentArea_SizeChanged(object sender, SizeChangedEventArgs e)
    1005     {
    1006       ArrowArea.Width = PaintArea.Width = CircleArea.Width = e.NewSize.Width;
    1007       ArrowArea.Height = PaintArea.Height = CircleArea.Height = e.NewSize.Height;
    1008     }
    1009 
    1010     bool rotate = false;
    1011     private void PaintArea_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    1012     {
    1013       rotate = true;
    1014       Cursor = Cursors.SizeAll;
    1015     }
    1016 
    1017     private void ArrowArea_MouseLeave(object sender, MouseEventArgs e)
    1018     {
    1019       releaseRotate();
    1020     }
    1021 
    1022     private void ArrowArea_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    1023     {
    1024       releaseRotate();
    1025     }
    1026 
    1027     void releaseRotate()
    1028     {
    1029       lock (m_lockobject)
    1030       {
    1031         Cursor = Cursors.Arrow;
    1032         rotate = false;
    1033         lastPoint = null;
    1034         diff = 0;
    1035       }
    1036 
    1037     }
    1038     private void ArrowArea_PreviewDragOver(object sender, DragEventArgs e)
    1039     {
    1040     }
    1041 
    1042     object lastPoint = null;
    1043     object m_lockobject = new object();
    1044     int diff = 0;
    1045     private void ArrowArea_MouseMove(object sender, MouseEventArgs e)
    1046     {
    1047       lock (m_lockobject)
    1048       {
    1049         if (rotate)
    1050         {
    1051           if (lastPoint != null)
    1052           {
    1053             int x = 0;
    1054             if (Math.Abs(e.GetPosition(PaintArea).X - ((Point)lastPoint).X) > 2
    1055               || Math.Abs(e.GetPosition(PaintArea).Y - ((Point)lastPoint).Y) > 2)
    1056             {
    1057               if (e.GetPosition(PaintArea).X - ((Point)lastPoint).X < 0
    1058                 || e.GetPosition(PaintArea).Y - ((Point)lastPoint).Y < 0)
    1059               {
    1060                 x = -1;
    1061               }
    1062               else
    1063               {
    1064                 x = 1;
    1065               }
    1066               diff = ((diff + x) % m_Mod.IntValue);
    1067               CreatePoints();
    1068             }
    1069 
    1070           }
    1071           lastPoint = e.GetPosition(PaintArea);
    1072         }
    1073       }
    1074     }
    1075 
    1076    
    1077   }
    10781227}
Note: See TracChangeset for help on using the changeset viewer.